diff --git a/.claude/settings.local.json b/.claude/settings.local.json deleted file mode 100644 index 34eacd484..000000000 --- a/.claude/settings.local.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "permissions": { - "allow": [ - ] - } -} diff --git a/.gitignore b/.gitignore index 969ea7fb7..6fa41902f 100644 --- a/.gitignore +++ b/.gitignore @@ -36,12 +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/server +run/client2 + +# LLM +.claude/* diff --git a/AUDIT_ACTUEL.md b/AUDIT_ACTUEL.md new file mode 100644 index 000000000..ca8ea08d7 --- /dev/null +++ b/AUDIT_ACTUEL.md @@ -0,0 +1,271 @@ +# 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. + +--- + +## 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` — reste O(n×81) + asymétrie fuel/cooler** *(gravité réévaluée à la baisse lors d'un tour précédent, toujours d'actualité)* + Le neighbor lookup est passé de O(n) à O(1) (map `actualRods`, déjà corrigé — voir §8.1), mais chaque rod continue de boucler sur toute la grille `formattedPattern` (9×9=81 cellules) pour retrouver sa propre position — non remplacée par une map slot→position précalculée (coût ~57×81 ≈ 4617 itérations/tick sur réacteur plein). **Recommandation** : précalculer une `Map` — gain mineur, risque nul, priorité basse. + - **Asymétrie toujours présente** : l'examen des voisins ne se fait que si `"fuel".equals(currentRod)` ; un cooler ne déclenche jamais l'examen de ses voisins, et `heat += rod.baseRodHeat() / neighborRod.proximityRodHeat()` (division) côté fuel→cooler-voisin vs addition côté fuel→fuel-voisin. **Ne pas toucher sans confirmation balance** — c'est potentiellement voulu. + +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`, 3 cas : fuel isolé, cooler isolé, asymétrie de voisinage fuel/cooler documentée en §2.2) 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. | +| **`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) (déjà corrigé), reste une boucle O(81) de recherche de position par rod | 🟡 **partiellement corrigé, priorité basse** | §2.2 | + +*(`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 (§2.2, §5). **Ne pas** toucher à l'asymétrie fuel/cooler sans validation balance. +- `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 | +|---|---|---|---| +| 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 4174b4996..5343aceb8 100644 --- a/build.gradle +++ b/build.gradle @@ -117,6 +117,12 @@ minecraft { property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" } + client2 { + parent runs.client + workingDirectory project.file('run/client2') + args '--username', 'Dev2' + } + server { workingDirectory project.file('run/server') //property 'forge.enabledGameTestNamespaces', mod_id @@ -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 { @@ -212,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/gradle.properties b/gradle.properties index 5c1237d60..a678e3f86 100644 --- a/gradle.properties +++ b/gradle.properties @@ -64,13 +64,13 @@ mod_name=Create Nuclear # The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. mod_license=MIT # The mod version. See https://semver.org/ -mod_version=2.0.5.4-alpha +mod_version=2.0.16-beta # 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. +# 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 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 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/nitrogen.png b/nitrogen.png deleted file mode 100644 index 369ffd820..000000000 Binary files a/nitrogen.png and /dev/null differ diff --git a/run/hs_err_pid21100.log b/run/hs_err_pid21100.log deleted file mode 100644 index fc80693f8..000000000 --- a/run/hs_err_pid21100.log +++ /dev/null @@ -1,1152 +0,0 @@ -# -# A fatal error has been detected by the Java Runtime Environment: -# -# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0000000000000008, pid=21100, tid=23416 -# -# JRE version: OpenJDK Runtime Environment Temurin-21.0.8+9 (21.0.8+9) (build 21.0.8+9-LTS) -# Java VM: OpenJDK 64-Bit Server VM Temurin-21.0.8+9 (21.0.8+9-LTS, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, g1 gc, windows-amd64) -# Problematic frame: -# C [jdwp.dll+0x161bf] -# -# No core dump will be written. Minidumps are not enabled by default on client versions of Windows -# -# If you would like to submit a bug report, please visit: -# https://github.com/adoptium/adoptium-support/issues -# The crash happened outside the Java Virtual Machine in native code. -# See problematic frame for where to report the bug. -# - ---------------- S U M M A R Y ------------ - -Command Line: -Ddebugger.agent.enable.coroutines=true -Dforge.enableGameTest=true -Dforge.logging.console.level=debug -Dforge.logging.markers=REGISTRIES -DignoreList=bootstraplauncher,securejarhandler,asm-commons,asm-util,asm-analysis,asm-tree,asm,JarJarFileSystems,client-extra,fmlcore,javafmllanguage,lowcodelanguage,mclanguage,forge- -Djava.net.preferIPv6Addresses=system -Dkotlinx.coroutines.debug.enable.creation.stack.trace=false -Dkotlinx.coroutines.debug.enable.flows.stack.trace=true -Dkotlinx.coroutines.debug.enable.mutable.state.flows.stack.trace=true -DlegacyClassPath.file=C:\Users\TcT_g\Desktop\ynov\M1\CreateNuclear\CreateNuclearForge\build\classpath\runClient_minecraftClasspath.txt -DmergeModules=jna-5.10.0.jar,jna-platform-5.10.0.jar -Dmixin.debug.export=true -Dmixin.debug.verbose=true -Dmixin.env.refMapRemappingFile=C:\Users\TcT_g\Desktop\ynov\M1\CreateNuclear\CreateNuclearForge/build/createSrgToMcp/output.srg -Dmixin.env.remapRefMap=true -Dnet.minecraftforge.gradle.GradleStart.srg.srg-mcp=C:\Users\TcT_g\Desktop\ynov\M1\CreateNuclear\CreateNuclearForge\build\createSrgToMcp\output.srg --module-path=C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\cpw.mods\bootstraplauncher\1.1.2\c546e00443d8432cda6baa1c860346980742628\bootstraplauncher-1.1.2.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\cpw.mods\securejarhandler\2.1.10\51e6a22c6c716beb11e244bf5b8be480f51dd6b5\securejarhandler-2.1.10.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-commons\9.5\19ab5b5800a3910d30d3a3e64fdb00fd0cb42de0\asm-commons-9.5.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-util\9.5\64b5a1fc8c1b15ed2efd6a063e976bc8d3dc5ffe\asm-util-9.5.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-analysis\9.5\490bacc77de7cbc0be1a30bb3471072d705be4a4\asm-analysis-9.5.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-tree\9.5\fd33c8b6373abaa675be407082fdfda35021254a\asm-tree-9.5.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm\9.5\dc6ea1875f4d64fbc85e1691c95b96a3d8569c90\asm-9.5.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\net.minecraftforge\JarJarFileSystems\0.3.19\2464eb7d6b9ddb9db36a82cf8a95193e5c6fe020\JarJarFileSystems-0.3.19.jar --add-modules=ALL-MODULE-PATH --add-opens=java.base/java.util.jar=cpw.mods.securejarhandler --add-opens=java.base/java.lang.invoke=cpw.mods.securejarhandler --add-exports=java.base/sun.security.util=cpw.mods.securejarhandler --add-exports=jdk.naming.dns/com.sun.jndi.dns=java.naming -XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump --module-path=C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\cpw.mods\bootstraplauncher\1.1.2\c546e00443d8432cda6baa1c860346980742628\bootstraplauncher-1.1.2.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\cpw.mods\securejarhandler\2.1.10\51e6a22c6c716beb11e244bf5b8be480f51dd6b5\securejarhandler-2.1.10.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-commons\9.5\19ab5b5800a3910d30d3a3e64fdb00fd0cb42de0\asm-commons-9.5.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-util\9.5\64b5a1fc8c1b15ed2efd6a063e976bc8d3dc5ffe\asm-util-9.5.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-analysis\9.5\490bacc77de7cbc0be1a30bb3471072d705be4a4\asm-analysis-9.5.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-tree\9.5\fd33c8b6373abaa675be407082fdfda35021254a\asm-tree-9.5.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm\9.5\dc6ea1875f4d64fbc85e1691c95b96a3d8569c90\asm-9.5.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\net.minecraftforge\JarJarFileSystems\0.3.19\2464eb7d6b9ddb9db36a82cf8a95193e5c6fe020\JarJarFileSystems-0.3.19.jar --add-modules=ALL-MODULE-PATH --add-opens=java.base/java.util.jar=cpw.mods.securejarhandler --add-opens=java.base/java.lang.invoke=cpw.mods.securejarhandler --add-exports=java.base/sun.security.util=cpw.mods.securejarhandler --add-exports=jdk.naming.dns/com.sun.jndi.dns=java.naming -XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump -agentlib:jdwp=transport=dt_socket,server=n,suspend=y,address=127.0.0.1:58923 -javaagent:C:\Users\TcT_g\AppData\Local\JetBrains\IntelliJIdea2025.2\captureAgent\debugger-agent.jar=file:///C:/Users/TcT_g/AppData/Local/Temp/capture6757434691262209115.props -Dfile.encoding=UTF-8 -Duser.country=FR -Duser.language=fr -Duser.variant cpw.mods.bootstraplauncher.BootstrapLauncher --launchTarget forgeclientuserdev --version MOD_DEV --assetIndex 5 --assetsDir C:\Users\TcT_g\.gradle\caches\forge_gradle\assets --gameDir . --fml.forgeVersion 47.2.6 --fml.mcVersion 1.20.1 --fml.forgeGroup net.minecraftforge --fml.mcpVersion 20230612.114412 --mixin.config createnuclear.forge.mixins.json - -Host: AMD Ryzen AI 7 350 w/ Radeon 860M , 16 cores, 31G, Windows 11 , 64 bit Build 26100 (10.0.26100.6725) -Time: Wed Nov 26 14:43:23 2025 Paris, Madrid elapsed time: 3.686376 seconds (0d 0h 0m 3s) - ---------------- T H R E A D --------------- - -Current thread (0x000002cd18843d50): JavaThread "main" [_thread_in_native, id=23416, stack(0x000000fc5da00000,0x000000fc5db00000) (1024K)] - -Stack: [0x000000fc5da00000,0x000000fc5db00000], sp=0x000000fc5dafe570, free space=1017k -Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) -C 0x0000000000000008 - -Java frames: (J=compiled Java code, j=interpreted, Vv=VM code) -j org.lwjgl.glfw.GLFW.glfwInit()Z+0 org.lwjgl.glfw@3.3.1+7 -j net.minecraftforge.fml.earlydisplay.DisplayWindow.initWindow(Ljava/lang/String;)V+4 fmlearlydisplay@1.20.1-47.2.6 -j net.minecraftforge.fml.earlydisplay.DisplayWindow.start(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Runnable;+14 fmlearlydisplay@1.20.1-47.2.6 -j net.minecraftforge.fml.earlydisplay.DisplayWindow.initialize([Ljava/lang/String;)Ljava/lang/Runnable;+410 fmlearlydisplay@1.20.1-47.2.6 -j net.minecraftforge.fml.loading.ImmediateWindowHandler.load(Ljava/lang/String;[Ljava/lang/String;)V+180 fmlloader@1.20.1-47.2.6 -j net.minecraftforge.fml.loading.ModDirTransformerDiscoverer.earlyInitialization(Ljava/lang/String;[Ljava/lang/String;)V+2 fmlloader@1.20.1-47.2.6 -j cpw.mods.modlauncher.TransformationServicesHandler.lambda$discoverServices$18(Lcpw/mods/modlauncher/ArgumentHandler$DiscoveryData;Lcpw/mods/modlauncher/serviceapi/ITransformerDiscoveryService;)V+9 cpw.mods.modlauncher@10.0.9 -j cpw.mods.modlauncher.TransformationServicesHandler$$Lambda+0x000002cd41239450.accept(Ljava/lang/Object;)V+8 cpw.mods.modlauncher@10.0.9 -J 2638 c1 java.lang.Iterable.forEach(Ljava/util/function/Consumer;)V java.base@21.0.8 (39 bytes) @ 0x000002cd238d5a1c [0x000002cd238d5720+0x00000000000002fc] -j cpw.mods.modlauncher.TransformationServicesHandler.discoverServices(Lcpw/mods/modlauncher/ArgumentHandler$DiscoveryData;)V+145 cpw.mods.modlauncher@10.0.9 -j cpw.mods.modlauncher.Launcher.run([Ljava/lang/String;)V+14 cpw.mods.modlauncher@10.0.9 -j cpw.mods.modlauncher.Launcher.main([Ljava/lang/String;)V+78 cpw.mods.modlauncher@10.0.9 -j cpw.mods.modlauncher.BootstrapLaunchConsumer.accept([Ljava/lang/String;)V+1 cpw.mods.modlauncher@10.0.9 -j cpw.mods.modlauncher.BootstrapLaunchConsumer.accept(Ljava/lang/Object;)V+5 cpw.mods.modlauncher@10.0.9 -j cpw.mods.bootstraplauncher.BootstrapLauncher.main([Ljava/lang/String;)V+515 cpw.mods.bootstraplauncher@1.1.2 -v ~StubRoutines::call_stub 0x000002cd2a8c10e7 - -siginfo: EXCEPTION_ACCESS_VIOLATION (0xc0000005), data execution prevention violation at address 0x0000000000000008 - - -Registers: -RAX=0x000002cd914aec80, RBX=0x000002cd3ca40620, RCX=0x000002cd18844108, RDX=0x000002cd3ca40620 -RSP=0x000000fc5dafe568, RBP=0x0000000000000002, RSI=0x000000fc5dafe610, RDI=0x000002cd18844108 -R8 =0x0000000000010002, R9 =0x0000000000000000, R10=0x00007ff9d57c0000, R11=0x000000fc5dafe538 -R12=0x0000000000000007, R13=0x000002cd3ca40620, R14=0x00007ff9d21a0300, R15=0x0000000000000000 -RIP=0x0000000000000008, EFLAGS=0x0000000000010206 - -XMM[0]=0x0000000000000000 0x0000000000000000 -XMM[1]=0x0000000000000000 0x0000000000000000 -XMM[2]=0x0000000000000000 0x0000000000000000 -XMM[3]=0x0000000000000000 0x0000000000000000 -XMM[4]=0x0000000000000000 0x0000000000000000 -XMM[5]=0x0000000000000000 0x0000000000000000 -XMM[6]=0x000e178101b4d89f 0x34e63b4167e12cdf -XMM[7]=0xa74594e14f971b4a 0xec33e0a163fa7256 -XMM[8]=0xc5f505e146f075b3 0x54e989ae64a07bb9 -XMM[9]=0x135ef2740d4ca252 0x7390eba50b1b77f3 -XMM[10]=0x043d11cdce7a6327 0x8e8662f20aa274b1 -XMM[11]=0x4c2a58254c2a5825 0x4c2a5825ac508dbe -XMM[12]=0x0000000000000000 0x0000000060263599 -XMM[13]=0x6c09519d6c09519d 0x6c09519d1859df5b -XMM[14]=0x0000000000000000 0x00000000ac508dbe -XMM[15]=0x0000000000000000 0x0000000000000011 - MXCSR=0x00001fa0 - - -Register to memory mapping: - -RAX=0x000002cd914aec80 points into unknown readable memory: 0x0000000000000000 | 00 00 00 00 00 00 00 00 -RBX=0x000002cd3ca40620 points into unknown readable memory: 0x000000060ea974c8 | c8 74 a9 0e 06 00 00 00 -RCX=0x000002cd18844108 points into unknown readable memory: 0x000002cd914aec80 | 80 ec 4a 91 cd 02 00 00 -RDX=0x000002cd3ca40620 points into unknown readable memory: 0x000000060ea974c8 | c8 74 a9 0e 06 00 00 00 -RSP=0x000000fc5dafe568 is pointing into the stack for thread: 0x000002cd18843d50 -RBP=0x0000000000000002 is an unknown value -RSI=0x000000fc5dafe610 is pointing into the stack for thread: 0x000002cd18843d50 -RDI=0x000002cd18844108 points into unknown readable memory: 0x000002cd914aec80 | 80 ec 4a 91 cd 02 00 00 -R8 =0x0000000000010002 is an unknown value -R9 =0x0 is null -R10=0x00007ff9d57c0000 VCRUNTIME140.dll -R11=0x000000fc5dafe538 is pointing into the stack for thread: 0x000002cd18843d50 -R12=0x0000000000000007 is an unknown value -R13=0x000002cd3ca40620 points into unknown readable memory: 0x000000060ea974c8 | c8 74 a9 0e 06 00 00 00 -R14=0x00007ff9d21a0300 jdwp.dll -R15=0x0 is null - -Top of Stack: (sp=0x000000fc5dafe568) -0x000000fc5dafe568: 00007ff9d21861bf 000002cd3ca40620 -0x000000fc5dafe578: 000000fc5dafe610 0000000000000000 -0x000000fc5dafe588: 0000000000000000 000002cd3c95ba30 -0x000000fc5dafe598: 000002cd23470490 000002cd1884cc60 -0x000000fc5dafe5a8: 00007ff9d21a03a0 000002cd18844320 -0x000000fc5dafe5b8: 00007ff9d218283f 000002cd3ca40620 -0x000000fc5dafe5c8: 0000000000000002 000002cd18844108 -0x000000fc5dafe5d8: 000002cd3ca40628 000002cd3f92bde0 -0x000000fc5dafe5e8: 00007ff874af8ec5 00000000000002cd -0x000000fc5dafe5f8: 000000fc5dafe780 0000000000000000 -0x000000fc5dafe608: 0000000bffffffff 0000000000000007 -0x000000fc5dafe618: 000002cd3ca40620 0000000000000000 -0x000000fc5dafe628: 000002cd3ca40628 0000000000000000 -0x000000fc5dafe638: 0000000000000000 0000000000000000 -0x000000fc5dafe648: 0000000000000000 0000000000000000 -0x000000fc5dafe658: 0000000000000000 0000000000000000 -0x000000fc5dafe668: 000002cd18844320 000002cd4128cf60 -0x000000fc5dafe678: 00007ff874dec3f7 000002cd3ca40628 -0x000000fc5dafe688: 000002cd3fb1b300 000002cd18843d50 -0x000000fc5dafe698: 00000000000003d8 0000000000000000 -0x000000fc5dafe6a8: 000002cd1ad8e450 000000fc5dafe820 -0x000000fc5dafe6b8: 0000000000000005 000002cd4128cf60 -0x000000fc5dafe6c8: 000002cd822f2dc0 0000338c96f7c239 -0x000000fc5dafe6d8: 000002cd40611e50 000002cd18823960 -0x000000fc5dafe6e8: 000002cd188443b0 000002cd188443c0 -0x000000fc5dafe6f8: 000002cd18844798 00000000000003d8 -0x000000fc5dafe708: 000002cd18843d50 000002cd18843d50 -0x000000fc5dafe718: 000002cd18823aa0 000002cd18831c30 -0x000000fc5dafe728: 000002cd18831c48 000002cd18831d18 -0x000000fc5dafe738: 00000000000000d8 000000fc5dafe750 -0x000000fc5dafe748: 00007ff874f00133 000002cd18843d50 -0x000000fc5dafe758: 000002cd18823aa0 000002cd18831c30 - -Instructions: (pc=0x00007ff9d21861bf) -0x00007ff9d21860bf: 2c 41 b8 61 02 00 00 48 8d 0d 83 6e 01 00 48 8b -0x00007ff9d21860cf: d3 e8 37 50 00 00 41 8b cc e8 37 a0 ff ff 48 8b -0x00007ff9d21860df: d0 48 8d 0d f9 a3 01 00 e8 c8 50 00 00 4c 8b 4e -0x00007ff9d21860ef: 28 48 8d 0d 01 a4 01 00 4c 8b 46 20 48 8b 56 08 -0x00007ff9d21860ff: e8 d4 0c 01 00 48 8b 05 f5 0f 02 00 f6 80 10 02 -0x00007ff9d218610f: 00 00 02 74 28 41 b8 6a 02 00 00 48 8d 0d cf 62 -0x00007ff9d218611f: 01 00 48 8b d3 e8 e3 4f 00 00 48 8d 15 b8 63 01 -0x00007ff9d218612f: 00 48 8d 0d d1 62 01 00 e8 78 50 00 00 48 8b 07 -0x00007ff9d218613f: 48 8b cf ff 50 78 48 8b 0d b4 0f 02 00 4c 8b f8 -0x00007ff9d218614f: f6 81 10 02 00 00 02 74 28 41 b8 6b 02 00 00 48 -0x00007ff9d218615f: 8d 0d 8b 62 01 00 48 8b d3 e8 9f 4f 00 00 48 8d -0x00007ff9d218616f: 15 ac 63 01 00 48 8d 0d 8d 62 01 00 e8 34 50 00 -0x00007ff9d218617f: 00 48 8b 07 48 8b cf ff 90 88 00 00 00 83 3d 29 -0x00007ff9d218618f: 0b 02 00 00 76 0c e8 d6 5b ff ff 83 25 1b 0b 02 -0x00007ff9d218619f: 00 00 48 8b 5e 08 48 85 db 74 4b 48 8b 05 4f 0f -0x00007ff9d21861af: 02 00 80 78 13 00 74 0b 48 8b cb e8 7d 06 01 00 -0x00007ff9d21861bf: 88 46 10 4d 8b c7 48 8b d6 41 8a ce e8 a0 a0 00 -0x00007ff9d21861cf: 00 48 8b e8 48 85 c0 75 25 48 8b cb e8 7c 44 00 -0x00007ff9d21861df: 00 84 c0 0f 84 ea 00 00 00 48 8b d3 41 8a ce e8 -0x00007ff9d21861ef: 8d 13 00 00 eb e3 e8 ee 0d 00 00 48 8b e8 4c 8b -0x00007ff9d21861ff: cd 44 88 74 24 20 45 8b c4 48 8b d6 48 8b cf e8 -0x00007ff9d218620f: e1 00 00 00 83 3e 14 75 0b 48 8b 05 e1 0e 02 00 -0x00007ff9d218621f: c6 40 10 01 48 85 db 75 08 48 8b cd e8 14 53 ff -0x00007ff9d218622f: ff 48 8b 05 c9 0e 02 00 4d 85 ff 74 43 f6 80 10 -0x00007ff9d218623f: 02 00 00 02 74 2c 41 b8 b3 02 00 00 48 8d 15 4e -0x00007ff9d218624f: a1 01 00 48 8d 0d 97 61 01 00 e8 ae 4e 00 00 48 -0x00007ff9d218625f: 8d 15 9b 7c 01 00 48 8d 0d 9c 61 01 00 e8 43 4f -0x00007ff9d218626f: 00 00 48 8b 07 49 8b d7 48 8b cf ff 50 68 eb 41 -0x00007ff9d218627f: f6 80 10 02 00 00 02 74 2c 41 b8 b5 02 00 00 48 -0x00007ff9d218628f: 8d 15 0b a1 01 00 48 8d 0d 54 61 01 00 e8 6b 4e -0x00007ff9d218629f: 00 00 48 8d 15 78 62 01 00 48 8d 0d 59 61 01 00 -0x00007ff9d21862af: e8 00 4f 00 00 48 8b 07 48 8b cf ff 90 88 00 00 - - -Stack slot to memory mapping: - -stack at sp + 0 slots: 0x000002cd3ca40620 points into unknown readable memory: 0x000000060ea974c8 | c8 74 a9 0e 06 00 00 00 -stack at sp + 1 slots: 0x000000fc5dafe610 is pointing into the stack for thread: 0x000002cd18843d50 -stack at sp + 2 slots: 0x0 is null -stack at sp + 3 slots: 0x0 is null -stack at sp + 4 slots: 0x000002cd3c95ba30 points into unknown readable memory: 0x000002cd1884cbf0 | f0 cb 84 18 cd 02 00 00 -stack at sp + 5 slots: 0x000002cd23470490 is at entry_point+-400 in (nmethod*)0x000002cd23470490 -Compiled method (c1) 3714 1 3 java.lang.Object:: (1 bytes) - total in heap [0x000002cd23470490,0x000002cd23470780] = 752 - relocation [0x000002cd234705f0,0x000002cd23470620] = 48 - main code [0x000002cd23470620,0x000002cd234706f0] = 208 - stub code [0x000002cd234706f0,0x000002cd23470728] = 56 - metadata [0x000002cd23470728,0x000002cd23470738] = 16 - scopes data [0x000002cd23470738,0x000002cd23470748] = 16 - scopes pcs [0x000002cd23470748,0x000002cd23470778] = 48 - dependencies [0x000002cd23470778,0x000002cd23470780] = 8 -stack at sp + 6 slots: 0x000002cd1884cc60 points into unknown readable memory: 0x8000001500000001 | 01 00 00 00 15 00 00 80 -stack at sp + 7 slots: 0x00007ff9d21a03a0 jdwp.dll - - -Compiled method (c1) 3717 2638 3 java.lang.Iterable::forEach (39 bytes) - total in heap [0x000002cd238d5510,0x000002cd238d5f38] = 2600 - relocation [0x000002cd238d5670,0x000002cd238d5720] = 176 - main code [0x000002cd238d5720,0x000002cd238d5cd8] = 1464 - stub code [0x000002cd238d5cd8,0x000002cd238d5d60] = 136 - metadata [0x000002cd238d5d60,0x000002cd238d5d70] = 16 - scopes data [0x000002cd238d5d70,0x000002cd238d5e18] = 168 - scopes pcs [0x000002cd238d5e18,0x000002cd238d5f18] = 256 - dependencies [0x000002cd238d5f18,0x000002cd238d5f20] = 8 - nul chk table [0x000002cd238d5f20,0x000002cd238d5f38] = 24 - -[Constant Pool (empty)] - -[MachCode] -[Entry Point] - # {method} {0x000002cd400599e8} 'forEach' '(Ljava/util/function/Consumer;)V' in 'java/lang/Iterable' - # this: rdx:rdx = 'java/lang/Iterable' - # parm0: r8:r8 = 'java/util/function/Consumer' - # [sp+0x70] (sp of caller) - 0x000002cd238d5720: 448b 5208 | 49bb 0000 | 0040 cd02 | 0000 4d03 | d34c 3bd0 - - 0x000002cd238d5734: ; {runtime_call ic_miss_stub} - 0x000002cd238d5734: 0f85 4692 | 0307 660f | 1f44 0000 -[Verified Entry Point] - 0x000002cd238d5740: 8984 2400 | 80ff ff55 | 4883 ec60 | 4181 7f20 | 0100 0000 - - 0x000002cd238d5754: ; {runtime_call StubRoutines (final stubs)} - 0x000002cd238d5754: 7405 e865 | 9504 0748 | 8954 2438 | 4c89 4424 - - 0x000002cd238d5764: ; {metadata(method data for {method} {0x000002cd400599e8} 'forEach' '(Ljava/util/function/Consumer;)V' in 'java/lang/Iterable')} - 0x000002cd238d5764: 3048 be18 | 956a 81cd | 0200 008b | becc 0000 | 0083 c702 | 89be cc00 | 0000 81e7 | fe07 0000 - 0x000002cd238d5784: 85ff 0f84 | 7504 0000 - - 0x000002cd238d578c: ; {metadata(method data for {method} {0x000002cd400599e8} 'forEach' '(Ljava/util/function/Consumer;)V' in 'java/lang/Iterable')} - 0x000002cd238d578c: 48be 1895 | 6a81 cd02 | 0000 4883 | 8610 0100 - - 0x000002cd238d579c: ; {metadata(method data for {method} {0x000002cd40057168} 'requireNonNull' '(Ljava/lang/Object;)Ljava/lang/Object;' in 'java/util/Objects')} - 0x000002cd238d579c: 0001 48be | b814 0181 | cd02 0000 | 8bbe cc00 | 0000 83c7 | 0289 becc | 0000 0081 | e7fe ff1f - 0x000002cd238d57bc: 0085 ff0f | 845d 0400 | 004d 85c0 - - 0x000002cd238d57c8: ; {metadata(method data for {method} {0x000002cd40057168} 'requireNonNull' '(Ljava/lang/Object;)Ljava/lang/Object;' in 'java/util/Objects')} - 0x000002cd238d57c8: 48be b814 | 0181 cd02 | 0000 48c7 | c720 0100 | 0074 0748 | c7c7 1001 | 0000 488b | 1c3e 488d - 0x000002cd238d57e8: 5b01 4889 | 1c3e 0f84 | 6903 0000 - - 0x000002cd238d57f4: ; {metadata(method data for {method} {0x000002cd400599e8} 'forEach' '(Ljava/util/function/Consumer;)V' in 'java/lang/Iterable')} - 0x000002cd238d57f4: 488b f248 | bf18 956a | 81cd 0200 | 008b 7608 | 49ba 0000 | 0040 cd02 | 0000 4903 | f248 3bb7 - 0x000002cd238d5814: 3001 0000 | 750d 4883 | 8738 0100 | 0001 e960 | 0000 0048 | 3bb7 4001 | 0000 750d | 4883 8748 - 0x000002cd238d5834: 0100 0001 | e94a 0000 | 0048 83bf | 3001 0000 | 0075 1748 | 89b7 3001 | 0000 48c7 | 8738 0100 - 0x000002cd238d5854: 0001 0000 | 00e9 2900 | 0000 4883 | bf40 0100 | 0000 7517 | 4889 b740 | 0100 0048 | c787 4801 - 0x000002cd238d5874: 0000 0100 | 0000 e908 | 0000 0048 | 8387 2001 | 0000 0148 | 8bf2 488b | d648 b8a0 | 39bf 8bcd - 0x000002cd238d5894: ; {virtual_call} - 0x000002cd238d5894: 0200 00e8 - - 0x000002cd238d5898: ; ImmutableOopMap {[48]=Oop [56]=Oop } - ;*invokeinterface iterator {reexecute=0 rethrow=0 return_oop=0} - ; - java.lang.Iterable::forEach@6 (line 74) - 0x000002cd238d5898: f4b3 1b07 - - 0x000002cd238d589c: ; {other} - 0x000002cd238d589c: 0f1f 8400 | 8c03 0000 | 4889 4424 | 40e9 bc01 | 0000 6690 | 488b 4424 - - 0x000002cd238d58b4: ; {metadata(method data for {method} {0x000002cd400599e8} 'forEach' '(Ljava/util/function/Consumer;)V' in 'java/lang/Iterable')} - 0x000002cd238d58b4: 4048 ba18 | 956a 81cd | 0200 008b | 4008 49ba | 0000 0040 | cd02 0000 | 4903 c248 | 3b82 c001 - 0x000002cd238d58d4: 0000 750d | 4883 82c8 | 0100 0001 | e960 0000 | 0048 3b82 | d001 0000 | 750d 4883 | 82d8 0100 - 0x000002cd238d58f4: 0001 e94a | 0000 0048 | 83ba c001 | 0000 0075 | 1748 8982 | c001 0000 | 48c7 82c8 | 0100 0001 - 0x000002cd238d5914: 0000 00e9 | 2900 0000 | 4883 bad0 | 0100 0000 | 7517 4889 | 82d0 0100 | 0048 c782 | d801 0000 - 0x000002cd238d5934: 0100 0000 | e908 0000 | 0048 8382 | b001 0000 | 0148 8b54 | 2440 6666 | 9048 b800 | 34bf 8bcd - 0x000002cd238d5954: ; {virtual_call} - 0x000002cd238d5954: 0200 00e8 - - 0x000002cd238d5958: ; ImmutableOopMap {[48]=Oop [56]=Oop [64]=Oop } - ;*invokeinterface next {reexecute=0 rethrow=0 return_oop=0} - ; - java.lang.Iterable::forEach@22 (line 74) - 0x000002cd238d5958: b4b5 1b07 - - 0x000002cd238d595c: ; {other} - 0x000002cd238d595c: 0f1f 8400 | 4c04 0001 | 4c8b 4424 | 3049 3b00 - - 0x000002cd238d596c: ; {metadata(method data for {method} {0x000002cd400599e8} 'forEach' '(Ljava/util/function/Consumer;)V' in 'java/lang/Iterable')} - 0x000002cd238d596c: 498b d048 | be18 956a | 81cd 0200 | 008b 5208 | 49ba 0000 | 0040 cd02 | 0000 4903 | d248 3b96 - 0x000002cd238d598c: f801 0000 | 750d 4883 | 8600 0200 | 0001 e960 | 0000 0048 | 3b96 0802 | 0000 750d | 4883 8610 - 0x000002cd238d59ac: 0200 0001 | e94a 0000 | 0048 83be | f801 0000 | 0075 1748 | 8996 f801 | 0000 48c7 | 8600 0200 - 0x000002cd238d59cc: 0001 0000 | 00e9 2900 | 0000 4883 | be08 0200 | 0000 7517 | 4889 9608 | 0200 0048 | c786 1002 - 0x000002cd238d59ec: 0000 0100 | 0000 e908 | 0000 0048 | 8386 e801 | 0000 0149 | 8bf0 4c8b | c048 8bd6 | 4889 4424 - 0x000002cd238d5a0c: 4848 b850 | dda3 8acd - - 0x000002cd238d5a14: ; {virtual_call} - 0x000002cd238d5a14: 0200 00e8 - - 0x000002cd238d5a18: ; ImmutableOopMap {[48]=Oop [56]=Oop [64]=Oop [72]=Oop } - ;*invokeinterface accept {reexecute=0 rethrow=0 return_oop=0} - ; - java.lang.Iterable::forEach@30 (line 75) - 0x000002cd238d5a18: 74b2 1b07 - - 0x000002cd238d5a1c: ; {other} - 0x000002cd238d5a1c: 0f1f 8400 | 0c05 0002 - - 0x000002cd238d5a24: ; {metadata(method data for {method} {0x000002cd400599e8} 'forEach' '(Ljava/util/function/Consumer;)V' in 'java/lang/Iterable')} - 0x000002cd238d5a24: 48ba 1895 | 6a81 cd02 | 0000 8bb2 | d000 0000 | 83c6 0289 | b2d0 0000 | 0081 e6fe | 3f00 0085 - 0x000002cd238d5a44: f60f 84fd | 0100 004d | 8b97 5004 - - 0x000002cd238d5a50: ; ImmutableOopMap {[48]=Oop [56]=Oop [64]=Oop [72]=Oop } - ;*goto {reexecute=1 rethrow=0 return_oop=0} - ; - (reexecute) java.lang.Iterable::forEach@35 (line 76) - ; {poll} - 0x000002cd238d5a50: 0000 4185 - - 0x000002cd238d5a54: ; {metadata(method data for {method} {0x000002cd400599e8} 'forEach' '(Ljava/util/function/Consumer;)V' in 'java/lang/Iterable')} - 0x000002cd238d5a54: 0248 ba18 | 956a 81cd | 0200 00ff | 8220 0200 | 0048 8b44 | 2440 483b | 0048 8bd0 - - 0x000002cd238d5a70: ; {metadata(method data for {method} {0x000002cd400599e8} 'forEach' '(Ljava/util/function/Consumer;)V' in 'java/lang/Iterable')} - 0x000002cd238d5a70: 48be 1895 | 6a81 cd02 | 0000 8b52 | 0849 ba00 | 0000 40cd | 0200 0049 | 03d2 483b | 9668 0100 - 0x000002cd238d5a90: 0075 0d48 | 8386 7001 | 0000 01e9 | 6000 0000 | 483b 9678 | 0100 0075 | 0d48 8386 | 8001 0000 - 0x000002cd238d5ab0: 01e9 4a00 | 0000 4883 | be68 0100 | 0000 7517 | 4889 9668 | 0100 0048 | c786 7001 | 0000 0100 - 0x000002cd238d5ad0: 0000 e929 | 0000 0048 | 83be 7801 | 0000 0075 | 1748 8996 | 7801 0000 | 48c7 8680 | 0100 0001 - 0x000002cd238d5af0: 0000 00e9 | 0800 0000 | 4883 8658 | 0100 0001 | 488b d066 | 9048 b850 | 3ebf 8bcd - - 0x000002cd238d5b0c: ; {virtual_call} - 0x000002cd238d5b0c: 0200 00e8 - - 0x000002cd238d5b10: ; ImmutableOopMap {[48]=Oop [56]=Oop [64]=Oop } - ;*invokeinterface hasNext {reexecute=0 rethrow=0 return_oop=0} - ; - java.lang.Iterable::forEach@13 (line 74) - 0x000002cd238d5b10: 8cb2 1b07 - - 0x000002cd238d5b14: ; {other} - 0x000002cd238d5b14: 0f1f 8400 | 0406 0004 - - 0x000002cd238d5b1c: ; {metadata(method data for {method} {0x000002cd400599e8} 'forEach' '(Ljava/util/function/Consumer;)V' in 'java/lang/Iterable')} - 0x000002cd238d5b1c: 85c0 48ba | 1895 6a81 | cd02 0000 | 48c7 c6a0 | 0100 0075 | 0748 c7c6 | 9001 0000 | 488b 3c32 - 0x000002cd238d5b3c: 488d 7f01 | 4889 3c32 | 0f85 66fd | ffff 4883 - - 0x000002cd238d5b4c: ; {poll_return} - 0x000002cd238d5b4c: c460 5d49 | 3ba7 4804 | 0000 0f87 | 1201 0000 | c366 6690 - - 0x000002cd238d5b60: ; {no_reloc} - 0x000002cd238d5b60: e92e 0100 | 0000 0000 | 0000 498b | 87b8 0100 | 0048 8d78 | 3049 3bbf | c801 0000 | 0f87 1b01 - 0x000002cd238d5b80: 0000 4989 | bfb8 0100 | 0048 c700 | 0100 0000 | 488b ca49 | ba00 0000 | 40cd 0200 | 0049 2bca - 0x000002cd238d5ba0: 8948 0848 | 33c9 8948 | 0c48 33c9 | 4889 4810 | 4889 4818 | 4889 4820 | 4889 4828 - - 0x000002cd238d5bbc: ; {metadata(method data for {method} {0x000002cd40057168} 'requireNonNull' '(Ljava/lang/Object;)Ljava/lang/Object;' in 'java/util/Objects')} - 0x000002cd238d5bbc: 488b d048 | beb8 1401 | 81cd 0200 | 0048 8386 | 3001 0000 | 0148 8bd0 | 4889 4424 | 5066 0f1f - 0x000002cd238d5bdc: ; {optimized virtual_call} - 0x000002cd238d5bdc: 4400 00e8 - - 0x000002cd238d5be0: ; ImmutableOopMap {[48]=Oop [56]=Oop [80]=Oop } - ;*invokespecial {reexecute=0 rethrow=0 return_oop=0} - ; - java.util.Objects::requireNonNull@8 (line 233) - ; - java.lang.Iterable::forEach@1 (line 73) - 0x000002cd238d5be0: 9c92 0307 - - 0x000002cd238d5be4: ; {other} - 0x000002cd238d5be4: 0f1f 8400 | d406 0005 | 488b 4424 - - 0x000002cd238d5bf0: ; ImmutableOopMap {rax=Oop [48]=Oop [56]=Oop } - ;*athrow {reexecute=1 rethrow=0 return_oop=0} - ; - (reexecute) java.util.Objects::requireNonNull@11 (line 233) - ; - java.lang.Iterable::forEach@1 (line 73) - ; {section_word} - 0x000002cd238d5bf0: 5048 baf1 | 5b8d 23cd - - 0x000002cd238d5bf8: ; {runtime_call handle_exception_nofpu Runtime1 stub} - 0x000002cd238d5bf8: 0200 00e8 | 801c 1207 - - 0x000002cd238d5c00: ; {metadata({method} {0x000002cd400599e8} 'forEach' '(Ljava/util/function/Consumer;)V' in 'java/lang/Iterable')} - 0x000002cd238d5c00: 9049 bae0 | 9905 40cd | 0200 004c | 8954 2408 | 48c7 0424 | ffff ffff - - 0x000002cd238d5c18: ; {runtime_call counter_overflow Runtime1 stub} - 0x000002cd238d5c18: e8e3 6512 - - 0x000002cd238d5c1c: ; ImmutableOopMap {rdx=Oop r8=Oop [48]=Oop [56]=Oop } - ;*synchronization entry - ; - java.lang.Iterable::forEach@-1 (line 73) - 0x000002cd238d5c1c: 07e9 6afb - - 0x000002cd238d5c20: ; {metadata({method} {0x000002cd40057168} 'requireNonNull' '(Ljava/lang/Object;)Ljava/lang/Object;' in 'java/util/Objects')} - 0x000002cd238d5c20: ffff 49ba | 6071 0540 | cd02 0000 | 4c89 5424 | 0848 c704 | 24ff ffff - - 0x000002cd238d5c38: ; {runtime_call counter_overflow Runtime1 stub} - 0x000002cd238d5c38: ffe8 c265 - - 0x000002cd238d5c3c: ; ImmutableOopMap {rdx=Oop r8=Oop [48]=Oop [56]=Oop } - ;*synchronization entry - ; - java.util.Objects::requireNonNull@-1 (line 232) - ; - java.lang.Iterable::forEach@1 (line 73) - 0x000002cd238d5c3c: 1207 e982 - - 0x000002cd238d5c40: ; {runtime_call throw_null_pointer_exception Runtime1 stub} - 0x000002cd238d5c40: fbff ffe8 - - 0x000002cd238d5c44: ; ImmutableOopMap {rax=Oop r8=Oop [48]=Oop [56]=Oop [64]=Oop } - ;*invokeinterface accept {reexecute=0 rethrow=0 return_oop=0} - ; - java.lang.Iterable::forEach@30 (line 75) - 0x000002cd238d5c44: 58eb 1107 - - 0x000002cd238d5c48: ; {metadata({method} {0x000002cd400599e8} 'forEach' '(Ljava/util/function/Consumer;)V' in 'java/lang/Iterable')} - 0x000002cd238d5c48: 49ba e099 | 0540 cd02 | 0000 4c89 | 5424 0848 | c704 2423 - - 0x000002cd238d5c5c: ; {runtime_call counter_overflow Runtime1 stub} - 0x000002cd238d5c5c: 0000 00e8 - - 0x000002cd238d5c60: ; ImmutableOopMap {[48]=Oop [56]=Oop [64]=Oop [72]=Oop } - ;*goto {reexecute=1 rethrow=0 return_oop=0} - ; - (reexecute) java.lang.Iterable::forEach@35 (line 76) - 0x000002cd238d5c60: 9c65 1207 | e9e2 fdff - - 0x000002cd238d5c68: ; {runtime_call throw_null_pointer_exception Runtime1 stub} - 0x000002cd238d5c68: ffe8 32eb - - 0x000002cd238d5c6c: ; ImmutableOopMap {rax=Oop [48]=Oop [56]=Oop [64]=Oop } - ;*invokeinterface hasNext {reexecute=0 rethrow=0 return_oop=0} - ; - java.lang.Iterable::forEach@13 (line 74) - ; {internal_word} - 0x000002cd238d5c6c: 1107 49ba | 4f5b 8d23 | cd02 0000 | 4d89 9760 - - 0x000002cd238d5c7c: ; {runtime_call SafepointBlob} - 0x000002cd238d5c7c: 0400 00e9 | fc0e 0407 - - 0x000002cd238d5c84: ; {metadata(nullptr)} - 0x000002cd238d5c84: 48ba 0000 | 0000 0000 | 0000 b800 - - 0x000002cd238d5c90: ; {runtime_call load_klass_patching Runtime1 stub} - 0x000002cd238d5c90: 0f05 0ae8 - - 0x000002cd238d5c94: ; ImmutableOopMap {[48]=Oop [56]=Oop } - ;*new {reexecute=1 rethrow=0 return_oop=0} - ; - (reexecute) java.util.Objects::requireNonNull@4 (line 233) - ; - java.lang.Iterable::forEach@1 (line 73) - 0x000002cd238d5c94: e848 1207 | e9c3 feff | ff48 8bd2 - - 0x000002cd238d5ca0: ; {runtime_call fast_new_instance Runtime1 stub} - 0x000002cd238d5ca0: e8db 0112 - - 0x000002cd238d5ca4: ; ImmutableOopMap {[48]=Oop [56]=Oop } - ;*new {reexecute=0 rethrow=0 return_oop=0} - ; - java.util.Objects::requireNonNull@4 (line 233) - ; - java.lang.Iterable::forEach@1 (line 73) - 0x000002cd238d5ca4: 07e9 12ff | ffff 498b | 87f8 0400 | 0049 c787 | f804 0000 | 0000 0000 | 49c7 8700 | 0500 0000 - 0x000002cd238d5cc4: 0000 0048 | 83c4 605d - - 0x000002cd238d5ccc: ; {runtime_call unwind_exception Runtime1 stub} - 0x000002cd238d5ccc: e9af c911 | 07f4 f4f4 | f4f4 f4f4 -[Stub Code] - 0x000002cd238d5cd8: ; {no_reloc} - 0x000002cd238d5cd8: 0f1f 4400 - - 0x000002cd238d5cdc: ; {static_stub} - 0x000002cd238d5cdc: 0048 bb00 | 0000 0000 - - 0x000002cd238d5ce4: ; {runtime_call nmethod} - 0x000002cd238d5ce4: 0000 00e9 | fbff ffff - - 0x000002cd238d5cec: ; {static_stub} - 0x000002cd238d5cec: 9048 bb00 | 0000 0000 - - 0x000002cd238d5cf4: ; {runtime_call nmethod} - 0x000002cd238d5cf4: 0000 00e9 | fbff ffff - - 0x000002cd238d5cfc: ; {static_stub} - 0x000002cd238d5cfc: 9048 bb00 | 0000 0000 - - 0x000002cd238d5d04: ; {runtime_call nmethod} - 0x000002cd238d5d04: 0000 00e9 | fbff ffff - - 0x000002cd238d5d0c: ; {static_stub} - 0x000002cd238d5d0c: 9048 bb00 | 0000 0000 - - 0x000002cd238d5d14: ; {runtime_call nmethod} - 0x000002cd238d5d14: 0000 00e9 | fbff ffff - - 0x000002cd238d5d1c: ; {static_stub} - 0x000002cd238d5d1c: 48bb 0000 | 0000 0000 - - 0x000002cd238d5d24: ; {runtime_call nmethod} - 0x000002cd238d5d24: 0000 e9fb - - 0x000002cd238d5d28: ; {runtime_call handle_exception_from_callee Runtime1 stub} - 0x000002cd238d5d28: ffff ffe8 | 5022 1207 - - 0x000002cd238d5d30: ; {external_word} - 0x000002cd238d5d30: 48b9 90e2 | 2575 f87f | 0000 4883 - - 0x000002cd238d5d3c: ; {runtime_call} - 0x000002cd238d5d3c: e4f0 48b8 | 1079 e874 | f87f 0000 - - 0x000002cd238d5d48: ; {section_word} - 0x000002cd238d5d48: ffd0 f449 | ba4b 5d8d | 23cd 0200 - - 0x000002cd238d5d54: ; {runtime_call DeoptimizationBlob} - 0x000002cd238d5d54: 0041 52e9 | c422 0407 | f4f4 f4f4 -[/MachCode] - - ---------------- P R O C E S S --------------- - -Threads class SMR info: -_java_thread_list=0x000002cd8f5c2b60, length=25, elements={ -0x000002cd18843d50, 0x000002cd3ca5a6c0, 0x000002cd3ca5b110, 0x000002cd3ca601b0, -0x000002cd3ca611f0, 0x000002cd3ca61fa0, 0x000002cd3ca629f0, 0x000002cd3ca6f8d0, -0x000002cd3ca73ac0, 0x000002cd3ca9c770, 0x000002cd3f9f0980, 0x000002cd3fa845e0, -0x000002cd3fc04350, 0x000002cd3fba3b50, 0x000002cd3fc065d0, 0x000002cd3fc75fe0, -0x000002cd3fbd3540, 0x000002cd8525f610, 0x000002cd85372210, 0x000002cd8588fde0, -0x000002cd85dbd8c0, 0x000002cd85ea5070, 0x000002cd85e9bf00, 0x000002cd85ca75f0, -0x000002cd85b0a740 -} - -Java Threads: ( => current thread ) -=>0x000002cd18843d50 JavaThread "main" [_thread_in_native, id=23416, stack(0x000000fc5da00000,0x000000fc5db00000) (1024K)] - 0x000002cd3ca5a6c0 JavaThread "Reference Handler" daemon [_thread_blocked, id=25248, stack(0x000000fc5e200000,0x000000fc5e300000) (1024K)] - 0x000002cd3ca5b110 JavaThread "Finalizer" daemon [_thread_blocked, id=5336, stack(0x000000fc5e300000,0x000000fc5e400000) (1024K)] - 0x000002cd3ca601b0 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=11384, stack(0x000000fc5e400000,0x000000fc5e500000) (1024K)] - 0x000002cd3ca611f0 JavaThread "Attach Listener" daemon [_thread_blocked, id=27632, stack(0x000000fc5e500000,0x000000fc5e600000) (1024K)] - 0x000002cd3ca61fa0 JavaThread "Service Thread" daemon [_thread_blocked, id=13388, stack(0x000000fc5e600000,0x000000fc5e700000) (1024K)] - 0x000002cd3ca629f0 JavaThread "Monitor Deflation Thread" daemon [_thread_blocked, id=26172, stack(0x000000fc5e700000,0x000000fc5e800000) (1024K)] - 0x000002cd3ca6f8d0 JavaThread "C2 CompilerThread0" daemon [_thread_in_native, id=20612, stack(0x000000fc5e800000,0x000000fc5e900000) (1024K)] - 0x000002cd3ca73ac0 JavaThread "C1 CompilerThread0" daemon [_thread_blocked, id=19120, stack(0x000000fc5e900000,0x000000fc5ea00000) (1024K)] - 0x000002cd3ca9c770 JavaThread "C1 CompilerThread1" daemon [_thread_blocked, id=12212, stack(0x000000fc5ea00000,0x000000fc5eb00000) (1024K)] - 0x000002cd3f9f0980 JavaThread "Common-Cleaner" daemon [_thread_blocked, id=24772, stack(0x000000fc5eb00000,0x000000fc5ec00000) (1024K)] - 0x000002cd3fa845e0 JavaThread "C1 CompilerThread2" daemon [_thread_blocked, id=19904, stack(0x000000fc5ec00000,0x000000fc5ed00000) (1024K)] - 0x000002cd3fc04350 JavaThread "JDWP Transport Listener: dt_socket" daemon [_thread_blocked, id=6184, stack(0x000000fc5ef00000,0x000000fc5f000000) (1024K)] - 0x000002cd3fba3b50 JavaThread "JDWP Event Helper Thread" daemon [_thread_blocked, id=22384, stack(0x000000fc5f000000,0x000000fc5f100000) (1024K)] - 0x000002cd3fc065d0 JavaThread "JDWP Command Reader" daemon [_thread_in_native, id=23336, stack(0x000000fc5f100000,0x000000fc5f200000) (1024K)] - 0x000002cd3fc75fe0 JavaThread "IntelliJ Suspend Helper" daemon [_thread_blocked, id=23388, stack(0x000000fc5ed00000,0x000000fc5ee00000) (1024K)] - 0x000002cd3fbd3540 JavaThread "Notification Thread" daemon [_thread_blocked, id=12280, stack(0x000000fc5ee00000,0x000000fc5ef00000) (1024K)] - 0x000002cd8525f610 JavaThread "C2 CompilerThread1" daemon [_thread_blocked, id=25304, stack(0x000000fc5f200000,0x000000fc5f300000) (1024K)] - 0x000002cd85372210 JavaThread "C2 CompilerThread2" daemon [_thread_blocked, id=18208, stack(0x000000fc5f300000,0x000000fc5f400000) (1024K)] - 0x000002cd8588fde0 JavaThread "C1 CompilerThread3" daemon [_thread_blocked, id=15436, stack(0x000000fc5ff00000,0x000000fc60000000) (1024K)] - 0x000002cd85dbd8c0 JavaThread "C2 CompilerThread3" daemon [_thread_blocked, id=1076, stack(0x000000fc60000000,0x000000fc60100000) (1024K)] - 0x000002cd85ea5070 JavaThread "C2 CompilerThread4" daemon [_thread_blocked, id=25664, stack(0x000000fc60100000,0x000000fc60200000) (1024K)] - 0x000002cd85e9bf00 JavaThread "C2 CompilerThread5" daemon [_thread_in_native, id=24456, stack(0x000000fc60200000,0x000000fc60300000) (1024K)] - 0x000002cd85ca75f0 JavaThread "C2 CompilerThread6" daemon [_thread_blocked, id=23260, stack(0x000000fc60300000,0x000000fc60400000) (1024K)] - 0x000002cd85b0a740 JavaThread "C2 CompilerThread7" daemon [_thread_blocked, id=26800, stack(0x000000fc60400000,0x000000fc60500000) (1024K)] -Total: 25 - -Other Threads: - 0x000002cd3ca3d5b0 VMThread "VM Thread" [id=26936, stack(0x000000fc5e100000,0x000000fc5e200000) (1024K)] - 0x000002cd3f9117b0 WatcherThread "VM Periodic Task Thread" [id=8988, stack(0x000000fc5e000000,0x000000fc5e100000) (1024K)] - 0x000002cd3c8df4b0 WorkerThread "GC Thread#0" [id=23352, stack(0x000000fc5db00000,0x000000fc5dc00000) (1024K)] - 0x000002cd858a49b0 WorkerThread "GC Thread#1" [id=24496, stack(0x000000fc5f400000,0x000000fc5f500000) (1024K)] - 0x000002cd858cc5f0 WorkerThread "GC Thread#2" [id=23976, stack(0x000000fc5f500000,0x000000fc5f600000) (1024K)] - 0x000002cd858cc990 WorkerThread "GC Thread#3" [id=24628, stack(0x000000fc5f600000,0x000000fc5f700000) (1024K)] - 0x000002cd858ccd30 WorkerThread "GC Thread#4" [id=25432, stack(0x000000fc5f700000,0x000000fc5f800000) (1024K)] - 0x000002cd858cbeb0 WorkerThread "GC Thread#5" [id=19584, stack(0x000000fc5f800000,0x000000fc5f900000) (1024K)] - 0x000002cd858cbb10 WorkerThread "GC Thread#6" [id=9052, stack(0x000000fc5f900000,0x000000fc5fa00000) (1024K)] - 0x000002cd858cb3d0 WorkerThread "GC Thread#7" [id=20212, stack(0x000000fc5fa00000,0x000000fc5fb00000) (1024K)] - 0x000002cd858cc250 WorkerThread "GC Thread#8" [id=9424, stack(0x000000fc5fb00000,0x000000fc5fc00000) (1024K)] - 0x000002cd858cb770 WorkerThread "GC Thread#9" [id=25420, stack(0x000000fc5fc00000,0x000000fc5fd00000) (1024K)] - 0x000002cd858fc280 WorkerThread "GC Thread#10" [id=27420, stack(0x000000fc5fd00000,0x000000fc5fe00000) (1024K)] - 0x000002cd858fc9c0 WorkerThread "GC Thread#11" [id=24424, stack(0x000000fc5fe00000,0x000000fc5ff00000) (1024K)] - 0x000002cd858fd100 WorkerThread "GC Thread#12" [id=4876, stack(0x000000fc60500000,0x000000fc60600000) (1024K)] - 0x000002cd1ae10110 ConcurrentGCThread "G1 Main Marker" [id=24552, stack(0x000000fc5dc00000,0x000000fc5dd00000) (1024K)] - 0x000002cd1ae11740 WorkerThread "G1 Conc#0" [id=20756, stack(0x000000fc5dd00000,0x000000fc5de00000) (1024K)] - 0x000002cd3c9788a0 ConcurrentGCThread "G1 Refine#0" [id=22628, stack(0x000000fc5de00000,0x000000fc5df00000) (1024K)] - 0x000002cd3c979320 ConcurrentGCThread "G1 Service" [id=23180, stack(0x000000fc5df00000,0x000000fc5e000000) (1024K)] -Total: 19 - -Threads with active compile tasks: -C2 CompilerThread0 3727 4134 4 java.lang.invoke.MethodType::methodType (69 bytes) -C2 CompilerThread5 3727 4097 4 java.lang.invoke.MethodType::makeImpl (109 bytes) -Total: 2 - -VM state: not at safepoint (normal execution) - -VM Mutex/Monitor currently owned by a thread: None - -Heap address: 0x000000060e000000, size: 7968 MB, Compressed Oops mode: Zero based, Oop shift amount: 3 - -CDS archive(s) mapped at: [0x000002cd40000000-0x000002cd40c80000-0x000002cd40c80000), size 13107200, SharedBaseAddress: 0x000002cd40000000, ArchiveRelocationMode: 1. -Compressed class space mapped at: 0x000002cd41000000-0x000002cd81000000, reserved size: 1073741824 -Narrow klass base: 0x000002cd40000000, Narrow klass shift: 0, Narrow klass range: 0x100000000 - -GC Precious Log: - CardTable entry size: 512 - Card Set container configuration: InlinePtr #cards 4 size 8 Array Of Cards #cards 32 size 80 Howl #buckets 8 coarsen threshold 7372 Howl Bitmap #cards 1024 size 144 coarsen threshold 921 Card regions per heap region 1 cards per card region 8192 - CPUs: 16 total, 16 available - Memory: 31865M - Large Page Support: Disabled - NUMA Support: Disabled - Compressed Oops: Enabled (Zero based) - Heap Region Size: 4M - Heap Min Capacity: 8M - Heap Initial Capacity: 500M - Heap Max Capacity: 7968M - Pre-touch: Disabled - Parallel Workers: 13 - Concurrent Workers: 3 - Concurrent Refinement Workers: 13 - Periodic GC: Disabled - -Heap: - garbage-first heap total 512000K, used 256284K [0x000000060e000000, 0x0000000800000000) - region size 4096K, 61 young (249856K), 4 survivors (16384K) - Metaspace used 21158K, committed 21504K, reserved 1114112K - class space used 2274K, committed 2432K, reserved 1048576K - -Heap Regions: E=young(eden), S=young(survivor), O=old, HS=humongous(starts), HC=humongous(continues), CS=collection set, F=free, TAMS=top-at-mark-start, PB=parsable bottom -| 0|0x000000060e000000, 0x000000060e38ee78, 0x000000060e400000| 88%| O| |TAMS 0x000000060e000000| PB 0x000000060e000000| Untracked -| 1|0x000000060e400000, 0x000000060e800000, 0x000000060e800000|100%| O| |TAMS 0x000000060e400000| PB 0x000000060e400000| Untracked -| 2|0x000000060e800000, 0x000000060ec00000, 0x000000060ec00000|100%| O| |TAMS 0x000000060e800000| PB 0x000000060e800000| Untracked -| 3|0x000000060ec00000, 0x000000060ec00000, 0x000000060f000000| 0%| F| |TAMS 0x000000060ec00000| PB 0x000000060ec00000| Untracked -| 4|0x000000060f000000, 0x000000060f000000, 0x000000060f400000| 0%| F| |TAMS 0x000000060f000000| PB 0x000000060f000000| Untracked -| 5|0x000000060f400000, 0x000000060f400000, 0x000000060f800000| 0%| F| |TAMS 0x000000060f400000| PB 0x000000060f400000| Untracked -| 6|0x000000060f800000, 0x000000060f800000, 0x000000060fc00000| 0%| F| |TAMS 0x000000060f800000| PB 0x000000060f800000| Untracked -| 7|0x000000060fc00000, 0x000000060fc00000, 0x0000000610000000| 0%| F| |TAMS 0x000000060fc00000| PB 0x000000060fc00000| Untracked -| 8|0x0000000610000000, 0x0000000610000000, 0x0000000610400000| 0%| F| |TAMS 0x0000000610000000| PB 0x0000000610000000| Untracked -| 9|0x0000000610400000, 0x0000000610400000, 0x0000000610800000| 0%| F| |TAMS 0x0000000610400000| PB 0x0000000610400000| Untracked -| 10|0x0000000610800000, 0x0000000610800000, 0x0000000610c00000| 0%| F| |TAMS 0x0000000610800000| PB 0x0000000610800000| Untracked -| 11|0x0000000610c00000, 0x0000000610c00000, 0x0000000611000000| 0%| F| |TAMS 0x0000000610c00000| PB 0x0000000610c00000| Untracked -| 12|0x0000000611000000, 0x0000000611000000, 0x0000000611400000| 0%| F| |TAMS 0x0000000611000000| PB 0x0000000611000000| Untracked -| 13|0x0000000611400000, 0x0000000611400000, 0x0000000611800000| 0%| F| |TAMS 0x0000000611400000| PB 0x0000000611400000| Untracked -| 14|0x0000000611800000, 0x0000000611800000, 0x0000000611c00000| 0%| F| |TAMS 0x0000000611800000| PB 0x0000000611800000| Untracked -| 15|0x0000000611c00000, 0x0000000611c00000, 0x0000000612000000| 0%| F| |TAMS 0x0000000611c00000| PB 0x0000000611c00000| Untracked -| 16|0x0000000612000000, 0x0000000612000000, 0x0000000612400000| 0%| F| |TAMS 0x0000000612000000| PB 0x0000000612000000| Untracked -| 17|0x0000000612400000, 0x0000000612400000, 0x0000000612800000| 0%| F| |TAMS 0x0000000612400000| PB 0x0000000612400000| Untracked -| 18|0x0000000612800000, 0x0000000612800000, 0x0000000612c00000| 0%| F| |TAMS 0x0000000612800000| PB 0x0000000612800000| Untracked -| 19|0x0000000612c00000, 0x0000000612c00000, 0x0000000613000000| 0%| F| |TAMS 0x0000000612c00000| PB 0x0000000612c00000| Untracked -| 20|0x0000000613000000, 0x0000000613000000, 0x0000000613400000| 0%| F| |TAMS 0x0000000613000000| PB 0x0000000613000000| Untracked -| 21|0x0000000613400000, 0x0000000613400000, 0x0000000613800000| 0%| F| |TAMS 0x0000000613400000| PB 0x0000000613400000| Untracked -| 22|0x0000000613800000, 0x0000000613800000, 0x0000000613c00000| 0%| F| |TAMS 0x0000000613800000| PB 0x0000000613800000| Untracked -| 23|0x0000000613c00000, 0x0000000613c00000, 0x0000000614000000| 0%| F| |TAMS 0x0000000613c00000| PB 0x0000000613c00000| Untracked -| 24|0x0000000614000000, 0x0000000614000000, 0x0000000614400000| 0%| F| |TAMS 0x0000000614000000| PB 0x0000000614000000| Untracked -| 25|0x0000000614400000, 0x0000000614400000, 0x0000000614800000| 0%| F| |TAMS 0x0000000614400000| PB 0x0000000614400000| Untracked -| 26|0x0000000614800000, 0x0000000614800000, 0x0000000614c00000| 0%| F| |TAMS 0x0000000614800000| PB 0x0000000614800000| Untracked -| 27|0x0000000614c00000, 0x0000000614c00000, 0x0000000615000000| 0%| F| |TAMS 0x0000000614c00000| PB 0x0000000614c00000| Untracked -| 28|0x0000000615000000, 0x0000000615000000, 0x0000000615400000| 0%| F| |TAMS 0x0000000615000000| PB 0x0000000615000000| Untracked -| 29|0x0000000615400000, 0x0000000615400000, 0x0000000615800000| 0%| F| |TAMS 0x0000000615400000| PB 0x0000000615400000| Untracked -| 30|0x0000000615800000, 0x0000000615800000, 0x0000000615c00000| 0%| F| |TAMS 0x0000000615800000| PB 0x0000000615800000| Untracked -| 31|0x0000000615c00000, 0x0000000615c00000, 0x0000000616000000| 0%| F| |TAMS 0x0000000615c00000| PB 0x0000000615c00000| Untracked -| 32|0x0000000616000000, 0x0000000616000000, 0x0000000616400000| 0%| F| |TAMS 0x0000000616000000| PB 0x0000000616000000| Untracked -| 33|0x0000000616400000, 0x0000000616400000, 0x0000000616800000| 0%| F| |TAMS 0x0000000616400000| PB 0x0000000616400000| Untracked -| 34|0x0000000616800000, 0x0000000616800000, 0x0000000616c00000| 0%| F| |TAMS 0x0000000616800000| PB 0x0000000616800000| Untracked -| 35|0x0000000616c00000, 0x0000000616c00000, 0x0000000617000000| 0%| F| |TAMS 0x0000000616c00000| PB 0x0000000616c00000| Untracked -| 36|0x0000000617000000, 0x0000000617000000, 0x0000000617400000| 0%| F| |TAMS 0x0000000617000000| PB 0x0000000617000000| Untracked -| 37|0x0000000617400000, 0x0000000617400000, 0x0000000617800000| 0%| F| |TAMS 0x0000000617400000| PB 0x0000000617400000| Untracked -| 38|0x0000000617800000, 0x0000000617800000, 0x0000000617c00000| 0%| F| |TAMS 0x0000000617800000| PB 0x0000000617800000| Untracked -| 39|0x0000000617c00000, 0x0000000617c00000, 0x0000000618000000| 0%| F| |TAMS 0x0000000617c00000| PB 0x0000000617c00000| Untracked -| 40|0x0000000618000000, 0x0000000618000000, 0x0000000618400000| 0%| F| |TAMS 0x0000000618000000| PB 0x0000000618000000| Untracked -| 41|0x0000000618400000, 0x0000000618400000, 0x0000000618800000| 0%| F| |TAMS 0x0000000618400000| PB 0x0000000618400000| Untracked -| 42|0x0000000618800000, 0x0000000618800000, 0x0000000618c00000| 0%| F| |TAMS 0x0000000618800000| PB 0x0000000618800000| Untracked -| 43|0x0000000618c00000, 0x0000000618c00000, 0x0000000619000000| 0%| F| |TAMS 0x0000000618c00000| PB 0x0000000618c00000| Untracked -| 44|0x0000000619000000, 0x0000000619000000, 0x0000000619400000| 0%| F| |TAMS 0x0000000619000000| PB 0x0000000619000000| Untracked -| 45|0x0000000619400000, 0x0000000619400000, 0x0000000619800000| 0%| F| |TAMS 0x0000000619400000| PB 0x0000000619400000| Untracked -| 46|0x0000000619800000, 0x0000000619800000, 0x0000000619c00000| 0%| F| |TAMS 0x0000000619800000| PB 0x0000000619800000| Untracked -| 47|0x0000000619c00000, 0x0000000619c00000, 0x000000061a000000| 0%| F| |TAMS 0x0000000619c00000| PB 0x0000000619c00000| Untracked -| 48|0x000000061a000000, 0x000000061a000000, 0x000000061a400000| 0%| F| |TAMS 0x000000061a000000| PB 0x000000061a000000| Untracked -| 49|0x000000061a400000, 0x000000061a400000, 0x000000061a800000| 0%| F| |TAMS 0x000000061a400000| PB 0x000000061a400000| Untracked -| 50|0x000000061a800000, 0x000000061a800000, 0x000000061ac00000| 0%| F| |TAMS 0x000000061a800000| PB 0x000000061a800000| Untracked -| 51|0x000000061ac00000, 0x000000061ac00000, 0x000000061b000000| 0%| F| |TAMS 0x000000061ac00000| PB 0x000000061ac00000| Untracked -| 52|0x000000061b000000, 0x000000061b000000, 0x000000061b400000| 0%| F| |TAMS 0x000000061b000000| PB 0x000000061b000000| Untracked -| 53|0x000000061b400000, 0x000000061b400000, 0x000000061b800000| 0%| F| |TAMS 0x000000061b400000| PB 0x000000061b400000| Untracked -| 54|0x000000061b800000, 0x000000061b800000, 0x000000061bc00000| 0%| F| |TAMS 0x000000061b800000| PB 0x000000061b800000| Untracked -| 55|0x000000061bc00000, 0x000000061bc00000, 0x000000061c000000| 0%| F| |TAMS 0x000000061bc00000| PB 0x000000061bc00000| Untracked -| 56|0x000000061c000000, 0x000000061c000000, 0x000000061c400000| 0%| F| |TAMS 0x000000061c000000| PB 0x000000061c000000| Untracked -| 57|0x000000061c400000, 0x000000061c400000, 0x000000061c800000| 0%| F| |TAMS 0x000000061c400000| PB 0x000000061c400000| Untracked -| 58|0x000000061c800000, 0x000000061c800000, 0x000000061cc00000| 0%| F| |TAMS 0x000000061c800000| PB 0x000000061c800000| Untracked -| 59|0x000000061cc00000, 0x000000061cc00000, 0x000000061d000000| 0%| F| |TAMS 0x000000061cc00000| PB 0x000000061cc00000| Untracked -| 60|0x000000061d000000, 0x000000061d000000, 0x000000061d400000| 0%| F| |TAMS 0x000000061d000000| PB 0x000000061d000000| Untracked -| 61|0x000000061d400000, 0x000000061d400000, 0x000000061d800000| 0%| F| |TAMS 0x000000061d400000| PB 0x000000061d400000| Untracked -| 62|0x000000061d800000, 0x000000061d800000, 0x000000061dc00000| 0%| F| |TAMS 0x000000061d800000| PB 0x000000061d800000| Untracked -| 63|0x000000061dc00000, 0x000000061dc00000, 0x000000061e000000| 0%| F| |TAMS 0x000000061dc00000| PB 0x000000061dc00000| Untracked -| 64|0x000000061e000000, 0x000000061e2b2820, 0x000000061e400000| 67%| E| |TAMS 0x000000061e000000| PB 0x000000061e000000| Complete -| 65|0x000000061e400000, 0x000000061e800000, 0x000000061e800000|100%| E|CS|TAMS 0x000000061e400000| PB 0x000000061e400000| Complete -| 66|0x000000061e800000, 0x000000061ec00000, 0x000000061ec00000|100%| E|CS|TAMS 0x000000061e800000| PB 0x000000061e800000| Complete -| 67|0x000000061ec00000, 0x000000061f000000, 0x000000061f000000|100%| E|CS|TAMS 0x000000061ec00000| PB 0x000000061ec00000| Complete -| 68|0x000000061f000000, 0x000000061f400000, 0x000000061f400000|100%| E|CS|TAMS 0x000000061f000000| PB 0x000000061f000000| Complete -| 69|0x000000061f400000, 0x000000061f800000, 0x000000061f800000|100%| E|CS|TAMS 0x000000061f400000| PB 0x000000061f400000| Complete -| 70|0x000000061f800000, 0x000000061fc00000, 0x000000061fc00000|100%| E|CS|TAMS 0x000000061f800000| PB 0x000000061f800000| Complete -| 71|0x000000061fc00000, 0x0000000620000000, 0x0000000620000000|100%| E|CS|TAMS 0x000000061fc00000| PB 0x000000061fc00000| Complete -| 72|0x0000000620000000, 0x0000000620400000, 0x0000000620400000|100%| E|CS|TAMS 0x0000000620000000| PB 0x0000000620000000| Complete -| 73|0x0000000620400000, 0x0000000620800000, 0x0000000620800000|100%| E|CS|TAMS 0x0000000620400000| PB 0x0000000620400000| Complete -| 74|0x0000000620800000, 0x0000000620c00000, 0x0000000620c00000|100%| E|CS|TAMS 0x0000000620800000| PB 0x0000000620800000| Complete -| 75|0x0000000620c00000, 0x0000000621000000, 0x0000000621000000|100%| E|CS|TAMS 0x0000000620c00000| PB 0x0000000620c00000| Complete -| 76|0x0000000621000000, 0x0000000621400000, 0x0000000621400000|100%| E|CS|TAMS 0x0000000621000000| PB 0x0000000621000000| Complete -| 77|0x0000000621400000, 0x0000000621800000, 0x0000000621800000|100%| E|CS|TAMS 0x0000000621400000| PB 0x0000000621400000| Complete -| 78|0x0000000621800000, 0x0000000621ab8280, 0x0000000621c00000| 67%| S|CS|TAMS 0x0000000621800000| PB 0x0000000621800000| Complete -| 79|0x0000000621c00000, 0x0000000622000000, 0x0000000622000000|100%| S|CS|TAMS 0x0000000621c00000| PB 0x0000000621c00000| Complete -| 80|0x0000000622000000, 0x0000000622400000, 0x0000000622400000|100%| S|CS|TAMS 0x0000000622000000| PB 0x0000000622000000| Complete -| 81|0x0000000622400000, 0x0000000622800000, 0x0000000622800000|100%| S|CS|TAMS 0x0000000622400000| PB 0x0000000622400000| Complete -| 82|0x0000000622800000, 0x0000000622c00000, 0x0000000622c00000|100%| E|CS|TAMS 0x0000000622800000| PB 0x0000000622800000| Complete -| 83|0x0000000622c00000, 0x0000000623000000, 0x0000000623000000|100%| E|CS|TAMS 0x0000000622c00000| PB 0x0000000622c00000| Complete -| 84|0x0000000623000000, 0x0000000623400000, 0x0000000623400000|100%| E|CS|TAMS 0x0000000623000000| PB 0x0000000623000000| Complete -| 85|0x0000000623400000, 0x0000000623800000, 0x0000000623800000|100%| E|CS|TAMS 0x0000000623400000| PB 0x0000000623400000| Complete -| 86|0x0000000623800000, 0x0000000623c00000, 0x0000000623c00000|100%| E|CS|TAMS 0x0000000623800000| PB 0x0000000623800000| Complete -| 87|0x0000000623c00000, 0x0000000624000000, 0x0000000624000000|100%| E|CS|TAMS 0x0000000623c00000| PB 0x0000000623c00000| Complete -| 88|0x0000000624000000, 0x0000000624400000, 0x0000000624400000|100%| E|CS|TAMS 0x0000000624000000| PB 0x0000000624000000| Complete -| 89|0x0000000624400000, 0x0000000624800000, 0x0000000624800000|100%| E|CS|TAMS 0x0000000624400000| PB 0x0000000624400000| Complete -| 90|0x0000000624800000, 0x0000000624c00000, 0x0000000624c00000|100%| E|CS|TAMS 0x0000000624800000| PB 0x0000000624800000| Complete -| 91|0x0000000624c00000, 0x0000000625000000, 0x0000000625000000|100%| E|CS|TAMS 0x0000000624c00000| PB 0x0000000624c00000| Complete -| 92|0x0000000625000000, 0x0000000625400000, 0x0000000625400000|100%| E|CS|TAMS 0x0000000625000000| PB 0x0000000625000000| Complete -| 93|0x0000000625400000, 0x0000000625800000, 0x0000000625800000|100%| E|CS|TAMS 0x0000000625400000| PB 0x0000000625400000| Complete -| 94|0x0000000625800000, 0x0000000625c00000, 0x0000000625c00000|100%| E|CS|TAMS 0x0000000625800000| PB 0x0000000625800000| Complete -| 95|0x0000000625c00000, 0x0000000626000000, 0x0000000626000000|100%| E|CS|TAMS 0x0000000625c00000| PB 0x0000000625c00000| Complete -| 96|0x0000000626000000, 0x0000000626400000, 0x0000000626400000|100%| E|CS|TAMS 0x0000000626000000| PB 0x0000000626000000| Complete -| 97|0x0000000626400000, 0x0000000626800000, 0x0000000626800000|100%| E|CS|TAMS 0x0000000626400000| PB 0x0000000626400000| Complete -| 98|0x0000000626800000, 0x0000000626c00000, 0x0000000626c00000|100%| E|CS|TAMS 0x0000000626800000| PB 0x0000000626800000| Complete -| 99|0x0000000626c00000, 0x0000000627000000, 0x0000000627000000|100%| E|CS|TAMS 0x0000000626c00000| PB 0x0000000626c00000| Complete -| 100|0x0000000627000000, 0x0000000627400000, 0x0000000627400000|100%| E|CS|TAMS 0x0000000627000000| PB 0x0000000627000000| Complete -| 101|0x0000000627400000, 0x0000000627800000, 0x0000000627800000|100%| E|CS|TAMS 0x0000000627400000| PB 0x0000000627400000| Complete -| 102|0x0000000627800000, 0x0000000627c00000, 0x0000000627c00000|100%| E|CS|TAMS 0x0000000627800000| PB 0x0000000627800000| Complete -| 103|0x0000000627c00000, 0x0000000628000000, 0x0000000628000000|100%| E|CS|TAMS 0x0000000627c00000| PB 0x0000000627c00000| Complete -| 104|0x0000000628000000, 0x0000000628400000, 0x0000000628400000|100%| E|CS|TAMS 0x0000000628000000| PB 0x0000000628000000| Complete -| 105|0x0000000628400000, 0x0000000628800000, 0x0000000628800000|100%| E|CS|TAMS 0x0000000628400000| PB 0x0000000628400000| Complete -| 106|0x0000000628800000, 0x0000000628c00000, 0x0000000628c00000|100%| E|CS|TAMS 0x0000000628800000| PB 0x0000000628800000| Complete -| 107|0x0000000628c00000, 0x0000000629000000, 0x0000000629000000|100%| E|CS|TAMS 0x0000000628c00000| PB 0x0000000628c00000| Complete -| 108|0x0000000629000000, 0x0000000629400000, 0x0000000629400000|100%| E|CS|TAMS 0x0000000629000000| PB 0x0000000629000000| Complete -| 109|0x0000000629400000, 0x0000000629800000, 0x0000000629800000|100%| E|CS|TAMS 0x0000000629400000| PB 0x0000000629400000| Complete -| 110|0x0000000629800000, 0x0000000629c00000, 0x0000000629c00000|100%| E|CS|TAMS 0x0000000629800000| PB 0x0000000629800000| Complete -| 111|0x0000000629c00000, 0x000000062a000000, 0x000000062a000000|100%| E|CS|TAMS 0x0000000629c00000| PB 0x0000000629c00000| Complete -| 112|0x000000062a000000, 0x000000062a400000, 0x000000062a400000|100%| E|CS|TAMS 0x000000062a000000| PB 0x000000062a000000| Complete -| 113|0x000000062a400000, 0x000000062a800000, 0x000000062a800000|100%| E|CS|TAMS 0x000000062a400000| PB 0x000000062a400000| Complete -| 114|0x000000062a800000, 0x000000062ac00000, 0x000000062ac00000|100%| E|CS|TAMS 0x000000062a800000| PB 0x000000062a800000| Complete -| 115|0x000000062ac00000, 0x000000062b000000, 0x000000062b000000|100%| E|CS|TAMS 0x000000062ac00000| PB 0x000000062ac00000| Complete -| 116|0x000000062b000000, 0x000000062b400000, 0x000000062b400000|100%| E|CS|TAMS 0x000000062b000000| PB 0x000000062b000000| Complete -| 117|0x000000062b400000, 0x000000062b800000, 0x000000062b800000|100%| E|CS|TAMS 0x000000062b400000| PB 0x000000062b400000| Complete -| 118|0x000000062b800000, 0x000000062bc00000, 0x000000062bc00000|100%| E|CS|TAMS 0x000000062b800000| PB 0x000000062b800000| Complete -| 119|0x000000062bc00000, 0x000000062c000000, 0x000000062c000000|100%| E|CS|TAMS 0x000000062bc00000| PB 0x000000062bc00000| Complete -| 120|0x000000062c000000, 0x000000062c400000, 0x000000062c400000|100%| E|CS|TAMS 0x000000062c000000| PB 0x000000062c000000| Complete -| 121|0x000000062c400000, 0x000000062c800000, 0x000000062c800000|100%| E|CS|TAMS 0x000000062c400000| PB 0x000000062c400000| Complete -| 122|0x000000062c800000, 0x000000062cc00000, 0x000000062cc00000|100%| E|CS|TAMS 0x000000062c800000| PB 0x000000062c800000| Complete -| 123|0x000000062cc00000, 0x000000062d000000, 0x000000062d000000|100%| E|CS|TAMS 0x000000062cc00000| PB 0x000000062cc00000| Complete -| 124|0x000000062d000000, 0x000000062d400000, 0x000000062d400000|100%| E|CS|TAMS 0x000000062d000000| PB 0x000000062d000000| Complete - -Card table byte_map: [0x000002cd33c90000,0x000002cd34c20000] _byte_map_base: 0x000002cd30c20000 - -Marking Bits: (CMBitMap*) 0x000002cd1ae00170 - Bits: [0x000002cd34c20000, 0x000002cd3c8a0000) - -Polling page: 0x000002cd18ac0000 - -Metaspace: - -Usage: - Non-class: 18.44 MB used. - Class: 2.22 MB used. - Both: 20.66 MB used. - -Virtual space: - Non-class space: 64.00 MB reserved, 18.62 MB ( 29%) committed, 1 nodes. - Class space: 1.00 GB reserved, 2.38 MB ( <1%) committed, 1 nodes. - Both: 1.06 GB reserved, 21.00 MB ( 2%) committed. - -Chunk freelists: - Non-Class: 13.03 MB - Class: 13.45 MB - Both: 26.48 MB - -MaxMetaspaceSize: unlimited -CompressedClassSpaceSize: 1.00 GB -Initial GC threshold: 21.00 MB -Current GC threshold: 21.00 MB -CDS: on - - commit_granule_bytes: 65536. - - commit_granule_words: 8192. - - virtual_space_node_default_size: 8388608. - - enlarge_chunks_in_place: 1. - - use_allocation_guard: 0. - - -Internal statistics: - -num_allocs_failed_limit: 0. -num_arena_births: 402. -num_arena_deaths: 0. -num_vsnodes_births: 2. -num_vsnodes_deaths: 0. -num_space_committed: 336. -num_space_uncommitted: 0. -num_chunks_returned_to_freelist: 0. -num_chunks_taken_from_freelist: 821. -num_chunk_merges: 0. -num_chunk_splits: 522. -num_chunks_enlarged: 339. -num_inconsistent_stats: 0. - -CodeHeap 'non-profiled nmethods': size=119168Kb used=3683Kb max_used=3683Kb free=115484Kb - bounds [0x000002cd2b010000, 0x000002cd2b3b0000, 0x000002cd32470000] -CodeHeap 'profiled nmethods': size=119104Kb used=8250Kb max_used=8250Kb free=110853Kb - bounds [0x000002cd23470000, 0x000002cd23c80000, 0x000002cd2a8c0000] -CodeHeap 'non-nmethods': size=7488Kb used=3438Kb max_used=3462Kb free=4049Kb - bounds [0x000002cd2a8c0000, 0x000002cd2ac30000, 0x000002cd2b010000] -CodeCache: size=245760Kb, used=15371Kb, max_used=15395Kb, free=230386Kb - total_blobs=4859, nmethods=4271, adapters=489, full_count=0 -Compilation: enabled, stopped_count=0, restarted_count=0 - -Compilation events (20 events): -Event: 3.647 Thread 0x000002cd3ca73ac0 4264 3 sun.nio.fs.WindowsPath::getPathForWin32Calls (6 bytes) -Event: 3.647 Thread 0x000002cd3ca73ac0 nmethod 4264 0x000002cd23c7c210 code [0x000002cd23c7c3c0, 0x000002cd23c7c510] -Event: 3.652 Thread 0x000002cd85372210 4265 4 java.util.regex.Pattern$BmpCharProperty::match (55 bytes) -Event: 3.653 Thread 0x000002cd85372210 nmethod 4265 0x000002cd2b3a5490 code [0x000002cd2b3a5660, 0x000002cd2b3a5958] -Event: 3.655 Thread 0x000002cd85ca75f0 4266 4 cpw.mods.niofs.union.UnionFileSystem::lambda$checkAccess$8 (19 bytes) -Event: 3.663 Thread 0x000002cd85ca75f0 nmethod 4266 0x000002cd2b3a5c90 code [0x000002cd2b3a5ec0, 0x000002cd2b3a6920] -Event: 3.668 Thread 0x000002cd3ca9c770 4267 3 java.lang.Class::protectionDomain (48 bytes) -Event: 3.669 Thread 0x000002cd3ca9c770 nmethod 4267 0x000002cd23c7c590 code [0x000002cd23c7c7e0, 0x000002cd23c7ce88] -Event: 3.671 Thread 0x000002cd3fa845e0 4269 3 jdk.internal.reflect.ReflectionFactory::copyField (11 bytes) -Event: 3.671 Thread 0x000002cd3ca9c770 4270 3 java.lang.reflect.ReflectAccess::copyField (5 bytes) -Event: 3.671 Thread 0x000002cd8588fde0 4271 3 java.lang.reflect.Field::copy (80 bytes) -Event: 3.671 Thread 0x000002cd3ca73ac0 4272 3 java.lang.reflect.Field:: (50 bytes) -Event: 3.671 Thread 0x000002cd3ca9c770 nmethod 4270 0x000002cd23c7d090 code [0x000002cd23c7d240, 0x000002cd23c7d388] -Event: 3.671 Thread 0x000002cd3fa845e0 nmethod 4269 0x000002cd23c7d490 code [0x000002cd23c7d640, 0x000002cd23c7d850] -Event: 3.671 Thread 0x000002cd8588fde0 nmethod 4271 0x000002cd23c7d990 code [0x000002cd23c7db60, 0x000002cd23c7dfb0] -Event: 3.671 Thread 0x000002cd3ca73ac0 nmethod 4272 0x000002cd23c7e110 code [0x000002cd23c7e2e0, 0x000002cd23c7e6c0] -Event: 3.672 Thread 0x000002cd85b0a740 4275 ! 4 java.lang.invoke.MemberName::getMethodType (211 bytes) -Event: 3.675 Thread 0x000002cd3ca73ac0 4277 3 java.lang.ThreadLocal$ThreadLocalMap::nextIndex (15 bytes) -Event: 3.675 Thread 0x000002cd3ca73ac0 nmethod 4277 0x000002cd23c7e810 code [0x000002cd23c7e9a0, 0x000002cd23c7ead8] -Event: 3.675 Thread 0x000002cd85b0a740 nmethod 4275 0x000002cd2b3a7e90 code [0x000002cd2b3a8080, 0x000002cd2b3a8678] - -GC Heap History (8 events): -Event: 0.565 GC heap before -{Heap before GC invocations=0 (full 0): - garbage-first heap total 512000K, used 24576K [0x000000060e000000, 0x0000000800000000) - region size 4096K, 6 young (24576K), 0 survivors (0K) - Metaspace used 4126K, committed 4288K, reserved 1114112K - class space used 380K, committed 448K, reserved 1048576K -} -Event: 0.574 GC heap after -{Heap after GC invocations=1 (full 0): - garbage-first heap total 512000K, used 10805K [0x000000060e000000, 0x0000000800000000) - region size 4096K, 1 young (4096K), 1 survivors (4096K) - Metaspace used 4126K, committed 4288K, reserved 1114112K - class space used 380K, committed 448K, reserved 1048576K -} -Event: 0.725 GC heap before -{Heap before GC invocations=1 (full 0): - garbage-first heap total 512000K, used 31285K [0x000000060e000000, 0x0000000800000000) - region size 4096K, 6 young (24576K), 1 survivors (4096K) - Metaspace used 4867K, committed 5120K, reserved 1114112K - class space used 438K, committed 576K, reserved 1048576K -} -Event: 0.726 GC heap after -{Heap after GC invocations=2 (full 0): - garbage-first heap total 512000K, used 12398K [0x000000060e000000, 0x0000000800000000) - region size 4096K, 1 young (4096K), 1 survivors (4096K) - Metaspace used 4867K, committed 5120K, reserved 1114112K - class space used 438K, committed 576K, reserved 1048576K -} -Event: 1.059 GC heap before -{Heap before GC invocations=2 (full 0): - garbage-first heap total 512000K, used 65646K [0x000000060e000000, 0x0000000800000000) - region size 4096K, 15 young (61440K), 1 survivors (4096K) - Metaspace used 7113K, committed 7360K, reserved 1114112K - class space used 648K, committed 768K, reserved 1048576K -} -Event: 1.064 GC heap after -{Heap after GC invocations=3 (full 0): - garbage-first heap total 512000K, used 20027K [0x000000060e000000, 0x0000000800000000) - region size 4096K, 2 young (8192K), 2 survivors (8192K) - Metaspace used 7113K, committed 7360K, reserved 1114112K - class space used 648K, committed 768K, reserved 1048576K -} -Event: 1.650 GC heap before -{Heap before GC invocations=3 (full 0): - garbage-first heap total 512000K, used 187963K [0x000000060e000000, 0x0000000800000000) - region size 4096K, 43 young (176128K), 2 survivors (8192K) - Metaspace used 7307K, committed 7488K, reserved 1114112K - class space used 660K, committed 768K, reserved 1048576K -} -Event: 1.656 GC heap after -{Heap after GC invocations=4 (full 0): - garbage-first heap total 512000K, used 26908K [0x000000060e000000, 0x0000000800000000) - region size 4096K, 4 young (16384K), 4 survivors (16384K) - Metaspace used 7307K, committed 7488K, reserved 1114112K - class space used 660K, committed 768K, reserved 1048576K -} - -Dll operation events (12 events): -Event: 0.029 Loaded shared library C:\Users\TcT_g\Desktop\ynov\M1\CreateNuclear\jdk\bin\java.dll -Event: 0.030 Loaded shared library C:\Users\TcT_g\Desktop\ynov\M1\CreateNuclear\jdk\bin\zip.dll -Event: 0.055 Loaded shared library C:\Users\TcT_g\Desktop\ynov\M1\CreateNuclear\jdk\bin\jsvml.dll -Event: 0.115 Loaded shared library C:\Users\TcT_g\Desktop\ynov\M1\CreateNuclear\jdk\bin\net.dll -Event: 0.117 Loaded shared library C:\Users\TcT_g\Desktop\ynov\M1\CreateNuclear\jdk\bin\nio.dll -Event: 0.121 Loaded shared library C:\Users\TcT_g\Desktop\ynov\M1\CreateNuclear\jdk\bin\zip.dll -Event: 0.368 Loaded shared library C:\Users\TcT_g\Desktop\ynov\M1\CreateNuclear\jdk\bin\instrument.dll -Event: 0.434 Loaded shared library C:\Users\TcT_g\Desktop\ynov\M1\CreateNuclear\jdk\bin\jimage.dll -Event: 0.693 Loaded shared library C:\Users\TcT_g\Desktop\ynov\M1\CreateNuclear\jdk\bin\verify.dll -Event: 2.642 Loaded shared library C:\Users\TcT_g\Desktop\ynov\M1\CreateNuclear\jdk\bin\management.dll -Event: 2.647 Loaded shared library C:\Users\TcT_g\Desktop\ynov\M1\CreateNuclear\jdk\bin\management_ext.dll -Event: 3.653 Loaded shared library C:\Users\TcT_g\AppData\Local\Temp\lwjglTcT_g\3.3.1-build-7\lwjgl.dll - -Deoptimization events (20 events): -Event: 3.680 Thread 0x000002cd18843d50 DEOPT PACKING pc=0x000002cd23add704 sp=0x000000fc5dafdab0 -Event: 3.680 Thread 0x000002cd18843d50 DEOPT UNPACKING pc=0x000002cd2a9188e2 sp=0x000000fc5dafcf68 mode 1 -Event: 3.680 Thread 0x000002cd18843d50 DEOPT PACKING pc=0x000002cd2b2d2070 sp=0x000000fc5dafd960 -Event: 3.680 Thread 0x000002cd18843d50 DEOPT UNPACKING pc=0x000002cd2a9188e2 sp=0x000000fc5dafcde0 mode 1 -Event: 3.680 Thread 0x000002cd18843d50 DEOPT PACKING pc=0x000002cd23ac7dac sp=0x000000fc5dafd980 -Event: 3.680 Thread 0x000002cd18843d50 DEOPT UNPACKING pc=0x000002cd2a9188e2 sp=0x000000fc5dafce08 mode 1 -Event: 3.680 Thread 0x000002cd18843d50 DEOPT PACKING pc=0x000002cd23add704 sp=0x000000fc5dafdab0 -Event: 3.680 Thread 0x000002cd18843d50 DEOPT UNPACKING pc=0x000002cd2a9188e2 sp=0x000000fc5dafcf68 mode 1 -Event: 3.681 Thread 0x000002cd18843d50 DEOPT PACKING pc=0x000002cd2b2d2070 sp=0x000000fc5dafd960 -Event: 3.681 Thread 0x000002cd18843d50 DEOPT UNPACKING pc=0x000002cd2a9188e2 sp=0x000000fc5dafcde0 mode 1 -Event: 3.681 Thread 0x000002cd18843d50 DEOPT PACKING pc=0x000002cd23ac7dac sp=0x000000fc5dafd980 -Event: 3.681 Thread 0x000002cd18843d50 DEOPT UNPACKING pc=0x000002cd2a9188e2 sp=0x000000fc5dafce08 mode 1 -Event: 3.681 Thread 0x000002cd18843d50 DEOPT PACKING pc=0x000002cd23add704 sp=0x000000fc5dafdab0 -Event: 3.681 Thread 0x000002cd18843d50 DEOPT UNPACKING pc=0x000002cd2a9188e2 sp=0x000000fc5dafcf68 mode 1 -Event: 3.681 Thread 0x000002cd18843d50 DEOPT PACKING pc=0x000002cd2b2d2070 sp=0x000000fc5dafd960 -Event: 3.681 Thread 0x000002cd18843d50 DEOPT UNPACKING pc=0x000002cd2a9188e2 sp=0x000000fc5dafcde0 mode 1 -Event: 3.681 Thread 0x000002cd18843d50 DEOPT PACKING pc=0x000002cd23ac7dac sp=0x000000fc5dafd980 -Event: 3.681 Thread 0x000002cd18843d50 DEOPT UNPACKING pc=0x000002cd2a9188e2 sp=0x000000fc5dafce08 mode 1 -Event: 3.681 Thread 0x000002cd18843d50 DEOPT PACKING pc=0x000002cd23add704 sp=0x000000fc5dafdab0 -Event: 3.681 Thread 0x000002cd18843d50 DEOPT UNPACKING pc=0x000002cd2a9188e2 sp=0x000000fc5dafcf68 mode 1 - -Classes loaded (20 events): -Event: 3.667 Loading class java/nio/BufferOverflowException -Event: 3.667 Loading class java/nio/BufferOverflowException done -Event: 3.668 Loading class java/nio/DirectShortBufferU -Event: 3.668 Loading class java/nio/DirectShortBufferU done -Event: 3.669 Loading class java/nio/DirectCharBufferU -Event: 3.669 Loading class java/nio/DirectCharBufferU done -Event: 3.669 Loading class java/nio/DirectFloatBufferU -Event: 3.669 Loading class java/nio/DirectFloatBufferU done -Event: 3.669 Loading class java/nio/DirectDoubleBufferU -Event: 3.669 Loading class java/nio/DirectDoubleBufferU done -Event: 3.670 Loading class java/util/function/LongPredicate -Event: 3.670 Loading class java/util/function/LongPredicate done -Event: 3.673 Loading class java/nio/InvalidMarkException -Event: 3.673 Loading class java/nio/InvalidMarkException done -Event: 3.673 Loading class java/nio/BufferUnderflowException -Event: 3.673 Loading class java/nio/BufferUnderflowException done -Event: 3.674 Loading class org/lwjgl/system/MemoryStack -Event: 3.674 Loading class org/lwjgl/system/MemoryStack done -Event: 3.674 Loading class org/lwjgl/system/MemoryStack -Event: 3.674 Loading class org/lwjgl/system/MemoryStack done - -Classes unloaded (0 events): -No events - -Classes redefined (1 events): -Event: 0.393 Thread 0x000002cd3ca3d5b0 redefined class name=java.lang.Throwable, count=1 - -Internal exceptions (20 events): -Event: 3.567 Thread 0x000002cd18843d50 Exception (0x000000061e83afd0) -thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 773] -Event: 3.569 Thread 0x000002cd18843d50 Exception (0x000000061e84b028) -thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 773] -Event: 3.569 Thread 0x000002cd18843d50 Exception (0x000000061e856290) -thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 773] -Event: 3.570 Thread 0x000002cd18843d50 Exception (0x000000061e85b3f0) -thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 840] -Event: 3.572 Thread 0x000002cd18843d50 Exception (0x000000061e893518) -thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 840] -Event: 3.599 Thread 0x000002cd18843d50 Exception (0x000000061ea74898) -thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 773] -Event: 3.629 Thread 0x000002cd18843d50 Exception (0x000000061ebc97d8) -thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 773] -Event: 3.629 Thread 0x000002cd18843d50 Exception (0x000000061ebcd748) -thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 773] -Event: 3.638 Thread 0x000002cd18843d50 Exception (0x000000061e4ff880) -thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 773] -Event: 3.639 Thread 0x000002cd18843d50 Exception (0x000000061e511e60) -thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 773] -Event: 3.651 Thread 0x000002cd18843d50 Exception (0x000000061e70a1c0) -thrown [s\src\hotspot\share\prims\jni.cpp, line 520] -Event: 3.651 Thread 0x000002cd18843d50 Exception (0x000000061e70a510) -thrown [s\src\hotspot\share\prims\jni.cpp, line 520] -Event: 3.664 Thread 0x000002cd18843d50 Exception (0x000000061e7cde78) -thrown [s\src\hotspot\share\prims\jni.cpp, line 520] -Event: 3.665 Thread 0x000002cd18843d50 Exception (0x000000061e7ce1d8) -thrown [s\src\hotspot\share\prims\jni.cpp, line 520] -Event: 3.670 Thread 0x000002cd18843d50 Exception (0x000000061e10e830) -thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 773] -Event: 3.671 Thread 0x000002cd18843d50 Exception (0x000000061e113b58) -thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 773] -Event: 3.672 Thread 0x000002cd18843d50 Exception (0x000000061e128180) -thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 773] -Event: 3.672 Thread 0x000002cd18843d50 Exception (0x000000061e12d870) -thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 773] -Event: 3.672 Thread 0x000002cd18843d50 Exception (0x000000061e1310b8) -thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 773] -Event: 3.672 Thread 0x000002cd18843d50 Exception (0x000000061e1382d0) -thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 773] - -ZGC Phase Switch (0 events): -No events - -VM Operations (20 events): -Event: 3.206 Executing VM operation: HandshakeAllThreads (Deoptimize) -Event: 3.206 Executing VM operation: HandshakeAllThreads (Deoptimize) done -Event: 3.209 Executing VM operation: HandshakeAllThreads (Deoptimize) -Event: 3.209 Executing VM operation: HandshakeAllThreads (Deoptimize) done -Event: 3.260 Executing VM operation: HandshakeAllThreads (Deoptimize) -Event: 3.260 Executing VM operation: HandshakeAllThreads (Deoptimize) done -Event: 3.260 Executing VM operation: HandshakeAllThreads (Deoptimize) -Event: 3.260 Executing VM operation: HandshakeAllThreads (Deoptimize) done -Event: 3.306 Executing VM operation: HandshakeAllThreads (Deoptimize) -Event: 3.306 Executing VM operation: HandshakeAllThreads (Deoptimize) done -Event: 3.318 Executing VM operation: ICBufferFull -Event: 3.319 Executing VM operation: ICBufferFull done -Event: 3.403 Executing VM operation: HandshakeAllThreads (Deoptimize) -Event: 3.403 Executing VM operation: HandshakeAllThreads (Deoptimize) done -Event: 3.421 Executing VM operation: HandshakeAllThreads (Deoptimize) -Event: 3.421 Executing VM operation: HandshakeAllThreads (Deoptimize) done -Event: 3.509 Executing VM operation: HandshakeAllThreads (Deoptimize) -Event: 3.509 Executing VM operation: HandshakeAllThreads (Deoptimize) done -Event: 3.668 Executing VM operation: ICBufferFull -Event: 3.669 Executing VM operation: ICBufferFull done - -Memory protections (0 events): -No events - -Nmethod flushes (0 events): -No events - -Events (20 events): -Event: 0.163 Thread 0x000002cd3ca73ac0 Thread added: 0x000002cd3fad77e0 -Event: 0.179 Thread 0x000002cd18843d50 Thread added: 0x000002cd3fc04350 -Event: 0.179 Thread 0x000002cd18843d50 Thread added: 0x000002cd3fba3b50 -Event: 0.180 Thread 0x000002cd3fc04350 Thread added: 0x000002cd3fc065d0 -Event: 0.359 Thread 0x000002cd3fad77e0 Thread exited: 0x000002cd3fad77e0 -Event: 0.359 Thread 0x000002cd3fa854a0 Thread exited: 0x000002cd3fa854a0 -Event: 0.403 Thread 0x000002cd18843d50 Thread added: 0x000002cd3fc75fe0 -Event: 0.404 Thread 0x000002cd18843d50 Thread added: 0x000002cd3fbd3540 -Event: 0.453 Thread 0x000002cd3ca6f8d0 Thread added: 0x000002cd8525f610 -Event: 0.453 Thread 0x000002cd3ca6f8d0 Thread added: 0x000002cd85372210 -Event: 0.611 Thread 0x000002cd3fa845e0 Thread added: 0x000002cd8588fde0 -Event: 0.630 Thread 0x000002cd3fa845e0 Thread added: 0x000002cd85dbd8c0 -Event: 0.631 Thread 0x000002cd3fa845e0 Thread added: 0x000002cd85ea5070 -Event: 0.635 Thread 0x000002cd3ca9c770 Thread added: 0x000002cd85e9bf00 -Event: 0.639 Thread 0x000002cd3ca73ac0 Thread added: 0x000002cd85ca75f0 -Event: 0.644 Thread 0x000002cd3ca73ac0 Thread added: 0x000002cd85b0a740 -Event: 3.282 Thread 0x000002cd18843d50 Thread added: 0x000002cd8a61c1a0 -Event: 3.290 Thread 0x000002cd8a61c1a0 Thread exited: 0x000002cd8a61c1a0 -Event: 3.295 Thread 0x000002cd18843d50 Thread added: 0x000002cd8a61c1a0 -Event: 3.304 Thread 0x000002cd8a61c1a0 Thread exited: 0x000002cd8a61c1a0 - - -Dynamic libraries: -0x00007ff60f510000 - 0x00007ff60f51e000 C:\Users\TcT_g\Desktop\ynov\M1\CreateNuclear\jdk\bin\java.exe -0x00007ff9ed660000 - 0x00007ff9ed8c8000 C:\Windows\SYSTEM32\ntdll.dll -0x00007ff9eb560000 - 0x00007ff9eb629000 C:\Windows\System32\KERNEL32.DLL -0x00007ff9eae40000 - 0x00007ff9eb232000 C:\Windows\System32\KERNELBASE.dll -0x00007ff9eacf0000 - 0x00007ff9eae3b000 C:\Windows\System32\ucrtbase.dll -0x00007ff9d56a0000 - 0x00007ff9d56b8000 C:\Users\TcT_g\Desktop\ynov\M1\CreateNuclear\jdk\bin\jli.dll -0x00007ff9d57c0000 - 0x00007ff9d57de000 C:\Users\TcT_g\Desktop\ynov\M1\CreateNuclear\jdk\bin\VCRUNTIME140.dll -0x00007ff9ecc50000 - 0x00007ff9ece15000 C:\Windows\System32\USER32.dll -0x00007ff9d0f20000 - 0x00007ff9d11b3000 C:\Windows\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.26100.6899_none_3e0efeeae32e88c1\COMCTL32.dll -0x00007ff9ea7f0000 - 0x00007ff9ea817000 C:\Windows\System32\win32u.dll -0x00007ff9eb6a0000 - 0x00007ff9eb749000 C:\Windows\System32\msvcrt.dll -0x00007ff9eb430000 - 0x00007ff9eb45b000 C:\Windows\System32\GDI32.dll -0x00007ff9eaa40000 - 0x00007ff9eab6d000 C:\Windows\System32\gdi32full.dll -0x00007ff9ea820000 - 0x00007ff9ea8c3000 C:\Windows\System32\msvcp_win.dll -0x00007ff9ebca0000 - 0x00007ff9ebccf000 C:\Windows\System32\IMM32.DLL -0x00007ff9e2030000 - 0x00007ff9e203c000 C:\Users\TcT_g\Desktop\ynov\M1\CreateNuclear\jdk\bin\vcruntime140_1.dll -0x00007ff9c7c00000 - 0x00007ff9c7c8d000 C:\Users\TcT_g\Desktop\ynov\M1\CreateNuclear\jdk\bin\msvcp140.dll -0x00007ff874860000 - 0x00007ff8755f7000 C:\Users\TcT_g\Desktop\ynov\M1\CreateNuclear\jdk\bin\server\jvm.dll -0x00007ff9ed1c0000 - 0x00007ff9ed274000 C:\Windows\System32\ADVAPI32.dll -0x00007ff9ecea0000 - 0x00007ff9ecf46000 C:\Windows\System32\sechost.dll -0x00007ff9ecfb0000 - 0x00007ff9ed0c8000 C:\Windows\System32\RPCRT4.dll -0x00007ff9ece20000 - 0x00007ff9ece94000 C:\Windows\System32\WS2_32.dll -0x00007ff9e9420000 - 0x00007ff9e947e000 C:\Windows\SYSTEM32\POWRPROF.dll -0x00007ff9db040000 - 0x00007ff9db04b000 C:\Windows\SYSTEM32\VERSION.dll -0x00007ff9db460000 - 0x00007ff9db495000 C:\Windows\SYSTEM32\WINMM.dll -0x00007ff9e9400000 - 0x00007ff9e9414000 C:\Windows\SYSTEM32\UMPDC.dll -0x00007ff9e96e0000 - 0x00007ff9e96fb000 C:\Windows\SYSTEM32\kernel.appcore.dll -0x00007ff9e1f30000 - 0x00007ff9e1f3a000 C:\Users\TcT_g\Desktop\ynov\M1\CreateNuclear\jdk\bin\jimage.dll -0x00007ff9e7e60000 - 0x00007ff9e80a2000 C:\Windows\SYSTEM32\DBGHELP.DLL -0x00007ff9ed280000 - 0x00007ff9ed5fb000 C:\Windows\System32\combase.dll -0x00007ff9ebce0000 - 0x00007ff9ebdb7000 C:\Windows\System32\OLEAUT32.dll -0x00007ff9cb010000 - 0x00007ff9cb04c000 C:\Windows\SYSTEM32\dbgcore.DLL -0x00007ff9eb240000 - 0x00007ff9eb2d8000 C:\Windows\System32\bcryptPrimitives.dll -0x00007ff9d2170000 - 0x00007ff9d21ac000 C:\Users\TcT_g\Desktop\ynov\M1\CreateNuclear\jdk\bin\jdwp.dll -0x00007ff9dc090000 - 0x00007ff9dc09f000 C:\Users\TcT_g\Desktop\ynov\M1\CreateNuclear\jdk\bin\instrument.dll -0x00007ff9d4c30000 - 0x00007ff9d4c4f000 C:\Users\TcT_g\Desktop\ynov\M1\CreateNuclear\jdk\bin\java.dll -0x00007ff9d28e0000 - 0x00007ff9d28f8000 C:\Users\TcT_g\Desktop\ynov\M1\CreateNuclear\jdk\bin\zip.dll -0x00007ff9ebff0000 - 0x00007ff9ec73d000 C:\Windows\System32\SHELL32.dll -0x00007ff9ea8d0000 - 0x00007ff9eaa3b000 C:\Windows\System32\wintypes.dll -0x00007ff9e8440000 - 0x00007ff9e8c9d000 C:\Windows\SYSTEM32\windows.storage.dll -0x00007ff9ebba0000 - 0x00007ff9ebc92000 C:\Windows\System32\SHCORE.dll -0x00007ff9eb630000 - 0x00007ff9eb692000 C:\Windows\System32\shlwapi.dll -0x00007ff9ea710000 - 0x00007ff9ea739000 C:\Windows\SYSTEM32\profapi.dll -0x00007ff9b0b30000 - 0x00007ff9b0c07000 C:\Users\TcT_g\Desktop\ynov\M1\CreateNuclear\jdk\bin\jsvml.dll -0x00007ff9d4d90000 - 0x00007ff9d4da0000 C:\Users\TcT_g\Desktop\ynov\M1\CreateNuclear\jdk\bin\net.dll -0x00007ff9e3db0000 - 0x00007ff9e3ecf000 C:\Windows\SYSTEM32\WINHTTP.dll -0x00007ff9e9c50000 - 0x00007ff9e9cbb000 C:\Windows\system32\mswsock.dll -0x00007ff9d28c0000 - 0x00007ff9d28d6000 C:\Users\TcT_g\Desktop\ynov\M1\CreateNuclear\jdk\bin\nio.dll -0x00007ff9d5530000 - 0x00007ff9d553b000 C:\Users\TcT_g\Desktop\ynov\M1\CreateNuclear\jdk\bin\dt_socket.dll -0x00007ff9e90a0000 - 0x00007ff9e90d4000 C:\Windows\SYSTEM32\IPHLPAPI.DLL -0x00007ff9d4840000 - 0x00007ff9d4850000 C:\Users\TcT_g\Desktop\ynov\M1\CreateNuclear\jdk\bin\verify.dll -0x00007ff9d3150000 - 0x00007ff9d315a000 C:\Users\TcT_g\Desktop\ynov\M1\CreateNuclear\jdk\bin\management.dll -0x00007ff9d2f80000 - 0x00007ff9d2f8b000 C:\Users\TcT_g\Desktop\ynov\M1\CreateNuclear\jdk\bin\management_ext.dll -0x00007ff9ecc40000 - 0x00007ff9ecc48000 C:\Windows\System32\PSAPI.DLL -0x00007ff9a93b0000 - 0x00007ff9a93c8000 C:\Windows\system32\napinsp.dll -0x00007ff9e9140000 - 0x00007ff9e9266000 C:\Windows\SYSTEM32\DNSAPI.dll -0x00007ff9eb7d0000 - 0x00007ff9eb7da000 C:\Windows\System32\NSI.dll -0x00007ff9a4270000 - 0x00007ff9a4282000 C:\Windows\System32\winrnr.dll -0x00007ff9a3e50000 - 0x00007ff9a3e78000 C:\Windows\system32\nlansp_c.dll -0x00007ff9e26a0000 - 0x00007ff9e26b6000 C:\Windows\system32\wshbth.dll -0x00007ff9e3080000 - 0x00007ff9e308b000 C:\Windows\System32\rasadhlp.dll -0x00007ff9e41e0000 - 0x00007ff9e4266000 C:\Windows\System32\fwpuclnt.dll -0x00007ff9cd6a0000 - 0x00007ff9cd715000 C:\Users\TcT_g\AppData\Local\Temp\lwjglTcT_g\3.3.1-build-7\lwjgl.dll -0x00007ff9cb110000 - 0x00007ff9cb171000 C:\Users\TcT_g\AppData\Local\Temp\lwjglTcT_g\3.3.1-build-7\glfw.dll - -JVMTI agents: -jdwp path:C:\Users\TcT_g\Desktop\ynov\M1\CreateNuclear\jdk\bin\jdwp.dll, loaded, initialized, options:transport=dt_socket,server=n,suspend=y,address=127.0.0.1:58923 -C:\Users\TcT_g\AppData\Local\JetBrains\IntelliJIdea2025.2\captureAgent\debugger-agent.jar path:C:\Users\TcT_g\Desktop\ynov\M1\CreateNuclear\jdk\bin\instrument.dll, loaded, initialized, instrumentlib options:file:///C:/Users/TcT_g/AppData/Local/Temp/capture6757434691262209115.props - -dbghelp: loaded successfully - version: 4.0.5 - missing functions: none -symbol engine: initialized successfully - sym options: 0x614 - pdb path: .;C:\Users\TcT_g\Desktop\ynov\M1\CreateNuclear\jdk\bin;C:\Windows\SYSTEM32;C:\Windows\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.26100.6899_none_3e0efeeae32e88c1;C:\Users\TcT_g\Desktop\ynov\M1\CreateNuclear\jdk\bin\server;C:\Users\TcT_g\AppData\Local\Temp\lwjglTcT_g\3.3.1-build-7 - -VM Arguments: -jvm_args: -Ddebugger.agent.enable.coroutines=true -Dforge.enableGameTest=true -Dforge.logging.console.level=debug -Dforge.logging.markers=REGISTRIES -DignoreList=bootstraplauncher,securejarhandler,asm-commons,asm-util,asm-analysis,asm-tree,asm,JarJarFileSystems,client-extra,fmlcore,javafmllanguage,lowcodelanguage,mclanguage,forge- -Djava.net.preferIPv6Addresses=system -Dkotlinx.coroutines.debug.enable.creation.stack.trace=false -Dkotlinx.coroutines.debug.enable.flows.stack.trace=true -Dkotlinx.coroutines.debug.enable.mutable.state.flows.stack.trace=true -DlegacyClassPath.file=C:\Users\TcT_g\Desktop\ynov\M1\CreateNuclear\CreateNuclearForge\build\classpath\runClient_minecraftClasspath.txt -DmergeModules=jna-5.10.0.jar,jna-platform-5.10.0.jar -Dmixin.debug.export=true -Dmixin.debug.verbose=true -Dmixin.env.refMapRemappingFile=C:\Users\TcT_g\Desktop\ynov\M1\CreateNuclear\CreateNuclearForge/build/createSrgToMcp/output.srg -Dmixin.env.remapRefMap=true -Dnet.minecraftforge.gradle.GradleStart.srg.srg-mcp=C:\Users\TcT_g\Desktop\ynov\M1\CreateNuclear\CreateNuclearForge\build\createSrgToMcp\output.srg --module-path=C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\cpw.mods\bootstraplauncher\1.1.2\c546e00443d8432cda6baa1c860346980742628\bootstraplauncher-1.1.2.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\cpw.mods\securejarhandler\2.1.10\51e6a22c6c716beb11e244bf5b8be480f51dd6b5\securejarhandler-2.1.10.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-commons\9.5\19ab5b5800a3910d30d3a3e64fdb00fd0cb42de0\asm-commons-9.5.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-util\9.5\64b5a1fc8c1b15ed2efd6a063e976bc8d3dc5ffe\asm-util-9.5.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-analysis\9.5\490bacc77de7cbc0be1a30bb3471072d705be4a4\asm-analysis-9.5.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-tree\9.5\fd33c8b6373abaa675be407082fdfda35021254a\asm-tree-9.5.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm\9.5\dc6ea1875f4d64fbc85e1691c95b96a3d8569c90\asm-9.5.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\net.minecraftforge\JarJarFileSystems\0.3.19\2464eb7d6b9ddb9db36a82cf8a95193e5c6fe020\JarJarFileSystems-0.3.19.jar --add-modules=ALL-MODULE-PATH --add-opens=java.base/java.util.jar=cpw.mods.securejarhandler --add-opens=java.base/java.lang.invoke=cpw.mods.securejarhandler --add-exports=java.base/sun.security.util=cpw.mods.securejarhandler --add-exports=jdk.naming.dns/com.sun.jndi.dns=java.naming -XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump --module-path=C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\cpw.mods\bootstraplauncher\1.1.2\c546e00443d8432cda6baa1c860346980742628\bootstraplauncher-1.1.2.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\cpw.mods\securejarhandler\2.1.10\51e6a22c6c716beb11e244bf5b8be480f51dd6b5\securejarhandler-2.1.10.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-commons\9.5\19ab5b5800a3910d30d3a3e64fdb00fd0cb42de0\asm-commons-9.5.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-util\9.5\64b5a1fc8c1b15ed2efd6a063e976bc8d3dc5ffe\asm-util-9.5.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-analysis\9.5\490bacc77de7cbc0be1a30bb3471072d705be4a4\asm-analysis-9.5.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-tree\9.5\fd33c8b6373abaa675be407082fdfda35021254a\asm-tree-9.5.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm\9.5\dc6ea1875f4d64fbc85e1691c95b96a3d8569c90\asm-9.5.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\net.minecraftforge\JarJarFileSystems\0.3.19\2464eb7d6b9ddb9db36a82cf8a95193e5c6fe020\JarJarFileSystems-0.3.19.jar --add-modules=ALL-MODULE-PATH --add-opens=java.base/java.util.jar=cpw.mods.securejarhandler --add-opens=java.base/java.lang.invoke=cpw.mods.securejarhandler --add-exports=java.base/sun.security.util=cpw.mods.securejarhandler --add-exports=jdk.naming.dns/com.sun.jndi.dns=java.naming -XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump -agentlib:jdwp=transport=dt_socket,server=n,suspend=y,address=127.0.0.1:58923 -javaagent:C:\Users\TcT_g\AppData\Local\JetBrains\IntelliJIdea2025.2\captureAgent\debugger-agent.jar=file:///C:/Users/TcT_g/AppData/Local/Temp/capture6757434691262209115.props -Dfile.encoding=UTF-8 -Duser.country=FR -Duser.language=fr -Duser.variant -java_command: cpw.mods.bootstraplauncher.BootstrapLauncher --launchTarget forgeclientuserdev --version MOD_DEV --assetIndex 5 --assetsDir C:\Users\TcT_g\.gradle\caches\forge_gradle\assets --gameDir . --fml.forgeVersion 47.2.6 --fml.mcVersion 1.20.1 --fml.forgeGroup net.minecraftforge --fml.mcpVersion 20230612.114412 --mixin.config createnuclear.forge.mixins.json -java_class_path (initial): C:\Users\TcT_g\Desktop\ynov\M1\CreateNuclear\CreateNuclearForge\build\classes\java\main;C:\Users\TcT_g\Desktop\ynov\M1\CreateNuclear\CreateNuclearForge\build\resources\main;C:\Users\TcT_g\.gradle\caches\forge_gradle\deobf_dependencies\curse\maven\jade-324717\6106101_mapped_parchment_2023.09.03-1.20.1\jade-324717-6106101_mapped_parchment_2023.09.03-1.20.1.jar;C:\Users\TcT_g\.gradle\caches\forge_gradle\deobf_dependencies\com\simibubi\create\create-1.20.1\6.0.8-289_mapped_parchment_2023.09.03-1.20.1\create-1.20.1-6.0.8-289_mapped_parchment_2023.09.03-1.20.1-slim.jar;C:\Users\TcT_g\.gradle\caches\forge_gradle\deobf_dependencies\net\createmod\ponder\Ponder-Forge-1.20.1\1.0.91_mapped_parchment_2023.09.03-1.20.1\Ponder-Forge-1.20.1-1.0.91_mapped_parchment_2023.09.03-1.20.1.jar;C:\Users\TcT_g\.gradle\caches\forge_gradle\deobf_dependencies\com\tterrag\registrate\Registrate\MC1.20-1.3.3_mapped_parchment_2023.09.03-1.20.1\Registrate-MC1.20-1.3.3_mapped_parchment_2023.09.03-1.20.1.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\io.github.llamalad7\mixinextras-forge\0.4.1\5c35573a7b76103724799ca1174a69699b8a9aec\mixinextras-forge-0.4.1.jar;C:\Users\TcT_g\Desktop\ynov\M1\CreateNuclear\CreateNuclearForge\build\fg_cache\net\minecraftforge\forge\1.20.1-47.2.6_mapped_parchment_2023.09.03-1.20.1\forge-1.20.1-47.2.6_mapped_parchment_2023.09.03-1.20.1-recomp.jar;C:\Users\TcT_g\.gradle\caches\forge_gradle\deobf_dependencies\dev\engine-room\flywheel\flywheel-forge-1.20.1\1.0.5_mapped_parchment_2023.09.03-1.20.1\flywheel-forge-1.20.1-1.0.5_mapped_parchment_2023.09.03-1.20.1.jar;C:\Users\TcT_g\.gradle\caches\forge_gradle\deobf_dependencies\mezz\jei\jei-1.20.1-forge\15.20.0.105_mapped_parchment_2023.09.03-1.20.1\jei-1.20.1-forge-15.20.0.105_mapped_parchment_2023.09.03-1.20.1.jar;C:\Users\TcT_g\.gradle\caches\forge_gradle\minecraft_repo\versions\1.20.1\client-extra.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\net.minecraftforge\fmlearlydisplay\1.20.1-47.2.6\855538dcc7ae05a1de27881ebd5725cd7177201\fmlearlydisplay-1.20.1-47.2.6.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\net.minecraftforge\javafmllanguage\1.20.1-47.2.6\56551ed4a181a00930b0365996e1d9f3ca851459\javafmllanguage-1.20.1-47.2.6.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\net.minecraftforge\lowcodelanguage\1.20.1-47.2.6\f27bd133cd78227e8d6def633b83c881a30cc243\lowcodelanguage-1.20.1-47.2.6.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\net.minecraftforge\mclanguage\1.20.1-47.2.6\6e1641ac5a046737d7c3209901ca0a829d636873\mclanguage-1.20.1-47.2.6.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\net.minecraftforge\fmlcore\1.20.1-47.2.6\2d5f5aff839b7d2825c6968049399633d1c4d0b8\fmlcore-1.20.1-47.2.6.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\net.minecraftforge\fmlloader\1.20.1-47.2.6\7e862c69c8fd10696819690249f2afa0d1da3c3b\fmlloader-1.20.1-47.2.6.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\net.minecraftforge\JarJarSelector\0.3.19\376cc9c8ea60720cf027c01fc033de915699801c\JarJarSelector-0.3.19.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\net.minecraftforge\JarJarMetadata\0.3.19\83feaa9b770e6ac0e96ee4fc23fa89325c5fe2\JarJarMetadata-0.3.19.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\com.google.guava\guava\31.1-jre\60458f877d055d0c9114d9e1a2efb737b4bc282c\guava-31.1-jre.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\com.google.code.findbugs\jsr305\3.0.2\25ea2e8b0c338a877313bd4672d3fe056ea78f0d\jsr305-3.0.2.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\ca.weblite\java-objc-bridge\1.1\1227f9e0666314f9de41477e3ec277e542ed7f7b\java-objc-bridge-1.1.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\net.minecraftforge\coremods\5.0.1\386b00279628b105b2d507539c46e134e96f6237\coremods-5.0.1.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\net.minecraftforge\forgespi\7.0.1\3b4972a0cdb135853dba219be61a79b22cff1309\forgespi-7.0.1.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\net.minecraftforge\mergetool\1.1.5\f3da18e12c696d35a47c82cbb2cc8b5aa15e1154\mergetool-1.1.5-api.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.jetbrains\annotations\24.0.1\13c5c75c4206580aa4d683bffee658caae6c9f43\annotations-24.0.1.jar;C:\Users\TcT_g\.gradle\caches\parchmentgradle\org\parchmentmc\data\parchment-1.20.1\2023.09.03\parchment-1.20.1-2023.09.03.zip;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\net.minecraftforge\accesstransformers\8.0.4\272d240aa73f42195b2a68e2ebd8b701ecf41f63\accesstransformers-8.0.4.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\net.minecraftforge\eventbus\6.0.5\699143dd438431d06b57416944f7cedbe52e1475\eventbus-6.0.5.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\cpw.mods\modlauncher\10.0.9\6d9443f56f50bb85cea383686ff9c867391458b\modlauncher-10.0.9.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\cpw.mods\bootstraplauncher\1.1.2\c546e00443d8432cda6baa1c860346980742628\bootstraplauncher-1.1.2.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\cpw.mods\securejarhandler\2.1.10\51e6a22c6c716beb11e244bf5b8be480f51dd6b5\securejarhandler-2.1.10.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.openjdk.nashorn\nashorn-core\15.3\43977e804697048fc8d81d333a36c17d07a5b3dd\nashorn-core-15.3.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-commons\9.5\19ab5b5800a3910d30d3a3e64fdb00fd0cb42de0\asm-commons-9.5.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-util\9.5\64b5a1fc8c1b15ed2efd6a063e976bc8d3dc5ffe\asm-util-9.5.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-analysis\9.5\490bacc77de7cbc0be1a30bb3471072d705be4a4\asm-analysis-9.5.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-tree\9.5\fd33c8b6373abaa675be407082fdfda35021254a\asm-tree-9.5.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm\9.5\dc6ea1875f4d64fbc85e1691c95b96a3d8569c90\asm-9.5.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.antlr\antlr4\4.9.1\e92af8ab33e428461927b484e90bb155a4f3a052\antlr4-4.9.1.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.antlr\antlr4-runtime\4.9.1\428664f05d2b7f7b7610204b5aa7c1763f62011a\antlr4-runtime-4.9.1.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\net.minecraftforge\unsafe\0.2.0\54d7a0a5e8fdb71b973025caa46f341ae5904f39\unsafe-0.2.0.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\com.electronwill.night-config\toml\3.6.4\51d6cefb2b55ee55ee26b16391212fb2c7dfb4f4\toml-3.6.4.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\com.electronwill.night-config\core\3.6.4\510f174abbf1c947494db50ef2445683bd52c230\core-3.6.4.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.apache.maven\maven-artifact\3.8.5\4433f50c07debefaed0553bd0068f4f48d449313\maven-artifact-3.8.5.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\net.jodah\typetools\0.6.3\a01aaa6ddaea9ec07ec4f209487b7a46a526283a\typetools-0.6.3.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\net.minecrell\terminalconsoleappender\1.2.0\96d02cd3b384ff015a8fef4223bcb4ccf1717c95\terminalconsoleappender-1.2.0.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.jline\jline-reader\3.12.1\4382ab1382c7b6f379377ed5f665dc2f6e1218bc\jline-reader-3.12.1.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.jline\jline-terminal\3.12.1\c777448314e050d980a6b697c140f3bfe9eb7416\jline-terminal-3.12.1.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.spongepowered\mixin\0.8.5\9d1c0c3a304ae6697ecd477218fa61b850bf57fc\mixin-0.8.5.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\net.minecraftforge\JarJarFileSystems\0.3.19\2464eb7d6b9ddb9db36a82cf8a95193e5c6fe020\JarJarFileSystems-0.3.19.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\com.github.oshi\oshi-core\6.2.2\54f5efc19bca95d709d9a37d19ffcbba3d21c1a6\oshi-core-6.2.2.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\com.google.code.gson\gson\2.10\dd9b193aef96e973d5a11ab13cd17430c2e4306b\gson-2.10.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\com.google.guava\failureaccess\1.0.1\1dcf1de382a0bf95a3d8b0849546c88bac1292c9\failureaccess-1.0.1.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\com.ibm.icu\icu4j\71.1\9e7d3304c23f9ba5cb71915f7cce23231a57a445\icu4j-71.1.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\com.mojang\authlib\4.0.43\2ff9d747a77570a07a60d32ac77eb6162ad2a2d9\authlib-4.0.43.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\com.mojang\blocklist\1.0.10\5c685c5ffa94c4cd39496c7184c1d122e515ecef\blocklist-1.0.10.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\com.mojang\brigadier\1.1.8\5244ce82c3337bba4a196a3ce858bfaecc74404a\brigadier-1.1.8.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\com.mojang\datafixerupper\6.0.8\3ba4a30557a9b057760af4011f909ba619fc5125\datafixerupper-6.0.8.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\com.mojang\logging\1.1.1\832b8e6674a9b325a5175a3a6267dfaf34c85139\logging-1.1.1.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\com.mojang\patchy\2.2.10\da05971b07cbb379d002cf7eaec6a2048211fefc\patchy-2.2.10.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\com.mojang\text2speech\1.17.9\3cad216e3a7f0c19b4b394388bc9ffc446f13b14\text2speech-1.17.9.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.apache.httpcomponents\httpclient\4.5.13\e5f6cae5ca7ecaac1ec2827a9e2d65ae2869cada\httpclient-4.5.13.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\commons-codec\commons-codec\1.15\49d94806b6e3dc933dacbd8acb0fdbab8ebd1e5d\commons-codec-1.15.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\commons-io\commons-io\2.11.0\a2503f302b11ebde7ebc3df41daebe0e4eea3689\commons-io-2.11.0.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\commons-logging\commons-logging\1.2\4bfc12adfe4842bf07b657f0369c4cb522955686\commons-logging-1.2.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\io.netty\netty-handler\4.1.82.Final\644041d1fa96a5d3130a29e8978630d716d76e38\netty-handler-4.1.82.Final.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\io.netty\netty-codec\4.1.82.Final\b77200379acb345a9ffdece1c605e591ac3e4e0a\netty-codec-4.1.82.Final.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\io.netty\netty-transport-classes-epoll\4.1.82.Final\e7c7dd18deac93105797f30057c912651ea76521\netty-transport-classes-epoll-4.1.82.Final.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\io.netty\netty-transport-native-unix-common\4.1.82.Final\3e895b35ca1b8a0eca56cacff4c2dde5d2c6abce\netty-transport-native-unix-common-4.1.82.Final.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\io.netty\netty-transport\4.1.82.Final\e431a218d91acb6476ccad5f5aafde50aa3945ca\netty-transport-4.1.82.Final.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\io.netty\netty-buffer\4.1.82.Final\a544270cf1ae8b8077082f5036436a9a9971ea71\netty-buffer-4.1.82.Final.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\io.netty\netty-resolver\4.1.82.Final\38f665ae8dcd29032eea31245ba7806bed2e0fa8\netty-resolver-4.1.82.Final.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\io.netty\netty-common\4.1.82.Final\22d148e85c3f5ebdacc0ce1f5aabb1d420f73f3\netty-common-4.1.82.Final.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\it.unimi.dsi\fastutil\8.5.9\bb7ea75ecdb216654237830b3a96d87ad91f8cc5\fastutil-8.5.9.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\net.java.dev.jna\jna-platform\5.12.1\97406a297c852f4a41e688a176ec675f72e8329\jna-platform-5.12.1.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\net.java.dev.jna\jna\5.12.1\b1e93a735caea94f503e95e6fe79bf9cdc1e985d\jna-5.12.1.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\net.sf.jopt-simple\jopt-simple\5.0.4\4fdac2fbe92dfad86aa6e9301736f6b4342a3f5c\jopt-simple-5.0.4.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.apache.commons\commons-compress\1.21\4ec95b60d4e86b5c95a0e919cb172a0af98011ef\commons-compress-1.21.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.apache.commons\commons-lang3\3.12.0\c6842c86792ff03b9f1d1fe2aab8dc23aa6c6f0e\commons-lang3-3.12.0.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.apache.httpcomponents\httpcore\4.4.15\7f2e0c573eaa7a74bac2e89b359e1f73d92a0a1d\httpcore-4.4.15.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.apache.logging.log4j\log4j-core\2.19.0\3b6eeb4de4c49c0fe38a4ee27188ff5fee44d0bb\log4j-core-2.19.0.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.apache.logging.log4j\log4j-slf4j2-impl\2.19.0\5c04bfdd63ce9dceb2e284b81e96b6a70010ee10\log4j-slf4j2-impl-2.19.0.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.apache.logging.log4j\log4j-api\2.19.0\ea1b37f38c327596b216542bc636cfdc0b8036fa\log4j-api-2.19.0.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.joml\joml\1.10.5\22566d58af70ad3d72308bab63b8339906deb649\joml-1.10.5.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-glfw\3.3.1\cbac1b8d30cb4795149c1ef540f912671a8616d0\lwjgl-glfw-3.3.1.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-glfw\3.3.1\ed892f945cf7e79c8756796f32d00fa4ceaf573b\lwjgl-glfw-3.3.1-natives-windows.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-glfw\3.3.1\beda65ee503443e60aa196d58ed31f8d001dc22a\lwjgl-glfw-3.3.1-natives-windows-arm64.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-glfw\3.3.1\b997e3391d6ce8f05487e7335d95c606043884a1\lwjgl-glfw-3.3.1-natives-windows-x86.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-jemalloc\3.3.1\a817bcf213db49f710603677457567c37d53e103\lwjgl-jemalloc-3.3.1.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-jemalloc\3.3.1\948a89b76a16aa324b046ae9308891216ffce5f9\lwjgl-jemalloc-3.3.1-natives-windows.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-jemalloc\3.3.1\cae85c4edb219c88b6a0c26a87955ad98dc9519d\lwjgl-jemalloc-3.3.1-natives-windows-arm64.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-jemalloc\3.3.1\fb476c8ec110e1c137ad3ce8a7f7bfe6b11c6324\lwjgl-jemalloc-3.3.1-natives-windows-x86.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-openal\3.3.1\2623a6b8ae1dfcd880738656a9f0243d2e6840bd\lwjgl-openal-3.3.1.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-openal\3.3.1\30a474d0e57193d7bc128849a3ab66bc9316fdb1\lwjgl-openal-3.3.1-natives-windows.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-openal\3.3.1\40d65f1a7368a2aa47336f9cb69f5a190cf9975a\lwjgl-openal-3.3.1-natives-windows-arm64.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-openal\3.3.1\888349f7b1be6fbae58bf8edfb9ef12def04c4e3\lwjgl-openal-3.3.1-natives-windows-x86.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-opengl\3.3.1\831a5533a21a5f4f81bbc51bb13e9899319b5411\lwjgl-opengl-3.3.1.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-opengl\3.3.1\c1807e9bd571402787d7e37e3029776ae2513bb8\lwjgl-opengl-3.3.1-natives-windows.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-opengl\3.3.1\527d78f1e9056aff3ed02ce93019c73c5e8f1721\lwjgl-opengl-3.3.1-natives-windows-arm64.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-opengl\3.3.1\deef3eb9b178ff2ff3ce893cc72ae741c3a17974\lwjgl-opengl-3.3.1-natives-windows-x86.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-stb\3.3.1\b119297cf8ed01f247abe8685857f8e7fcf5980f\lwjgl-stb-3.3.1.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-stb\3.3.1\86315914ac119efdb02dc9e8e978ade84f1702af\lwjgl-stb-3.3.1-natives-windows.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-stb\3.3.1\fde63cdd2605c00636721a6c8b961e41d1f6b247\lwjgl-stb-3.3.1-natives-windows-arm64.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-stb\3.3.1\a8d41f419eecb430b7c91ea2ce2c5c451cae2091\lwjgl-stb-3.3.1-natives-windows-x86.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-tinyfd\3.3.1\ff1914111ef2e3e0110ef2dabc8d8cdaad82347\lwjgl-tinyfd-3.3.1.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-tinyfd\3.3.1\a5d830475ec0958d9fdba1559efa99aef211e6ff\lwjgl-tinyfd-3.3.1-natives-windows.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-tinyfd\3.3.1\83a5e780df610829ff3a737822b4f931cffecd91\lwjgl-tinyfd-3.3.1-natives-windows-arm64.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-tinyfd\3.3.1\842eedd876fae354abc308c98a263f6bbc9e8a4d\lwjgl-tinyfd-3.3.1-natives-windows-x86.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl\3.3.1\ae58664f88e18a9bb2c77b063833ca7aaec484cb\lwjgl-3.3.1.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl\3.3.1\36c37f16ab611b3aa11f3bcf80b1d509b4ce6b\lwjgl-3.3.1-natives-windows.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl\3.3.1\f46cadcf95675908fd3a550d63d9d709cb68998\lwjgl-3.3.1-natives-windows-arm64.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl\3.3.1\3b14f4beae9dd39791ec9e12190a9380cd8a3ce6\lwjgl-3.3.1-natives-windows-x86.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\com.machinezoo.noexception\noexception\1.7.1\b65330c98e38a1f915fa54a6e5eca496505e3f0a\noexception-1.7.1.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.slf4j\slf4j-simple\1.7.30\e606eac955f55ecf1d8edcccba04eb8ac98088dd\slf4j-simple-1.7.30.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.slf4j\slf4j-api\2.0.1\f48d81adce2abf5ad3cfe463df517952749e03bc\slf4j-api-2.0.1.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\net.minecraftforge\srgutils\0.4.11\fbad1341ffdb47d276bbdc40ecb06da49e053e74\srgutils-0.4.11.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.codehaus.plexus\plexus-utils\3.3.0\cf43b5391de623b36fe066a21127baef82c64022\plexus-utils-3.3.0.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\com.google.guava\listenablefuture\9999.0-empty-to-avoid-conflict-with-guava\b421526c5f297295adef1c886e5246c39d4ac629\listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.checkerframework\checker-qual\3.12.0\d5692f0526415fcc6de94bb5bfbd3afd9dd3b3e5\checker-qual-3.12.0.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\com.google.errorprone\error_prone_annotations\2.11.0\c5a0ace696d3f8b1c1d8cc036d8c03cc0cbe6b69\error_prone_annotations-2.11.0.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\com.google.j2objc\j2objc-annotations\1.3\ba035118bc8bac37d7eff77700720999acd9986d\j2objc-annotations-1.3.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.antlr\ST4\4.3\92f2c1ad8d84abcbeead6cf7f2c53a04166293c2\ST4-4.3.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.antlr\antlr-runtime\3.5.2\cd9cd41361c155f3af0f653009dcecb08d8b4afd\antlr-runtime-3.5.2.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.abego.treelayout\org.abego.treelayout.core\1.0.3\457216e8e6578099ae63667bb1e4439235892028\org.abego.treelayout.core-1.0.3.jar;C:\Users\TcT_g\.gradle\caches\modules-2\files-2.1\org.glassfish\javax.json\1.0.4\3178f73569fd7a1e5ffc464e680f7a8cc784b85a\javax.json-1.0.4.jar -Launcher Type: SUN_STANDARD - -[Global flags] - intx CICompilerCount = 12 {product} {ergonomic} - uint ConcGCThreads = 3 {product} {ergonomic} - uint G1ConcRefinementThreads = 13 {product} {ergonomic} - size_t G1HeapRegionSize = 4194304 {product} {ergonomic} - uintx GCDrainStackTargetSize = 64 {product} {ergonomic} - ccstr HeapDumpPath = MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump {manageable} {command line} - size_t InitialHeapSize = 524288000 {product} {ergonomic} - size_t MarkStackSize = 4194304 {product} {ergonomic} - size_t MaxHeapSize = 8355053568 {product} {ergonomic} - size_t MaxNewSize = 5012193280 {product} {ergonomic} - size_t MinHeapDeltaBytes = 4194304 {product} {ergonomic} - size_t MinHeapSize = 8388608 {product} {ergonomic} - uintx NonNMethodCodeHeapSize = 7602480 {pd product} {ergonomic} - uintx NonProfiledCodeHeapSize = 122027880 {pd product} {ergonomic} - uintx ProfiledCodeHeapSize = 122027880 {pd product} {ergonomic} - uintx ReservedCodeCacheSize = 251658240 {pd product} {ergonomic} - bool SegmentedCodeCache = true {product} {ergonomic} - size_t SoftMaxHeapSize = 8355053568 {manageable} {ergonomic} - bool UseCompressedOops = true {product lp64_product} {ergonomic} - bool UseG1GC = true {product} {ergonomic} - bool UseLargePagesIndividualAllocation = false {pd product} {ergonomic} - -Logging: -Log output configuration: - #0: stdout all=warning uptime,level,tags foldmultilines=false - #1: stderr all=off uptime,level,tags foldmultilines=false - -Environment Variables: -PATH=C:\Python314\Scripts\;C:\Python314\;C:\Program Files (x86)\Common Files\Oracle\Java\java8path;C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\NVIDIA Corporation\NVIDIA App\NvDLISR;C:\Program Files\dotnet\;C:\Windows\AtlasModules;C:\Windows\AtlasModules\Tools;C:\Windows\AtlasModules\Scripts;C:\Program Files\Git\cmd;C:\Program Files\nodejs\;C:\ProgramData\chocolatey\bin;C:\Program Files\cursor\resources\app\bin;C:\Program Files\PowerToys\;C:\Program Files\Docker\Docker\resources\bin;C:\Users\TcT_g\AppData\Local\Microsoft\WindowsApps;C:\Users\TcT_g\AppData\Local\Programs\Microsoft VS Code\bin;C:\Program Files\JetBrains\IntelliJ IDEA 2025.2.3\bin;C:\Users\TcT_g\AppData\Roaming\npm;C:\Users\TcT_g\AppData\Local\Programs\Antigravity\bin -USERNAME=TcT_g -OS=Windows_NT -PROCESSOR_IDENTIFIER=AMD64 Family 26 Model 96 Stepping 0, AuthenticAMD -TMP=C:\Users\TcT_g\AppData\Local\Temp -TEMP=C:\Users\TcT_g\AppData\Local\Temp - - - - -Periodic native trim disabled - ---------------- S Y S T E M --------------- - -OS: - Windows 11 , 64 bit Build 26100 (10.0.26100.6725) -OS uptime: 0 days 6:19 hours -Hyper-V role detected - -CPU: total 16 (initial active 16) (16 cores per cpu, 2 threads per core) family 26 model 96 stepping 0 microcode 0xb60000e, cx8, cmov, fxsr, ht, mmx, 3dnowpref, sse, sse2, sse3, ssse3, sse4a, sse4.1, sse4.2, popcnt, lzcnt, tsc, tscinvbit, avx, avx2, aes, erms, clmul, bmi1, bmi2, adx, avx512f, avx512dq, avx512cd, avx512bw, avx512vl, sha, fma, vzeroupper, avx512_vpopcntdq, avx512_vpclmulqdq, avx512_vaes, avx512_vnni, clflush, clflushopt, avx512_vbmi2, avx512_vbmi, hv, rdtscp, rdpid, fsrm, gfni, avx512_bitalg, f16c, cet_ss, avx512_ifma -Processor Information for the first 16 processors : - Max Mhz: 2000, Current Mhz: 2000, Mhz Limit: 2000 - -Memory: 4k page, system-wide physical 31865M (12873M free) -TotalPageFile size 42617M (AvailPageFile size 8050M) -current process WorkingSet (physical memory assigned to process): 522M, peak: 522M -current process commit charge ("private bytes"): 827M, peak: 827M - -vm_info: OpenJDK 64-Bit Server VM (21.0.8+9-LTS) for windows-amd64 JRE (21.0.8+9-LTS), built on 2025-07-15T00:00:00Z by "admin" with MS VC++ 17.7 (VS2022) - -END. diff --git a/run/hs_err_pid27848.log b/run/hs_err_pid27848.log deleted file mode 100644 index 336db0663..000000000 --- a/run/hs_err_pid27848.log +++ /dev/null @@ -1,2638 +0,0 @@ -# -# There is insufficient memory for the Java Runtime Environment to continue. -# Native memory allocation (mmap) failed to map 211812352 bytes. Error detail: G1 virtual space -# Possible reasons: -# The system is out of physical RAM or swap space -# This process is running with CompressedOops enabled, and the Java Heap may be blocking the growth of the native heap -# Possible solutions: -# Reduce memory load on the system -# Increase physical memory or swap space -# Check if swap backing store is full -# Decrease Java heap size (-Xmx/-Xms) -# Decrease number of Java threads -# Decrease Java thread stack sizes (-Xss) -# Set larger code cache with -XX:ReservedCodeCacheSize= -# JVM is running with Zero Based Compressed Oops mode in which the Java heap is -# placed in the first 32GB address space. The Java Heap base address is the -# maximum limit for the native heap growth. Please use -XX:HeapBaseMinAddress -# to set the Java Heap base and to place the Java Heap above 32GB virtual address. -# This output file may be truncated or incomplete. -# -# Out of Memory Error (os_windows.cpp:3618), pid=27848, tid=27956 -# -# JRE version: OpenJDK Runtime Environment Temurin-17.0.17+10 (17.0.17+10) (build 17.0.17+10) -# Java VM: OpenJDK 64-Bit Server VM Temurin-17.0.17+10 (17.0.17+10, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, g1 gc, windows-amd64) -# No core dump will be written. Minidumps are not enabled by default on client versions of Windows -# - ---------------- S U M M A R Y ------------ - -Command Line: -Dforge.enableGameTest=true -Dforge.logging.console.level=debug -Dforge.logging.markers=REGISTRIES -DignoreList=bootstraplauncher,securejarhandler,asm-commons,asm-util,asm-analysis,asm-tree,asm,JarJarFileSystems,client-extra,fmlcore,javafmllanguage,lowcodelanguage,mclanguage,forge- -Djava.net.preferIPv6Addresses=system -DlegacyClassPath.file=C:\Users\Utilisateur\Documents\travail\ynov\ydays\CreateNuclearForge\build\classpath\runClient_minecraftClasspath.txt -DmergeModules=jna-5.10.0.jar,jna-platform-5.10.0.jar -Dmixin.debug.export=true -Dmixin.debug.verbose=true -Dmixin.env.refMapRemappingFile=C:\Users\Utilisateur\Documents\travail\ynov\ydays\CreateNuclearForge/build/createSrgToMcp/output.srg -Dmixin.env.remapRefMap=true -Dnet.minecraftforge.gradle.GradleStart.srg.srg-mcp=C:\Users\Utilisateur\Documents\travail\ynov\ydays\CreateNuclearForge\build\createSrgToMcp\output.srg --module-path=C:\Users\Utilisateur\.gradle\caches\modules-2\files-2.1\cpw.mods\bootstraplauncher\1.1.2\c546e00443d8432cda6baa1c860346980742628\bootstraplauncher-1.1.2.jar;C:\Users\Utilisateur\.gradle\caches\modules-2\files-2.1\cpw.mods\securejarhandler\2.1.10\51e6a22c6c716beb11e244bf5b8be480f51dd6b5\securejarhandler-2.1.10.jar;C:\Users\Utilisateur\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-commons\9.5\19ab5b5800a3910d30d3a3e64fdb00fd0cb42de0\asm-commons-9.5.jar;C:\Users\Utilisateur\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-util\9.5\64b5a1fc8c1b15ed2efd6a063e976bc8d3dc5ffe\asm-util-9.5.jar;C:\Users\Utilisateur\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-analysis\9.5\490bacc77de7cbc0be1a30bb3471072d705be4a4\asm-analysis-9.5.jar;C:\Users\Utilisateur\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-tree\9.5\fd33c8b6373abaa675be407082fdfda35021254a\asm-tree-9.5.jar;C:\Users\Utilisateur\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm\9.5\dc6ea1875f4d64fbc85e1691c95b96a3d8569c90\asm-9.5.jar;C:\Users\Utilisateur\.gradle\caches\modules-2\files-2.1\net.minecraftforge\JarJarFileSystems\0.3.19\2464eb7d6b9ddb9db36a82cf8a95193e5c6fe020\JarJarFileSystems-0.3.19.jar --add-modules=ALL-MODULE-PATH --add-opens=java.base/java.util.jar=cpw.mods.securejarhandler --add-opens=java.base/java.lang.invoke=cpw.mods.securejarhandler --add-exports=java.base/sun.security.util=cpw.mods.securejarhandler --add-exports=jdk.naming.dns/com.sun.jndi.dns=java.naming -XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump -Dfile.encoding=UTF-8 -Duser.country=FR -Duser.language=fr -Duser.variant cpw.mods.bootstraplauncher.BootstrapLauncher --launchTarget forgeclientuserdev --version MOD_DEV --assetIndex 5 --assetsDir C:\Users\Utilisateur\.gradle\caches\forge_gradle\assets --gameDir . --fml.forgeVersion 47.2.6 --fml.mcVersion 1.20.1 --fml.forgeGroup net.minecraftforge --fml.mcpVersion 20230612.114412 --mixin.config createnuclear.forge.mixins.json - -Host: 12th Gen Intel(R) Core(TM) i7-12700F, 20 cores, 15G, Windows 11 , 64 bit Build 26100 (10.0.26100.8328) -Time: Tue May 19 14:54:23 2026 Paris, Madrid (heure duild 26100 (10.0.26100.8328) elapsed time: 41.604246 seconds (0d 0h 0m 41s) - ---------------- T H R E A D --------------- - -Current thread (0x000001fbff57a010): VMThread "VM Thread" [stack: 0x000000c54f500000,0x000000c54f600000] [id=27956] - -Stack: [0x000000c54f500000,0x000000c54f600000] -Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) -V [jvm.dll+0x683fb9] -V [jvm.dll+0x83a1b5] -V [jvm.dll+0x83bc2e] -V [jvm.dll+0x83c2b3] -V [jvm.dll+0x248eff] -V [jvm.dll+0x680d79] -V [jvm.dll+0x675b7a] -V [jvm.dll+0x3091a7] -V [jvm.dll+0x310776] -V [jvm.dll+0x360bbe] -V [jvm.dll+0x360dfd] -V [jvm.dll+0x2e022c] -V [jvm.dll+0x2de602] -V [jvm.dll+0x2ddd9c] -V [jvm.dll+0x320a3b] -V [jvm.dll+0x840acd] -V [jvm.dll+0x841803] -V [jvm.dll+0x841d2f] -V [jvm.dll+0x842115] -V [jvm.dll+0x8421de] -V [jvm.dll+0x7ea44c] -V [jvm.dll+0x682e87] -C [ucrtbase.dll+0x37b0] -C [KERNEL32.DLL+0x2e957] -C [ntdll.dll+0x427c] - -VM_Operation (0x000000c553efefa0): G1CollectForAllocation, mode: safepoint, requested by thread 0x000001fbe8a6fbb0 - - ---------------- P R O C E S S --------------- - -Threads class SMR info: -_java_thread_list=0x000001fbea81b420, length=64, elements={ -0x000001fbef365e40, 0x000001fbff581410, 0x000001fbff583b00, 0x000001fbff597de0, -0x000001fbff5982c0, 0x000001fbff5987a0, 0x000001fbff59cc90, 0x000001fbff59f8c0, -0x000001fbff5a5e00, 0x000001fb93429fc0, 0x000001fb934c7bb0, 0x000001fb93561300, -0x000001fb93650850, 0x000001fbe78809b0, 0x000001fbdff9a200, 0x000001fbdff97980, -0x000001fbdff983a0, 0x000001fbdff99cf0, 0x000001fbdff9a710, 0x000001fbe787f060, -0x000001fbe787dc20, 0x000001fbe787e130, 0x000001fbe8a6a5a0, 0x000001fbe8a6a090, -0x000001fbe8a6afc0, 0x000001fbe8a6bef0, 0x000001fbe8a68c50, 0x000001fbe8a68740, -0x000001fbe8a6c400, 0x000001fbe8a6dd50, 0x000001fbe8a6e770, 0x000001fbe8a6ec80, -0x000001fbe8a6f6a0, 0x000001fbe8a6f190, 0x000001fbe8a6fbb0, 0x000001fbdff992d0, -0x000001fbe787fa80, 0x000001fbe8a30c40, 0x000001fbe8a32fb0, 0x000001fbe8a31660, -0x000001fbe8a2f800, 0x000001fbe8a2fd10, 0x000001fbe8a31b70, 0x000001fbe8a32080, -0x000001fbe8a31150, 0x000001fbe8a30730, 0x000001fbe8a32590, 0x000001fbe8a32aa0, -0x000001fbe8a334c0, 0x000001fbe8a339d0, 0x000001fbe8a35830, 0x000001fbe8a6d330, -0x000001fbdff51620, 0x000001fbdff52f70, 0x000001fbdff53480, 0x000001fbde3f9930, -0x000001fbdff501e0, 0x000001fbdff53ea0, 0x000001fbdff57650, 0x000001fbdff552e0, -0x000001fbdff543b0, 0x000001fbdff56720, 0x000001fbdff548c0, 0x000001fbdff50c00 -} - -Java Threads: ( => current thread ) - 0x000001fbef365e40 JavaThread "Render thread" [_thread_blocked, id=27932, stack(0x000000c54ef00000,0x000000c54f000000)] - 0x000001fbff581410 JavaThread "Reference Handler" daemon [_thread_blocked, id=27960, stack(0x000000c54f600000,0x000000c54f700000)] - 0x000001fbff583b00 JavaThread "Finalizer" daemon [_thread_blocked, id=27964, stack(0x000000c54f700000,0x000000c54f800000)] - 0x000001fbff597de0 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=27968, stack(0x000000c54f800000,0x000000c54f900000)] - 0x000001fbff5982c0 JavaThread "Attach Listener" daemon [_thread_blocked, id=27972, stack(0x000000c54f900000,0x000000c54fa00000)] - 0x000001fbff5987a0 JavaThread "Service Thread" daemon [_thread_blocked, id=27976, stack(0x000000c54fa00000,0x000000c54fb00000)] - 0x000001fbff59cc90 JavaThread "Monitor Deflation Thread" daemon [_thread_blocked, id=27980, stack(0x000000c54fb00000,0x000000c54fc00000)] - 0x000001fbff59f8c0 JavaThread "C2 CompilerThread0" daemon [_thread_blocked, id=27984, stack(0x000000c54fc00000,0x000000c54fd00000)] - 0x000001fbff5a5e00 JavaThread "C1 CompilerThread0" daemon [_thread_blocked, id=27988, stack(0x000000c54fd00000,0x000000c54fe00000)] - 0x000001fb93429fc0 JavaThread "Sweeper thread" daemon [_thread_blocked, id=27992, stack(0x000000c54fe00000,0x000000c54ff00000)] - 0x000001fb934c7bb0 JavaThread "C1 CompilerThread1" daemon [_thread_blocked, id=27996, stack(0x000000c54ff00000,0x000000c550000000)] - 0x000001fb93561300 JavaThread "Common-Cleaner" daemon [_thread_blocked, id=28000, stack(0x000000c550000000,0x000000c550100000)] - 0x000001fb93650850 JavaThread "Notification Thread" daemon [_thread_blocked, id=28016, stack(0x000000c550300000,0x000000c550400000)] - 0x000001fbe78809b0 JavaThread "JNA Cleaner" daemon [_thread_blocked, id=28280, stack(0x000000c552400000,0x000000c552500000)] - 0x000001fbdff9a200 JavaThread "Timer hack thread" daemon [_thread_blocked, id=24660, stack(0x000000c551f00000,0x000000c552000000)] - 0x000001fbdff97980 JavaThread "Yggdrasil Key Fetcher" daemon [_thread_blocked, id=23804, stack(0x000000c552600000,0x000000c552700000)] - 0x000001fbdff983a0 JavaThread "Cleaner-0" daemon [_thread_blocked, id=19428, stack(0x000000c552b00000,0x000000c552c00000)] - 0x000001fbdff99cf0 JavaThread "modloading-worker-0" daemon [_thread_blocked, id=18624, stack(0x000000c552d00000,0x000000c552e00000)] - 0x000001fbdff9a710 JavaThread "modloading-worker-0" daemon [_thread_blocked, id=26600, stack(0x000000c552e00000,0x000000c552f00000)] - 0x000001fbe787f060 JavaThread "modloading-worker-0" daemon [_thread_blocked, id=27640, stack(0x000000c552f00000,0x000000c553000000)] - 0x000001fbe787dc20 JavaThread "modloading-worker-0" daemon [_thread_blocked, id=25292, stack(0x000000c553000000,0x000000c553100000)] - 0x000001fbe787e130 JavaThread "modloading-worker-0" daemon [_thread_blocked, id=18128, stack(0x000000c553100000,0x000000c553200000)] - 0x000001fbe8a6a5a0 JavaThread "modloading-worker-0" daemon [_thread_blocked, id=544, stack(0x000000c553200000,0x000000c553300000)] - 0x000001fbe8a6a090 JavaThread "modloading-worker-0" daemon [_thread_blocked, id=26844, stack(0x000000c553300000,0x000000c553400000)] - 0x000001fbe8a6afc0 JavaThread "modloading-worker-0" daemon [_thread_blocked, id=27520, stack(0x000000c553400000,0x000000c553500000)] - 0x000001fbe8a6bef0 JavaThread "modloading-worker-0" daemon [_thread_blocked, id=27468, stack(0x000000c553500000,0x000000c553600000)] - 0x000001fbe8a68c50 JavaThread "modloading-worker-0" daemon [_thread_blocked, id=26204, stack(0x000000c553600000,0x000000c553700000)] - 0x000001fbe8a68740 JavaThread "FileSystemWatchService" daemon [_thread_in_native, id=24156, stack(0x000000c553800000,0x000000c553900000)] - 0x000001fbe8a6c400 JavaThread "JEI Config File Watcher" daemon [_thread_blocked, id=25816, stack(0x000000c553900000,0x000000c553a00000)] - 0x000001fbe8a6dd50 JavaThread "Worker-Main-1" daemon [_thread_blocked, id=10556, stack(0x000000c552300000,0x000000c552400000)] - 0x000001fbe8a6e770 JavaThread "Thread-3" daemon [_thread_blocked, id=24648, stack(0x000000c553a00000,0x000000c553b00000)] - 0x000001fbe8a6ec80 JavaThread "FileSystemWatchService" daemon [_thread_in_native, id=19160, stack(0x000000c553b00000,0x000000c553c00000)] - 0x000001fbe8a6f6a0 JavaThread "Worker-Main-2" daemon [_thread_blocked, id=5812, stack(0x000000c553c00000,0x000000c553d00000)] - 0x000001fbe8a6f190 JavaThread "Worker-Main-3" daemon [_thread_blocked, id=27348, stack(0x000000c553d00000,0x000000c553e00000)] - 0x000001fbe8a6fbb0 JavaThread "Worker-Main-4" daemon [_thread_blocked, id=26584, stack(0x000000c553e00000,0x000000c553f00000)] - 0x000001fbdff992d0 JavaThread "Worker-Main-5" daemon [_thread_blocked, id=27100, stack(0x000000c553f00000,0x000000c554000000)] - 0x000001fbe787fa80 JavaThread "Worker-Main-6" daemon [_thread_blocked, id=26144, stack(0x000000c554000000,0x000000c554100000)] - 0x000001fbe8a30c40 JavaThread "Worker-Main-7" daemon [_thread_blocked, id=14828, stack(0x000000c554100000,0x000000c554200000)] - 0x000001fbe8a32fb0 JavaThread "Worker-Main-8" daemon [_thread_blocked, id=14940, stack(0x000000c554200000,0x000000c554300000)] - 0x000001fbe8a31660 JavaThread "Worker-Main-9" daemon [_thread_blocked, id=12632, stack(0x000000c554300000,0x000000c554400000)] - 0x000001fbe8a2f800 JavaThread "Worker-Main-10" daemon [_thread_blocked, id=27600, stack(0x000000c554400000,0x000000c554500000)] - 0x000001fbe8a2fd10 JavaThread "Worker-Main-11" daemon [_thread_blocked, id=23584, stack(0x000000c554500000,0x000000c554600000)] - 0x000001fbe8a31b70 JavaThread "Worker-Main-13" daemon [_thread_blocked, id=26860, stack(0x000000c554600000,0x000000c554700000)] - 0x000001fbe8a32080 JavaThread "Worker-Main-12" daemon [_thread_blocked, id=25924, stack(0x000000c554700000,0x000000c554800000)] - 0x000001fbe8a31150 JavaThread "Worker-Main-14" daemon [_thread_blocked, id=18176, stack(0x000000c554900000,0x000000c554a00000)] - 0x000001fbe8a30730 JavaThread "Worker-Main-15" daemon [_thread_blocked, id=25156, stack(0x000000c554b00000,0x000000c554c00000)] - 0x000001fbe8a32590 JavaThread "Worker-Main-16" daemon [_thread_blocked, id=26168, stack(0x000000c554c00000,0x000000c554d00000)] - 0x000001fbe8a32aa0 JavaThread "Worker-Main-17" daemon [_thread_blocked, id=3980, stack(0x000000c554d00000,0x000000c554e00000)] - 0x000001fbe8a334c0 JavaThread "Worker-Main-18" daemon [_thread_blocked, id=16172, stack(0x000000c554e00000,0x000000c554f00000)] - 0x000001fbe8a339d0 JavaThread "Worker-Main-19" daemon [_thread_blocked, id=26028, stack(0x000000c554f00000,0x000000c555000000)] - 0x000001fbe8a35830 JavaThread "IO-Worker-20" [_thread_blocked, id=27012, stack(0x000000c555100000,0x000000c555200000)] - 0x000001fbe8a6d330 JavaThread "Cleaner-1" daemon [_thread_blocked, id=23984, stack(0x000000c556000000,0x000000c556100000)] - 0x000001fbdff51620 JavaThread "Server thread" [_thread_blocked, id=27908, stack(0x000000c551300000,0x000000c551400000)] - 0x000001fbdff52f70 JavaThread "FileSystemWatchService" daemon [_thread_in_native, id=27900, stack(0x000000c551600000,0x000000c551700000)] - 0x000001fbdff53480 JavaThread "IO-Worker-21" [_thread_blocked, id=24340, stack(0x000000c553700000,0x000000c553800000)] - 0x000001fbde3f9930 JavaThread "C2 CompilerThread1" daemon [_thread_blocked, id=27420, stack(0x000000c550200000,0x000000c550300000)] - 0x000001fbdff501e0 JavaThread "IO-Worker-22" [_thread_blocked, id=28096, stack(0x000000c555e00000,0x000000c555f00000)] - 0x000001fbdff53ea0 JavaThread "IO-Worker-23" [_thread_blocked, id=26300, stack(0x000000c555f00000,0x000000c556000000)] - 0x000001fbdff57650 JavaThread "Java2D Disposer" daemon [_thread_blocked, id=24460, stack(0x000000c555200000,0x000000c555300000)] - 0x000001fbdff552e0 JavaThread "Netty Server IO #0" daemon [_thread_in_native, id=27604, stack(0x000000c550500000,0x000000c550600000)] - 0x000001fbdff543b0 JavaThread "Netty Local Client IO #0" daemon [_thread_blocked, id=27412, stack(0x000000c550600000,0x000000c550700000)] - 0x000001fbdff56720 JavaThread "Netty Server IO #1" daemon [_thread_in_native, id=25360, stack(0x000000c551100000,0x000000c551200000)] - 0x000001fbdff548c0 JavaThread "IO-Worker-24" [_thread_blocked, id=21412, stack(0x000000c555300000,0x000000c555400000)] - 0x000001fbdff50c00 JavaThread "Sound engine" daemon [_thread_blocked, id=6428, stack(0x000000c555400000,0x000000c555500000)] - -Other Threads: -=>0x000001fbff57a010 VMThread "VM Thread" [stack: 0x000000c54f500000,0x000000c54f600000] [id=27956] - 0x000001fbef3679e0 WatcherThread [stack: 0x000000c550400000,0x000000c550500000] [id=28020] - 0x000001fbef3d2450 GCTaskThread "GC Thread#0" [stack: 0x000000c54f000000,0x000000c54f100000] [id=27936] - 0x000001fbd954b2e0 GCTaskThread "GC Thread#1" [stack: 0x000000c550800000,0x000000c550900000] [id=28036] - 0x000001fbd954a6b0 GCTaskThread "GC Thread#2" [stack: 0x000000c550900000,0x000000c550a00000] [id=28040] - 0x000001fbd90a8180 GCTaskThread "GC Thread#3" [stack: 0x000000c550a00000,0x000000c550b00000] [id=28044] - 0x000001fbd90a8440 GCTaskThread "GC Thread#4" [stack: 0x000000c550b00000,0x000000c550c00000] [id=28048] - 0x000001fbd90a8700 GCTaskThread "GC Thread#5" [stack: 0x000000c550c00000,0x000000c550d00000] [id=28052] - 0x000001fbdf747a30 GCTaskThread "GC Thread#6" [stack: 0x000000c550d00000,0x000000c550e00000] [id=28076] - 0x000001fbdd6529c0 GCTaskThread "GC Thread#7" [stack: 0x000000c551700000,0x000000c551800000] [id=28168] - 0x000001fbdb709300 GCTaskThread "GC Thread#8" [stack: 0x000000c551800000,0x000000c551900000] [id=28172] - 0x000001fbdf620160 GCTaskThread "GC Thread#9" [stack: 0x000000c551900000,0x000000c551a00000] [id=28176] - 0x000001fbdca83cb0 GCTaskThread "GC Thread#10" [stack: 0x000000c551a00000,0x000000c551b00000] [id=28180] - 0x000001fbdc7a4ea0 GCTaskThread "GC Thread#11" [stack: 0x000000c551b00000,0x000000c551c00000] [id=28184] - 0x000001fbd90d1fd0 GCTaskThread "GC Thread#12" [stack: 0x000000c551c00000,0x000000c551d00000] [id=28188] - 0x000001fbdd05fb70 GCTaskThread "GC Thread#13" [stack: 0x000000c551d00000,0x000000c551e00000] [id=28192] - 0x000001fbdcaa5840 GCTaskThread "GC Thread#14" [stack: 0x000000c551e00000,0x000000c551f00000] [id=28196] - 0x000001fbef3e3190 ConcurrentGCThread "G1 Main Marker" [stack: 0x000000c54f100000,0x000000c54f200000] [id=27940] - 0x000001fbef3e54e0 ConcurrentGCThread "G1 Conc#0" [stack: 0x000000c54f200000,0x000000c54f300000] [id=27944] - 0x000001fbdcaa6e40 ConcurrentGCThread "G1 Conc#1" [stack: 0x000000c552000000,0x000000c552100000] [id=28204] - 0x000001fbdcaa6600 ConcurrentGCThread "G1 Conc#2" [stack: 0x000000c552100000,0x000000c552200000] [id=28208] - 0x000001fbdcaa6b80 ConcurrentGCThread "G1 Conc#3" [stack: 0x000000c552200000,0x000000c552300000] [id=28212] - 0x000001fbff4b14a0 ConcurrentGCThread "G1 Refine#0" [stack: 0x000000c54f300000,0x000000c54f400000] [id=27948] - 0x000001fbdc2e2c30 ConcurrentGCThread "G1 Refine#1" [stack: 0x000000c552700000,0x000000c552800000] [id=28360] - 0x000001fbdc2e3500 ConcurrentGCThread "G1 Refine#2" [stack: 0x000000c552800000,0x000000c552900000] [id=28364] - 0x000001fbdef8f5c0 ConcurrentGCThread "G1 Refine#3" [stack: 0x000000c552900000,0x000000c552a00000] [id=28368] - 0x000001fbdef8d860 ConcurrentGCThread "G1 Refine#4" [stack: 0x000000c552a00000,0x000000c552b00000] [id=28372] - 0x000001fbdad67280 ConcurrentGCThread "G1 Refine#5" [stack: 0x000000c555000000,0x000000c555100000] [id=25524] - 0x000001fbdad65230 ConcurrentGCThread "G1 Refine#6" [stack: 0x000000c555500000,0x000000c555600000] [id=12304] - 0x000001fbdad67570 ConcurrentGCThread "G1 Refine#7" [stack: 0x000000c555600000,0x000000c555700000] [id=27188] - 0x000001fbdad68130 ConcurrentGCThread "G1 Refine#8" [stack: 0x000000c555700000,0x000000c555800000] [id=5156] - 0x000001fbdad68a00 ConcurrentGCThread "G1 Refine#9" [stack: 0x000000c555800000,0x000000c555900000] [id=26768] - 0x000001fbdad65b00 ConcurrentGCThread "G1 Refine#10" [stack: 0x000000c555900000,0x000000c555a00000] [id=25548] - 0x000001fbdad666c0 ConcurrentGCThread "G1 Refine#11" [stack: 0x000000c555a00000,0x000000c555b00000] [id=26400] - 0x000001fbdad65520 ConcurrentGCThread "G1 Refine#12" [stack: 0x000000c555b00000,0x000000c555c00000] [id=13180] - 0x000001fbdad68420 ConcurrentGCThread "G1 Refine#13" [stack: 0x000000c555c00000,0x000000c555d00000] [id=24672] - 0x000001fbdad66ca0 ConcurrentGCThread "G1 Refine#14" [stack: 0x000000c554a00000,0x000000c554b00000] [id=27068] - 0x000001fbff4b1890 ConcurrentGCThread "G1 Service" [stack: 0x000000c54f400000,0x000000c54f500000] [id=27952] - -Threads with active compile tasks: -C2 CompilerThread0 41732 24886 4 net.minecraftforge.registries.NamespacedWrapper::getOptional (12 bytes) -C2 CompilerThread1 41732 25205 % 4 net.minecraft.world.level.chunk.storage.ChunkSerializer::read @ 170 (1424 bytes) - -VM state: at safepoint (normal execution) - -VM Mutex/Monitor currently owned by a thread: ([mutex/lock_event]) -[0x000001fbef35ff30] Threads_lock - owner thread: 0x000001fbff57a010 -[0x000001fbef360440] Heap_lock - owner thread: 0x000001fbe8a6fbb0 - -Heap address: 0x0000000702800000, size: 4056 MB, Compressed Oops mode: Zero based, Oop shift amount: 3 - -CDS archive(s) mapped at: [0x000001fb94000000-0x000001fb94bb0000-0x000001fb94bb0000), size 12255232, SharedBaseAddress: 0x000001fb94000000, ArchiveRelocationMode: 1. -Compressed class space mapped at: 0x000001fb95000000-0x000001fbd5000000, reserved size: 1073741824 -Narrow klass base: 0x000001fb94000000, Narrow klass shift: 0, Narrow klass range: 0x100000000 - -GC Precious Log: - CPUs: 20 total, 20 available - Memory: 16222M - Large Page Support: Disabled - NUMA Support: Disabled - Compressed Oops: Enabled (Zero based) - Heap Region Size: 2M - Heap Min Capacity: 8M - Heap Initial Capacity: 254M - Heap Max Capacity: 4056M - Pre-touch: Disabled - Parallel Workers: 15 - Concurrent Workers: 4 - Concurrent Refinement Workers: 15 - Periodic GC: Disabled - -Heap: - garbage-first heap total 3639296K, used 2162688K [0x0000000702800000, 0x0000000800000000) - region size 2048K, 38 young (77824K), 38 survivors (77824K) - Metaspace used 147655K, committed 149440K, reserved 1179648K - class space used 22729K, committed 23552K, reserved 1048576K - -Heap Regions: E=young(eden), S=young(survivor), O=old, HS=humongous(starts), HC=humongous(continues), CS=collection set, F=free, OA=open archive, CA=closed archive, TAMS=top-at-mark-start (previous, next) -| 0|0x0000000702800000, 0x0000000702a00000, 0x0000000702a00000|100%|HS| |TAMS 0x0000000702a00000, 0x0000000702800000| Complete -| 1|0x0000000702a00000, 0x0000000702c00000, 0x0000000702c00000|100%|HS| |TAMS 0x0000000702c00000, 0x0000000702a00000| Complete -| 2|0x0000000702c00000, 0x0000000702e00000, 0x0000000702e00000|100%| O| |TAMS 0x0000000702e00000, 0x0000000702c00000| Untracked -| 3|0x0000000702e00000, 0x0000000703000000, 0x0000000703000000|100%| O| |TAMS 0x0000000703000000, 0x0000000702e00000| Untracked -| 4|0x0000000703000000, 0x0000000703200000, 0x0000000703200000|100%|HS| |TAMS 0x0000000703200000, 0x0000000703000000| Complete -| 5|0x0000000703200000, 0x0000000703400000, 0x0000000703400000|100%| O| |TAMS 0x0000000703400000, 0x0000000703200000| Untracked -| 6|0x0000000703400000, 0x0000000703600000, 0x0000000703600000|100%| O| |TAMS 0x0000000703600000, 0x0000000703400000| Untracked -| 7|0x0000000703600000, 0x0000000703800000, 0x0000000703800000|100%|HS| |TAMS 0x0000000703800000, 0x0000000703600000| Complete -| 8|0x0000000703800000, 0x0000000703a00000, 0x0000000703a00000|100%|HS| |TAMS 0x0000000703a00000, 0x0000000703800000| Complete -| 9|0x0000000703a00000, 0x0000000703c00000, 0x0000000703c00000|100%| O| |TAMS 0x0000000703c00000, 0x0000000703a00000| Untracked -| 10|0x0000000703c00000, 0x0000000703e00000, 0x0000000703e00000|100%| O| |TAMS 0x0000000703e00000, 0x0000000703c00000| Untracked -| 11|0x0000000703e00000, 0x0000000704000000, 0x0000000704000000|100%| O| |TAMS 0x0000000704000000, 0x0000000703e00000| Untracked -| 12|0x0000000704000000, 0x0000000704200000, 0x0000000704200000|100%| O| |TAMS 0x0000000704200000, 0x0000000704000000| Untracked -| 13|0x0000000704200000, 0x0000000704400000, 0x0000000704400000|100%| O| |TAMS 0x0000000704400000, 0x0000000704200000| Untracked -| 14|0x0000000704400000, 0x0000000704600000, 0x0000000704600000|100%| O| |TAMS 0x0000000704600000, 0x0000000704400000| Untracked -| 15|0x0000000704600000, 0x0000000704800000, 0x0000000704800000|100%| O| |TAMS 0x0000000704800000, 0x0000000704600000| Untracked -| 16|0x0000000704800000, 0x0000000704a00000, 0x0000000704a00000|100%|HS| |TAMS 0x0000000704a00000, 0x0000000704800000| Complete -| 17|0x0000000704a00000, 0x0000000704c00000, 0x0000000704c00000|100%| O| |TAMS 0x0000000704c00000, 0x0000000704a00000| Untracked -| 18|0x0000000704c00000, 0x0000000704e00000, 0x0000000704e00000|100%| O| |TAMS 0x0000000704e00000, 0x0000000704c00000| Untracked -| 19|0x0000000704e00000, 0x0000000705000000, 0x0000000705000000|100%| O| |TAMS 0x0000000705000000, 0x0000000704e00000| Untracked -| 20|0x0000000705000000, 0x0000000705200000, 0x0000000705200000|100%| O| |TAMS 0x0000000705200000, 0x0000000705000000| Untracked -| 21|0x0000000705200000, 0x0000000705400000, 0x0000000705400000|100%| O| |TAMS 0x0000000705400000, 0x0000000705200000| Untracked -| 22|0x0000000705400000, 0x0000000705600000, 0x0000000705600000|100%| O| |TAMS 0x0000000705600000, 0x0000000705400000| Untracked -| 23|0x0000000705600000, 0x0000000705800000, 0x0000000705800000|100%| O| |TAMS 0x0000000705800000, 0x0000000705600000| Untracked -| 24|0x0000000705800000, 0x0000000705a00000, 0x0000000705a00000|100%| O| |TAMS 0x0000000705a00000, 0x0000000705800000| Untracked -| 25|0x0000000705a00000, 0x0000000705c00000, 0x0000000705c00000|100%| O| |TAMS 0x0000000705c00000, 0x0000000705a00000| Untracked -| 26|0x0000000705c00000, 0x0000000705e00000, 0x0000000705e00000|100%| O| |TAMS 0x0000000705e00000, 0x0000000705c00000| Untracked -| 27|0x0000000705e00000, 0x0000000706000000, 0x0000000706000000|100%|HS| |TAMS 0x0000000706000000, 0x0000000705e00000| Complete -| 28|0x0000000706000000, 0x0000000706200000, 0x0000000706200000|100%|HS| |TAMS 0x0000000706200000, 0x0000000706000000| Complete -| 29|0x0000000706200000, 0x0000000706400000, 0x0000000706400000|100%| O| |TAMS 0x0000000706400000, 0x0000000706200000| Untracked -| 30|0x0000000706400000, 0x0000000706600000, 0x0000000706600000|100%| O| |TAMS 0x0000000706600000, 0x0000000706400000| Untracked -| 31|0x0000000706600000, 0x0000000706800000, 0x0000000706800000|100%| O| |TAMS 0x0000000706800000, 0x0000000706600000| Untracked -| 32|0x0000000706800000, 0x0000000706a00000, 0x0000000706a00000|100%| O| |TAMS 0x0000000706a00000, 0x0000000706800000| Untracked -| 33|0x0000000706a00000, 0x0000000706c00000, 0x0000000706c00000|100%| O| |TAMS 0x0000000706c00000, 0x0000000706a00000| Untracked -| 34|0x0000000706c00000, 0x0000000706e00000, 0x0000000706e00000|100%| O| |TAMS 0x0000000706e00000, 0x0000000706c00000| Untracked -| 35|0x0000000706e00000, 0x0000000707000000, 0x0000000707000000|100%| O| |TAMS 0x0000000707000000, 0x0000000706e00000| Untracked -| 36|0x0000000707000000, 0x0000000707200000, 0x0000000707200000|100%| O| |TAMS 0x0000000707200000, 0x0000000707000000| Untracked -| 37|0x0000000707200000, 0x0000000707400000, 0x0000000707400000|100%| O| |TAMS 0x0000000707400000, 0x0000000707200000| Untracked -| 38|0x0000000707400000, 0x0000000707600000, 0x0000000707600000|100%| O| |TAMS 0x0000000707600000, 0x0000000707400000| Untracked -| 39|0x0000000707600000, 0x0000000707800000, 0x0000000707800000|100%| O| |TAMS 0x0000000707800000, 0x0000000707600000| Untracked -| 40|0x0000000707800000, 0x0000000707a00000, 0x0000000707a00000|100%| O| |TAMS 0x0000000707a00000, 0x0000000707800000| Untracked -| 41|0x0000000707a00000, 0x0000000707c00000, 0x0000000707c00000|100%| O| |TAMS 0x0000000707c00000, 0x0000000707a00000| Untracked -| 42|0x0000000707c00000, 0x0000000707e00000, 0x0000000707e00000|100%| O| |TAMS 0x0000000707e00000, 0x0000000707c00000| Untracked -| 43|0x0000000707e00000, 0x0000000708000000, 0x0000000708000000|100%| O| |TAMS 0x0000000708000000, 0x0000000707e00000| Untracked -| 44|0x0000000708000000, 0x0000000708200000, 0x0000000708200000|100%| O| |TAMS 0x0000000708200000, 0x0000000708000000| Untracked -| 45|0x0000000708200000, 0x0000000708400000, 0x0000000708400000|100%| O| |TAMS 0x0000000708400000, 0x0000000708200000| Untracked -| 46|0x0000000708400000, 0x0000000708600000, 0x0000000708600000|100%| O| |TAMS 0x0000000708600000, 0x0000000708400000| Untracked -| 47|0x0000000708600000, 0x0000000708800000, 0x0000000708800000|100%| O| |TAMS 0x0000000708800000, 0x0000000708600000| Untracked -| 48|0x0000000708800000, 0x0000000708a00000, 0x0000000708a00000|100%| O| |TAMS 0x0000000708a00000, 0x0000000708800000| Untracked -| 49|0x0000000708a00000, 0x0000000708c00000, 0x0000000708c00000|100%| O| |TAMS 0x0000000708c00000, 0x0000000708a00000| Untracked -| 50|0x0000000708c00000, 0x0000000708e00000, 0x0000000708e00000|100%| O| |TAMS 0x0000000708e00000, 0x0000000708c00000| Untracked -| 51|0x0000000708e00000, 0x0000000709000000, 0x0000000709000000|100%| O| |TAMS 0x0000000709000000, 0x0000000708e00000| Untracked -| 52|0x0000000709000000, 0x0000000709200000, 0x0000000709200000|100%|HS| |TAMS 0x0000000709200000, 0x0000000709000000| Complete -| 53|0x0000000709200000, 0x0000000709400000, 0x0000000709400000|100%|HC| |TAMS 0x0000000709400000, 0x0000000709200000| Complete -| 54|0x0000000709400000, 0x0000000709600000, 0x0000000709600000|100%|HC| |TAMS 0x0000000709600000, 0x0000000709400000| Complete -| 55|0x0000000709600000, 0x0000000709800000, 0x0000000709800000|100%|HC| |TAMS 0x0000000709800000, 0x0000000709600000| Complete -| 56|0x0000000709800000, 0x0000000709a00000, 0x0000000709a00000|100%|HC| |TAMS 0x0000000709a00000, 0x0000000709800000| Complete -| 57|0x0000000709a00000, 0x0000000709c00000, 0x0000000709c00000|100%|HC| |TAMS 0x0000000709c00000, 0x0000000709a00000| Complete -| 58|0x0000000709c00000, 0x0000000709e00000, 0x0000000709e00000|100%| O| |TAMS 0x0000000709e00000, 0x0000000709c00000| Untracked -| 59|0x0000000709e00000, 0x000000070a000000, 0x000000070a000000|100%| O| |TAMS 0x000000070a000000, 0x0000000709e00000| Untracked -| 60|0x000000070a000000, 0x000000070a200000, 0x000000070a200000|100%| O| |TAMS 0x000000070a200000, 0x000000070a000000| Untracked -| 61|0x000000070a200000, 0x000000070a400000, 0x000000070a400000|100%| O| |TAMS 0x000000070a400000, 0x000000070a200000| Untracked -| 62|0x000000070a400000, 0x000000070a600000, 0x000000070a600000|100%| O| |TAMS 0x000000070a600000, 0x000000070a400000| Untracked -| 63|0x000000070a600000, 0x000000070a800000, 0x000000070a800000|100%| O| |TAMS 0x000000070a800000, 0x000000070a600000| Untracked -| 64|0x000000070a800000, 0x000000070aa00000, 0x000000070aa00000|100%| O| |TAMS 0x000000070aa00000, 0x000000070a800000| Untracked -| 65|0x000000070aa00000, 0x000000070ac00000, 0x000000070ac00000|100%| O| |TAMS 0x000000070ac00000, 0x000000070aa00000| Untracked -| 66|0x000000070ac00000, 0x000000070ae00000, 0x000000070ae00000|100%| O| |TAMS 0x000000070ae00000, 0x000000070ac00000| Untracked -| 67|0x000000070ae00000, 0x000000070b000000, 0x000000070b000000|100%| O| |TAMS 0x000000070b000000, 0x000000070ae00000| Untracked -| 68|0x000000070b000000, 0x000000070b200000, 0x000000070b200000|100%| O| |TAMS 0x000000070b200000, 0x000000070b000000| Untracked -| 69|0x000000070b200000, 0x000000070b400000, 0x000000070b400000|100%| O| |TAMS 0x000000070b400000, 0x000000070b200000| Untracked -| 70|0x000000070b400000, 0x000000070b600000, 0x000000070b600000|100%| O| |TAMS 0x000000070b600000, 0x000000070b400000| Untracked -| 71|0x000000070b600000, 0x000000070b800000, 0x000000070b800000|100%| O| |TAMS 0x000000070b800000, 0x000000070b600000| Untracked -| 72|0x000000070b800000, 0x000000070ba00000, 0x000000070ba00000|100%| O| |TAMS 0x000000070ba00000, 0x000000070b800000| Untracked -| 73|0x000000070ba00000, 0x000000070bc00000, 0x000000070bc00000|100%| O| |TAMS 0x000000070bc00000, 0x000000070ba00000| Untracked -| 74|0x000000070bc00000, 0x000000070be00000, 0x000000070be00000|100%| O| |TAMS 0x000000070be00000, 0x000000070bc00000| Untracked -| 75|0x000000070be00000, 0x000000070c000000, 0x000000070c000000|100%| O| |TAMS 0x000000070c000000, 0x000000070be00000| Untracked -| 76|0x000000070c000000, 0x000000070c200000, 0x000000070c200000|100%| O| |TAMS 0x000000070c200000, 0x000000070c000000| Untracked -| 77|0x000000070c200000, 0x000000070c400000, 0x000000070c400000|100%| O| |TAMS 0x000000070c400000, 0x000000070c200000| Untracked -| 78|0x000000070c400000, 0x000000070c600000, 0x000000070c600000|100%| O| |TAMS 0x000000070c600000, 0x000000070c400000| Untracked -| 79|0x000000070c600000, 0x000000070c800000, 0x000000070c800000|100%| O| |TAMS 0x000000070c800000, 0x000000070c600000| Untracked -| 80|0x000000070c800000, 0x000000070ca00000, 0x000000070ca00000|100%| O| |TAMS 0x000000070ca00000, 0x000000070c800000| Untracked -| 81|0x000000070ca00000, 0x000000070cc00000, 0x000000070cc00000|100%| O| |TAMS 0x000000070cc00000, 0x000000070ca00000| Untracked -| 82|0x000000070cc00000, 0x000000070ce00000, 0x000000070ce00000|100%| O| |TAMS 0x000000070ce00000, 0x000000070cc00000| Untracked -| 83|0x000000070ce00000, 0x000000070d000000, 0x000000070d000000|100%| O| |TAMS 0x000000070d000000, 0x000000070ce00000| Untracked -| 84|0x000000070d000000, 0x000000070d200000, 0x000000070d200000|100%| O| |TAMS 0x000000070d200000, 0x000000070d000000| Untracked -| 85|0x000000070d200000, 0x000000070d400000, 0x000000070d400000|100%| O| |TAMS 0x000000070d400000, 0x000000070d200000| Untracked -| 86|0x000000070d400000, 0x000000070d600000, 0x000000070d600000|100%| O| |TAMS 0x000000070d600000, 0x000000070d400000| Untracked -| 87|0x000000070d600000, 0x000000070d800000, 0x000000070d800000|100%| O| |TAMS 0x000000070d800000, 0x000000070d600000| Untracked -| 88|0x000000070d800000, 0x000000070da00000, 0x000000070da00000|100%| O| |TAMS 0x000000070da00000, 0x000000070d800000| Untracked -| 89|0x000000070da00000, 0x000000070dc00000, 0x000000070dc00000|100%| O| |TAMS 0x000000070dc00000, 0x000000070da00000| Untracked -| 90|0x000000070dc00000, 0x000000070de00000, 0x000000070de00000|100%| O| |TAMS 0x000000070de00000, 0x000000070dc00000| Untracked -| 91|0x000000070de00000, 0x000000070e000000, 0x000000070e000000|100%| O| |TAMS 0x000000070e000000, 0x000000070de00000| Untracked -| 92|0x000000070e000000, 0x000000070e200000, 0x000000070e200000|100%| O| |TAMS 0x000000070e200000, 0x000000070e000000| Untracked -| 93|0x000000070e200000, 0x000000070e400000, 0x000000070e400000|100%| O| |TAMS 0x000000070e400000, 0x000000070e200000| Untracked -| 94|0x000000070e400000, 0x000000070e600000, 0x000000070e600000|100%| O| |TAMS 0x000000070e600000, 0x000000070e400000| Untracked -| 95|0x000000070e600000, 0x000000070e800000, 0x000000070e800000|100%| O| |TAMS 0x000000070e800000, 0x000000070e600000| Untracked -| 96|0x000000070e800000, 0x000000070ea00000, 0x000000070ea00000|100%| O| |TAMS 0x000000070ea00000, 0x000000070e800000| Untracked -| 97|0x000000070ea00000, 0x000000070ec00000, 0x000000070ec00000|100%| O| |TAMS 0x000000070ec00000, 0x000000070ea00000| Untracked -| 98|0x000000070ec00000, 0x000000070ee00000, 0x000000070ee00000|100%| O| |TAMS 0x000000070ee00000, 0x000000070ec00000| Untracked -| 99|0x000000070ee00000, 0x000000070f000000, 0x000000070f000000|100%| O| |TAMS 0x000000070f000000, 0x000000070ee00000| Untracked -| 100|0x000000070f000000, 0x000000070f200000, 0x000000070f200000|100%| O| |TAMS 0x000000070f200000, 0x000000070f000000| Untracked -| 101|0x000000070f200000, 0x000000070f400000, 0x000000070f400000|100%| O| |TAMS 0x000000070f400000, 0x000000070f200000| Untracked -| 102|0x000000070f400000, 0x000000070f600000, 0x000000070f600000|100%| O| |TAMS 0x000000070f600000, 0x000000070f400000| Untracked -| 103|0x000000070f600000, 0x000000070f800000, 0x000000070f800000|100%| O| |TAMS 0x000000070f800000, 0x000000070f600000| Untracked -| 104|0x000000070f800000, 0x000000070fa00000, 0x000000070fa00000|100%| O| |TAMS 0x000000070fa00000, 0x000000070f800000| Untracked -| 105|0x000000070fa00000, 0x000000070fc00000, 0x000000070fc00000|100%| O| |TAMS 0x000000070fc00000, 0x000000070fa00000| Untracked -| 106|0x000000070fc00000, 0x000000070fe00000, 0x000000070fe00000|100%| O| |TAMS 0x000000070fe00000, 0x000000070fc00000| Untracked -| 107|0x000000070fe00000, 0x0000000710000000, 0x0000000710000000|100%| O| |TAMS 0x0000000710000000, 0x000000070fe00000| Untracked -| 108|0x0000000710000000, 0x0000000710200000, 0x0000000710200000|100%| O| |TAMS 0x0000000710200000, 0x0000000710000000| Untracked -| 109|0x0000000710200000, 0x0000000710400000, 0x0000000710400000|100%| O| |TAMS 0x0000000710400000, 0x0000000710200000| Untracked -| 110|0x0000000710400000, 0x0000000710600000, 0x0000000710600000|100%| O| |TAMS 0x0000000710600000, 0x0000000710400000| Untracked -| 111|0x0000000710600000, 0x0000000710800000, 0x0000000710800000|100%| O| |TAMS 0x0000000710800000, 0x0000000710600000| Untracked -| 112|0x0000000710800000, 0x0000000710a00000, 0x0000000710a00000|100%| O| |TAMS 0x0000000710a00000, 0x0000000710800000| Untracked -| 113|0x0000000710a00000, 0x0000000710c00000, 0x0000000710c00000|100%| O| |TAMS 0x0000000710c00000, 0x0000000710a00000| Untracked -| 114|0x0000000710c00000, 0x0000000710e00000, 0x0000000710e00000|100%| O| |TAMS 0x0000000710e00000, 0x0000000710c00000| Untracked -| 115|0x0000000710e00000, 0x0000000711000000, 0x0000000711000000|100%| O| |TAMS 0x0000000711000000, 0x0000000710e00000| Untracked -| 116|0x0000000711000000, 0x0000000711200000, 0x0000000711200000|100%| O| |TAMS 0x0000000711200000, 0x0000000711000000| Untracked -| 117|0x0000000711200000, 0x0000000711400000, 0x0000000711400000|100%| O| |TAMS 0x0000000711400000, 0x0000000711200000| Untracked -| 118|0x0000000711400000, 0x0000000711600000, 0x0000000711600000|100%| O| |TAMS 0x0000000711600000, 0x0000000711400000| Untracked -| 119|0x0000000711600000, 0x0000000711800000, 0x0000000711800000|100%| O| |TAMS 0x0000000711800000, 0x0000000711600000| Untracked -| 120|0x0000000711800000, 0x0000000711a00000, 0x0000000711a00000|100%| O| |TAMS 0x0000000711a00000, 0x0000000711800000| Untracked -| 121|0x0000000711a00000, 0x0000000711c00000, 0x0000000711c00000|100%| O| |TAMS 0x0000000711c00000, 0x0000000711a00000| Untracked -| 122|0x0000000711c00000, 0x0000000711e00000, 0x0000000711e00000|100%| O| |TAMS 0x0000000711e00000, 0x0000000711c00000| Untracked -| 123|0x0000000711e00000, 0x0000000712000000, 0x0000000712000000|100%| O| |TAMS 0x0000000712000000, 0x0000000711e00000| Untracked -| 124|0x0000000712000000, 0x0000000712200000, 0x0000000712200000|100%| O| |TAMS 0x0000000712200000, 0x0000000712000000| Untracked -| 125|0x0000000712200000, 0x0000000712400000, 0x0000000712400000|100%| O| |TAMS 0x0000000712400000, 0x0000000712200000| Untracked -| 126|0x0000000712400000, 0x0000000712600000, 0x0000000712600000|100%| O| |TAMS 0x0000000712600000, 0x0000000712400000| Untracked -| 127|0x0000000712600000, 0x0000000712800000, 0x0000000712800000|100%| O| |TAMS 0x0000000712800000, 0x0000000712600000| Untracked -| 128|0x0000000712800000, 0x0000000712a00000, 0x0000000712a00000|100%| O| |TAMS 0x0000000712a00000, 0x0000000712800000| Untracked -| 129|0x0000000712a00000, 0x0000000712c00000, 0x0000000712c00000|100%| O| |TAMS 0x0000000712c00000, 0x0000000712a00000| Untracked -| 130|0x0000000712c00000, 0x0000000712e00000, 0x0000000712e00000|100%| O| |TAMS 0x0000000712e00000, 0x0000000712c00000| Untracked -| 131|0x0000000712e00000, 0x0000000713000000, 0x0000000713000000|100%| O| |TAMS 0x0000000713000000, 0x0000000712e00000| Untracked -| 132|0x0000000713000000, 0x0000000713200000, 0x0000000713200000|100%| O| |TAMS 0x0000000713200000, 0x0000000713000000| Untracked -| 133|0x0000000713200000, 0x0000000713400000, 0x0000000713400000|100%| O| |TAMS 0x0000000713400000, 0x0000000713200000| Untracked -| 134|0x0000000713400000, 0x0000000713600000, 0x0000000713600000|100%| O| |TAMS 0x0000000713600000, 0x0000000713400000| Untracked -| 135|0x0000000713600000, 0x0000000713800000, 0x0000000713800000|100%| O| |TAMS 0x0000000713800000, 0x0000000713600000| Untracked -| 136|0x0000000713800000, 0x0000000713a00000, 0x0000000713a00000|100%| O| |TAMS 0x0000000713a00000, 0x0000000713800000| Untracked -| 137|0x0000000713a00000, 0x0000000713c00000, 0x0000000713c00000|100%| O| |TAMS 0x0000000713c00000, 0x0000000713a00000| Untracked -| 138|0x0000000713c00000, 0x0000000713e00000, 0x0000000713e00000|100%| O| |TAMS 0x0000000713e00000, 0x0000000713c00000| Untracked -| 139|0x0000000713e00000, 0x0000000714000000, 0x0000000714000000|100%| O| |TAMS 0x0000000714000000, 0x0000000713e00000| Untracked -| 140|0x0000000714000000, 0x0000000714200000, 0x0000000714200000|100%| O| |TAMS 0x0000000714200000, 0x0000000714000000| Untracked -| 141|0x0000000714200000, 0x0000000714400000, 0x0000000714400000|100%| O| |TAMS 0x0000000714400000, 0x0000000714200000| Untracked -| 142|0x0000000714400000, 0x0000000714600000, 0x0000000714600000|100%| O| |TAMS 0x0000000714600000, 0x0000000714400000| Untracked -| 143|0x0000000714600000, 0x0000000714800000, 0x0000000714800000|100%| O| |TAMS 0x0000000714800000, 0x0000000714600000| Untracked -| 144|0x0000000714800000, 0x0000000714a00000, 0x0000000714a00000|100%| O| |TAMS 0x0000000714a00000, 0x0000000714800000| Untracked -| 145|0x0000000714a00000, 0x0000000714c00000, 0x0000000714c00000|100%| O| |TAMS 0x0000000714c00000, 0x0000000714a00000| Untracked -| 146|0x0000000714c00000, 0x0000000714e00000, 0x0000000714e00000|100%| O| |TAMS 0x0000000714e00000, 0x0000000714c00000| Untracked -| 147|0x0000000714e00000, 0x0000000715000000, 0x0000000715000000|100%| O| |TAMS 0x0000000715000000, 0x0000000714e00000| Untracked -| 148|0x0000000715000000, 0x0000000715200000, 0x0000000715200000|100%| O| |TAMS 0x0000000715200000, 0x0000000715000000| Untracked -| 149|0x0000000715200000, 0x0000000715400000, 0x0000000715400000|100%| O| |TAMS 0x0000000715400000, 0x0000000715200000| Untracked -| 150|0x0000000715400000, 0x0000000715600000, 0x0000000715600000|100%| O| |TAMS 0x0000000715600000, 0x0000000715400000| Untracked -| 151|0x0000000715600000, 0x0000000715800000, 0x0000000715800000|100%| O| |TAMS 0x0000000715800000, 0x0000000715600000| Untracked -| 152|0x0000000715800000, 0x0000000715a00000, 0x0000000715a00000|100%| O| |TAMS 0x0000000715a00000, 0x0000000715800000| Untracked -| 153|0x0000000715a00000, 0x0000000715c00000, 0x0000000715c00000|100%| O| |TAMS 0x0000000715c00000, 0x0000000715a00000| Untracked -| 154|0x0000000715c00000, 0x0000000715e00000, 0x0000000715e00000|100%| O| |TAMS 0x0000000715e00000, 0x0000000715c00000| Untracked -| 155|0x0000000715e00000, 0x0000000716000000, 0x0000000716000000|100%| O| |TAMS 0x0000000716000000, 0x0000000715e00000| Untracked -| 156|0x0000000716000000, 0x0000000716200000, 0x0000000716200000|100%| O| |TAMS 0x0000000716200000, 0x0000000716000000| Untracked -| 157|0x0000000716200000, 0x0000000716400000, 0x0000000716400000|100%| O| |TAMS 0x0000000716400000, 0x0000000716200000| Untracked -| 158|0x0000000716400000, 0x0000000716600000, 0x0000000716600000|100%| O| |TAMS 0x0000000716600000, 0x0000000716400000| Untracked -| 159|0x0000000716600000, 0x0000000716800000, 0x0000000716800000|100%| O| |TAMS 0x0000000716800000, 0x0000000716600000| Untracked -| 160|0x0000000716800000, 0x0000000716a00000, 0x0000000716a00000|100%| O| |TAMS 0x0000000716a00000, 0x0000000716800000| Untracked -| 161|0x0000000716a00000, 0x0000000716c00000, 0x0000000716c00000|100%| O| |TAMS 0x0000000716c00000, 0x0000000716a00000| Untracked -| 162|0x0000000716c00000, 0x0000000716e00000, 0x0000000716e00000|100%| O| |TAMS 0x0000000716e00000, 0x0000000716c00000| Untracked -| 163|0x0000000716e00000, 0x0000000717000000, 0x0000000717000000|100%| O| |TAMS 0x0000000717000000, 0x0000000716e00000| Untracked -| 164|0x0000000717000000, 0x0000000717200000, 0x0000000717200000|100%| O| |TAMS 0x0000000717200000, 0x0000000717000000| Untracked -| 165|0x0000000717200000, 0x0000000717400000, 0x0000000717400000|100%| O| |TAMS 0x0000000717400000, 0x0000000717200000| Untracked -| 166|0x0000000717400000, 0x0000000717600000, 0x0000000717600000|100%| O| |TAMS 0x0000000717600000, 0x0000000717400000| Untracked -| 167|0x0000000717600000, 0x0000000717800000, 0x0000000717800000|100%| O| |TAMS 0x0000000717800000, 0x0000000717600000| Untracked -| 168|0x0000000717800000, 0x0000000717a00000, 0x0000000717a00000|100%| O| |TAMS 0x0000000717a00000, 0x0000000717800000| Untracked -| 169|0x0000000717a00000, 0x0000000717c00000, 0x0000000717c00000|100%| O| |TAMS 0x0000000717c00000, 0x0000000717a00000| Untracked -| 170|0x0000000717c00000, 0x0000000717e00000, 0x0000000717e00000|100%| O| |TAMS 0x0000000717e00000, 0x0000000717c00000| Untracked -| 171|0x0000000717e00000, 0x0000000718000000, 0x0000000718000000|100%| O| |TAMS 0x0000000718000000, 0x0000000717e00000| Untracked -| 172|0x0000000718000000, 0x0000000718200000, 0x0000000718200000|100%| O| |TAMS 0x0000000718200000, 0x0000000718000000| Untracked -| 173|0x0000000718200000, 0x0000000718400000, 0x0000000718400000|100%| O| |TAMS 0x0000000718400000, 0x0000000718200000| Untracked -| 174|0x0000000718400000, 0x0000000718600000, 0x0000000718600000|100%| O| |TAMS 0x0000000718600000, 0x0000000718400000| Untracked -| 175|0x0000000718600000, 0x0000000718800000, 0x0000000718800000|100%| O| |TAMS 0x0000000718800000, 0x0000000718600000| Untracked -| 176|0x0000000718800000, 0x0000000718a00000, 0x0000000718a00000|100%| O| |TAMS 0x0000000718a00000, 0x0000000718800000| Untracked -| 177|0x0000000718a00000, 0x0000000718c00000, 0x0000000718c00000|100%| O| |TAMS 0x0000000718c00000, 0x0000000718a00000| Untracked -| 178|0x0000000718c00000, 0x0000000718e00000, 0x0000000718e00000|100%| O| |TAMS 0x0000000718e00000, 0x0000000718c00000| Untracked -| 179|0x0000000718e00000, 0x0000000719000000, 0x0000000719000000|100%| O| |TAMS 0x0000000719000000, 0x0000000718e00000| Untracked -| 180|0x0000000719000000, 0x0000000719200000, 0x0000000719200000|100%| O| |TAMS 0x0000000719200000, 0x0000000719000000| Untracked -| 181|0x0000000719200000, 0x0000000719400000, 0x0000000719400000|100%| O| |TAMS 0x0000000719400000, 0x0000000719200000| Untracked -| 182|0x0000000719400000, 0x0000000719600000, 0x0000000719600000|100%| O| |TAMS 0x0000000719600000, 0x0000000719400000| Untracked -| 183|0x0000000719600000, 0x0000000719800000, 0x0000000719800000|100%|HS| |TAMS 0x0000000719800000, 0x0000000719600000| Complete -| 184|0x0000000719800000, 0x0000000719a00000, 0x0000000719a00000|100%| O| |TAMS 0x0000000719a00000, 0x0000000719800000| Untracked -| 185|0x0000000719a00000, 0x0000000719c00000, 0x0000000719c00000|100%| O| |TAMS 0x0000000719c00000, 0x0000000719a00000| Untracked -| 186|0x0000000719c00000, 0x0000000719e00000, 0x0000000719e00000|100%| O| |TAMS 0x0000000719e00000, 0x0000000719c00000| Untracked -| 187|0x0000000719e00000, 0x000000071a000000, 0x000000071a000000|100%| O| |TAMS 0x000000071a000000, 0x0000000719e00000| Untracked -| 188|0x000000071a000000, 0x000000071a200000, 0x000000071a200000|100%| O| |TAMS 0x000000071a200000, 0x000000071a000000| Untracked -| 189|0x000000071a200000, 0x000000071a400000, 0x000000071a400000|100%| O| |TAMS 0x000000071a400000, 0x000000071a200000| Untracked -| 190|0x000000071a400000, 0x000000071a600000, 0x000000071a600000|100%| O| |TAMS 0x000000071a600000, 0x000000071a400000| Untracked -| 191|0x000000071a600000, 0x000000071a800000, 0x000000071a800000|100%| O| |TAMS 0x000000071a800000, 0x000000071a600000| Untracked -| 192|0x000000071a800000, 0x000000071aa00000, 0x000000071aa00000|100%| O| |TAMS 0x000000071aa00000, 0x000000071a800000| Untracked -| 193|0x000000071aa00000, 0x000000071ac00000, 0x000000071ac00000|100%| O| |TAMS 0x000000071ac00000, 0x000000071aa00000| Untracked -| 194|0x000000071ac00000, 0x000000071ae00000, 0x000000071ae00000|100%| O| |TAMS 0x000000071ae00000, 0x000000071ac00000| Untracked -| 195|0x000000071ae00000, 0x000000071b000000, 0x000000071b000000|100%| O| |TAMS 0x000000071b000000, 0x000000071ae00000| Untracked -| 196|0x000000071b000000, 0x000000071b200000, 0x000000071b200000|100%| O| |TAMS 0x000000071b200000, 0x000000071b000000| Untracked -| 197|0x000000071b200000, 0x000000071b400000, 0x000000071b400000|100%| O| |TAMS 0x000000071b400000, 0x000000071b200000| Untracked -| 198|0x000000071b400000, 0x000000071b600000, 0x000000071b600000|100%| O| |TAMS 0x000000071b600000, 0x000000071b400000| Untracked -| 199|0x000000071b600000, 0x000000071b800000, 0x000000071b800000|100%| O| |TAMS 0x000000071b800000, 0x000000071b600000| Untracked -| 200|0x000000071b800000, 0x000000071ba00000, 0x000000071ba00000|100%| O| |TAMS 0x000000071ba00000, 0x000000071b800000| Untracked -| 201|0x000000071ba00000, 0x000000071bc00000, 0x000000071bc00000|100%| O| |TAMS 0x000000071bc00000, 0x000000071ba00000| Untracked -| 202|0x000000071bc00000, 0x000000071be00000, 0x000000071be00000|100%| O| |TAMS 0x000000071be00000, 0x000000071bc00000| Untracked -| 203|0x000000071be00000, 0x000000071c000000, 0x000000071c000000|100%| O| |TAMS 0x000000071c000000, 0x000000071be00000| Untracked -| 204|0x000000071c000000, 0x000000071c200000, 0x000000071c200000|100%| O| |TAMS 0x000000071c200000, 0x000000071c000000| Untracked -| 205|0x000000071c200000, 0x000000071c400000, 0x000000071c400000|100%| O| |TAMS 0x000000071c400000, 0x000000071c200000| Untracked -| 206|0x000000071c400000, 0x000000071c600000, 0x000000071c600000|100%| O| |TAMS 0x000000071c600000, 0x000000071c400000| Untracked -| 207|0x000000071c600000, 0x000000071c800000, 0x000000071c800000|100%| O| |TAMS 0x000000071c800000, 0x000000071c600000| Untracked -| 208|0x000000071c800000, 0x000000071ca00000, 0x000000071ca00000|100%| O| |TAMS 0x000000071ca00000, 0x000000071c800000| Untracked -| 209|0x000000071ca00000, 0x000000071cc00000, 0x000000071cc00000|100%| O| |TAMS 0x000000071cc00000, 0x000000071ca00000| Untracked -| 210|0x000000071cc00000, 0x000000071ce00000, 0x000000071ce00000|100%| O| |TAMS 0x000000071ce00000, 0x000000071cc00000| Untracked -| 211|0x000000071ce00000, 0x000000071d000000, 0x000000071d000000|100%| O| |TAMS 0x000000071d000000, 0x000000071ce00000| Untracked -| 212|0x000000071d000000, 0x000000071d200000, 0x000000071d200000|100%| O| |TAMS 0x000000071d200000, 0x000000071d000000| Untracked -| 213|0x000000071d200000, 0x000000071d400000, 0x000000071d400000|100%| O| |TAMS 0x000000071d400000, 0x000000071d200000| Untracked -| 214|0x000000071d400000, 0x000000071d600000, 0x000000071d600000|100%| O| |TAMS 0x000000071d600000, 0x000000071d400000| Untracked -| 215|0x000000071d600000, 0x000000071d800000, 0x000000071d800000|100%| O| |TAMS 0x000000071d800000, 0x000000071d600000| Untracked -| 216|0x000000071d800000, 0x000000071da00000, 0x000000071da00000|100%| O| |TAMS 0x000000071da00000, 0x000000071d800000| Untracked -| 217|0x000000071da00000, 0x000000071dc00000, 0x000000071dc00000|100%| O| |TAMS 0x000000071dc00000, 0x000000071da00000| Untracked -| 218|0x000000071dc00000, 0x000000071de00000, 0x000000071de00000|100%| O| |TAMS 0x000000071de00000, 0x000000071dc00000| Untracked -| 219|0x000000071de00000, 0x000000071e000000, 0x000000071e000000|100%| O| |TAMS 0x000000071e000000, 0x000000071de00000| Untracked -| 220|0x000000071e000000, 0x000000071e200000, 0x000000071e200000|100%| O| |TAMS 0x000000071e200000, 0x000000071e000000| Untracked -| 221|0x000000071e200000, 0x000000071e400000, 0x000000071e400000|100%| O| |TAMS 0x000000071e400000, 0x000000071e200000| Untracked -| 222|0x000000071e400000, 0x000000071e600000, 0x000000071e600000|100%| O| |TAMS 0x000000071e600000, 0x000000071e400000| Untracked -| 223|0x000000071e600000, 0x000000071e800000, 0x000000071e800000|100%| O| |TAMS 0x000000071e800000, 0x000000071e600000| Untracked -| 224|0x000000071e800000, 0x000000071ea00000, 0x000000071ea00000|100%| O| |TAMS 0x000000071ea00000, 0x000000071e800000| Untracked -| 225|0x000000071ea00000, 0x000000071ec00000, 0x000000071ec00000|100%| O| |TAMS 0x000000071ec00000, 0x000000071ea00000| Untracked -| 226|0x000000071ec00000, 0x000000071ee00000, 0x000000071ee00000|100%| O| |TAMS 0x000000071ee00000, 0x000000071ec00000| Untracked -| 227|0x000000071ee00000, 0x000000071f000000, 0x000000071f000000|100%| O| |TAMS 0x000000071f000000, 0x000000071ee00000| Untracked -| 228|0x000000071f000000, 0x000000071f200000, 0x000000071f200000|100%| O| |TAMS 0x000000071f200000, 0x000000071f000000| Untracked -| 229|0x000000071f200000, 0x000000071f400000, 0x000000071f400000|100%| O| |TAMS 0x000000071f400000, 0x000000071f200000| Untracked -| 230|0x000000071f400000, 0x000000071f600000, 0x000000071f600000|100%| O| |TAMS 0x000000071f600000, 0x000000071f400000| Untracked -| 231|0x000000071f600000, 0x000000071f800000, 0x000000071f800000|100%| O| |TAMS 0x000000071f800000, 0x000000071f600000| Untracked -| 232|0x000000071f800000, 0x000000071fa00000, 0x000000071fa00000|100%| O| |TAMS 0x000000071fa00000, 0x000000071f800000| Untracked -| 233|0x000000071fa00000, 0x000000071fc00000, 0x000000071fc00000|100%| O| |TAMS 0x000000071fc00000, 0x000000071fa00000| Untracked -| 234|0x000000071fc00000, 0x000000071fe00000, 0x000000071fe00000|100%| O| |TAMS 0x000000071fe00000, 0x000000071fc00000| Untracked -| 235|0x000000071fe00000, 0x0000000720000000, 0x0000000720000000|100%| O| |TAMS 0x0000000720000000, 0x000000071fe00000| Untracked -| 236|0x0000000720000000, 0x0000000720200000, 0x0000000720200000|100%| O| |TAMS 0x0000000720200000, 0x0000000720000000| Untracked -| 237|0x0000000720200000, 0x0000000720400000, 0x0000000720400000|100%| O| |TAMS 0x0000000720400000, 0x0000000720200000| Untracked -| 238|0x0000000720400000, 0x0000000720600000, 0x0000000720600000|100%| O| |TAMS 0x0000000720600000, 0x0000000720400000| Untracked -| 239|0x0000000720600000, 0x0000000720800000, 0x0000000720800000|100%| O| |TAMS 0x0000000720800000, 0x0000000720600000| Untracked -| 240|0x0000000720800000, 0x0000000720a00000, 0x0000000720a00000|100%| O| |TAMS 0x0000000720a00000, 0x0000000720800000| Untracked -| 241|0x0000000720a00000, 0x0000000720c00000, 0x0000000720c00000|100%| O| |TAMS 0x0000000720c00000, 0x0000000720a00000| Untracked -| 242|0x0000000720c00000, 0x0000000720e00000, 0x0000000720e00000|100%| O| |TAMS 0x0000000720e00000, 0x0000000720c00000| Untracked -| 243|0x0000000720e00000, 0x0000000721000000, 0x0000000721000000|100%| O| |TAMS 0x0000000721000000, 0x0000000720e00000| Untracked -| 244|0x0000000721000000, 0x0000000721200000, 0x0000000721200000|100%| O| |TAMS 0x0000000721200000, 0x0000000721000000| Untracked -| 245|0x0000000721200000, 0x0000000721400000, 0x0000000721400000|100%| O| |TAMS 0x0000000721400000, 0x0000000721200000| Untracked -| 246|0x0000000721400000, 0x0000000721600000, 0x0000000721600000|100%| O| |TAMS 0x0000000721600000, 0x0000000721400000| Untracked -| 247|0x0000000721600000, 0x0000000721800000, 0x0000000721800000|100%| O| |TAMS 0x0000000721800000, 0x0000000721600000| Untracked -| 248|0x0000000721800000, 0x0000000721a00000, 0x0000000721a00000|100%| O| |TAMS 0x0000000721a00000, 0x0000000721800000| Untracked -| 249|0x0000000721a00000, 0x0000000721c00000, 0x0000000721c00000|100%| O| |TAMS 0x0000000721c00000, 0x0000000721a00000| Untracked -| 250|0x0000000721c00000, 0x0000000721e00000, 0x0000000721e00000|100%| O| |TAMS 0x0000000721e00000, 0x0000000721c00000| Untracked -| 251|0x0000000721e00000, 0x0000000722000000, 0x0000000722000000|100%| O| |TAMS 0x0000000722000000, 0x0000000721e00000| Untracked -| 252|0x0000000722000000, 0x0000000722200000, 0x0000000722200000|100%| O| |TAMS 0x0000000722200000, 0x0000000722000000| Untracked -| 253|0x0000000722200000, 0x0000000722400000, 0x0000000722400000|100%| O| |TAMS 0x0000000722400000, 0x0000000722200000| Untracked -| 254|0x0000000722400000, 0x0000000722600000, 0x0000000722600000|100%| O| |TAMS 0x0000000722600000, 0x0000000722400000| Untracked -| 255|0x0000000722600000, 0x0000000722800000, 0x0000000722800000|100%| O| |TAMS 0x0000000722800000, 0x0000000722600000| Untracked -| 256|0x0000000722800000, 0x0000000722a00000, 0x0000000722a00000|100%| O| |TAMS 0x0000000722a00000, 0x0000000722800000| Untracked -| 257|0x0000000722a00000, 0x0000000722c00000, 0x0000000722c00000|100%| O| |TAMS 0x0000000722c00000, 0x0000000722a00000| Untracked -| 258|0x0000000722c00000, 0x0000000722e00000, 0x0000000722e00000|100%|HS| |TAMS 0x0000000722c00000, 0x0000000722c00000| Complete -| 259|0x0000000722e00000, 0x0000000723000000, 0x0000000723000000|100%| O| |TAMS 0x0000000723000000, 0x0000000722e00000| Untracked -| 260|0x0000000723000000, 0x0000000723200000, 0x0000000723200000|100%| O| |TAMS 0x0000000723200000, 0x0000000723000000| Untracked -| 261|0x0000000723200000, 0x0000000723400000, 0x0000000723400000|100%| O| |TAMS 0x0000000723400000, 0x0000000723200000| Untracked -| 262|0x0000000723400000, 0x0000000723600000, 0x0000000723600000|100%| O| |TAMS 0x0000000723600000, 0x0000000723400000| Untracked -| 263|0x0000000723600000, 0x0000000723800000, 0x0000000723800000|100%| O| |TAMS 0x0000000723800000, 0x0000000723600000| Untracked -| 264|0x0000000723800000, 0x0000000723a00000, 0x0000000723a00000|100%| O| |TAMS 0x0000000723a00000, 0x0000000723800000| Untracked -| 265|0x0000000723a00000, 0x0000000723c00000, 0x0000000723c00000|100%| O| |TAMS 0x0000000723c00000, 0x0000000723a00000| Untracked -| 266|0x0000000723c00000, 0x0000000723e00000, 0x0000000723e00000|100%| O| |TAMS 0x0000000723c00000, 0x0000000723c00000| Untracked -| 267|0x0000000723e00000, 0x0000000724000000, 0x0000000724000000|100%| O| |TAMS 0x0000000724000000, 0x0000000723e00000| Untracked -| 268|0x0000000724000000, 0x0000000724200000, 0x0000000724200000|100%| O| |TAMS 0x0000000724200000, 0x0000000724000000| Untracked -| 269|0x0000000724200000, 0x0000000724400000, 0x0000000724400000|100%| O| |TAMS 0x0000000724400000, 0x0000000724200000| Untracked -| 270|0x0000000724400000, 0x0000000724600000, 0x0000000724600000|100%| O| |TAMS 0x0000000724600000, 0x0000000724400000| Untracked -| 271|0x0000000724600000, 0x0000000724800000, 0x0000000724800000|100%| O| |TAMS 0x0000000724800000, 0x0000000724600000| Untracked -| 272|0x0000000724800000, 0x0000000724a00000, 0x0000000724a00000|100%| O| |TAMS 0x0000000724a00000, 0x0000000724800000| Untracked -| 273|0x0000000724a00000, 0x0000000724c00000, 0x0000000724c00000|100%| O| |TAMS 0x0000000724a00000, 0x0000000724a00000| Untracked -| 274|0x0000000724c00000, 0x0000000724e00000, 0x0000000724e00000|100%| O| |TAMS 0x0000000724e00000, 0x0000000724c00000| Untracked -| 275|0x0000000724e00000, 0x0000000725000000, 0x0000000725000000|100%|HS| |TAMS 0x0000000724e00000, 0x0000000724e00000| Complete -| 276|0x0000000725000000, 0x0000000725200000, 0x0000000725200000|100%|HC| |TAMS 0x0000000725000000, 0x0000000725000000| Complete -| 277|0x0000000725200000, 0x0000000725400000, 0x0000000725400000|100%| O| |TAMS 0x0000000725200000, 0x0000000725200000| Untracked -| 278|0x0000000725400000, 0x0000000725600000, 0x0000000725600000|100%| O| |TAMS 0x0000000725400000, 0x0000000725400000| Untracked -| 279|0x0000000725600000, 0x0000000725800000, 0x0000000725800000|100%| O| |TAMS 0x0000000725600000, 0x0000000725600000| Untracked -| 280|0x0000000725800000, 0x0000000725a00000, 0x0000000725a00000|100%| O| |TAMS 0x0000000725800000, 0x0000000725800000| Untracked -| 281|0x0000000725a00000, 0x0000000725c00000, 0x0000000725c00000|100%| O| |TAMS 0x0000000725a00000, 0x0000000725a00000| Untracked -| 282|0x0000000725c00000, 0x0000000725e00000, 0x0000000725e00000|100%| O| |TAMS 0x0000000725c00000, 0x0000000725c00000| Untracked -| 283|0x0000000725e00000, 0x0000000726000000, 0x0000000726000000|100%| O| |TAMS 0x0000000725e00000, 0x0000000725e00000| Untracked -| 284|0x0000000726000000, 0x0000000726200000, 0x0000000726200000|100%| O| |TAMS 0x0000000726000000, 0x0000000726000000| Untracked -| 285|0x0000000726200000, 0x0000000726400000, 0x0000000726400000|100%| O| |TAMS 0x0000000726200000, 0x0000000726200000| Untracked -| 286|0x0000000726400000, 0x0000000726600000, 0x0000000726600000|100%| O| |TAMS 0x0000000726400000, 0x0000000726400000| Untracked -| 287|0x0000000726600000, 0x0000000726800000, 0x0000000726800000|100%| O| |TAMS 0x0000000726600000, 0x0000000726600000| Untracked -| 288|0x0000000726800000, 0x0000000726a00000, 0x0000000726a00000|100%| O| |TAMS 0x0000000726800000, 0x0000000726800000| Untracked -| 289|0x0000000726a00000, 0x0000000726c00000, 0x0000000726c00000|100%| O| |TAMS 0x0000000726a00000, 0x0000000726a00000| Untracked -| 290|0x0000000726c00000, 0x0000000726e00000, 0x0000000726e00000|100%| O| |TAMS 0x0000000726c00000, 0x0000000726c00000| Untracked -| 291|0x0000000726e00000, 0x0000000727000000, 0x0000000727000000|100%| O| |TAMS 0x0000000726e00000, 0x0000000726e00000| Untracked -| 292|0x0000000727000000, 0x0000000727200000, 0x0000000727200000|100%| O| |TAMS 0x0000000727000000, 0x0000000727000000| Untracked -| 293|0x0000000727200000, 0x0000000727400000, 0x0000000727400000|100%| O| |TAMS 0x0000000727400000, 0x0000000727200000| Untracked -| 294|0x0000000727400000, 0x0000000727600000, 0x0000000727600000|100%| O| |TAMS 0x0000000727600000, 0x0000000727400000| Untracked -| 295|0x0000000727600000, 0x0000000727800000, 0x0000000727800000|100%| O| |TAMS 0x0000000727800000, 0x0000000727600000| Untracked -| 296|0x0000000727800000, 0x0000000727a00000, 0x0000000727a00000|100%| O| |TAMS 0x0000000727a00000, 0x0000000727800000| Untracked -| 297|0x0000000727a00000, 0x0000000727c00000, 0x0000000727c00000|100%| O| |TAMS 0x0000000727c00000, 0x0000000727a00000| Untracked -| 298|0x0000000727c00000, 0x0000000727e00000, 0x0000000727e00000|100%| O| |TAMS 0x0000000727e00000, 0x0000000727c00000| Untracked -| 299|0x0000000727e00000, 0x0000000728000000, 0x0000000728000000|100%| O| |TAMS 0x0000000728000000, 0x0000000727e00000| Untracked -| 300|0x0000000728000000, 0x0000000728200000, 0x0000000728200000|100%| O| |TAMS 0x0000000728200000, 0x0000000728000000| Untracked -| 301|0x0000000728200000, 0x0000000728400000, 0x0000000728400000|100%| O| |TAMS 0x0000000728400000, 0x0000000728200000| Untracked -| 302|0x0000000728400000, 0x0000000728600000, 0x0000000728600000|100%| O| |TAMS 0x0000000728600000, 0x0000000728400000| Untracked -| 303|0x0000000728600000, 0x0000000728800000, 0x0000000728800000|100%| O| |TAMS 0x0000000728600000, 0x0000000728600000| Untracked -| 304|0x0000000728800000, 0x0000000728a00000, 0x0000000728a00000|100%| O| |TAMS 0x0000000728a00000, 0x0000000728800000| Untracked -| 305|0x0000000728a00000, 0x0000000728c00000, 0x0000000728c00000|100%| O| |TAMS 0x0000000728c00000, 0x0000000728a00000| Untracked -| 306|0x0000000728c00000, 0x0000000728e00000, 0x0000000728e00000|100%| O| |TAMS 0x0000000728e00000, 0x0000000728c00000| Untracked -| 307|0x0000000728e00000, 0x0000000729000000, 0x0000000729000000|100%| O| |TAMS 0x0000000729000000, 0x0000000728e00000| Untracked -| 308|0x0000000729000000, 0x0000000729200000, 0x0000000729200000|100%| O| |TAMS 0x0000000729200000, 0x0000000729000000| Untracked -| 309|0x0000000729200000, 0x0000000729400000, 0x0000000729400000|100%| O| |TAMS 0x0000000729400000, 0x0000000729200000| Untracked -| 310|0x0000000729400000, 0x0000000729600000, 0x0000000729600000|100%| O| |TAMS 0x0000000729600000, 0x0000000729400000| Untracked -| 311|0x0000000729600000, 0x0000000729800000, 0x0000000729800000|100%| O| |TAMS 0x0000000729800000, 0x0000000729600000| Untracked -| 312|0x0000000729800000, 0x0000000729a00000, 0x0000000729a00000|100%| O| |TAMS 0x0000000729a00000, 0x0000000729800000| Untracked -| 313|0x0000000729a00000, 0x0000000729c00000, 0x0000000729c00000|100%| O| |TAMS 0x0000000729c00000, 0x0000000729a00000| Untracked -| 314|0x0000000729c00000, 0x0000000729e00000, 0x0000000729e00000|100%| O| |TAMS 0x0000000729e00000, 0x0000000729c00000| Untracked -| 315|0x0000000729e00000, 0x000000072a000000, 0x000000072a000000|100%| O| |TAMS 0x000000072a000000, 0x0000000729e00000| Untracked -| 316|0x000000072a000000, 0x000000072a200000, 0x000000072a200000|100%| O| |TAMS 0x000000072a200000, 0x000000072a000000| Untracked -| 317|0x000000072a200000, 0x000000072a400000, 0x000000072a400000|100%| O| |TAMS 0x000000072a400000, 0x000000072a200000| Untracked -| 318|0x000000072a400000, 0x000000072a600000, 0x000000072a600000|100%| O| |TAMS 0x000000072a600000, 0x000000072a400000| Untracked -| 319|0x000000072a600000, 0x000000072a800000, 0x000000072a800000|100%| O| |TAMS 0x000000072a800000, 0x000000072a600000| Untracked -| 320|0x000000072a800000, 0x000000072aa00000, 0x000000072aa00000|100%| O| |TAMS 0x000000072aa00000, 0x000000072a800000| Untracked -| 321|0x000000072aa00000, 0x000000072ac00000, 0x000000072ac00000|100%| O| |TAMS 0x000000072ac00000, 0x000000072aa00000| Untracked -| 322|0x000000072ac00000, 0x000000072ae00000, 0x000000072ae00000|100%| O| |TAMS 0x000000072ae00000, 0x000000072ac00000| Untracked -| 323|0x000000072ae00000, 0x000000072b000000, 0x000000072b000000|100%| O| |TAMS 0x000000072b000000, 0x000000072ae00000| Untracked -| 324|0x000000072b000000, 0x000000072b200000, 0x000000072b200000|100%| O| |TAMS 0x000000072b000000, 0x000000072b000000| Untracked -| 325|0x000000072b200000, 0x000000072b400000, 0x000000072b400000|100%| O| |TAMS 0x000000072b400000, 0x000000072b200000| Untracked -| 326|0x000000072b400000, 0x000000072b600000, 0x000000072b600000|100%| O| |TAMS 0x000000072b400000, 0x000000072b400000| Untracked -| 327|0x000000072b600000, 0x000000072b800000, 0x000000072b800000|100%| O| |TAMS 0x000000072b600000, 0x000000072b600000| Untracked -| 328|0x000000072b800000, 0x000000072ba00000, 0x000000072ba00000|100%| O| |TAMS 0x000000072b800000, 0x000000072b800000| Untracked -| 329|0x000000072ba00000, 0x000000072bc00000, 0x000000072bc00000|100%| O| |TAMS 0x000000072ba00000, 0x000000072ba00000| Untracked -| 330|0x000000072bc00000, 0x000000072be00000, 0x000000072be00000|100%| O| |TAMS 0x000000072bc00000, 0x000000072bc00000| Untracked -| 331|0x000000072be00000, 0x000000072c000000, 0x000000072c000000|100%| O| |TAMS 0x000000072be00000, 0x000000072be00000| Untracked -| 332|0x000000072c000000, 0x000000072c200000, 0x000000072c200000|100%| O| |TAMS 0x000000072c000000, 0x000000072c000000| Untracked -| 333|0x000000072c200000, 0x000000072c400000, 0x000000072c400000|100%| O| |TAMS 0x000000072c400000, 0x000000072c200000| Untracked -| 334|0x000000072c400000, 0x000000072c600000, 0x000000072c600000|100%| O| |TAMS 0x000000072c600000, 0x000000072c400000| Untracked -| 335|0x000000072c600000, 0x000000072c800000, 0x000000072c800000|100%| O| |TAMS 0x000000072c800000, 0x000000072c600000| Untracked -| 336|0x000000072c800000, 0x000000072ca00000, 0x000000072ca00000|100%| O| |TAMS 0x000000072c800000, 0x000000072c800000| Untracked -| 337|0x000000072ca00000, 0x000000072cc00000, 0x000000072cc00000|100%| O| |TAMS 0x000000072ca00000, 0x000000072ca00000| Untracked -| 338|0x000000072cc00000, 0x000000072ce00000, 0x000000072ce00000|100%| O| |TAMS 0x000000072cc00000, 0x000000072cc00000| Untracked -| 339|0x000000072ce00000, 0x000000072d000000, 0x000000072d000000|100%| O| |TAMS 0x000000072ce00000, 0x000000072ce00000| Untracked -| 340|0x000000072d000000, 0x000000072d200000, 0x000000072d200000|100%| O| |TAMS 0x000000072d000000, 0x000000072d000000| Untracked -| 341|0x000000072d200000, 0x000000072d400000, 0x000000072d400000|100%| O| |TAMS 0x000000072d200000, 0x000000072d200000| Untracked -| 342|0x000000072d400000, 0x000000072d600000, 0x000000072d600000|100%| O| |TAMS 0x000000072d400000, 0x000000072d400000| Untracked -| 343|0x000000072d600000, 0x000000072d800000, 0x000000072d800000|100%| O| |TAMS 0x000000072d600000, 0x000000072d600000| Untracked -| 344|0x000000072d800000, 0x000000072da00000, 0x000000072da00000|100%| O| |TAMS 0x000000072d800000, 0x000000072d800000| Untracked -| 345|0x000000072da00000, 0x000000072dc00000, 0x000000072dc00000|100%| O| |TAMS 0x000000072da00000, 0x000000072da00000| Untracked -| 346|0x000000072dc00000, 0x000000072de00000, 0x000000072de00000|100%| O| |TAMS 0x000000072dc00000, 0x000000072dc00000| Untracked -| 347|0x000000072de00000, 0x000000072e000000, 0x000000072e000000|100%| O| |TAMS 0x000000072de00000, 0x000000072de00000| Untracked -| 348|0x000000072e000000, 0x000000072e000000, 0x000000072e200000| 0%| F| |TAMS 0x000000072e000000, 0x000000072e000000| Untracked -| 349|0x000000072e200000, 0x000000072e400000, 0x000000072e400000|100%| O| |TAMS 0x000000072e400000, 0x000000072e200000| Untracked -| 350|0x000000072e400000, 0x000000072e600000, 0x000000072e600000|100%| O| |TAMS 0x000000072e600000, 0x000000072e400000| Untracked -| 351|0x000000072e600000, 0x000000072e800000, 0x000000072e800000|100%| O| |TAMS 0x000000072e800000, 0x000000072e600000| Untracked -| 352|0x000000072e800000, 0x000000072e800000, 0x000000072ea00000| 0%| F| |TAMS 0x000000072e800000, 0x000000072e800000| Untracked -| 353|0x000000072ea00000, 0x000000072ea00000, 0x000000072ec00000| 0%| F| |TAMS 0x000000072ea00000, 0x000000072ea00000| Untracked -| 354|0x000000072ec00000, 0x000000072ec00000, 0x000000072ee00000| 0%| F| |TAMS 0x000000072ec00000, 0x000000072ec00000| Untracked -| 355|0x000000072ee00000, 0x000000072ee00000, 0x000000072f000000| 0%| F| |TAMS 0x000000072ee00000, 0x000000072ee00000| Untracked -| 356|0x000000072f000000, 0x000000072f000000, 0x000000072f200000| 0%| F| |TAMS 0x000000072f000000, 0x000000072f000000| Untracked -| 357|0x000000072f200000, 0x000000072f200000, 0x000000072f400000| 0%| F| |TAMS 0x000000072f200000, 0x000000072f200000| Untracked -| 358|0x000000072f400000, 0x000000072f400000, 0x000000072f600000| 0%| F| |TAMS 0x000000072f400000, 0x000000072f400000| Untracked -| 359|0x000000072f600000, 0x000000072f600000, 0x000000072f800000| 0%| F| |TAMS 0x000000072f600000, 0x000000072f600000| Untracked -| 360|0x000000072f800000, 0x000000072f800000, 0x000000072fa00000| 0%| F| |TAMS 0x000000072f800000, 0x000000072f800000| Untracked -| 361|0x000000072fa00000, 0x000000072fa00000, 0x000000072fc00000| 0%| F| |TAMS 0x000000072fa00000, 0x000000072fa00000| Untracked -| 362|0x000000072fc00000, 0x000000072fc00000, 0x000000072fe00000| 0%| F| |TAMS 0x000000072fc00000, 0x000000072fc00000| Untracked -| 363|0x000000072fe00000, 0x000000072fe00000, 0x0000000730000000| 0%| F| |TAMS 0x000000072fe00000, 0x000000072fe00000| Untracked -| 364|0x0000000730000000, 0x0000000730000000, 0x0000000730200000| 0%| F| |TAMS 0x0000000730000000, 0x0000000730000000| Untracked -| 365|0x0000000730200000, 0x0000000730200000, 0x0000000730400000| 0%| F| |TAMS 0x0000000730200000, 0x0000000730200000| Untracked -| 366|0x0000000730400000, 0x0000000730400000, 0x0000000730600000| 0%| F| |TAMS 0x0000000730400000, 0x0000000730400000| Untracked -| 367|0x0000000730600000, 0x0000000730600000, 0x0000000730800000| 0%| F| |TAMS 0x0000000730600000, 0x0000000730600000| Untracked -| 368|0x0000000730800000, 0x0000000730800000, 0x0000000730a00000| 0%| F| |TAMS 0x0000000730800000, 0x0000000730800000| Untracked -| 369|0x0000000730a00000, 0x0000000730a00000, 0x0000000730c00000| 0%| F| |TAMS 0x0000000730a00000, 0x0000000730a00000| Untracked -| 370|0x0000000730c00000, 0x0000000730c00000, 0x0000000730e00000| 0%| F| |TAMS 0x0000000730c00000, 0x0000000730c00000| Untracked -| 371|0x0000000730e00000, 0x0000000730e00000, 0x0000000731000000| 0%| F| |TAMS 0x0000000730e00000, 0x0000000730e00000| Untracked -| 372|0x0000000731000000, 0x0000000731000000, 0x0000000731200000| 0%| F| |TAMS 0x0000000731000000, 0x0000000731000000| Untracked -| 373|0x0000000731200000, 0x0000000731200000, 0x0000000731400000| 0%| F| |TAMS 0x0000000731200000, 0x0000000731200000| Untracked -| 374|0x0000000731400000, 0x0000000731400000, 0x0000000731600000| 0%| F| |TAMS 0x0000000731400000, 0x0000000731400000| Untracked -| 375|0x0000000731600000, 0x0000000731600000, 0x0000000731800000| 0%| F| |TAMS 0x0000000731600000, 0x0000000731600000| Untracked -| 376|0x0000000731800000, 0x0000000731800000, 0x0000000731a00000| 0%| F| |TAMS 0x0000000731800000, 0x0000000731800000| Untracked -| 377|0x0000000731a00000, 0x0000000731a00000, 0x0000000731c00000| 0%| F| |TAMS 0x0000000731a00000, 0x0000000731a00000| Untracked -| 378|0x0000000731c00000, 0x0000000731c00000, 0x0000000731e00000| 0%| F| |TAMS 0x0000000731c00000, 0x0000000731c00000| Untracked -| 379|0x0000000731e00000, 0x0000000732000000, 0x0000000732000000|100%| O| |TAMS 0x0000000732000000, 0x0000000731e00000| Untracked -| 380|0x0000000732000000, 0x0000000732000000, 0x0000000732200000| 0%| F| |TAMS 0x0000000732000000, 0x0000000732000000| Untracked -| 381|0x0000000732200000, 0x0000000732200000, 0x0000000732400000| 0%| F| |TAMS 0x0000000732200000, 0x0000000732200000| Untracked -| 382|0x0000000732400000, 0x0000000732400000, 0x0000000732600000| 0%| F| |TAMS 0x0000000732400000, 0x0000000732400000| Untracked -| 383|0x0000000732600000, 0x0000000732600000, 0x0000000732800000| 0%| F| |TAMS 0x0000000732600000, 0x0000000732600000| Untracked -| 384|0x0000000732800000, 0x0000000732a00000, 0x0000000732a00000|100%| O| |TAMS 0x0000000732a00000, 0x0000000732800000| Untracked -| 385|0x0000000732a00000, 0x0000000732a00000, 0x0000000732c00000| 0%| F| |TAMS 0x0000000732a00000, 0x0000000732a00000| Untracked -| 386|0x0000000732c00000, 0x0000000732e00000, 0x0000000732e00000|100%| O| |TAMS 0x0000000732e00000, 0x0000000732c00000| Untracked -| 387|0x0000000732e00000, 0x0000000732e00000, 0x0000000733000000| 0%| F| |TAMS 0x0000000732e00000, 0x0000000732e00000| Untracked -| 388|0x0000000733000000, 0x0000000733000000, 0x0000000733200000| 0%| F| |TAMS 0x0000000733000000, 0x0000000733000000| Untracked -| 389|0x0000000733200000, 0x0000000733400000, 0x0000000733400000|100%| O| |TAMS 0x0000000733400000, 0x0000000733200000| Untracked -| 390|0x0000000733400000, 0x0000000733600000, 0x0000000733600000|100%| O| |TAMS 0x0000000733600000, 0x0000000733400000| Untracked -| 391|0x0000000733600000, 0x0000000733800000, 0x0000000733800000|100%| O| |TAMS 0x0000000733800000, 0x0000000733600000| Untracked -| 392|0x0000000733800000, 0x0000000733a00000, 0x0000000733a00000|100%| O| |TAMS 0x0000000733a00000, 0x0000000733800000| Untracked -| 393|0x0000000733a00000, 0x0000000733c00000, 0x0000000733c00000|100%| O| |TAMS 0x0000000733c00000, 0x0000000733a00000| Untracked -| 394|0x0000000733c00000, 0x0000000733e00000, 0x0000000733e00000|100%| O| |TAMS 0x0000000733e00000, 0x0000000733c00000| Untracked -| 395|0x0000000733e00000, 0x0000000734000000, 0x0000000734000000|100%| O| |TAMS 0x0000000734000000, 0x0000000733e00000| Untracked -| 396|0x0000000734000000, 0x0000000734200000, 0x0000000734200000|100%| O| |TAMS 0x0000000734200000, 0x0000000734000000| Untracked -| 397|0x0000000734200000, 0x0000000734400000, 0x0000000734400000|100%| O| |TAMS 0x0000000734400000, 0x0000000734200000| Untracked -| 398|0x0000000734400000, 0x0000000734600000, 0x0000000734600000|100%| O| |TAMS 0x0000000734600000, 0x0000000734400000| Untracked -| 399|0x0000000734600000, 0x0000000734800000, 0x0000000734800000|100%| O| |TAMS 0x0000000734800000, 0x0000000734600000| Untracked -| 400|0x0000000734800000, 0x0000000734a00000, 0x0000000734a00000|100%| O| |TAMS 0x0000000734a00000, 0x0000000734800000| Untracked -| 401|0x0000000734a00000, 0x0000000734c00000, 0x0000000734c00000|100%| O| |TAMS 0x0000000734c00000, 0x0000000734a00000| Untracked -| 402|0x0000000734c00000, 0x0000000734e00000, 0x0000000734e00000|100%| O| |TAMS 0x0000000734e00000, 0x0000000734c00000| Untracked -| 403|0x0000000734e00000, 0x0000000735000000, 0x0000000735000000|100%| O| |TAMS 0x0000000735000000, 0x0000000734e00000| Untracked -| 404|0x0000000735000000, 0x0000000735200000, 0x0000000735200000|100%| O| |TAMS 0x0000000735200000, 0x0000000735000000| Untracked -| 405|0x0000000735200000, 0x0000000735200000, 0x0000000735400000| 0%| F| |TAMS 0x0000000735200000, 0x0000000735200000| Untracked -| 406|0x0000000735400000, 0x0000000735400000, 0x0000000735600000| 0%| F| |TAMS 0x0000000735400000, 0x0000000735400000| Untracked -| 407|0x0000000735600000, 0x0000000735600000, 0x0000000735800000| 0%| F| |TAMS 0x0000000735600000, 0x0000000735600000| Untracked -| 408|0x0000000735800000, 0x0000000735800000, 0x0000000735a00000| 0%| F| |TAMS 0x0000000735800000, 0x0000000735800000| Untracked -| 409|0x0000000735a00000, 0x0000000735a00000, 0x0000000735c00000| 0%| F| |TAMS 0x0000000735a00000, 0x0000000735a00000| Untracked -| 410|0x0000000735c00000, 0x0000000735c00000, 0x0000000735e00000| 0%| F| |TAMS 0x0000000735c00000, 0x0000000735c00000| Untracked -| 411|0x0000000735e00000, 0x0000000735e00000, 0x0000000736000000| 0%| F| |TAMS 0x0000000735e00000, 0x0000000735e00000| Untracked -| 412|0x0000000736000000, 0x0000000736000000, 0x0000000736200000| 0%| F| |TAMS 0x0000000736000000, 0x0000000736000000| Untracked -| 413|0x0000000736200000, 0x0000000736200000, 0x0000000736400000| 0%| F| |TAMS 0x0000000736200000, 0x0000000736200000| Untracked -| 414|0x0000000736400000, 0x0000000736400000, 0x0000000736600000| 0%| F| |TAMS 0x0000000736400000, 0x0000000736400000| Untracked -| 415|0x0000000736600000, 0x0000000736600000, 0x0000000736800000| 0%| F| |TAMS 0x0000000736600000, 0x0000000736600000| Untracked -| 416|0x0000000736800000, 0x0000000736800000, 0x0000000736a00000| 0%| F| |TAMS 0x0000000736800000, 0x0000000736800000| Untracked -| 417|0x0000000736a00000, 0x0000000736a00000, 0x0000000736c00000| 0%| F| |TAMS 0x0000000736a00000, 0x0000000736a00000| Untracked -| 418|0x0000000736c00000, 0x0000000736c00000, 0x0000000736e00000| 0%| F| |TAMS 0x0000000736c00000, 0x0000000736c00000| Untracked -| 419|0x0000000736e00000, 0x0000000736e00000, 0x0000000737000000| 0%| F| |TAMS 0x0000000736e00000, 0x0000000736e00000| Untracked -| 420|0x0000000737000000, 0x0000000737000000, 0x0000000737200000| 0%| F| |TAMS 0x0000000737000000, 0x0000000737000000| Untracked -| 421|0x0000000737200000, 0x0000000737200000, 0x0000000737400000| 0%| F| |TAMS 0x0000000737200000, 0x0000000737200000| Untracked -| 422|0x0000000737400000, 0x0000000737400000, 0x0000000737600000| 0%| F| |TAMS 0x0000000737400000, 0x0000000737400000| Untracked -| 423|0x0000000737600000, 0x0000000737600000, 0x0000000737800000| 0%| F| |TAMS 0x0000000737600000, 0x0000000737600000| Untracked -| 424|0x0000000737800000, 0x0000000737800000, 0x0000000737a00000| 0%| F| |TAMS 0x0000000737800000, 0x0000000737800000| Untracked -| 425|0x0000000737a00000, 0x0000000737a00000, 0x0000000737c00000| 0%| F| |TAMS 0x0000000737a00000, 0x0000000737a00000| Untracked -| 426|0x0000000737c00000, 0x0000000737c00000, 0x0000000737e00000| 0%| F| |TAMS 0x0000000737c00000, 0x0000000737c00000| Untracked -| 427|0x0000000737e00000, 0x0000000738000000, 0x0000000738000000|100%| O| |TAMS 0x0000000738000000, 0x0000000737e00000| Untracked -| 428|0x0000000738000000, 0x0000000738000000, 0x0000000738200000| 0%| F| |TAMS 0x0000000738000000, 0x0000000738000000| Untracked -| 429|0x0000000738200000, 0x0000000738200000, 0x0000000738400000| 0%| F| |TAMS 0x0000000738200000, 0x0000000738200000| Untracked -| 430|0x0000000738400000, 0x0000000738400000, 0x0000000738600000| 0%| F| |TAMS 0x0000000738400000, 0x0000000738400000| Untracked -| 431|0x0000000738600000, 0x0000000738600000, 0x0000000738800000| 0%| F| |TAMS 0x0000000738600000, 0x0000000738600000| Untracked -| 432|0x0000000738800000, 0x0000000738800000, 0x0000000738a00000| 0%| F| |TAMS 0x0000000738800000, 0x0000000738800000| Untracked -| 433|0x0000000738a00000, 0x0000000738a00000, 0x0000000738c00000| 0%| F| |TAMS 0x0000000738a00000, 0x0000000738a00000| Untracked -| 434|0x0000000738c00000, 0x0000000738c00000, 0x0000000738e00000| 0%| F| |TAMS 0x0000000738c00000, 0x0000000738c00000| Untracked -| 435|0x0000000738e00000, 0x0000000738e00000, 0x0000000739000000| 0%| F| |TAMS 0x0000000738e00000, 0x0000000738e00000| Untracked -| 436|0x0000000739000000, 0x0000000739000000, 0x0000000739200000| 0%| F| |TAMS 0x0000000739000000, 0x0000000739000000| Untracked -| 437|0x0000000739200000, 0x0000000739200000, 0x0000000739400000| 0%| F| |TAMS 0x0000000739200000, 0x0000000739200000| Untracked -| 438|0x0000000739400000, 0x0000000739400000, 0x0000000739600000| 0%| F| |TAMS 0x0000000739400000, 0x0000000739400000| Untracked -| 439|0x0000000739600000, 0x0000000739600000, 0x0000000739800000| 0%| F| |TAMS 0x0000000739600000, 0x0000000739600000| Untracked -| 440|0x0000000739800000, 0x0000000739800000, 0x0000000739a00000| 0%| F| |TAMS 0x0000000739800000, 0x0000000739800000| Untracked -| 441|0x0000000739a00000, 0x0000000739a00000, 0x0000000739c00000| 0%| F| |TAMS 0x0000000739a00000, 0x0000000739a00000| Untracked -| 442|0x0000000739c00000, 0x0000000739c00000, 0x0000000739e00000| 0%| F| |TAMS 0x0000000739c00000, 0x0000000739c00000| Untracked -| 443|0x0000000739e00000, 0x0000000739e00000, 0x000000073a000000| 0%| F| |TAMS 0x0000000739e00000, 0x0000000739e00000| Untracked -| 444|0x000000073a000000, 0x000000073a000000, 0x000000073a200000| 0%| F| |TAMS 0x000000073a000000, 0x000000073a000000| Untracked -| 445|0x000000073a200000, 0x000000073a200000, 0x000000073a400000| 0%| F| |TAMS 0x000000073a200000, 0x000000073a200000| Untracked -| 446|0x000000073a400000, 0x000000073a400000, 0x000000073a600000| 0%| F| |TAMS 0x000000073a400000, 0x000000073a400000| Untracked -| 447|0x000000073a600000, 0x000000073a600000, 0x000000073a800000| 0%| F| |TAMS 0x000000073a600000, 0x000000073a600000| Untracked -| 448|0x000000073a800000, 0x000000073aa00000, 0x000000073aa00000|100%| O| |TAMS 0x000000073aa00000, 0x000000073a800000| Untracked -| 449|0x000000073aa00000, 0x000000073ac00000, 0x000000073ac00000|100%| O| |TAMS 0x000000073ac00000, 0x000000073aa00000| Untracked -| 450|0x000000073ac00000, 0x000000073ac00000, 0x000000073ae00000| 0%| F| |TAMS 0x000000073ac00000, 0x000000073ac00000| Untracked -| 451|0x000000073ae00000, 0x000000073ae00000, 0x000000073b000000| 0%| F| |TAMS 0x000000073ae00000, 0x000000073ae00000| Untracked -| 452|0x000000073b000000, 0x000000073b000000, 0x000000073b200000| 0%| F| |TAMS 0x000000073b000000, 0x000000073b000000| Untracked -| 453|0x000000073b200000, 0x000000073b200000, 0x000000073b400000| 0%| F| |TAMS 0x000000073b200000, 0x000000073b200000| Untracked -| 454|0x000000073b400000, 0x000000073b400000, 0x000000073b600000| 0%| F| |TAMS 0x000000073b400000, 0x000000073b400000| Untracked -| 455|0x000000073b600000, 0x000000073b800000, 0x000000073b800000|100%| O| |TAMS 0x000000073b800000, 0x000000073b600000| Untracked -| 456|0x000000073b800000, 0x000000073b800000, 0x000000073ba00000| 0%| F| |TAMS 0x000000073b800000, 0x000000073b800000| Untracked -| 457|0x000000073ba00000, 0x000000073ba00000, 0x000000073bc00000| 0%| F| |TAMS 0x000000073ba00000, 0x000000073ba00000| Untracked -| 458|0x000000073bc00000, 0x000000073bc00000, 0x000000073be00000| 0%| F| |TAMS 0x000000073bc00000, 0x000000073bc00000| Untracked -| 459|0x000000073be00000, 0x000000073be00000, 0x000000073c000000| 0%| F| |TAMS 0x000000073be00000, 0x000000073be00000| Untracked -| 460|0x000000073c000000, 0x000000073c000000, 0x000000073c200000| 0%| F| |TAMS 0x000000073c000000, 0x000000073c000000| Untracked -| 461|0x000000073c200000, 0x000000073c400000, 0x000000073c400000|100%| O| |TAMS 0x000000073c400000, 0x000000073c200000| Untracked -| 462|0x000000073c400000, 0x000000073c400000, 0x000000073c600000| 0%| F| |TAMS 0x000000073c400000, 0x000000073c400000| Untracked -| 463|0x000000073c600000, 0x000000073c600000, 0x000000073c800000| 0%| F| |TAMS 0x000000073c600000, 0x000000073c600000| Untracked -| 464|0x000000073c800000, 0x000000073c800000, 0x000000073ca00000| 0%| F| |TAMS 0x000000073c800000, 0x000000073c800000| Untracked -| 465|0x000000073ca00000, 0x000000073ca00000, 0x000000073cc00000| 0%| F| |TAMS 0x000000073ca00000, 0x000000073ca00000| Untracked -| 466|0x000000073cc00000, 0x000000073cc00000, 0x000000073ce00000| 0%| F| |TAMS 0x000000073cc00000, 0x000000073cc00000| Untracked -| 467|0x000000073ce00000, 0x000000073d000000, 0x000000073d000000|100%| O| |TAMS 0x000000073d000000, 0x000000073ce00000| Untracked -| 468|0x000000073d000000, 0x000000073d200000, 0x000000073d200000|100%| O| |TAMS 0x000000073d200000, 0x000000073d000000| Untracked -| 469|0x000000073d200000, 0x000000073d400000, 0x000000073d400000|100%| O| |TAMS 0x000000073d400000, 0x000000073d200000| Untracked -| 470|0x000000073d400000, 0x000000073d600000, 0x000000073d600000|100%| O| |TAMS 0x000000073d600000, 0x000000073d400000| Untracked -| 471|0x000000073d600000, 0x000000073d800000, 0x000000073d800000|100%| O| |TAMS 0x000000073d800000, 0x000000073d600000| Untracked -| 472|0x000000073d800000, 0x000000073d800000, 0x000000073da00000| 0%| F| |TAMS 0x000000073d800000, 0x000000073d800000| Untracked -| 473|0x000000073da00000, 0x000000073da00000, 0x000000073dc00000| 0%| F| |TAMS 0x000000073da00000, 0x000000073da00000| Untracked -| 474|0x000000073dc00000, 0x000000073dc00000, 0x000000073de00000| 0%| F| |TAMS 0x000000073dc00000, 0x000000073dc00000| Untracked -| 475|0x000000073de00000, 0x000000073de00000, 0x000000073e000000| 0%| F| |TAMS 0x000000073de00000, 0x000000073de00000| Untracked -| 476|0x000000073e000000, 0x000000073e000000, 0x000000073e200000| 0%| F| |TAMS 0x000000073e000000, 0x000000073e000000| Untracked -| 477|0x000000073e200000, 0x000000073e200000, 0x000000073e400000| 0%| F| |TAMS 0x000000073e200000, 0x000000073e200000| Untracked -| 478|0x000000073e400000, 0x000000073e600000, 0x000000073e600000|100%| O| |TAMS 0x000000073e600000, 0x000000073e400000| Untracked -| 479|0x000000073e600000, 0x000000073e800000, 0x000000073e800000|100%| O| |TAMS 0x000000073e800000, 0x000000073e600000| Untracked -| 480|0x000000073e800000, 0x000000073ea00000, 0x000000073ea00000|100%| O| |TAMS 0x000000073ea00000, 0x000000073e800000| Untracked -| 481|0x000000073ea00000, 0x000000073ec00000, 0x000000073ec00000|100%| O| |TAMS 0x000000073ec00000, 0x000000073ea00000| Untracked -| 482|0x000000073ec00000, 0x000000073ee00000, 0x000000073ee00000|100%| O| |TAMS 0x000000073ee00000, 0x000000073ec00000| Untracked -| 483|0x000000073ee00000, 0x000000073f000000, 0x000000073f000000|100%| O| |TAMS 0x000000073f000000, 0x000000073ee00000| Untracked -| 484|0x000000073f000000, 0x000000073f200000, 0x000000073f200000|100%| O| |TAMS 0x000000073f200000, 0x000000073f000000| Untracked -| 485|0x000000073f200000, 0x000000073f400000, 0x000000073f400000|100%| O| |TAMS 0x000000073f400000, 0x000000073f200000| Untracked -| 486|0x000000073f400000, 0x000000073f600000, 0x000000073f600000|100%| O| |TAMS 0x000000073f600000, 0x000000073f400000| Untracked -| 487|0x000000073f600000, 0x000000073f800000, 0x000000073f800000|100%| O| |TAMS 0x000000073f800000, 0x000000073f600000| Untracked -| 488|0x000000073f800000, 0x000000073fa00000, 0x000000073fa00000|100%| O| |TAMS 0x000000073fa00000, 0x000000073f800000| Untracked -| 489|0x000000073fa00000, 0x000000073fc00000, 0x000000073fc00000|100%| O| |TAMS 0x000000073fc00000, 0x000000073fa00000| Untracked -| 490|0x000000073fc00000, 0x000000073fe00000, 0x000000073fe00000|100%| O| |TAMS 0x000000073fe00000, 0x000000073fc00000| Untracked -| 491|0x000000073fe00000, 0x0000000740000000, 0x0000000740000000|100%| O| |TAMS 0x0000000740000000, 0x000000073fe00000| Untracked -| 492|0x0000000740000000, 0x0000000740200000, 0x0000000740200000|100%| O| |TAMS 0x0000000740200000, 0x0000000740000000| Untracked -| 493|0x0000000740200000, 0x0000000740400000, 0x0000000740400000|100%| O| |TAMS 0x0000000740400000, 0x0000000740200000| Untracked -| 494|0x0000000740400000, 0x0000000740600000, 0x0000000740600000|100%| O| |TAMS 0x0000000740600000, 0x0000000740400000| Untracked -| 495|0x0000000740600000, 0x0000000740800000, 0x0000000740800000|100%| O| |TAMS 0x0000000740800000, 0x0000000740600000| Untracked -| 496|0x0000000740800000, 0x0000000740a00000, 0x0000000740a00000|100%| O| |TAMS 0x0000000740a00000, 0x0000000740800000| Untracked -| 497|0x0000000740a00000, 0x0000000740c00000, 0x0000000740c00000|100%| O| |TAMS 0x0000000740c00000, 0x0000000740a00000| Untracked -| 498|0x0000000740c00000, 0x0000000740e00000, 0x0000000740e00000|100%| O| |TAMS 0x0000000740e00000, 0x0000000740c00000| Untracked -| 499|0x0000000740e00000, 0x0000000741000000, 0x0000000741000000|100%| O| |TAMS 0x0000000741000000, 0x0000000740e00000| Untracked -| 500|0x0000000741000000, 0x0000000741200000, 0x0000000741200000|100%| O| |TAMS 0x0000000741200000, 0x0000000741000000| Untracked -| 501|0x0000000741200000, 0x0000000741400000, 0x0000000741400000|100%| O| |TAMS 0x0000000741400000, 0x0000000741200000| Untracked -| 502|0x0000000741400000, 0x0000000741600000, 0x0000000741600000|100%| O| |TAMS 0x0000000741600000, 0x0000000741400000| Untracked -| 503|0x0000000741600000, 0x0000000741800000, 0x0000000741800000|100%| O| |TAMS 0x0000000741800000, 0x0000000741600000| Untracked -| 504|0x0000000741800000, 0x0000000741a00000, 0x0000000741a00000|100%| O| |TAMS 0x0000000741a00000, 0x0000000741800000| Untracked -| 505|0x0000000741a00000, 0x0000000741c00000, 0x0000000741c00000|100%| O| |TAMS 0x0000000741c00000, 0x0000000741a00000| Untracked -| 506|0x0000000741c00000, 0x0000000741e00000, 0x0000000741e00000|100%| O| |TAMS 0x0000000741e00000, 0x0000000741c00000| Untracked -| 507|0x0000000741e00000, 0x0000000742000000, 0x0000000742000000|100%| O| |TAMS 0x0000000742000000, 0x0000000741e00000| Untracked -| 508|0x0000000742000000, 0x0000000742200000, 0x0000000742200000|100%| O| |TAMS 0x0000000742200000, 0x0000000742000000| Untracked -| 509|0x0000000742200000, 0x0000000742400000, 0x0000000742400000|100%| O| |TAMS 0x0000000742400000, 0x0000000742200000| Untracked -| 510|0x0000000742400000, 0x0000000742600000, 0x0000000742600000|100%| O| |TAMS 0x0000000742600000, 0x0000000742400000| Untracked -| 511|0x0000000742600000, 0x0000000742800000, 0x0000000742800000|100%| O| |TAMS 0x0000000742800000, 0x0000000742600000| Untracked -| 512|0x0000000742800000, 0x0000000742a00000, 0x0000000742a00000|100%| O| |TAMS 0x0000000742a00000, 0x0000000742800000| Untracked -| 513|0x0000000742a00000, 0x0000000742c00000, 0x0000000742c00000|100%| O| |TAMS 0x0000000742c00000, 0x0000000742a00000| Untracked -| 514|0x0000000742c00000, 0x0000000742e00000, 0x0000000742e00000|100%| O| |TAMS 0x0000000742e00000, 0x0000000742c00000| Untracked -| 515|0x0000000742e00000, 0x0000000743000000, 0x0000000743000000|100%| O| |TAMS 0x0000000743000000, 0x0000000742e00000| Untracked -| 516|0x0000000743000000, 0x0000000743200000, 0x0000000743200000|100%| O| |TAMS 0x0000000743200000, 0x0000000743000000| Untracked -| 517|0x0000000743200000, 0x0000000743400000, 0x0000000743400000|100%| O| |TAMS 0x0000000743400000, 0x0000000743200000| Untracked -| 518|0x0000000743400000, 0x0000000743600000, 0x0000000743600000|100%| O| |TAMS 0x0000000743600000, 0x0000000743400000| Untracked -| 519|0x0000000743600000, 0x0000000743800000, 0x0000000743800000|100%| O| |TAMS 0x0000000743800000, 0x0000000743600000| Untracked -| 520|0x0000000743800000, 0x0000000743a00000, 0x0000000743a00000|100%| O| |TAMS 0x0000000743a00000, 0x0000000743800000| Untracked -| 521|0x0000000743a00000, 0x0000000743c00000, 0x0000000743c00000|100%| O| |TAMS 0x0000000743c00000, 0x0000000743a00000| Untracked -| 522|0x0000000743c00000, 0x0000000743e00000, 0x0000000743e00000|100%| O| |TAMS 0x0000000743e00000, 0x0000000743c00000| Untracked -| 523|0x0000000743e00000, 0x0000000744000000, 0x0000000744000000|100%| O| |TAMS 0x0000000744000000, 0x0000000743e00000| Untracked -| 524|0x0000000744000000, 0x0000000744000000, 0x0000000744200000| 0%| F| |TAMS 0x0000000744000000, 0x0000000744000000| Untracked -| 525|0x0000000744200000, 0x0000000744400000, 0x0000000744400000|100%| O| |TAMS 0x0000000744400000, 0x0000000744200000| Untracked -| 526|0x0000000744400000, 0x0000000744600000, 0x0000000744600000|100%| O| |TAMS 0x0000000744600000, 0x0000000744400000| Untracked -| 527|0x0000000744600000, 0x0000000744800000, 0x0000000744800000|100%| O| |TAMS 0x0000000744800000, 0x0000000744600000| Untracked -| 528|0x0000000744800000, 0x0000000744a00000, 0x0000000744a00000|100%| O| |TAMS 0x0000000744a00000, 0x0000000744800000| Untracked -| 529|0x0000000744a00000, 0x0000000744c00000, 0x0000000744c00000|100%| O| |TAMS 0x0000000744c00000, 0x0000000744a00000| Untracked -| 530|0x0000000744c00000, 0x0000000744e00000, 0x0000000744e00000|100%| O| |TAMS 0x0000000744e00000, 0x0000000744c00000| Untracked -| 531|0x0000000744e00000, 0x0000000745000000, 0x0000000745000000|100%| O| |TAMS 0x0000000745000000, 0x0000000744e00000| Untracked -| 532|0x0000000745000000, 0x0000000745200000, 0x0000000745200000|100%| O| |TAMS 0x0000000745200000, 0x0000000745000000| Untracked -| 533|0x0000000745200000, 0x0000000745400000, 0x0000000745400000|100%| O| |TAMS 0x0000000745400000, 0x0000000745200000| Untracked -| 534|0x0000000745400000, 0x0000000745600000, 0x0000000745600000|100%| O| |TAMS 0x0000000745600000, 0x0000000745400000| Untracked -| 535|0x0000000745600000, 0x0000000745800000, 0x0000000745800000|100%| O| |TAMS 0x0000000745800000, 0x0000000745600000| Untracked -| 536|0x0000000745800000, 0x0000000745a00000, 0x0000000745a00000|100%| O| |TAMS 0x0000000745a00000, 0x0000000745800000| Untracked -| 537|0x0000000745a00000, 0x0000000745c00000, 0x0000000745c00000|100%| O| |TAMS 0x0000000745c00000, 0x0000000745a00000| Untracked -| 538|0x0000000745c00000, 0x0000000745e00000, 0x0000000745e00000|100%| O| |TAMS 0x0000000745e00000, 0x0000000745c00000| Untracked -| 539|0x0000000745e00000, 0x0000000746000000, 0x0000000746000000|100%| O| |TAMS 0x0000000746000000, 0x0000000745e00000| Untracked -| 540|0x0000000746000000, 0x0000000746200000, 0x0000000746200000|100%| O| |TAMS 0x0000000746200000, 0x0000000746000000| Untracked -| 541|0x0000000746200000, 0x0000000746400000, 0x0000000746400000|100%| O| |TAMS 0x0000000746400000, 0x0000000746200000| Untracked -| 542|0x0000000746400000, 0x0000000746600000, 0x0000000746600000|100%| O| |TAMS 0x0000000746600000, 0x0000000746400000| Untracked -| 543|0x0000000746600000, 0x0000000746800000, 0x0000000746800000|100%| O| |TAMS 0x0000000746800000, 0x0000000746600000| Untracked -| 544|0x0000000746800000, 0x0000000746a00000, 0x0000000746a00000|100%| O| |TAMS 0x0000000746a00000, 0x0000000746800000| Untracked -| 545|0x0000000746a00000, 0x0000000746c00000, 0x0000000746c00000|100%| O| |TAMS 0x0000000746c00000, 0x0000000746a00000| Untracked -| 546|0x0000000746c00000, 0x0000000746e00000, 0x0000000746e00000|100%| O| |TAMS 0x0000000746e00000, 0x0000000746c00000| Untracked -| 547|0x0000000746e00000, 0x0000000747000000, 0x0000000747000000|100%| O| |TAMS 0x0000000747000000, 0x0000000746e00000| Untracked -| 548|0x0000000747000000, 0x0000000747200000, 0x0000000747200000|100%| O| |TAMS 0x0000000747200000, 0x0000000747000000| Untracked -| 549|0x0000000747200000, 0x0000000747400000, 0x0000000747400000|100%| O| |TAMS 0x0000000747400000, 0x0000000747200000| Untracked -| 550|0x0000000747400000, 0x0000000747600000, 0x0000000747600000|100%| O| |TAMS 0x0000000747600000, 0x0000000747400000| Untracked -| 551|0x0000000747600000, 0x0000000747800000, 0x0000000747800000|100%| O| |TAMS 0x0000000747800000, 0x0000000747600000| Untracked -| 552|0x0000000747800000, 0x0000000747a00000, 0x0000000747a00000|100%| O| |TAMS 0x0000000747a00000, 0x0000000747800000| Untracked -| 553|0x0000000747a00000, 0x0000000747c00000, 0x0000000747c00000|100%| O| |TAMS 0x0000000747c00000, 0x0000000747a00000| Untracked -| 554|0x0000000747c00000, 0x0000000747e00000, 0x0000000747e00000|100%| O| |TAMS 0x0000000747e00000, 0x0000000747c00000| Untracked -| 555|0x0000000747e00000, 0x0000000748000000, 0x0000000748000000|100%| O| |TAMS 0x0000000748000000, 0x0000000747e00000| Untracked -| 556|0x0000000748000000, 0x0000000748200000, 0x0000000748200000|100%| O| |TAMS 0x0000000748200000, 0x0000000748000000| Untracked -| 557|0x0000000748200000, 0x0000000748400000, 0x0000000748400000|100%| O| |TAMS 0x0000000748400000, 0x0000000748200000| Untracked -| 558|0x0000000748400000, 0x0000000748600000, 0x0000000748600000|100%| O| |TAMS 0x0000000748600000, 0x0000000748400000| Untracked -| 559|0x0000000748600000, 0x0000000748800000, 0x0000000748800000|100%| O| |TAMS 0x0000000748800000, 0x0000000748600000| Untracked -| 560|0x0000000748800000, 0x0000000748a00000, 0x0000000748a00000|100%| O| |TAMS 0x0000000748a00000, 0x0000000748800000| Untracked -| 561|0x0000000748a00000, 0x0000000748c00000, 0x0000000748c00000|100%| O| |TAMS 0x0000000748c00000, 0x0000000748a00000| Untracked -| 562|0x0000000748c00000, 0x0000000748e00000, 0x0000000748e00000|100%| O| |TAMS 0x0000000748e00000, 0x0000000748c00000| Untracked -| 563|0x0000000748e00000, 0x0000000749000000, 0x0000000749000000|100%| O| |TAMS 0x0000000749000000, 0x0000000748e00000| Untracked -| 564|0x0000000749000000, 0x0000000749200000, 0x0000000749200000|100%| O| |TAMS 0x0000000749200000, 0x0000000749000000| Untracked -| 565|0x0000000749200000, 0x0000000749400000, 0x0000000749400000|100%| O| |TAMS 0x0000000749400000, 0x0000000749200000| Untracked -| 566|0x0000000749400000, 0x0000000749600000, 0x0000000749600000|100%| O| |TAMS 0x0000000749600000, 0x0000000749400000| Untracked -| 567|0x0000000749600000, 0x0000000749800000, 0x0000000749800000|100%| O| |TAMS 0x0000000749800000, 0x0000000749600000| Untracked -| 568|0x0000000749800000, 0x0000000749a00000, 0x0000000749a00000|100%| O| |TAMS 0x0000000749a00000, 0x0000000749800000| Untracked -| 569|0x0000000749a00000, 0x0000000749c00000, 0x0000000749c00000|100%| O| |TAMS 0x0000000749c00000, 0x0000000749a00000| Untracked -| 570|0x0000000749c00000, 0x0000000749e00000, 0x0000000749e00000|100%| O| |TAMS 0x0000000749e00000, 0x0000000749c00000| Untracked -| 571|0x0000000749e00000, 0x000000074a000000, 0x000000074a000000|100%| O| |TAMS 0x000000074a000000, 0x0000000749e00000| Untracked -| 572|0x000000074a000000, 0x000000074a200000, 0x000000074a200000|100%| O| |TAMS 0x000000074a200000, 0x000000074a000000| Untracked -| 573|0x000000074a200000, 0x000000074a400000, 0x000000074a400000|100%| O| |TAMS 0x000000074a400000, 0x000000074a200000| Untracked -| 574|0x000000074a400000, 0x000000074a600000, 0x000000074a600000|100%| O| |TAMS 0x000000074a600000, 0x000000074a400000| Untracked -| 575|0x000000074a600000, 0x000000074a800000, 0x000000074a800000|100%| O| |TAMS 0x000000074a800000, 0x000000074a600000| Untracked -| 576|0x000000074a800000, 0x000000074aa00000, 0x000000074aa00000|100%| O| |TAMS 0x000000074aa00000, 0x000000074a800000| Untracked -| 577|0x000000074aa00000, 0x000000074ac00000, 0x000000074ac00000|100%| O| |TAMS 0x000000074ac00000, 0x000000074aa00000| Untracked -| 578|0x000000074ac00000, 0x000000074ae00000, 0x000000074ae00000|100%| O| |TAMS 0x000000074ae00000, 0x000000074ac00000| Untracked -| 579|0x000000074ae00000, 0x000000074b000000, 0x000000074b000000|100%| O| |TAMS 0x000000074b000000, 0x000000074ae00000| Untracked -| 580|0x000000074b000000, 0x000000074b200000, 0x000000074b200000|100%| O| |TAMS 0x000000074b200000, 0x000000074b000000| Untracked -| 581|0x000000074b200000, 0x000000074b400000, 0x000000074b400000|100%| O| |TAMS 0x000000074b400000, 0x000000074b200000| Untracked -| 582|0x000000074b400000, 0x000000074b600000, 0x000000074b600000|100%| O| |TAMS 0x000000074b600000, 0x000000074b400000| Untracked -| 583|0x000000074b600000, 0x000000074b800000, 0x000000074b800000|100%| O| |TAMS 0x000000074b800000, 0x000000074b600000| Untracked -| 584|0x000000074b800000, 0x000000074ba00000, 0x000000074ba00000|100%| O| |TAMS 0x000000074ba00000, 0x000000074b800000| Untracked -| 585|0x000000074ba00000, 0x000000074bc00000, 0x000000074bc00000|100%| O| |TAMS 0x000000074bc00000, 0x000000074ba00000| Untracked -| 586|0x000000074bc00000, 0x000000074be00000, 0x000000074be00000|100%| O| |TAMS 0x000000074be00000, 0x000000074bc00000| Untracked -| 587|0x000000074be00000, 0x000000074c000000, 0x000000074c000000|100%| O| |TAMS 0x000000074c000000, 0x000000074be00000| Untracked -| 588|0x000000074c000000, 0x000000074c200000, 0x000000074c200000|100%| O| |TAMS 0x000000074c200000, 0x000000074c000000| Untracked -| 589|0x000000074c200000, 0x000000074c400000, 0x000000074c400000|100%| O| |TAMS 0x000000074c400000, 0x000000074c200000| Untracked -| 590|0x000000074c400000, 0x000000074c600000, 0x000000074c600000|100%| O| |TAMS 0x000000074c600000, 0x000000074c400000| Untracked -| 591|0x000000074c600000, 0x000000074c800000, 0x000000074c800000|100%| O| |TAMS 0x000000074c800000, 0x000000074c600000| Untracked -| 592|0x000000074c800000, 0x000000074ca00000, 0x000000074ca00000|100%| O| |TAMS 0x000000074ca00000, 0x000000074c800000| Untracked -| 593|0x000000074ca00000, 0x000000074cc00000, 0x000000074cc00000|100%| O| |TAMS 0x000000074cc00000, 0x000000074ca00000| Untracked -| 594|0x000000074cc00000, 0x000000074ce00000, 0x000000074ce00000|100%| O| |TAMS 0x000000074ce00000, 0x000000074cc00000| Untracked -| 595|0x000000074ce00000, 0x000000074d000000, 0x000000074d000000|100%| O| |TAMS 0x000000074d000000, 0x000000074ce00000| Untracked -| 596|0x000000074d000000, 0x000000074d200000, 0x000000074d200000|100%| O| |TAMS 0x000000074d200000, 0x000000074d000000| Untracked -| 597|0x000000074d200000, 0x000000074d400000, 0x000000074d400000|100%| O| |TAMS 0x000000074d400000, 0x000000074d200000| Untracked -| 598|0x000000074d400000, 0x000000074d600000, 0x000000074d600000|100%| O| |TAMS 0x000000074d600000, 0x000000074d400000| Untracked -| 599|0x000000074d600000, 0x000000074d800000, 0x000000074d800000|100%| O| |TAMS 0x000000074d800000, 0x000000074d600000| Untracked -| 600|0x000000074d800000, 0x000000074da00000, 0x000000074da00000|100%| O| |TAMS 0x000000074da00000, 0x000000074d800000| Untracked -| 601|0x000000074da00000, 0x000000074dc00000, 0x000000074dc00000|100%| O| |TAMS 0x000000074dc00000, 0x000000074da00000| Untracked -| 602|0x000000074dc00000, 0x000000074de00000, 0x000000074de00000|100%| O| |TAMS 0x000000074de00000, 0x000000074dc00000| Untracked -| 603|0x000000074de00000, 0x000000074e000000, 0x000000074e000000|100%| O| |TAMS 0x000000074e000000, 0x000000074de00000| Untracked -| 604|0x000000074e000000, 0x000000074e200000, 0x000000074e200000|100%| O| |TAMS 0x000000074e200000, 0x000000074e000000| Untracked -| 605|0x000000074e200000, 0x000000074e400000, 0x000000074e400000|100%| O| |TAMS 0x000000074e400000, 0x000000074e200000| Untracked -| 606|0x000000074e400000, 0x000000074e600000, 0x000000074e600000|100%| O| |TAMS 0x000000074e600000, 0x000000074e400000| Untracked -| 607|0x000000074e600000, 0x000000074e800000, 0x000000074e800000|100%| O| |TAMS 0x000000074e800000, 0x000000074e600000| Untracked -| 608|0x000000074e800000, 0x000000074ea00000, 0x000000074ea00000|100%| O| |TAMS 0x000000074ea00000, 0x000000074e800000| Untracked -| 609|0x000000074ea00000, 0x000000074ec00000, 0x000000074ec00000|100%| O| |TAMS 0x000000074ec00000, 0x000000074ea00000| Untracked -| 610|0x000000074ec00000, 0x000000074ee00000, 0x000000074ee00000|100%| O| |TAMS 0x000000074ee00000, 0x000000074ec00000| Untracked -| 611|0x000000074ee00000, 0x000000074f000000, 0x000000074f000000|100%| O| |TAMS 0x000000074f000000, 0x000000074ee00000| Untracked -| 612|0x000000074f000000, 0x000000074f200000, 0x000000074f200000|100%| O| |TAMS 0x000000074f200000, 0x000000074f000000| Untracked -| 613|0x000000074f200000, 0x000000074f400000, 0x000000074f400000|100%| O| |TAMS 0x000000074f400000, 0x000000074f200000| Untracked -| 614|0x000000074f400000, 0x000000074f600000, 0x000000074f600000|100%| O| |TAMS 0x000000074f600000, 0x000000074f400000| Untracked -| 615|0x000000074f600000, 0x000000074f800000, 0x000000074f800000|100%| O| |TAMS 0x000000074f800000, 0x000000074f600000| Untracked -| 616|0x000000074f800000, 0x000000074fa00000, 0x000000074fa00000|100%| O| |TAMS 0x000000074fa00000, 0x000000074f800000| Untracked -| 617|0x000000074fa00000, 0x000000074fc00000, 0x000000074fc00000|100%| O| |TAMS 0x000000074fc00000, 0x000000074fa00000| Untracked -| 618|0x000000074fc00000, 0x000000074fe00000, 0x000000074fe00000|100%| O| |TAMS 0x000000074fe00000, 0x000000074fc00000| Untracked -| 619|0x000000074fe00000, 0x0000000750000000, 0x0000000750000000|100%| O| |TAMS 0x0000000750000000, 0x000000074fe00000| Untracked -| 620|0x0000000750000000, 0x0000000750200000, 0x0000000750200000|100%| O| |TAMS 0x0000000750200000, 0x0000000750000000| Untracked -| 621|0x0000000750200000, 0x0000000750400000, 0x0000000750400000|100%| O| |TAMS 0x0000000750400000, 0x0000000750200000| Untracked -| 622|0x0000000750400000, 0x0000000750600000, 0x0000000750600000|100%| O| |TAMS 0x0000000750600000, 0x0000000750400000| Untracked -| 623|0x0000000750600000, 0x0000000750800000, 0x0000000750800000|100%| O| |TAMS 0x0000000750800000, 0x0000000750600000| Untracked -| 624|0x0000000750800000, 0x0000000750a00000, 0x0000000750a00000|100%| O| |TAMS 0x0000000750a00000, 0x0000000750800000| Untracked -| 625|0x0000000750a00000, 0x0000000750c00000, 0x0000000750c00000|100%| O| |TAMS 0x0000000750c00000, 0x0000000750a00000| Untracked -| 626|0x0000000750c00000, 0x0000000750e00000, 0x0000000750e00000|100%| O| |TAMS 0x0000000750e00000, 0x0000000750c00000| Untracked -| 627|0x0000000750e00000, 0x0000000751000000, 0x0000000751000000|100%| O| |TAMS 0x0000000751000000, 0x0000000750e00000| Untracked -| 628|0x0000000751000000, 0x0000000751200000, 0x0000000751200000|100%| O| |TAMS 0x0000000751200000, 0x0000000751000000| Untracked -| 629|0x0000000751200000, 0x0000000751400000, 0x0000000751400000|100%| O| |TAMS 0x0000000751400000, 0x0000000751200000| Untracked -| 630|0x0000000751400000, 0x0000000751600000, 0x0000000751600000|100%| O| |TAMS 0x0000000751600000, 0x0000000751400000| Untracked -| 631|0x0000000751600000, 0x0000000751800000, 0x0000000751800000|100%| O| |TAMS 0x0000000751800000, 0x0000000751600000| Untracked -| 632|0x0000000751800000, 0x0000000751a00000, 0x0000000751a00000|100%| O| |TAMS 0x0000000751a00000, 0x0000000751800000| Untracked -| 633|0x0000000751a00000, 0x0000000751c00000, 0x0000000751c00000|100%| O| |TAMS 0x0000000751c00000, 0x0000000751a00000| Untracked -| 634|0x0000000751c00000, 0x0000000751e00000, 0x0000000751e00000|100%| O| |TAMS 0x0000000751e00000, 0x0000000751c00000| Untracked -| 635|0x0000000751e00000, 0x0000000752000000, 0x0000000752000000|100%| O| |TAMS 0x0000000752000000, 0x0000000751e00000| Untracked -| 636|0x0000000752000000, 0x0000000752200000, 0x0000000752200000|100%| O| |TAMS 0x0000000752200000, 0x0000000752000000| Untracked -| 637|0x0000000752200000, 0x0000000752400000, 0x0000000752400000|100%| O| |TAMS 0x0000000752400000, 0x0000000752200000| Untracked -| 638|0x0000000752400000, 0x0000000752600000, 0x0000000752600000|100%| O| |TAMS 0x0000000752600000, 0x0000000752400000| Untracked -| 639|0x0000000752600000, 0x0000000752800000, 0x0000000752800000|100%| O| |TAMS 0x0000000752800000, 0x0000000752600000| Untracked -| 640|0x0000000752800000, 0x0000000752a00000, 0x0000000752a00000|100%| O| |TAMS 0x0000000752a00000, 0x0000000752800000| Untracked -| 641|0x0000000752a00000, 0x0000000752c00000, 0x0000000752c00000|100%| O| |TAMS 0x0000000752c00000, 0x0000000752a00000| Untracked -| 642|0x0000000752c00000, 0x0000000752e00000, 0x0000000752e00000|100%| O| |TAMS 0x0000000752e00000, 0x0000000752c00000| Untracked -| 643|0x0000000752e00000, 0x0000000753000000, 0x0000000753000000|100%| O| |TAMS 0x0000000753000000, 0x0000000752e00000| Untracked -| 644|0x0000000753000000, 0x0000000753200000, 0x0000000753200000|100%| O| |TAMS 0x0000000753200000, 0x0000000753000000| Untracked -| 645|0x0000000753200000, 0x0000000753400000, 0x0000000753400000|100%| O| |TAMS 0x0000000753400000, 0x0000000753200000| Untracked -| 646|0x0000000753400000, 0x0000000753600000, 0x0000000753600000|100%| O| |TAMS 0x0000000753600000, 0x0000000753400000| Untracked -| 647|0x0000000753600000, 0x0000000753800000, 0x0000000753800000|100%| O| |TAMS 0x0000000753800000, 0x0000000753600000| Untracked -| 648|0x0000000753800000, 0x0000000753a00000, 0x0000000753a00000|100%| O| |TAMS 0x0000000753a00000, 0x0000000753800000| Untracked -| 649|0x0000000753a00000, 0x0000000753c00000, 0x0000000753c00000|100%| O| |TAMS 0x0000000753c00000, 0x0000000753a00000| Untracked -| 650|0x0000000753c00000, 0x0000000753e00000, 0x0000000753e00000|100%| O| |TAMS 0x0000000753e00000, 0x0000000753c00000| Untracked -| 651|0x0000000753e00000, 0x0000000754000000, 0x0000000754000000|100%| O| |TAMS 0x0000000754000000, 0x0000000753e00000| Untracked -| 652|0x0000000754000000, 0x0000000754200000, 0x0000000754200000|100%| O| |TAMS 0x0000000754200000, 0x0000000754000000| Untracked -| 653|0x0000000754200000, 0x0000000754400000, 0x0000000754400000|100%| O| |TAMS 0x0000000754400000, 0x0000000754200000| Untracked -| 654|0x0000000754400000, 0x0000000754600000, 0x0000000754600000|100%| O| |TAMS 0x0000000754600000, 0x0000000754400000| Untracked -| 655|0x0000000754600000, 0x0000000754800000, 0x0000000754800000|100%| O| |TAMS 0x0000000754800000, 0x0000000754600000| Untracked -| 656|0x0000000754800000, 0x0000000754a00000, 0x0000000754a00000|100%| O| |TAMS 0x0000000754a00000, 0x0000000754800000| Untracked -| 657|0x0000000754a00000, 0x0000000754c00000, 0x0000000754c00000|100%| O| |TAMS 0x0000000754c00000, 0x0000000754a00000| Untracked -| 658|0x0000000754c00000, 0x0000000754e00000, 0x0000000754e00000|100%| O| |TAMS 0x0000000754e00000, 0x0000000754c00000| Untracked -| 659|0x0000000754e00000, 0x0000000755000000, 0x0000000755000000|100%| O| |TAMS 0x0000000755000000, 0x0000000754e00000| Untracked -| 660|0x0000000755000000, 0x0000000755200000, 0x0000000755200000|100%| O| |TAMS 0x0000000755200000, 0x0000000755000000| Untracked -| 661|0x0000000755200000, 0x0000000755400000, 0x0000000755400000|100%| O| |TAMS 0x0000000755400000, 0x0000000755200000| Untracked -| 662|0x0000000755400000, 0x0000000755600000, 0x0000000755600000|100%| O| |TAMS 0x0000000755600000, 0x0000000755400000| Untracked -| 663|0x0000000755600000, 0x0000000755800000, 0x0000000755800000|100%| O| |TAMS 0x0000000755800000, 0x0000000755600000| Untracked -| 664|0x0000000755800000, 0x0000000755a00000, 0x0000000755a00000|100%| O| |TAMS 0x0000000755a00000, 0x0000000755800000| Untracked -| 665|0x0000000755a00000, 0x0000000755c00000, 0x0000000755c00000|100%| O| |TAMS 0x0000000755c00000, 0x0000000755a00000| Untracked -| 666|0x0000000755c00000, 0x0000000755e00000, 0x0000000755e00000|100%| O| |TAMS 0x0000000755e00000, 0x0000000755c00000| Untracked -| 667|0x0000000755e00000, 0x0000000756000000, 0x0000000756000000|100%| O| |TAMS 0x0000000756000000, 0x0000000755e00000| Untracked -| 668|0x0000000756000000, 0x0000000756200000, 0x0000000756200000|100%| O| |TAMS 0x0000000756200000, 0x0000000756000000| Untracked -| 669|0x0000000756200000, 0x0000000756400000, 0x0000000756400000|100%| O| |TAMS 0x0000000756400000, 0x0000000756200000| Untracked -| 670|0x0000000756400000, 0x0000000756600000, 0x0000000756600000|100%| O| |TAMS 0x0000000756600000, 0x0000000756400000| Untracked -| 671|0x0000000756600000, 0x0000000756800000, 0x0000000756800000|100%| O| |TAMS 0x0000000756800000, 0x0000000756600000| Untracked -| 672|0x0000000756800000, 0x0000000756a00000, 0x0000000756a00000|100%| O| |TAMS 0x0000000756a00000, 0x0000000756800000| Untracked -| 673|0x0000000756a00000, 0x0000000756c00000, 0x0000000756c00000|100%| O| |TAMS 0x0000000756c00000, 0x0000000756a00000| Untracked -| 674|0x0000000756c00000, 0x0000000756e00000, 0x0000000756e00000|100%| O| |TAMS 0x0000000756e00000, 0x0000000756c00000| Untracked -| 675|0x0000000756e00000, 0x0000000757000000, 0x0000000757000000|100%| O| |TAMS 0x0000000757000000, 0x0000000756e00000| Untracked -| 676|0x0000000757000000, 0x0000000757200000, 0x0000000757200000|100%| O| |TAMS 0x0000000757200000, 0x0000000757000000| Untracked -| 677|0x0000000757200000, 0x0000000757400000, 0x0000000757400000|100%| O| |TAMS 0x0000000757400000, 0x0000000757200000| Untracked -| 678|0x0000000757400000, 0x0000000757600000, 0x0000000757600000|100%| O| |TAMS 0x0000000757600000, 0x0000000757400000| Untracked -| 679|0x0000000757600000, 0x0000000757800000, 0x0000000757800000|100%| O| |TAMS 0x0000000757800000, 0x0000000757600000| Untracked -| 680|0x0000000757800000, 0x0000000757a00000, 0x0000000757a00000|100%| O| |TAMS 0x0000000757a00000, 0x0000000757800000| Untracked -| 681|0x0000000757a00000, 0x0000000757c00000, 0x0000000757c00000|100%| O| |TAMS 0x0000000757c00000, 0x0000000757a00000| Untracked -| 682|0x0000000757c00000, 0x0000000757e00000, 0x0000000757e00000|100%| O| |TAMS 0x0000000757e00000, 0x0000000757c00000| Untracked -| 683|0x0000000757e00000, 0x0000000758000000, 0x0000000758000000|100%| O| |TAMS 0x0000000758000000, 0x0000000757e00000| Untracked -| 684|0x0000000758000000, 0x0000000758200000, 0x0000000758200000|100%| O| |TAMS 0x0000000758200000, 0x0000000758000000| Untracked -| 685|0x0000000758200000, 0x0000000758400000, 0x0000000758400000|100%| O| |TAMS 0x0000000758400000, 0x0000000758200000| Untracked -| 686|0x0000000758400000, 0x0000000758600000, 0x0000000758600000|100%| O| |TAMS 0x0000000758600000, 0x0000000758400000| Untracked -| 687|0x0000000758600000, 0x0000000758800000, 0x0000000758800000|100%| O| |TAMS 0x0000000758800000, 0x0000000758600000| Untracked -| 688|0x0000000758800000, 0x0000000758a00000, 0x0000000758a00000|100%| O| |TAMS 0x0000000758a00000, 0x0000000758800000| Untracked -| 689|0x0000000758a00000, 0x0000000758c00000, 0x0000000758c00000|100%| O| |TAMS 0x0000000758c00000, 0x0000000758a00000| Untracked -| 690|0x0000000758c00000, 0x0000000758e00000, 0x0000000758e00000|100%| O| |TAMS 0x0000000758e00000, 0x0000000758c00000| Untracked -| 691|0x0000000758e00000, 0x0000000759000000, 0x0000000759000000|100%| O| |TAMS 0x0000000759000000, 0x0000000758e00000| Untracked -| 692|0x0000000759000000, 0x0000000759200000, 0x0000000759200000|100%| O| |TAMS 0x0000000759200000, 0x0000000759000000| Untracked -| 693|0x0000000759200000, 0x0000000759400000, 0x0000000759400000|100%| O| |TAMS 0x0000000759400000, 0x0000000759200000| Untracked -| 694|0x0000000759400000, 0x0000000759600000, 0x0000000759600000|100%| O| |TAMS 0x0000000759600000, 0x0000000759400000| Untracked -| 695|0x0000000759600000, 0x0000000759800000, 0x0000000759800000|100%| O| |TAMS 0x0000000759800000, 0x0000000759600000| Untracked -| 696|0x0000000759800000, 0x0000000759a00000, 0x0000000759a00000|100%| O| |TAMS 0x0000000759a00000, 0x0000000759800000| Untracked -| 697|0x0000000759a00000, 0x0000000759c00000, 0x0000000759c00000|100%| O| |TAMS 0x0000000759c00000, 0x0000000759a00000| Untracked -| 698|0x0000000759c00000, 0x0000000759e00000, 0x0000000759e00000|100%| O| |TAMS 0x0000000759e00000, 0x0000000759c00000| Untracked -| 699|0x0000000759e00000, 0x000000075a000000, 0x000000075a000000|100%| O| |TAMS 0x000000075a000000, 0x0000000759e00000| Untracked -| 700|0x000000075a000000, 0x000000075a200000, 0x000000075a200000|100%| O| |TAMS 0x000000075a200000, 0x000000075a000000| Untracked -| 701|0x000000075a200000, 0x000000075a400000, 0x000000075a400000|100%| O| |TAMS 0x000000075a400000, 0x000000075a200000| Untracked -| 702|0x000000075a400000, 0x000000075a600000, 0x000000075a600000|100%| O| |TAMS 0x000000075a600000, 0x000000075a400000| Untracked -| 703|0x000000075a600000, 0x000000075a800000, 0x000000075a800000|100%| O| |TAMS 0x000000075a800000, 0x000000075a600000| Untracked -| 704|0x000000075a800000, 0x000000075aa00000, 0x000000075aa00000|100%| O| |TAMS 0x000000075aa00000, 0x000000075a800000| Untracked -| 705|0x000000075aa00000, 0x000000075ac00000, 0x000000075ac00000|100%| O| |TAMS 0x000000075ac00000, 0x000000075aa00000| Untracked -| 706|0x000000075ac00000, 0x000000075ae00000, 0x000000075ae00000|100%| O| |TAMS 0x000000075ae00000, 0x000000075ac00000| Untracked -| 707|0x000000075ae00000, 0x000000075b000000, 0x000000075b000000|100%| O| |TAMS 0x000000075b000000, 0x000000075ae00000| Untracked -| 708|0x000000075b000000, 0x000000075b200000, 0x000000075b200000|100%| O| |TAMS 0x000000075b200000, 0x000000075b000000| Untracked -| 709|0x000000075b200000, 0x000000075b400000, 0x000000075b400000|100%| O| |TAMS 0x000000075b400000, 0x000000075b200000| Untracked -| 710|0x000000075b400000, 0x000000075b600000, 0x000000075b600000|100%| O| |TAMS 0x000000075b600000, 0x000000075b400000| Untracked -| 711|0x000000075b600000, 0x000000075b800000, 0x000000075b800000|100%| O| |TAMS 0x000000075b800000, 0x000000075b600000| Untracked -| 712|0x000000075b800000, 0x000000075ba00000, 0x000000075ba00000|100%| O| |TAMS 0x000000075ba00000, 0x000000075b800000| Untracked -| 713|0x000000075ba00000, 0x000000075bc00000, 0x000000075bc00000|100%| O| |TAMS 0x000000075bc00000, 0x000000075ba00000| Untracked -| 714|0x000000075bc00000, 0x000000075be00000, 0x000000075be00000|100%| O| |TAMS 0x000000075be00000, 0x000000075bc00000| Untracked -| 715|0x000000075be00000, 0x000000075c000000, 0x000000075c000000|100%| O| |TAMS 0x000000075c000000, 0x000000075be00000| Untracked -| 716|0x000000075c000000, 0x000000075c200000, 0x000000075c200000|100%| O| |TAMS 0x000000075c200000, 0x000000075c000000| Untracked -| 717|0x000000075c200000, 0x000000075c400000, 0x000000075c400000|100%| O| |TAMS 0x000000075c400000, 0x000000075c200000| Untracked -| 718|0x000000075c400000, 0x000000075c600000, 0x000000075c600000|100%| O| |TAMS 0x000000075c600000, 0x000000075c400000| Untracked -| 719|0x000000075c600000, 0x000000075c800000, 0x000000075c800000|100%| O| |TAMS 0x000000075c800000, 0x000000075c600000| Untracked -| 720|0x000000075c800000, 0x000000075ca00000, 0x000000075ca00000|100%| O| |TAMS 0x000000075ca00000, 0x000000075c800000| Untracked -| 721|0x000000075ca00000, 0x000000075cc00000, 0x000000075cc00000|100%| O| |TAMS 0x000000075cc00000, 0x000000075ca00000| Untracked -| 722|0x000000075cc00000, 0x000000075ce00000, 0x000000075ce00000|100%| O| |TAMS 0x000000075ce00000, 0x000000075cc00000| Untracked -| 723|0x000000075ce00000, 0x000000075d000000, 0x000000075d000000|100%| O| |TAMS 0x000000075d000000, 0x000000075ce00000| Untracked -| 724|0x000000075d000000, 0x000000075d200000, 0x000000075d200000|100%| O| |TAMS 0x000000075d200000, 0x000000075d000000| Untracked -| 725|0x000000075d200000, 0x000000075d400000, 0x000000075d400000|100%| O| |TAMS 0x000000075d400000, 0x000000075d200000| Untracked -| 726|0x000000075d400000, 0x000000075d600000, 0x000000075d600000|100%| O| |TAMS 0x000000075d600000, 0x000000075d400000| Untracked -| 727|0x000000075d600000, 0x000000075d800000, 0x000000075d800000|100%| O| |TAMS 0x000000075d800000, 0x000000075d600000| Untracked -| 728|0x000000075d800000, 0x000000075da00000, 0x000000075da00000|100%| O| |TAMS 0x000000075da00000, 0x000000075d800000| Untracked -| 729|0x000000075da00000, 0x000000075dc00000, 0x000000075dc00000|100%| O| |TAMS 0x000000075dc00000, 0x000000075da00000| Untracked -| 730|0x000000075dc00000, 0x000000075de00000, 0x000000075de00000|100%| O| |TAMS 0x000000075de00000, 0x000000075dc00000| Untracked -| 731|0x000000075de00000, 0x000000075e000000, 0x000000075e000000|100%| O| |TAMS 0x000000075e000000, 0x000000075de00000| Untracked -| 732|0x000000075e000000, 0x000000075e200000, 0x000000075e200000|100%| O| |TAMS 0x000000075e200000, 0x000000075e000000| Untracked -| 733|0x000000075e200000, 0x000000075e400000, 0x000000075e400000|100%| O| |TAMS 0x000000075e400000, 0x000000075e200000| Untracked -| 734|0x000000075e400000, 0x000000075e600000, 0x000000075e600000|100%| O| |TAMS 0x000000075e600000, 0x000000075e400000| Untracked -| 735|0x000000075e600000, 0x000000075e800000, 0x000000075e800000|100%| O| |TAMS 0x000000075e800000, 0x000000075e600000| Untracked -| 736|0x000000075e800000, 0x000000075ea00000, 0x000000075ea00000|100%| O| |TAMS 0x000000075ea00000, 0x000000075e800000| Untracked -| 737|0x000000075ea00000, 0x000000075ec00000, 0x000000075ec00000|100%| O| |TAMS 0x000000075ec00000, 0x000000075ea00000| Untracked -| 738|0x000000075ec00000, 0x000000075ee00000, 0x000000075ee00000|100%| O| |TAMS 0x000000075ee00000, 0x000000075ec00000| Untracked -| 739|0x000000075ee00000, 0x000000075f000000, 0x000000075f000000|100%| O| |TAMS 0x000000075f000000, 0x000000075ee00000| Untracked -| 740|0x000000075f000000, 0x000000075f200000, 0x000000075f200000|100%| O| |TAMS 0x000000075f200000, 0x000000075f000000| Untracked -| 741|0x000000075f200000, 0x000000075f400000, 0x000000075f400000|100%| O| |TAMS 0x000000075f400000, 0x000000075f200000| Untracked -| 742|0x000000075f400000, 0x000000075f600000, 0x000000075f600000|100%| O| |TAMS 0x000000075f600000, 0x000000075f400000| Untracked -| 743|0x000000075f600000, 0x000000075f800000, 0x000000075f800000|100%| O| |TAMS 0x000000075f800000, 0x000000075f600000| Untracked -| 744|0x000000075f800000, 0x000000075fa00000, 0x000000075fa00000|100%| O| |TAMS 0x000000075fa00000, 0x000000075f800000| Untracked -| 745|0x000000075fa00000, 0x000000075fc00000, 0x000000075fc00000|100%| O| |TAMS 0x000000075fc00000, 0x000000075fa00000| Untracked -| 746|0x000000075fc00000, 0x000000075fe00000, 0x000000075fe00000|100%| O| |TAMS 0x000000075fe00000, 0x000000075fc00000| Untracked -| 747|0x000000075fe00000, 0x0000000760000000, 0x0000000760000000|100%| O| |TAMS 0x0000000760000000, 0x000000075fe00000| Untracked -| 748|0x0000000760000000, 0x0000000760200000, 0x0000000760200000|100%| O| |TAMS 0x0000000760200000, 0x0000000760000000| Untracked -| 749|0x0000000760200000, 0x0000000760400000, 0x0000000760400000|100%| O| |TAMS 0x0000000760400000, 0x0000000760200000| Untracked -| 750|0x0000000760400000, 0x0000000760600000, 0x0000000760600000|100%| O| |TAMS 0x0000000760600000, 0x0000000760400000| Untracked -| 751|0x0000000760600000, 0x0000000760800000, 0x0000000760800000|100%| O| |TAMS 0x0000000760800000, 0x0000000760600000| Untracked -| 752|0x0000000760800000, 0x0000000760a00000, 0x0000000760a00000|100%| O| |TAMS 0x0000000760a00000, 0x0000000760800000| Untracked -| 753|0x0000000760a00000, 0x0000000760c00000, 0x0000000760c00000|100%| O| |TAMS 0x0000000760c00000, 0x0000000760a00000| Untracked -| 754|0x0000000760c00000, 0x0000000760e00000, 0x0000000760e00000|100%| O| |TAMS 0x0000000760e00000, 0x0000000760c00000| Untracked -| 755|0x0000000760e00000, 0x0000000761000000, 0x0000000761000000|100%| O| |TAMS 0x0000000761000000, 0x0000000760e00000| Untracked -| 756|0x0000000761000000, 0x0000000761200000, 0x0000000761200000|100%| O| |TAMS 0x0000000761200000, 0x0000000761000000| Untracked -| 757|0x0000000761200000, 0x0000000761400000, 0x0000000761400000|100%| O| |TAMS 0x0000000761400000, 0x0000000761200000| Untracked -| 758|0x0000000761400000, 0x0000000761600000, 0x0000000761600000|100%| O| |TAMS 0x0000000761600000, 0x0000000761400000| Untracked -| 759|0x0000000761600000, 0x0000000761800000, 0x0000000761800000|100%| O| |TAMS 0x0000000761800000, 0x0000000761600000| Untracked -| 760|0x0000000761800000, 0x0000000761a00000, 0x0000000761a00000|100%| O| |TAMS 0x0000000761a00000, 0x0000000761800000| Untracked -| 761|0x0000000761a00000, 0x0000000761c00000, 0x0000000761c00000|100%| O| |TAMS 0x0000000761c00000, 0x0000000761a00000| Untracked -| 762|0x0000000761c00000, 0x0000000761e00000, 0x0000000761e00000|100%| O| |TAMS 0x0000000761e00000, 0x0000000761c00000| Untracked -| 763|0x0000000761e00000, 0x0000000762000000, 0x0000000762000000|100%| O| |TAMS 0x0000000762000000, 0x0000000761e00000| Untracked -| 764|0x0000000762000000, 0x0000000762200000, 0x0000000762200000|100%| O| |TAMS 0x0000000762200000, 0x0000000762000000| Untracked -| 765|0x0000000762200000, 0x0000000762400000, 0x0000000762400000|100%| O| |TAMS 0x0000000762400000, 0x0000000762200000| Untracked -| 766|0x0000000762400000, 0x0000000762600000, 0x0000000762600000|100%| O| |TAMS 0x0000000762600000, 0x0000000762400000| Untracked -| 767|0x0000000762600000, 0x0000000762800000, 0x0000000762800000|100%| O| |TAMS 0x0000000762800000, 0x0000000762600000| Untracked -| 768|0x0000000762800000, 0x0000000762a00000, 0x0000000762a00000|100%| O| |TAMS 0x0000000762a00000, 0x0000000762800000| Untracked -| 769|0x0000000762a00000, 0x0000000762c00000, 0x0000000762c00000|100%| O| |TAMS 0x0000000762c00000, 0x0000000762a00000| Untracked -| 770|0x0000000762c00000, 0x0000000762e00000, 0x0000000762e00000|100%| O| |TAMS 0x0000000762e00000, 0x0000000762c00000| Untracked -| 771|0x0000000762e00000, 0x0000000763000000, 0x0000000763000000|100%| O| |TAMS 0x0000000763000000, 0x0000000762e00000| Untracked -| 772|0x0000000763000000, 0x0000000763200000, 0x0000000763200000|100%| O| |TAMS 0x0000000763200000, 0x0000000763000000| Untracked -| 773|0x0000000763200000, 0x0000000763400000, 0x0000000763400000|100%| O| |TAMS 0x0000000763400000, 0x0000000763200000| Untracked -| 774|0x0000000763400000, 0x0000000763600000, 0x0000000763600000|100%| O| |TAMS 0x0000000763600000, 0x0000000763400000| Untracked -| 775|0x0000000763600000, 0x0000000763800000, 0x0000000763800000|100%| O| |TAMS 0x0000000763800000, 0x0000000763600000| Untracked -| 776|0x0000000763800000, 0x0000000763a00000, 0x0000000763a00000|100%| O| |TAMS 0x0000000763a00000, 0x0000000763800000| Untracked -| 777|0x0000000763a00000, 0x0000000763c00000, 0x0000000763c00000|100%| O| |TAMS 0x0000000763c00000, 0x0000000763a00000| Untracked -| 778|0x0000000763c00000, 0x0000000763e00000, 0x0000000763e00000|100%| O| |TAMS 0x0000000763e00000, 0x0000000763c00000| Untracked -| 779|0x0000000763e00000, 0x0000000764000000, 0x0000000764000000|100%| O| |TAMS 0x0000000763e00000, 0x0000000763e00000| Untracked -| 780|0x0000000764000000, 0x0000000764200000, 0x0000000764200000|100%| O| |TAMS 0x0000000764000000, 0x0000000764000000| Untracked -| 781|0x0000000764200000, 0x0000000764400000, 0x0000000764400000|100%| O| |TAMS 0x0000000764200000, 0x0000000764200000| Untracked -| 782|0x0000000764400000, 0x0000000764600000, 0x0000000764600000|100%| O| |TAMS 0x0000000764400000, 0x0000000764400000| Untracked -| 783|0x0000000764600000, 0x0000000764800000, 0x0000000764800000|100%| O| |TAMS 0x0000000764600000, 0x0000000764600000| Untracked -| 784|0x0000000764800000, 0x0000000764a00000, 0x0000000764a00000|100%| O| |TAMS 0x0000000764800000, 0x0000000764800000| Untracked -| 785|0x0000000764a00000, 0x0000000764c00000, 0x0000000764c00000|100%| O| |TAMS 0x0000000764a00000, 0x0000000764a00000| Untracked -| 786|0x0000000764c00000, 0x0000000764e00000, 0x0000000764e00000|100%| O| |TAMS 0x0000000764c00000, 0x0000000764c00000| Untracked -| 787|0x0000000764e00000, 0x0000000765000000, 0x0000000765000000|100%| O| |TAMS 0x0000000764e00000, 0x0000000764e00000| Untracked -| 788|0x0000000765000000, 0x0000000765200000, 0x0000000765200000|100%| O| |TAMS 0x0000000765000000, 0x0000000765000000| Untracked -| 789|0x0000000765200000, 0x0000000765400000, 0x0000000765400000|100%| O| |TAMS 0x0000000765200000, 0x0000000765200000| Untracked -| 790|0x0000000765400000, 0x0000000765600000, 0x0000000765600000|100%| O| |TAMS 0x0000000765400000, 0x0000000765400000| Untracked -| 791|0x0000000765600000, 0x0000000765800000, 0x0000000765800000|100%| O| |TAMS 0x0000000765600000, 0x0000000765600000| Untracked -| 792|0x0000000765800000, 0x0000000765a00000, 0x0000000765a00000|100%| O| |TAMS 0x0000000765800000, 0x0000000765800000| Untracked -| 793|0x0000000765a00000, 0x0000000765c00000, 0x0000000765c00000|100%| O| |TAMS 0x0000000765a00000, 0x0000000765a00000| Untracked -| 794|0x0000000765c00000, 0x0000000765e00000, 0x0000000765e00000|100%| O| |TAMS 0x0000000765c00000, 0x0000000765c00000| Untracked -| 795|0x0000000765e00000, 0x0000000766000000, 0x0000000766000000|100%| O| |TAMS 0x0000000765e00000, 0x0000000765e00000| Untracked -| 796|0x0000000766000000, 0x0000000766200000, 0x0000000766200000|100%| O| |TAMS 0x0000000766000000, 0x0000000766000000| Untracked -| 797|0x0000000766200000, 0x0000000766400000, 0x0000000766400000|100%| O| |TAMS 0x0000000766200000, 0x0000000766200000| Untracked -| 798|0x0000000766400000, 0x0000000766600000, 0x0000000766600000|100%| O| |TAMS 0x0000000766400000, 0x0000000766400000| Untracked -| 799|0x0000000766600000, 0x0000000766800000, 0x0000000766800000|100%| O| |TAMS 0x0000000766600000, 0x0000000766600000| Untracked -| 800|0x0000000766800000, 0x0000000766a00000, 0x0000000766a00000|100%| O| |TAMS 0x0000000766800000, 0x0000000766800000| Untracked -| 801|0x0000000766a00000, 0x0000000766c00000, 0x0000000766c00000|100%| O| |TAMS 0x0000000766a00000, 0x0000000766a00000| Untracked -| 802|0x0000000766c00000, 0x0000000766e00000, 0x0000000766e00000|100%| O| |TAMS 0x0000000766c00000, 0x0000000766c00000| Untracked -| 803|0x0000000766e00000, 0x0000000767000000, 0x0000000767000000|100%| O| |TAMS 0x0000000766e00000, 0x0000000766e00000| Untracked -| 804|0x0000000767000000, 0x0000000767200000, 0x0000000767200000|100%| O| |TAMS 0x0000000767000000, 0x0000000767000000| Untracked -| 805|0x0000000767200000, 0x0000000767400000, 0x0000000767400000|100%| O| |TAMS 0x0000000767200000, 0x0000000767200000| Untracked -| 806|0x0000000767400000, 0x0000000767600000, 0x0000000767600000|100%| O| |TAMS 0x0000000767400000, 0x0000000767400000| Untracked -| 807|0x0000000767600000, 0x0000000767800000, 0x0000000767800000|100%| O| |TAMS 0x0000000767600000, 0x0000000767600000| Untracked -| 808|0x0000000767800000, 0x0000000767a00000, 0x0000000767a00000|100%| O| |TAMS 0x0000000767800000, 0x0000000767800000| Untracked -| 809|0x0000000767a00000, 0x0000000767c00000, 0x0000000767c00000|100%| O| |TAMS 0x0000000767a00000, 0x0000000767a00000| Untracked -| 810|0x0000000767c00000, 0x0000000767e00000, 0x0000000767e00000|100%| O| |TAMS 0x0000000767c00000, 0x0000000767c00000| Untracked -| 811|0x0000000767e00000, 0x0000000768000000, 0x0000000768000000|100%| O| |TAMS 0x0000000767e00000, 0x0000000767e00000| Untracked -| 812|0x0000000768000000, 0x0000000768200000, 0x0000000768200000|100%| O| |TAMS 0x0000000768000000, 0x0000000768000000| Untracked -| 813|0x0000000768200000, 0x0000000768400000, 0x0000000768400000|100%| O| |TAMS 0x0000000768200000, 0x0000000768200000| Untracked -| 814|0x0000000768400000, 0x0000000768600000, 0x0000000768600000|100%| O| |TAMS 0x0000000768400000, 0x0000000768400000| Untracked -| 815|0x0000000768600000, 0x0000000768800000, 0x0000000768800000|100%| O| |TAMS 0x0000000768600000, 0x0000000768600000| Untracked -| 816|0x0000000768800000, 0x0000000768a00000, 0x0000000768a00000|100%| O| |TAMS 0x0000000768800000, 0x0000000768800000| Untracked -| 817|0x0000000768a00000, 0x0000000768c00000, 0x0000000768c00000|100%| O| |TAMS 0x0000000768a00000, 0x0000000768a00000| Untracked -| 818|0x0000000768c00000, 0x0000000768e00000, 0x0000000768e00000|100%| O| |TAMS 0x0000000768c00000, 0x0000000768c00000| Untracked -| 819|0x0000000768e00000, 0x0000000769000000, 0x0000000769000000|100%| O| |TAMS 0x0000000769000000, 0x0000000768e00000| Untracked -| 820|0x0000000769000000, 0x0000000769200000, 0x0000000769200000|100%| O| |TAMS 0x0000000769200000, 0x0000000769000000| Untracked -| 821|0x0000000769200000, 0x0000000769400000, 0x0000000769400000|100%| O| |TAMS 0x0000000769400000, 0x0000000769200000| Untracked -| 822|0x0000000769400000, 0x0000000769600000, 0x0000000769600000|100%| O| |TAMS 0x0000000769600000, 0x0000000769400000| Untracked -| 823|0x0000000769600000, 0x0000000769800000, 0x0000000769800000|100%| O| |TAMS 0x0000000769700000, 0x0000000769600000| Untracked -| 824|0x0000000769800000, 0x0000000769a00000, 0x0000000769a00000|100%| O| |TAMS 0x0000000769800000, 0x0000000769800000| Untracked -| 825|0x0000000769a00000, 0x0000000769c00000, 0x0000000769c00000|100%| O| |TAMS 0x0000000769a00000, 0x0000000769a00000| Untracked -| 826|0x0000000769c00000, 0x0000000769e00000, 0x0000000769e00000|100%| O| |TAMS 0x0000000769c00000, 0x0000000769c00000| Untracked -| 827|0x0000000769e00000, 0x000000076a000000, 0x000000076a000000|100%| O| |TAMS 0x0000000769e00000, 0x0000000769e00000| Untracked -| 828|0x000000076a000000, 0x000000076a200000, 0x000000076a200000|100%| O| |TAMS 0x000000076a000000, 0x000000076a000000| Untracked -| 829|0x000000076a200000, 0x000000076a400000, 0x000000076a400000|100%| O| |TAMS 0x000000076a200000, 0x000000076a200000| Untracked -| 830|0x000000076a400000, 0x000000076a600000, 0x000000076a600000|100%| O| |TAMS 0x000000076a400000, 0x000000076a400000| Untracked -| 831|0x000000076a600000, 0x000000076a800000, 0x000000076a800000|100%| O| |TAMS 0x000000076a600000, 0x000000076a600000| Untracked -| 832|0x000000076a800000, 0x000000076aa00000, 0x000000076aa00000|100%| O| |TAMS 0x000000076a800000, 0x000000076a800000| Untracked -| 833|0x000000076aa00000, 0x000000076ac00000, 0x000000076ac00000|100%| O| |TAMS 0x000000076aa00000, 0x000000076aa00000| Untracked -| 834|0x000000076ac00000, 0x000000076ae00000, 0x000000076ae00000|100%| O| |TAMS 0x000000076ac00000, 0x000000076ac00000| Untracked -| 835|0x000000076ae00000, 0x000000076b000000, 0x000000076b000000|100%| O| |TAMS 0x000000076ae00000, 0x000000076ae00000| Untracked -| 836|0x000000076b000000, 0x000000076b200000, 0x000000076b200000|100%| O| |TAMS 0x000000076b000000, 0x000000076b000000| Untracked -| 837|0x000000076b200000, 0x000000076b400000, 0x000000076b400000|100%| O| |TAMS 0x000000076b200000, 0x000000076b200000| Untracked -| 838|0x000000076b400000, 0x000000076b600000, 0x000000076b600000|100%| O| |TAMS 0x000000076b400000, 0x000000076b400000| Untracked -| 839|0x000000076b600000, 0x000000076b800000, 0x000000076b800000|100%| O| |TAMS 0x000000076b600000, 0x000000076b600000| Untracked -| 840|0x000000076b800000, 0x000000076ba00000, 0x000000076ba00000|100%| O| |TAMS 0x000000076b800000, 0x000000076b800000| Untracked -| 841|0x000000076ba00000, 0x000000076bc00000, 0x000000076bc00000|100%| O| |TAMS 0x000000076ba00000, 0x000000076ba00000| Untracked -| 842|0x000000076bc00000, 0x000000076be00000, 0x000000076be00000|100%| O| |TAMS 0x000000076bc00000, 0x000000076bc00000| Untracked -| 843|0x000000076be00000, 0x000000076c000000, 0x000000076c000000|100%| O| |TAMS 0x000000076be00000, 0x000000076be00000| Untracked -| 844|0x000000076c000000, 0x000000076c200000, 0x000000076c200000|100%| O| |TAMS 0x000000076c000000, 0x000000076c000000| Untracked -| 845|0x000000076c200000, 0x000000076c400000, 0x000000076c400000|100%| O| |TAMS 0x000000076c200000, 0x000000076c200000| Untracked -| 846|0x000000076c400000, 0x000000076c600000, 0x000000076c600000|100%| O| |TAMS 0x000000076c400000, 0x000000076c400000| Untracked -| 847|0x000000076c600000, 0x000000076c800000, 0x000000076c800000|100%| O| |TAMS 0x000000076c600000, 0x000000076c600000| Untracked -| 848|0x000000076c800000, 0x000000076ca00000, 0x000000076ca00000|100%| O| |TAMS 0x000000076c800000, 0x000000076c800000| Untracked -| 849|0x000000076ca00000, 0x000000076cc00000, 0x000000076cc00000|100%| O| |TAMS 0x000000076ca00000, 0x000000076ca00000| Untracked -| 850|0x000000076cc00000, 0x000000076ce00000, 0x000000076ce00000|100%| O| |TAMS 0x000000076cc00000, 0x000000076cc00000| Untracked -| 851|0x000000076ce00000, 0x000000076d000000, 0x000000076d000000|100%| O| |TAMS 0x000000076ce00000, 0x000000076ce00000| Untracked -| 852|0x000000076d000000, 0x000000076d200000, 0x000000076d200000|100%| O| |TAMS 0x000000076d000000, 0x000000076d000000| Untracked -| 853|0x000000076d200000, 0x000000076d400000, 0x000000076d400000|100%| O| |TAMS 0x000000076d200000, 0x000000076d200000| Untracked -| 854|0x000000076d400000, 0x000000076d600000, 0x000000076d600000|100%| O| |TAMS 0x000000076d400000, 0x000000076d400000| Untracked -| 855|0x000000076d600000, 0x000000076d800000, 0x000000076d800000|100%| O| |TAMS 0x000000076d600000, 0x000000076d600000| Untracked -| 856|0x000000076d800000, 0x000000076da00000, 0x000000076da00000|100%| O| |TAMS 0x000000076d800000, 0x000000076d800000| Untracked -| 857|0x000000076da00000, 0x000000076dc00000, 0x000000076dc00000|100%| O| |TAMS 0x000000076da00000, 0x000000076da00000| Untracked -| 858|0x000000076dc00000, 0x000000076de00000, 0x000000076de00000|100%| O| |TAMS 0x000000076dc00000, 0x000000076dc00000| Untracked -| 859|0x000000076de00000, 0x000000076e000000, 0x000000076e000000|100%| O| |TAMS 0x000000076de00000, 0x000000076de00000| Untracked -| 860|0x000000076e000000, 0x000000076e200000, 0x000000076e200000|100%| O| |TAMS 0x000000076e000000, 0x000000076e000000| Untracked -| 861|0x000000076e200000, 0x000000076e400000, 0x000000076e400000|100%| O| |TAMS 0x000000076e200000, 0x000000076e200000| Untracked -| 862|0x000000076e400000, 0x000000076e600000, 0x000000076e600000|100%| O| |TAMS 0x000000076e400000, 0x000000076e400000| Untracked -| 863|0x000000076e600000, 0x000000076e800000, 0x000000076e800000|100%| O| |TAMS 0x000000076e600000, 0x000000076e600000| Untracked -| 864|0x000000076e800000, 0x000000076ea00000, 0x000000076ea00000|100%| O| |TAMS 0x000000076e800000, 0x000000076e800000| Untracked -| 865|0x000000076ea00000, 0x000000076ec00000, 0x000000076ec00000|100%| O| |TAMS 0x000000076ea00000, 0x000000076ea00000| Untracked -| 866|0x000000076ec00000, 0x000000076ee00000, 0x000000076ee00000|100%| O| |TAMS 0x000000076ec00000, 0x000000076ec00000| Untracked -| 867|0x000000076ee00000, 0x000000076f000000, 0x000000076f000000|100%| O| |TAMS 0x000000076ee00000, 0x000000076ee00000| Untracked -| 868|0x000000076f000000, 0x000000076f200000, 0x000000076f200000|100%| O| |TAMS 0x000000076f000000, 0x000000076f000000| Untracked -| 869|0x000000076f200000, 0x000000076f400000, 0x000000076f400000|100%| O| |TAMS 0x000000076f200000, 0x000000076f200000| Untracked -| 870|0x000000076f400000, 0x000000076f600000, 0x000000076f600000|100%| O| |TAMS 0x000000076f400000, 0x000000076f400000| Untracked -| 871|0x000000076f600000, 0x000000076f800000, 0x000000076f800000|100%| O| |TAMS 0x000000076f600000, 0x000000076f600000| Untracked -| 872|0x000000076f800000, 0x000000076fa00000, 0x000000076fa00000|100%| O| |TAMS 0x000000076f800000, 0x000000076f800000| Untracked -| 873|0x000000076fa00000, 0x000000076fc00000, 0x000000076fc00000|100%| O| |TAMS 0x000000076fa00000, 0x000000076fa00000| Untracked -| 874|0x000000076fc00000, 0x000000076fe00000, 0x000000076fe00000|100%| O| |TAMS 0x000000076fc00000, 0x000000076fc00000| Untracked -| 875|0x000000076fe00000, 0x0000000770000000, 0x0000000770000000|100%| O| |TAMS 0x000000076fe00000, 0x000000076fe00000| Untracked -| 876|0x0000000770000000, 0x0000000770200000, 0x0000000770200000|100%| O| |TAMS 0x0000000770000000, 0x0000000770000000| Untracked -| 877|0x0000000770200000, 0x0000000770400000, 0x0000000770400000|100%| O| |TAMS 0x0000000770200000, 0x0000000770200000| Untracked -| 878|0x0000000770400000, 0x0000000770600000, 0x0000000770600000|100%| O| |TAMS 0x0000000770400000, 0x0000000770400000| Untracked -| 879|0x0000000770600000, 0x0000000770800000, 0x0000000770800000|100%| O| |TAMS 0x0000000770600000, 0x0000000770600000| Untracked -| 880|0x0000000770800000, 0x0000000770a00000, 0x0000000770a00000|100%| O| |TAMS 0x0000000770800000, 0x0000000770800000| Untracked -| 881|0x0000000770a00000, 0x0000000770c00000, 0x0000000770c00000|100%| O| |TAMS 0x0000000770a00000, 0x0000000770a00000| Untracked -| 882|0x0000000770c00000, 0x0000000770e00000, 0x0000000770e00000|100%| O| |TAMS 0x0000000770c00000, 0x0000000770c00000| Untracked -| 883|0x0000000770e00000, 0x0000000771000000, 0x0000000771000000|100%| O| |TAMS 0x0000000770e00000, 0x0000000770e00000| Untracked -| 884|0x0000000771000000, 0x0000000771200000, 0x0000000771200000|100%| O| |TAMS 0x0000000771000000, 0x0000000771000000| Untracked -| 885|0x0000000771200000, 0x0000000771400000, 0x0000000771400000|100%| O| |TAMS 0x0000000771200000, 0x0000000771200000| Untracked -| 886|0x0000000771400000, 0x0000000771600000, 0x0000000771600000|100%| O| |TAMS 0x0000000771400000, 0x0000000771400000| Untracked -| 887|0x0000000771600000, 0x0000000771800000, 0x0000000771800000|100%| O| |TAMS 0x0000000771600000, 0x0000000771600000| Untracked -| 888|0x0000000771800000, 0x0000000771a00000, 0x0000000771a00000|100%| O| |TAMS 0x0000000771800000, 0x0000000771800000| Untracked -| 889|0x0000000771a00000, 0x0000000771c00000, 0x0000000771c00000|100%| O| |TAMS 0x0000000771a00000, 0x0000000771a00000| Untracked -| 890|0x0000000771c00000, 0x0000000771e00000, 0x0000000771e00000|100%| O| |TAMS 0x0000000771c00000, 0x0000000771c00000| Untracked -| 891|0x0000000771e00000, 0x0000000772000000, 0x0000000772000000|100%| O| |TAMS 0x0000000771e00000, 0x0000000771e00000| Untracked -| 892|0x0000000772000000, 0x0000000772200000, 0x0000000772200000|100%| O| |TAMS 0x0000000772000000, 0x0000000772000000| Untracked -| 893|0x0000000772200000, 0x0000000772400000, 0x0000000772400000|100%| O| |TAMS 0x0000000772200000, 0x0000000772200000| Untracked -| 894|0x0000000772400000, 0x0000000772600000, 0x0000000772600000|100%| O| |TAMS 0x0000000772400000, 0x0000000772400000| Untracked -| 895|0x0000000772600000, 0x0000000772800000, 0x0000000772800000|100%| O| |TAMS 0x0000000772600000, 0x0000000772600000| Untracked -| 896|0x0000000772800000, 0x0000000772a00000, 0x0000000772a00000|100%| O| |TAMS 0x0000000772800000, 0x0000000772800000| Untracked -| 897|0x0000000772a00000, 0x0000000772c00000, 0x0000000772c00000|100%| O| |TAMS 0x0000000772a00000, 0x0000000772a00000| Untracked -| 898|0x0000000772c00000, 0x0000000772e00000, 0x0000000772e00000|100%| O| |TAMS 0x0000000772c00000, 0x0000000772c00000| Untracked -| 899|0x0000000772e00000, 0x0000000773000000, 0x0000000773000000|100%| O| |TAMS 0x0000000772e00000, 0x0000000772e00000| Untracked -| 900|0x0000000773000000, 0x0000000773200000, 0x0000000773200000|100%| O| |TAMS 0x0000000773000000, 0x0000000773000000| Untracked -| 901|0x0000000773200000, 0x0000000773400000, 0x0000000773400000|100%| O| |TAMS 0x0000000773200000, 0x0000000773200000| Untracked -| 902|0x0000000773400000, 0x0000000773600000, 0x0000000773600000|100%| O| |TAMS 0x0000000773400000, 0x0000000773400000| Untracked -| 903|0x0000000773600000, 0x0000000773800000, 0x0000000773800000|100%| O| |TAMS 0x0000000773600000, 0x0000000773600000| Untracked -| 904|0x0000000773800000, 0x0000000773a00000, 0x0000000773a00000|100%| O| |TAMS 0x0000000773800000, 0x0000000773800000| Untracked -| 905|0x0000000773a00000, 0x0000000773c00000, 0x0000000773c00000|100%| O| |TAMS 0x0000000773a00000, 0x0000000773a00000| Untracked -| 906|0x0000000773c00000, 0x0000000773e00000, 0x0000000773e00000|100%| O| |TAMS 0x0000000773c00000, 0x0000000773c00000| Untracked -| 907|0x0000000773e00000, 0x0000000774000000, 0x0000000774000000|100%| O| |TAMS 0x0000000773e00000, 0x0000000773e00000| Untracked -| 908|0x0000000774000000, 0x0000000774200000, 0x0000000774200000|100%| O| |TAMS 0x0000000774000000, 0x0000000774000000| Untracked -| 909|0x0000000774200000, 0x0000000774400000, 0x0000000774400000|100%| O| |TAMS 0x0000000774200000, 0x0000000774200000| Untracked -| 910|0x0000000774400000, 0x0000000774600000, 0x0000000774600000|100%| O| |TAMS 0x0000000774400000, 0x0000000774400000| Untracked -| 911|0x0000000774600000, 0x0000000774800000, 0x0000000774800000|100%| O| |TAMS 0x0000000774600000, 0x0000000774600000| Untracked -| 912|0x0000000774800000, 0x0000000774a00000, 0x0000000774a00000|100%| O| |TAMS 0x0000000774800000, 0x0000000774800000| Untracked -| 913|0x0000000774a00000, 0x0000000774c00000, 0x0000000774c00000|100%| O| |TAMS 0x0000000774a00000, 0x0000000774a00000| Untracked -| 914|0x0000000774c00000, 0x0000000774e00000, 0x0000000774e00000|100%| O| |TAMS 0x0000000774c00000, 0x0000000774c00000| Untracked -| 915|0x0000000774e00000, 0x0000000775000000, 0x0000000775000000|100%| O| |TAMS 0x0000000774e00000, 0x0000000774e00000| Untracked -| 916|0x0000000775000000, 0x0000000775200000, 0x0000000775200000|100%| O| |TAMS 0x0000000775000000, 0x0000000775000000| Untracked -| 917|0x0000000775200000, 0x0000000775400000, 0x0000000775400000|100%| O| |TAMS 0x0000000775200000, 0x0000000775200000| Untracked -| 918|0x0000000775400000, 0x0000000775600000, 0x0000000775600000|100%| O| |TAMS 0x0000000775400000, 0x0000000775400000| Untracked -| 919|0x0000000775600000, 0x0000000775800000, 0x0000000775800000|100%| O| |TAMS 0x0000000775600000, 0x0000000775600000| Untracked -| 920|0x0000000775800000, 0x0000000775a00000, 0x0000000775a00000|100%| O| |TAMS 0x0000000775800000, 0x0000000775800000| Untracked -| 921|0x0000000775a00000, 0x0000000775c00000, 0x0000000775c00000|100%| O| |TAMS 0x0000000775a00000, 0x0000000775a00000| Untracked -| 922|0x0000000775c00000, 0x0000000775e00000, 0x0000000775e00000|100%| O| |TAMS 0x0000000775c00000, 0x0000000775c00000| Untracked -| 923|0x0000000775e00000, 0x0000000776000000, 0x0000000776000000|100%| O| |TAMS 0x0000000775e00000, 0x0000000775e00000| Untracked -| 924|0x0000000776000000, 0x0000000776200000, 0x0000000776200000|100%| O| |TAMS 0x0000000776000000, 0x0000000776000000| Untracked -| 925|0x0000000776200000, 0x0000000776400000, 0x0000000776400000|100%| O| |TAMS 0x0000000776200000, 0x0000000776200000| Untracked -| 926|0x0000000776400000, 0x0000000776600000, 0x0000000776600000|100%| O| |TAMS 0x0000000776400000, 0x0000000776400000| Untracked -| 927|0x0000000776600000, 0x0000000776800000, 0x0000000776800000|100%| O| |TAMS 0x0000000776600000, 0x0000000776600000| Untracked -| 928|0x0000000776800000, 0x0000000776a00000, 0x0000000776a00000|100%| O| |TAMS 0x0000000776800000, 0x0000000776800000| Untracked -| 929|0x0000000776a00000, 0x0000000776c00000, 0x0000000776c00000|100%| O| |TAMS 0x0000000776a00000, 0x0000000776a00000| Untracked -| 930|0x0000000776c00000, 0x0000000776e00000, 0x0000000776e00000|100%| O| |TAMS 0x0000000776c00000, 0x0000000776c00000| Untracked -| 931|0x0000000776e00000, 0x0000000777000000, 0x0000000777000000|100%| O| |TAMS 0x0000000776e00000, 0x0000000776e00000| Untracked -| 932|0x0000000777000000, 0x0000000777200000, 0x0000000777200000|100%| O| |TAMS 0x0000000777000000, 0x0000000777000000| Untracked -| 933|0x0000000777200000, 0x0000000777400000, 0x0000000777400000|100%| O| |TAMS 0x0000000777200000, 0x0000000777200000| Untracked -| 934|0x0000000777400000, 0x0000000777600000, 0x0000000777600000|100%| O| |TAMS 0x0000000777400000, 0x0000000777400000| Untracked -| 935|0x0000000777600000, 0x0000000777800000, 0x0000000777800000|100%| O| |TAMS 0x0000000777600000, 0x0000000777600000| Untracked -| 936|0x0000000777800000, 0x0000000777a00000, 0x0000000777a00000|100%| O| |TAMS 0x0000000777800000, 0x0000000777800000| Untracked -| 937|0x0000000777a00000, 0x0000000777c00000, 0x0000000777c00000|100%| O| |TAMS 0x0000000777a00000, 0x0000000777a00000| Untracked -| 938|0x0000000777c00000, 0x0000000777e00000, 0x0000000777e00000|100%| O| |TAMS 0x0000000777c00000, 0x0000000777c00000| Untracked -| 939|0x0000000777e00000, 0x0000000778000000, 0x0000000778000000|100%| O| |TAMS 0x0000000777e00000, 0x0000000777e00000| Untracked -| 940|0x0000000778000000, 0x0000000778200000, 0x0000000778200000|100%| O| |TAMS 0x0000000778000000, 0x0000000778000000| Untracked -| 941|0x0000000778200000, 0x0000000778400000, 0x0000000778400000|100%| O| |TAMS 0x0000000778200000, 0x0000000778200000| Untracked -| 942|0x0000000778400000, 0x0000000778600000, 0x0000000778600000|100%| O| |TAMS 0x0000000778400000, 0x0000000778400000| Untracked -| 943|0x0000000778600000, 0x0000000778800000, 0x0000000778800000|100%| O| |TAMS 0x0000000778600000, 0x0000000778600000| Untracked -| 944|0x0000000778800000, 0x0000000778a00000, 0x0000000778a00000|100%| O| |TAMS 0x0000000778800000, 0x0000000778800000| Untracked -| 945|0x0000000778a00000, 0x0000000778c00000, 0x0000000778c00000|100%| O| |TAMS 0x0000000778a00000, 0x0000000778a00000| Untracked -| 946|0x0000000778c00000, 0x0000000778e00000, 0x0000000778e00000|100%| O| |TAMS 0x0000000778c00000, 0x0000000778c00000| Untracked -| 947|0x0000000778e00000, 0x0000000779000000, 0x0000000779000000|100%| O| |TAMS 0x0000000778e00000, 0x0000000778e00000| Untracked -| 948|0x0000000779000000, 0x0000000779200000, 0x0000000779200000|100%| O| |TAMS 0x0000000779000000, 0x0000000779000000| Untracked -| 949|0x0000000779200000, 0x0000000779400000, 0x0000000779400000|100%| O| |TAMS 0x0000000779200000, 0x0000000779200000| Untracked -| 950|0x0000000779400000, 0x0000000779600000, 0x0000000779600000|100%| O| |TAMS 0x0000000779400000, 0x0000000779400000| Untracked -| 951|0x0000000779600000, 0x0000000779800000, 0x0000000779800000|100%| O| |TAMS 0x0000000779600000, 0x0000000779600000| Untracked -| 952|0x0000000779800000, 0x0000000779a00000, 0x0000000779a00000|100%| O| |TAMS 0x0000000779800000, 0x0000000779800000| Untracked -| 953|0x0000000779a00000, 0x0000000779c00000, 0x0000000779c00000|100%| O| |TAMS 0x0000000779a00000, 0x0000000779a00000| Untracked -| 954|0x0000000779c00000, 0x0000000779e00000, 0x0000000779e00000|100%| O| |TAMS 0x0000000779c00000, 0x0000000779c00000| Untracked -| 955|0x0000000779e00000, 0x000000077a000000, 0x000000077a000000|100%| O| |TAMS 0x0000000779e00000, 0x0000000779e00000| Untracked -| 956|0x000000077a000000, 0x000000077a200000, 0x000000077a200000|100%| O| |TAMS 0x000000077a000000, 0x000000077a000000| Untracked -| 957|0x000000077a200000, 0x000000077a400000, 0x000000077a400000|100%| O| |TAMS 0x000000077a200000, 0x000000077a200000| Untracked -| 958|0x000000077a400000, 0x000000077a600000, 0x000000077a600000|100%| O| |TAMS 0x000000077a400000, 0x000000077a400000| Untracked -| 959|0x000000077a600000, 0x000000077a800000, 0x000000077a800000|100%| O| |TAMS 0x000000077a600000, 0x000000077a600000| Untracked -| 960|0x000000077a800000, 0x000000077aa00000, 0x000000077aa00000|100%| O| |TAMS 0x000000077a800000, 0x000000077a800000| Untracked -| 961|0x000000077aa00000, 0x000000077ac00000, 0x000000077ac00000|100%| O| |TAMS 0x000000077aa00000, 0x000000077aa00000| Untracked -| 962|0x000000077ac00000, 0x000000077ae00000, 0x000000077ae00000|100%| O| |TAMS 0x000000077ac00000, 0x000000077ac00000| Untracked -| 963|0x000000077ae00000, 0x000000077b000000, 0x000000077b000000|100%| O| |TAMS 0x000000077ae00000, 0x000000077ae00000| Untracked -| 964|0x000000077b000000, 0x000000077b200000, 0x000000077b200000|100%| O| |TAMS 0x000000077b000000, 0x000000077b000000| Untracked -| 965|0x000000077b200000, 0x000000077b400000, 0x000000077b400000|100%| O| |TAMS 0x000000077b200000, 0x000000077b200000| Untracked -| 966|0x000000077b400000, 0x000000077b600000, 0x000000077b600000|100%| O| |TAMS 0x000000077b400000, 0x000000077b400000| Untracked -| 967|0x000000077b600000, 0x000000077b800000, 0x000000077b800000|100%| O| |TAMS 0x000000077b600000, 0x000000077b600000| Untracked -| 968|0x000000077b800000, 0x000000077ba00000, 0x000000077ba00000|100%| O| |TAMS 0x000000077b800000, 0x000000077b800000| Untracked -| 969|0x000000077ba00000, 0x000000077bc00000, 0x000000077bc00000|100%| O| |TAMS 0x000000077ba00000, 0x000000077ba00000| Untracked -| 970|0x000000077bc00000, 0x000000077be00000, 0x000000077be00000|100%| O| |TAMS 0x000000077bc00000, 0x000000077bc00000| Untracked -| 971|0x000000077be00000, 0x000000077c000000, 0x000000077c000000|100%| O| |TAMS 0x000000077be00000, 0x000000077be00000| Untracked -| 972|0x000000077c000000, 0x000000077c200000, 0x000000077c200000|100%| O| |TAMS 0x000000077c000000, 0x000000077c000000| Untracked -| 973|0x000000077c200000, 0x000000077c400000, 0x000000077c400000|100%| O| |TAMS 0x000000077c200000, 0x000000077c200000| Untracked -| 974|0x000000077c400000, 0x000000077c600000, 0x000000077c600000|100%| O| |TAMS 0x000000077c400000, 0x000000077c400000| Untracked -| 975|0x000000077c600000, 0x000000077c800000, 0x000000077c800000|100%| O| |TAMS 0x000000077c600000, 0x000000077c600000| Untracked -| 976|0x000000077c800000, 0x000000077ca00000, 0x000000077ca00000|100%| O| |TAMS 0x000000077c800000, 0x000000077c800000| Untracked -| 977|0x000000077ca00000, 0x000000077cc00000, 0x000000077cc00000|100%| O| |TAMS 0x000000077ca00000, 0x000000077ca00000| Untracked -| 978|0x000000077cc00000, 0x000000077ce00000, 0x000000077ce00000|100%| O| |TAMS 0x000000077cc00000, 0x000000077cc00000| Untracked -| 979|0x000000077ce00000, 0x000000077d000000, 0x000000077d000000|100%| O| |TAMS 0x000000077ce00000, 0x000000077ce00000| Untracked -| 980|0x000000077d000000, 0x000000077d200000, 0x000000077d200000|100%| O| |TAMS 0x000000077d000000, 0x000000077d000000| Untracked -| 981|0x000000077d200000, 0x000000077d400000, 0x000000077d400000|100%| O| |TAMS 0x000000077d200000, 0x000000077d200000| Untracked -| 982|0x000000077d400000, 0x000000077d600000, 0x000000077d600000|100%| O| |TAMS 0x000000077d400000, 0x000000077d400000| Untracked -| 983|0x000000077d600000, 0x000000077d800000, 0x000000077d800000|100%| O| |TAMS 0x000000077d600000, 0x000000077d600000| Untracked -| 984|0x000000077d800000, 0x000000077da00000, 0x000000077da00000|100%| O| |TAMS 0x000000077d800000, 0x000000077d800000| Untracked -| 985|0x000000077da00000, 0x000000077dc00000, 0x000000077dc00000|100%| O| |TAMS 0x000000077da00000, 0x000000077da00000| Untracked -| 986|0x000000077dc00000, 0x000000077de00000, 0x000000077de00000|100%| O| |TAMS 0x000000077dc00000, 0x000000077dc00000| Untracked -| 987|0x000000077de00000, 0x000000077e000000, 0x000000077e000000|100%| O| |TAMS 0x000000077de00000, 0x000000077de00000| Untracked -| 988|0x000000077e000000, 0x000000077e200000, 0x000000077e200000|100%| O| |TAMS 0x000000077e000000, 0x000000077e000000| Untracked -| 989|0x000000077e200000, 0x000000077e400000, 0x000000077e400000|100%| O| |TAMS 0x000000077e200000, 0x000000077e200000| Untracked -| 990|0x000000077e400000, 0x000000077e600000, 0x000000077e600000|100%| O| |TAMS 0x000000077e400000, 0x000000077e400000| Untracked -| 991|0x000000077e600000, 0x000000077e800000, 0x000000077e800000|100%| O| |TAMS 0x000000077e600000, 0x000000077e600000| Untracked -| 992|0x000000077e800000, 0x000000077ea00000, 0x000000077ea00000|100%| O| |TAMS 0x000000077e800000, 0x000000077e800000| Untracked -| 993|0x000000077ea00000, 0x000000077ec00000, 0x000000077ec00000|100%| O| |TAMS 0x000000077ea00000, 0x000000077ea00000| Untracked -| 994|0x000000077ec00000, 0x000000077ee00000, 0x000000077ee00000|100%| O| |TAMS 0x000000077ec00000, 0x000000077ec00000| Untracked -| 995|0x000000077ee00000, 0x000000077f000000, 0x000000077f000000|100%| O| |TAMS 0x000000077ee00000, 0x000000077ee00000| Untracked -| 996|0x000000077f000000, 0x000000077f200000, 0x000000077f200000|100%| O| |TAMS 0x000000077f000000, 0x000000077f000000| Untracked -| 997|0x000000077f200000, 0x000000077f400000, 0x000000077f400000|100%| O| |TAMS 0x000000077f200000, 0x000000077f200000| Untracked -| 998|0x000000077f400000, 0x000000077f600000, 0x000000077f600000|100%| O| |TAMS 0x000000077f400000, 0x000000077f400000| Untracked -| 999|0x000000077f600000, 0x000000077f800000, 0x000000077f800000|100%| O| |TAMS 0x000000077f600000, 0x000000077f600000| Untracked -|1000|0x000000077f800000, 0x000000077fa00000, 0x000000077fa00000|100%| O| |TAMS 0x000000077f800000, 0x000000077f800000| Untracked -|1001|0x000000077fa00000, 0x000000077fc00000, 0x000000077fc00000|100%| O| |TAMS 0x000000077fa00000, 0x000000077fa00000| Untracked -|1002|0x000000077fc00000, 0x000000077fe00000, 0x000000077fe00000|100%| O| |TAMS 0x000000077fc00000, 0x000000077fc00000| Untracked -|1003|0x000000077fe00000, 0x0000000780000000, 0x0000000780000000|100%| O| |TAMS 0x000000077fe00000, 0x000000077fe00000| Untracked -|1004|0x0000000780000000, 0x0000000780200000, 0x0000000780200000|100%| O| |TAMS 0x0000000780000000, 0x0000000780000000| Untracked -|1005|0x0000000780200000, 0x0000000780400000, 0x0000000780400000|100%| O| |TAMS 0x0000000780200000, 0x0000000780200000| Untracked -|1006|0x0000000780400000, 0x0000000780600000, 0x0000000780600000|100%| O| |TAMS 0x0000000780400000, 0x0000000780400000| Untracked -|1007|0x0000000780600000, 0x0000000780800000, 0x0000000780800000|100%| O| |TAMS 0x0000000780600000, 0x0000000780600000| Untracked -|1008|0x0000000780800000, 0x0000000780a00000, 0x0000000780a00000|100%| O| |TAMS 0x0000000780800000, 0x0000000780800000| Untracked -|1009|0x0000000780a00000, 0x0000000780c00000, 0x0000000780c00000|100%| O| |TAMS 0x0000000780a00000, 0x0000000780a00000| Untracked -|1010|0x0000000780c00000, 0x0000000780e00000, 0x0000000780e00000|100%| O| |TAMS 0x0000000780c00000, 0x0000000780c00000| Untracked -|1011|0x0000000780e00000, 0x0000000781000000, 0x0000000781000000|100%| O| |TAMS 0x0000000780e00000, 0x0000000780e00000| Untracked -|1012|0x0000000781000000, 0x0000000781200000, 0x0000000781200000|100%| O| |TAMS 0x0000000781000000, 0x0000000781000000| Untracked -|1013|0x0000000781200000, 0x0000000781400000, 0x0000000781400000|100%| O| |TAMS 0x0000000781200000, 0x0000000781200000| Untracked -|1014|0x0000000781400000, 0x0000000781600000, 0x0000000781600000|100%| O| |TAMS 0x0000000781400000, 0x0000000781400000| Untracked -|1015|0x0000000781600000, 0x0000000781800000, 0x0000000781800000|100%| O| |TAMS 0x0000000781600000, 0x0000000781600000| Untracked -|1016|0x0000000781800000, 0x0000000781a00000, 0x0000000781a00000|100%| O| |TAMS 0x0000000781800000, 0x0000000781800000| Untracked -|1017|0x0000000781a00000, 0x0000000781c00000, 0x0000000781c00000|100%| O| |TAMS 0x0000000781a00000, 0x0000000781a00000| Untracked -|1018|0x0000000781c00000, 0x0000000781e00000, 0x0000000781e00000|100%| O| |TAMS 0x0000000781c00000, 0x0000000781c00000| Untracked -|1019|0x0000000781e00000, 0x0000000782000000, 0x0000000782000000|100%| O| |TAMS 0x0000000781e00000, 0x0000000781e00000| Untracked -|1020|0x0000000782000000, 0x0000000782200000, 0x0000000782200000|100%| O| |TAMS 0x0000000782000000, 0x0000000782000000| Untracked -|1021|0x0000000782200000, 0x0000000782400000, 0x0000000782400000|100%| O| |TAMS 0x0000000782200000, 0x0000000782200000| Untracked -|1022|0x0000000782400000, 0x0000000782600000, 0x0000000782600000|100%| O| |TAMS 0x0000000782400000, 0x0000000782400000| Untracked -|1023|0x0000000782600000, 0x0000000782800000, 0x0000000782800000|100%| O| |TAMS 0x0000000782600000, 0x0000000782600000| Untracked -|1024|0x0000000782800000, 0x0000000782a00000, 0x0000000782a00000|100%| O| |TAMS 0x0000000782800000, 0x0000000782800000| Untracked -|1025|0x0000000782a00000, 0x0000000782c00000, 0x0000000782c00000|100%| O| |TAMS 0x0000000782a00000, 0x0000000782a00000| Untracked -|1026|0x0000000782c00000, 0x0000000782e00000, 0x0000000782e00000|100%| O| |TAMS 0x0000000782c00000, 0x0000000782c00000| Untracked -|1027|0x0000000782e00000, 0x0000000783000000, 0x0000000783000000|100%| O| |TAMS 0x0000000782e00000, 0x0000000782e00000| Untracked -|1028|0x0000000783000000, 0x0000000783200000, 0x0000000783200000|100%| O| |TAMS 0x0000000783000000, 0x0000000783000000| Untracked -|1029|0x0000000783200000, 0x0000000783400000, 0x0000000783400000|100%| O| |TAMS 0x0000000783200000, 0x0000000783200000| Untracked -|1030|0x0000000783400000, 0x0000000783600000, 0x0000000783600000|100%| O| |TAMS 0x0000000783400000, 0x0000000783400000| Untracked -|1031|0x0000000783600000, 0x0000000783800000, 0x0000000783800000|100%| O| |TAMS 0x0000000783600000, 0x0000000783600000| Untracked -|1032|0x0000000783800000, 0x0000000783a00000, 0x0000000783a00000|100%| O| |TAMS 0x0000000783800000, 0x0000000783800000| Untracked -|1033|0x0000000783a00000, 0x0000000783c00000, 0x0000000783c00000|100%| O| |TAMS 0x0000000783a00000, 0x0000000783a00000| Untracked -|1034|0x0000000783c00000, 0x0000000783e00000, 0x0000000783e00000|100%| O| |TAMS 0x0000000783c00000, 0x0000000783c00000| Untracked -|1035|0x0000000783e00000, 0x0000000784000000, 0x0000000784000000|100%| O| |TAMS 0x0000000783e00000, 0x0000000783e00000| Untracked -|1036|0x0000000784000000, 0x0000000784200000, 0x0000000784200000|100%| O| |TAMS 0x0000000784000000, 0x0000000784000000| Untracked -|1037|0x0000000784200000, 0x0000000784400000, 0x0000000784400000|100%| O| |TAMS 0x0000000784200000, 0x0000000784200000| Untracked -|1038|0x0000000784400000, 0x0000000784400000, 0x0000000784600000| 0%| F| |TAMS 0x0000000784400000, 0x0000000784400000| Untracked -|1039|0x0000000784600000, 0x0000000784800000, 0x0000000784800000|100%| O| |TAMS 0x0000000784600000, 0x0000000784600000| Untracked -|1040|0x0000000784800000, 0x0000000784a00000, 0x0000000784a00000|100%| O| |TAMS 0x0000000784800000, 0x0000000784800000| Untracked -|1041|0x0000000784a00000, 0x0000000784c00000, 0x0000000784c00000|100%| O| |TAMS 0x0000000784a00000, 0x0000000784a00000| Untracked -|1042|0x0000000784c00000, 0x0000000784e00000, 0x0000000784e00000|100%| O| |TAMS 0x0000000784c00000, 0x0000000784c00000| Untracked -|1043|0x0000000784e00000, 0x0000000785000000, 0x0000000785000000|100%| O| |TAMS 0x0000000784e00000, 0x0000000784e00000| Untracked -|1044|0x0000000785000000, 0x0000000785200000, 0x0000000785200000|100%| O| |TAMS 0x0000000785000000, 0x0000000785000000| Untracked -|1045|0x0000000785200000, 0x0000000785400000, 0x0000000785400000|100%| O| |TAMS 0x0000000785200000, 0x0000000785200000| Untracked -|1046|0x0000000785400000, 0x0000000785600000, 0x0000000785600000|100%| O| |TAMS 0x0000000785400000, 0x0000000785400000| Untracked -|1047|0x0000000785600000, 0x0000000785800000, 0x0000000785800000|100%| O| |TAMS 0x0000000785600000, 0x0000000785600000| Untracked -|1048|0x0000000785800000, 0x0000000785a00000, 0x0000000785a00000|100%| O| |TAMS 0x0000000785800000, 0x0000000785800000| Untracked -|1049|0x0000000785a00000, 0x0000000785c00000, 0x0000000785c00000|100%| O| |TAMS 0x0000000785a00000, 0x0000000785a00000| Untracked -|1050|0x0000000785c00000, 0x0000000785e00000, 0x0000000785e00000|100%| O| |TAMS 0x0000000785c00000, 0x0000000785c00000| Untracked -|1051|0x0000000785e00000, 0x0000000786000000, 0x0000000786000000|100%| O| |TAMS 0x0000000785e00000, 0x0000000785e00000| Untracked -|1052|0x0000000786000000, 0x0000000786200000, 0x0000000786200000|100%| O| |TAMS 0x0000000786000000, 0x0000000786000000| Untracked -|1053|0x0000000786200000, 0x0000000786400000, 0x0000000786400000|100%| O| |TAMS 0x0000000786200000, 0x0000000786200000| Untracked -|1054|0x0000000786400000, 0x0000000786600000, 0x0000000786600000|100%| O| |TAMS 0x0000000786400000, 0x0000000786400000| Untracked -|1055|0x0000000786600000, 0x0000000786800000, 0x0000000786800000|100%| O| |TAMS 0x0000000786600000, 0x0000000786600000| Untracked -|1056|0x0000000786800000, 0x0000000786a00000, 0x0000000786a00000|100%| O| |TAMS 0x0000000786800000, 0x0000000786800000| Untracked -|1057|0x0000000786a00000, 0x0000000786c00000, 0x0000000786c00000|100%| O| |TAMS 0x0000000786a00000, 0x0000000786a00000| Untracked -|1058|0x0000000786c00000, 0x0000000786e00000, 0x0000000786e00000|100%| O| |TAMS 0x0000000786c00000, 0x0000000786c00000| Untracked -|1059|0x0000000786e00000, 0x0000000787000000, 0x0000000787000000|100%| O| |TAMS 0x0000000786e00000, 0x0000000786e00000| Untracked -|1060|0x0000000787000000, 0x0000000787200000, 0x0000000787200000|100%| O| |TAMS 0x0000000787000000, 0x0000000787000000| Untracked -|1061|0x0000000787200000, 0x0000000787400000, 0x0000000787400000|100%| O| |TAMS 0x0000000787200000, 0x0000000787200000| Untracked -|1062|0x0000000787400000, 0x0000000787600000, 0x0000000787600000|100%| O| |TAMS 0x0000000787400000, 0x0000000787400000| Untracked -|1063|0x0000000787600000, 0x0000000787800000, 0x0000000787800000|100%| O| |TAMS 0x0000000787600000, 0x0000000787600000| Untracked -|1064|0x0000000787800000, 0x0000000787a00000, 0x0000000787a00000|100%| O| |TAMS 0x0000000787800000, 0x0000000787800000| Untracked -|1065|0x0000000787a00000, 0x0000000787c00000, 0x0000000787c00000|100%| O| |TAMS 0x0000000787a00000, 0x0000000787a00000| Untracked -|1066|0x0000000787c00000, 0x0000000787e00000, 0x0000000787e00000|100%| O| |TAMS 0x0000000787c00000, 0x0000000787c00000| Untracked -|1067|0x0000000787e00000, 0x0000000788000000, 0x0000000788000000|100%| O| |TAMS 0x0000000787e00000, 0x0000000787e00000| Untracked -|1068|0x0000000788000000, 0x0000000788200000, 0x0000000788200000|100%| O| |TAMS 0x0000000788000000, 0x0000000788000000| Untracked -|1069|0x0000000788200000, 0x0000000788400000, 0x0000000788400000|100%| O| |TAMS 0x0000000788200000, 0x0000000788200000| Untracked -|1070|0x0000000788400000, 0x0000000788600000, 0x0000000788600000|100%| O| |TAMS 0x0000000788400000, 0x0000000788400000| Untracked -|1071|0x0000000788600000, 0x0000000788800000, 0x0000000788800000|100%| O| |TAMS 0x0000000788600000, 0x0000000788600000| Untracked -|1072|0x0000000788800000, 0x0000000788a00000, 0x0000000788a00000|100%| O| |TAMS 0x0000000788800000, 0x0000000788800000| Untracked -|1073|0x0000000788a00000, 0x0000000788c00000, 0x0000000788c00000|100%| O| |TAMS 0x0000000788a00000, 0x0000000788a00000| Untracked -|1074|0x0000000788c00000, 0x0000000788e00000, 0x0000000788e00000|100%| O| |TAMS 0x0000000788c00000, 0x0000000788c00000| Untracked -|1075|0x0000000788e00000, 0x0000000789000000, 0x0000000789000000|100%| O| |TAMS 0x0000000788e00000, 0x0000000788e00000| Untracked -|1076|0x0000000789000000, 0x0000000789200000, 0x0000000789200000|100%| O| |TAMS 0x0000000789000000, 0x0000000789000000| Untracked -|1077|0x0000000789200000, 0x0000000789400000, 0x0000000789400000|100%| O| |TAMS 0x0000000789200000, 0x0000000789200000| Untracked -|1078|0x0000000789400000, 0x0000000789600000, 0x0000000789600000|100%| O| |TAMS 0x0000000789400000, 0x0000000789400000| Untracked -|1079|0x0000000789600000, 0x0000000789800000, 0x0000000789800000|100%| O| |TAMS 0x0000000789600000, 0x0000000789600000| Untracked -|1080|0x0000000789800000, 0x0000000789a00000, 0x0000000789a00000|100%| O| |TAMS 0x0000000789800000, 0x0000000789800000| Untracked -|1081|0x0000000789a00000, 0x0000000789c00000, 0x0000000789c00000|100%| O| |TAMS 0x0000000789a00000, 0x0000000789a00000| Untracked -|1082|0x0000000789c00000, 0x0000000789e00000, 0x0000000789e00000|100%| O| |TAMS 0x0000000789c00000, 0x0000000789c00000| Untracked -|1083|0x0000000789e00000, 0x000000078a000000, 0x000000078a000000|100%| O| |TAMS 0x0000000789e00000, 0x0000000789e00000| Untracked -|1084|0x000000078a000000, 0x000000078a200000, 0x000000078a200000|100%| O| |TAMS 0x000000078a000000, 0x000000078a000000| Untracked -|1085|0x000000078a200000, 0x000000078a400000, 0x000000078a400000|100%| O| |TAMS 0x000000078a200000, 0x000000078a200000| Untracked -|1086|0x000000078a400000, 0x000000078a600000, 0x000000078a600000|100%| O| |TAMS 0x000000078a400000, 0x000000078a400000| Untracked -|1087|0x000000078a600000, 0x000000078a800000, 0x000000078a800000|100%| O| |TAMS 0x000000078a600000, 0x000000078a600000| Untracked -|1088|0x000000078a800000, 0x000000078aa00000, 0x000000078aa00000|100%| O| |TAMS 0x000000078a800000, 0x000000078a800000| Untracked -|1089|0x000000078aa00000, 0x000000078ac00000, 0x000000078ac00000|100%| O| |TAMS 0x000000078aa00000, 0x000000078aa00000| Untracked -|1090|0x000000078ac00000, 0x000000078ae00000, 0x000000078ae00000|100%| O| |TAMS 0x000000078ac00000, 0x000000078ac00000| Untracked -|1091|0x000000078ae00000, 0x000000078b000000, 0x000000078b000000|100%| O| |TAMS 0x000000078ae00000, 0x000000078ae00000| Untracked -|1092|0x000000078b000000, 0x000000078b200000, 0x000000078b200000|100%| O| |TAMS 0x000000078b000000, 0x000000078b000000| Untracked -|1093|0x000000078b200000, 0x000000078b400000, 0x000000078b400000|100%| O| |TAMS 0x000000078b200000, 0x000000078b200000| Untracked -|1094|0x000000078b400000, 0x000000078b600000, 0x000000078b600000|100%| O| |TAMS 0x000000078b400000, 0x000000078b400000| Untracked -|1095|0x000000078b600000, 0x000000078b800000, 0x000000078b800000|100%| O| |TAMS 0x000000078b600000, 0x000000078b600000| Untracked -|1096|0x000000078b800000, 0x000000078ba00000, 0x000000078ba00000|100%| O| |TAMS 0x000000078b800000, 0x000000078b800000| Untracked -|1097|0x000000078ba00000, 0x000000078bc00000, 0x000000078bc00000|100%| O| |TAMS 0x000000078ba00000, 0x000000078ba00000| Untracked -|1098|0x000000078bc00000, 0x000000078be00000, 0x000000078be00000|100%| O| |TAMS 0x000000078bc00000, 0x000000078bc00000| Untracked -|1099|0x000000078be00000, 0x000000078c000000, 0x000000078c000000|100%| O| |TAMS 0x000000078be00000, 0x000000078be00000| Untracked -|1100|0x000000078c000000, 0x000000078c200000, 0x000000078c200000|100%| O| |TAMS 0x000000078c000000, 0x000000078c000000| Untracked -|1101|0x000000078c200000, 0x000000078c400000, 0x000000078c400000|100%| O| |TAMS 0x000000078c200000, 0x000000078c200000| Untracked -|1102|0x000000078c400000, 0x000000078c600000, 0x000000078c600000|100%| O| |TAMS 0x000000078c400000, 0x000000078c400000| Untracked -|1103|0x000000078c600000, 0x000000078c800000, 0x000000078c800000|100%| O| |TAMS 0x000000078c600000, 0x000000078c600000| Untracked -|1104|0x000000078c800000, 0x000000078ca00000, 0x000000078ca00000|100%| O| |TAMS 0x000000078c800000, 0x000000078c800000| Untracked -|1105|0x000000078ca00000, 0x000000078cc00000, 0x000000078cc00000|100%| O| |TAMS 0x000000078ca00000, 0x000000078ca00000| Untracked -|1106|0x000000078cc00000, 0x000000078ce00000, 0x000000078ce00000|100%| O| |TAMS 0x000000078cc00000, 0x000000078cc00000| Untracked -|1107|0x000000078ce00000, 0x000000078d000000, 0x000000078d000000|100%| O| |TAMS 0x000000078ce00000, 0x000000078ce00000| Untracked -|1108|0x000000078d000000, 0x000000078d200000, 0x000000078d200000|100%| O| |TAMS 0x000000078d000000, 0x000000078d000000| Untracked -|1109|0x000000078d200000, 0x000000078d400000, 0x000000078d400000|100%| O| |TAMS 0x000000078d200000, 0x000000078d200000| Untracked -|1110|0x000000078d400000, 0x000000078d600000, 0x000000078d600000|100%| O| |TAMS 0x000000078d400000, 0x000000078d400000| Untracked -|1111|0x000000078d600000, 0x000000078d800000, 0x000000078d800000|100%| O| |TAMS 0x000000078d600000, 0x000000078d600000| Untracked -|1112|0x000000078d800000, 0x000000078da00000, 0x000000078da00000|100%| O| |TAMS 0x000000078d800000, 0x000000078d800000| Untracked -|1113|0x000000078da00000, 0x000000078dc00000, 0x000000078dc00000|100%| O| |TAMS 0x000000078da00000, 0x000000078da00000| Untracked -|1114|0x000000078dc00000, 0x000000078de00000, 0x000000078de00000|100%| O| |TAMS 0x000000078dc00000, 0x000000078dc00000| Untracked -|1115|0x000000078de00000, 0x000000078e000000, 0x000000078e000000|100%| O| |TAMS 0x000000078de00000, 0x000000078de00000| Untracked -|1116|0x000000078e000000, 0x000000078e200000, 0x000000078e200000|100%| O| |TAMS 0x000000078e000000, 0x000000078e000000| Untracked -|1117|0x000000078e200000, 0x000000078e400000, 0x000000078e400000|100%| O| |TAMS 0x000000078e200000, 0x000000078e200000| Untracked -|1118|0x000000078e400000, 0x000000078e400000, 0x000000078e600000| 0%| F| |TAMS 0x000000078e400000, 0x000000078e400000| Untracked -|1119|0x000000078e600000, 0x000000078e600000, 0x000000078e800000| 0%| F| |TAMS 0x000000078e600000, 0x000000078e600000| Untracked -|1120|0x000000078e800000, 0x000000078e800000, 0x000000078ea00000| 0%| F| |TAMS 0x000000078e800000, 0x000000078e800000| Untracked -|1121|0x000000078ea00000, 0x000000078ea00000, 0x000000078ec00000| 0%| F| |TAMS 0x000000078ea00000, 0x000000078ea00000| Untracked -|1122|0x000000078ec00000, 0x000000078ec00000, 0x000000078ee00000| 0%| F| |TAMS 0x000000078ec00000, 0x000000078ec00000| Untracked -|1123|0x000000078ee00000, 0x000000078ee00000, 0x000000078f000000| 0%| F| |TAMS 0x000000078ee00000, 0x000000078ee00000| Untracked -|1124|0x000000078f000000, 0x000000078f000000, 0x000000078f200000| 0%| F| |TAMS 0x000000078f000000, 0x000000078f000000| Untracked -|1125|0x000000078f200000, 0x000000078f200000, 0x000000078f400000| 0%| F| |TAMS 0x000000078f200000, 0x000000078f200000| Untracked -|1126|0x000000078f400000, 0x000000078f400000, 0x000000078f600000| 0%| F| |TAMS 0x000000078f400000, 0x000000078f400000| Untracked -|1127|0x000000078f600000, 0x000000078f600000, 0x000000078f800000| 0%| F| |TAMS 0x000000078f600000, 0x000000078f600000| Untracked -|1128|0x000000078f800000, 0x000000078f800000, 0x000000078fa00000| 0%| F| |TAMS 0x000000078f800000, 0x000000078f800000| Untracked -|1129|0x000000078fa00000, 0x000000078fa00000, 0x000000078fc00000| 0%| F| |TAMS 0x000000078fa00000, 0x000000078fa00000| Untracked -|1130|0x000000078fc00000, 0x000000078fc00000, 0x000000078fe00000| 0%| F| |TAMS 0x000000078fc00000, 0x000000078fc00000| Untracked -|1131|0x000000078fe00000, 0x000000078fe00000, 0x0000000790000000| 0%| F| |TAMS 0x000000078fe00000, 0x000000078fe00000| Untracked -|1132|0x0000000790000000, 0x0000000790000000, 0x0000000790200000| 0%| F| |TAMS 0x0000000790000000, 0x0000000790000000| Untracked -|1133|0x0000000790200000, 0x0000000790200000, 0x0000000790400000| 0%| F| |TAMS 0x0000000790200000, 0x0000000790200000| Untracked -|1134|0x0000000790400000, 0x0000000790400000, 0x0000000790600000| 0%| F| |TAMS 0x0000000790400000, 0x0000000790400000| Untracked -|1135|0x0000000790600000, 0x0000000790600000, 0x0000000790800000| 0%| F| |TAMS 0x0000000790600000, 0x0000000790600000| Untracked -|1136|0x0000000790800000, 0x0000000790800000, 0x0000000790a00000| 0%| F| |TAMS 0x0000000790800000, 0x0000000790800000| Untracked -|1137|0x0000000790a00000, 0x0000000790a00000, 0x0000000790c00000| 0%| F| |TAMS 0x0000000790a00000, 0x0000000790a00000| Untracked -|1138|0x0000000790c00000, 0x0000000790c00000, 0x0000000790e00000| 0%| F| |TAMS 0x0000000790c00000, 0x0000000790c00000| Untracked -|1139|0x0000000790e00000, 0x0000000790e00000, 0x0000000791000000| 0%| F| |TAMS 0x0000000790e00000, 0x0000000790e00000| Untracked -|1140|0x0000000791000000, 0x0000000791000000, 0x0000000791200000| 0%| F| |TAMS 0x0000000791000000, 0x0000000791000000| Untracked -|1141|0x0000000791200000, 0x0000000791200000, 0x0000000791400000| 0%| F| |TAMS 0x0000000791200000, 0x0000000791200000| Untracked -|1142|0x0000000791400000, 0x0000000791400000, 0x0000000791600000| 0%| F| |TAMS 0x0000000791400000, 0x0000000791400000| Untracked -|1143|0x0000000791600000, 0x0000000791600000, 0x0000000791800000| 0%| F| |TAMS 0x0000000791600000, 0x0000000791600000| Untracked -|1144|0x0000000791800000, 0x0000000791800000, 0x0000000791a00000| 0%| F| |TAMS 0x0000000791800000, 0x0000000791800000| Untracked -|1145|0x0000000791a00000, 0x0000000791a00000, 0x0000000791c00000| 0%| F| |TAMS 0x0000000791a00000, 0x0000000791a00000| Untracked -|1146|0x0000000791c00000, 0x0000000791c00000, 0x0000000791e00000| 0%| F| |TAMS 0x0000000791c00000, 0x0000000791c00000| Untracked -|1147|0x0000000791e00000, 0x0000000791e00000, 0x0000000792000000| 0%| F| |TAMS 0x0000000791e00000, 0x0000000791e00000| Untracked -|1148|0x0000000792000000, 0x0000000792000000, 0x0000000792200000| 0%| F| |TAMS 0x0000000792000000, 0x0000000792000000| Untracked -|1149|0x0000000792200000, 0x0000000792200000, 0x0000000792400000| 0%| F| |TAMS 0x0000000792200000, 0x0000000792200000| Untracked -|1150|0x0000000792400000, 0x0000000792400000, 0x0000000792600000| 0%| F| |TAMS 0x0000000792400000, 0x0000000792400000| Untracked -|1151|0x0000000792600000, 0x0000000792600000, 0x0000000792800000| 0%| F| |TAMS 0x0000000792600000, 0x0000000792600000| Untracked -|1152|0x0000000792800000, 0x0000000792800000, 0x0000000792a00000| 0%| F| |TAMS 0x0000000792800000, 0x0000000792800000| Untracked -|1153|0x0000000792a00000, 0x0000000792a00000, 0x0000000792c00000| 0%| F| |TAMS 0x0000000792a00000, 0x0000000792a00000| Untracked -|1154|0x0000000792c00000, 0x0000000792c00000, 0x0000000792e00000| 0%| F| |TAMS 0x0000000792c00000, 0x0000000792c00000| Untracked -|1155|0x0000000792e00000, 0x0000000792e00000, 0x0000000793000000| 0%| F| |TAMS 0x0000000792e00000, 0x0000000792e00000| Untracked -|1156|0x0000000793000000, 0x0000000793000000, 0x0000000793200000| 0%| F| |TAMS 0x0000000793000000, 0x0000000793000000| Untracked -|1157|0x0000000793200000, 0x0000000793200000, 0x0000000793400000| 0%| F| |TAMS 0x0000000793200000, 0x0000000793200000| Untracked -|1158|0x0000000793400000, 0x0000000793400000, 0x0000000793600000| 0%| F| |TAMS 0x0000000793400000, 0x0000000793400000| Untracked -|1159|0x0000000793600000, 0x0000000793600000, 0x0000000793800000| 0%| F| |TAMS 0x0000000793600000, 0x0000000793600000| Untracked -|1160|0x0000000793800000, 0x0000000793800000, 0x0000000793a00000| 0%| F| |TAMS 0x0000000793800000, 0x0000000793800000| Untracked -|1161|0x0000000793a00000, 0x0000000793a00000, 0x0000000793c00000| 0%| F| |TAMS 0x0000000793a00000, 0x0000000793a00000| Untracked -|1162|0x0000000793c00000, 0x0000000793c00000, 0x0000000793e00000| 0%| F| |TAMS 0x0000000793c00000, 0x0000000793c00000| Untracked -|1163|0x0000000793e00000, 0x0000000793e00000, 0x0000000794000000| 0%| F| |TAMS 0x0000000793e00000, 0x0000000793e00000| Untracked -|1164|0x0000000794000000, 0x0000000794000000, 0x0000000794200000| 0%| F| |TAMS 0x0000000794000000, 0x0000000794000000| Untracked -|1165|0x0000000794200000, 0x0000000794200000, 0x0000000794400000| 0%| F| |TAMS 0x0000000794200000, 0x0000000794200000| Untracked -|1166|0x0000000794400000, 0x0000000794400000, 0x0000000794600000| 0%| F| |TAMS 0x0000000794400000, 0x0000000794400000| Untracked -|1167|0x0000000794600000, 0x0000000794600000, 0x0000000794800000| 0%| F| |TAMS 0x0000000794600000, 0x0000000794600000| Untracked -|1168|0x0000000794800000, 0x0000000794800000, 0x0000000794a00000| 0%| F| |TAMS 0x0000000794800000, 0x0000000794800000| Untracked -|1169|0x0000000794a00000, 0x0000000794a00000, 0x0000000794c00000| 0%| F| |TAMS 0x0000000794a00000, 0x0000000794a00000| Untracked -|1170|0x0000000794c00000, 0x0000000794c00000, 0x0000000794e00000| 0%| F| |TAMS 0x0000000794c00000, 0x0000000794c00000| Untracked -|1171|0x0000000794e00000, 0x0000000794e00000, 0x0000000795000000| 0%| F| |TAMS 0x0000000794e00000, 0x0000000794e00000| Untracked -|1172|0x0000000795000000, 0x0000000795000000, 0x0000000795200000| 0%| F| |TAMS 0x0000000795000000, 0x0000000795000000| Untracked -|1173|0x0000000795200000, 0x0000000795200000, 0x0000000795400000| 0%| F| |TAMS 0x0000000795200000, 0x0000000795200000| Untracked -|1174|0x0000000795400000, 0x0000000795400000, 0x0000000795600000| 0%| F| |TAMS 0x0000000795400000, 0x0000000795400000| Untracked -|1175|0x0000000795600000, 0x0000000795600000, 0x0000000795800000| 0%| F| |TAMS 0x0000000795600000, 0x0000000795600000| Untracked -|1176|0x0000000795800000, 0x0000000795800000, 0x0000000795a00000| 0%| F| |TAMS 0x0000000795800000, 0x0000000795800000| Untracked -|1177|0x0000000795a00000, 0x0000000795a00000, 0x0000000795c00000| 0%| F| |TAMS 0x0000000795a00000, 0x0000000795a00000| Untracked -|1178|0x0000000795c00000, 0x0000000795c00000, 0x0000000795e00000| 0%| F| |TAMS 0x0000000795c00000, 0x0000000795c00000| Untracked -|1179|0x0000000795e00000, 0x0000000795e00000, 0x0000000796000000| 0%| F| |TAMS 0x0000000795e00000, 0x0000000795e00000| Untracked -|1180|0x0000000796000000, 0x0000000796000000, 0x0000000796200000| 0%| F| |TAMS 0x0000000796000000, 0x0000000796000000| Untracked -|1181|0x0000000796200000, 0x0000000796200000, 0x0000000796400000| 0%| F| |TAMS 0x0000000796200000, 0x0000000796200000| Untracked -|1182|0x0000000796400000, 0x0000000796400000, 0x0000000796600000| 0%| F| |TAMS 0x0000000796400000, 0x0000000796400000| Untracked -|1183|0x0000000796600000, 0x0000000796600000, 0x0000000796800000| 0%| F| |TAMS 0x0000000796600000, 0x0000000796600000| Untracked -|1184|0x0000000796800000, 0x0000000796800000, 0x0000000796a00000| 0%| F| |TAMS 0x0000000796800000, 0x0000000796800000| Untracked -|1185|0x0000000796a00000, 0x0000000796a00000, 0x0000000796c00000| 0%| F| |TAMS 0x0000000796a00000, 0x0000000796a00000| Untracked -|1186|0x0000000796c00000, 0x0000000796c00000, 0x0000000796e00000| 0%| F| |TAMS 0x0000000796c00000, 0x0000000796c00000| Untracked -|1187|0x0000000796e00000, 0x0000000796e00000, 0x0000000797000000| 0%| F| |TAMS 0x0000000796e00000, 0x0000000796e00000| Untracked -|1188|0x0000000797000000, 0x0000000797000000, 0x0000000797200000| 0%| F| |TAMS 0x0000000797000000, 0x0000000797000000| Untracked -|1189|0x0000000797200000, 0x0000000797200000, 0x0000000797400000| 0%| F| |TAMS 0x0000000797200000, 0x0000000797200000| Untracked -|1190|0x0000000797400000, 0x0000000797400000, 0x0000000797600000| 0%| F| |TAMS 0x0000000797400000, 0x0000000797400000| Untracked -|1191|0x0000000797600000, 0x0000000797600000, 0x0000000797800000| 0%| F| |TAMS 0x0000000797600000, 0x0000000797600000| Untracked -|1192|0x0000000797800000, 0x0000000797800000, 0x0000000797a00000| 0%| F| |TAMS 0x0000000797800000, 0x0000000797800000| Untracked -|1193|0x0000000797a00000, 0x0000000797a00000, 0x0000000797c00000| 0%| F| |TAMS 0x0000000797a00000, 0x0000000797a00000| Untracked -|1194|0x0000000797c00000, 0x0000000797c00000, 0x0000000797e00000| 0%| F| |TAMS 0x0000000797c00000, 0x0000000797c00000| Untracked -|1195|0x0000000797e00000, 0x0000000797e00000, 0x0000000798000000| 0%| F| |TAMS 0x0000000797e00000, 0x0000000797e00000| Untracked -|1196|0x0000000798000000, 0x0000000798000000, 0x0000000798200000| 0%| F| |TAMS 0x0000000798000000, 0x0000000798000000| Untracked -|1197|0x0000000798200000, 0x0000000798200000, 0x0000000798400000| 0%| F| |TAMS 0x0000000798200000, 0x0000000798200000| Untracked -|1198|0x0000000798400000, 0x0000000798400000, 0x0000000798600000| 0%| F| |TAMS 0x0000000798400000, 0x0000000798400000| Untracked -|1199|0x0000000798600000, 0x0000000798600000, 0x0000000798800000| 0%| F| |TAMS 0x0000000798600000, 0x0000000798600000| Untracked -|1200|0x0000000798800000, 0x0000000798800000, 0x0000000798a00000| 0%| F| |TAMS 0x0000000798800000, 0x0000000798800000| Untracked -|1201|0x0000000798a00000, 0x0000000798a00000, 0x0000000798c00000| 0%| F| |TAMS 0x0000000798a00000, 0x0000000798a00000| Untracked -|1202|0x0000000798c00000, 0x0000000798c00000, 0x0000000798e00000| 0%| F| |TAMS 0x0000000798c00000, 0x0000000798c00000| Untracked -|1203|0x0000000798e00000, 0x0000000798e00000, 0x0000000799000000| 0%| F| |TAMS 0x0000000798e00000, 0x0000000798e00000| Untracked -|1204|0x0000000799000000, 0x0000000799000000, 0x0000000799200000| 0%| F| |TAMS 0x0000000799000000, 0x0000000799000000| Untracked -|1205|0x0000000799200000, 0x0000000799200000, 0x0000000799400000| 0%| F| |TAMS 0x0000000799200000, 0x0000000799200000| Untracked -|1206|0x0000000799400000, 0x0000000799400000, 0x0000000799600000| 0%| F| |TAMS 0x0000000799400000, 0x0000000799400000| Untracked -|1207|0x0000000799600000, 0x0000000799600000, 0x0000000799800000| 0%| F| |TAMS 0x0000000799600000, 0x0000000799600000| Untracked -|1208|0x0000000799800000, 0x0000000799800000, 0x0000000799a00000| 0%| F| |TAMS 0x0000000799800000, 0x0000000799800000| Untracked -|1209|0x0000000799a00000, 0x0000000799a00000, 0x0000000799c00000| 0%| F| |TAMS 0x0000000799a00000, 0x0000000799a00000| Untracked -|1210|0x0000000799c00000, 0x0000000799c00000, 0x0000000799e00000| 0%| F| |TAMS 0x0000000799c00000, 0x0000000799c00000| Untracked -|1211|0x0000000799e00000, 0x0000000799e00000, 0x000000079a000000| 0%| F| |TAMS 0x0000000799e00000, 0x0000000799e00000| Untracked -|1212|0x000000079a000000, 0x000000079a000000, 0x000000079a200000| 0%| F| |TAMS 0x000000079a000000, 0x000000079a000000| Untracked -|1213|0x000000079a200000, 0x000000079a200000, 0x000000079a400000| 0%| F| |TAMS 0x000000079a200000, 0x000000079a200000| Untracked -|1214|0x000000079a400000, 0x000000079a400000, 0x000000079a600000| 0%| F| |TAMS 0x000000079a400000, 0x000000079a400000| Untracked -|1215|0x000000079a600000, 0x000000079a600000, 0x000000079a800000| 0%| F| |TAMS 0x000000079a600000, 0x000000079a600000| Untracked -|1216|0x000000079a800000, 0x000000079a800000, 0x000000079aa00000| 0%| F| |TAMS 0x000000079a800000, 0x000000079a800000| Untracked -|1217|0x000000079aa00000, 0x000000079aa00000, 0x000000079ac00000| 0%| F| |TAMS 0x000000079aa00000, 0x000000079aa00000| Untracked -|1218|0x000000079ac00000, 0x000000079ac00000, 0x000000079ae00000| 0%| F| |TAMS 0x000000079ac00000, 0x000000079ac00000| Untracked -|1219|0x000000079ae00000, 0x000000079ae00000, 0x000000079b000000| 0%| F| |TAMS 0x000000079ae00000, 0x000000079ae00000| Untracked -|1220|0x000000079b000000, 0x000000079b000000, 0x000000079b200000| 0%| F| |TAMS 0x000000079b000000, 0x000000079b000000| Untracked -|1221|0x000000079b200000, 0x000000079b200000, 0x000000079b400000| 0%| F| |TAMS 0x000000079b200000, 0x000000079b200000| Untracked -|1222|0x000000079b400000, 0x000000079b400000, 0x000000079b600000| 0%| F| |TAMS 0x000000079b400000, 0x000000079b400000| Untracked -|1223|0x000000079b600000, 0x000000079b600000, 0x000000079b800000| 0%| F| |TAMS 0x000000079b600000, 0x000000079b600000| Untracked -|1224|0x000000079b800000, 0x000000079b800000, 0x000000079ba00000| 0%| F| |TAMS 0x000000079b800000, 0x000000079b800000| Untracked -|1225|0x000000079ba00000, 0x000000079ba00000, 0x000000079bc00000| 0%| F| |TAMS 0x000000079ba00000, 0x000000079ba00000| Untracked -|1226|0x000000079bc00000, 0x000000079bc00000, 0x000000079be00000| 0%| F| |TAMS 0x000000079bc00000, 0x000000079bc00000| Untracked -|1227|0x000000079be00000, 0x000000079be00000, 0x000000079c000000| 0%| F| |TAMS 0x000000079be00000, 0x000000079be00000| Untracked -|1228|0x000000079c000000, 0x000000079c000000, 0x000000079c200000| 0%| F| |TAMS 0x000000079c000000, 0x000000079c000000| Untracked -|1229|0x000000079c200000, 0x000000079c200000, 0x000000079c400000| 0%| F| |TAMS 0x000000079c200000, 0x000000079c200000| Untracked -|1230|0x000000079c400000, 0x000000079c400000, 0x000000079c600000| 0%| F| |TAMS 0x000000079c400000, 0x000000079c400000| Untracked -|1231|0x000000079c600000, 0x000000079c600000, 0x000000079c800000| 0%| F| |TAMS 0x000000079c600000, 0x000000079c600000| Untracked -|1232|0x000000079c800000, 0x000000079c800000, 0x000000079ca00000| 0%| F| |TAMS 0x000000079c800000, 0x000000079c800000| Untracked -|1233|0x000000079ca00000, 0x000000079ca00000, 0x000000079cc00000| 0%| F| |TAMS 0x000000079ca00000, 0x000000079ca00000| Untracked -|1234|0x000000079cc00000, 0x000000079cc00000, 0x000000079ce00000| 0%| F| |TAMS 0x000000079cc00000, 0x000000079cc00000| Untracked -|1235|0x000000079ce00000, 0x000000079ce00000, 0x000000079d000000| 0%| F| |TAMS 0x000000079ce00000, 0x000000079ce00000| Untracked -|1236|0x000000079d000000, 0x000000079d000000, 0x000000079d200000| 0%| F| |TAMS 0x000000079d000000, 0x000000079d000000| Untracked -|1237|0x000000079d200000, 0x000000079d200000, 0x000000079d400000| 0%| F| |TAMS 0x000000079d200000, 0x000000079d200000| Untracked -|1238|0x000000079d400000, 0x000000079d400000, 0x000000079d600000| 0%| F| |TAMS 0x000000079d400000, 0x000000079d400000| Untracked -|1239|0x000000079d600000, 0x000000079d600000, 0x000000079d800000| 0%| F| |TAMS 0x000000079d600000, 0x000000079d600000| Untracked -|1240|0x000000079d800000, 0x000000079d800000, 0x000000079da00000| 0%| F| |TAMS 0x000000079d800000, 0x000000079d800000| Untracked -|1241|0x000000079da00000, 0x000000079da00000, 0x000000079dc00000| 0%| F| |TAMS 0x000000079da00000, 0x000000079da00000| Untracked -|1242|0x000000079dc00000, 0x000000079dc00000, 0x000000079de00000| 0%| F| |TAMS 0x000000079dc00000, 0x000000079dc00000| Untracked -|1243|0x000000079de00000, 0x000000079de00000, 0x000000079e000000| 0%| F| |TAMS 0x000000079de00000, 0x000000079de00000| Untracked -|1244|0x000000079e000000, 0x000000079e000000, 0x000000079e200000| 0%| F| |TAMS 0x000000079e000000, 0x000000079e000000| Untracked -|1245|0x000000079e200000, 0x000000079e200000, 0x000000079e400000| 0%| F| |TAMS 0x000000079e200000, 0x000000079e200000| Untracked -|1246|0x000000079e400000, 0x000000079e400000, 0x000000079e600000| 0%| F| |TAMS 0x000000079e400000, 0x000000079e400000| Untracked -|1247|0x000000079e600000, 0x000000079e600000, 0x000000079e800000| 0%| F| |TAMS 0x000000079e600000, 0x000000079e600000| Untracked -|1248|0x000000079e800000, 0x000000079e800000, 0x000000079ea00000| 0%| F| |TAMS 0x000000079e800000, 0x000000079e800000| Untracked -|1249|0x000000079ea00000, 0x000000079ea00000, 0x000000079ec00000| 0%| F| |TAMS 0x000000079ea00000, 0x000000079ea00000| Untracked -|1250|0x000000079ec00000, 0x000000079ec00000, 0x000000079ee00000| 0%| F| |TAMS 0x000000079ec00000, 0x000000079ec00000| Untracked -|1251|0x000000079ee00000, 0x000000079ee00000, 0x000000079f000000| 0%| F| |TAMS 0x000000079ee00000, 0x000000079ee00000| Untracked -|1252|0x000000079f000000, 0x000000079f000000, 0x000000079f200000| 0%| F| |TAMS 0x000000079f000000, 0x000000079f000000| Untracked -|1253|0x000000079f200000, 0x000000079f200000, 0x000000079f400000| 0%| F| |TAMS 0x000000079f200000, 0x000000079f200000| Untracked -|1254|0x000000079f400000, 0x000000079f400000, 0x000000079f600000| 0%| F| |TAMS 0x000000079f400000, 0x000000079f400000| Untracked -|1255|0x000000079f600000, 0x000000079f600000, 0x000000079f800000| 0%| F| |TAMS 0x000000079f600000, 0x000000079f600000| Untracked -|1256|0x000000079f800000, 0x000000079f800000, 0x000000079fa00000| 0%| F| |TAMS 0x000000079f800000, 0x000000079f800000| Untracked -|1257|0x000000079fa00000, 0x000000079fa00000, 0x000000079fc00000| 0%| F| |TAMS 0x000000079fa00000, 0x000000079fa00000| Untracked -|1258|0x000000079fc00000, 0x000000079fc00000, 0x000000079fe00000| 0%| F| |TAMS 0x000000079fc00000, 0x000000079fc00000| Untracked -|1259|0x000000079fe00000, 0x000000079fe00000, 0x00000007a0000000| 0%| F| |TAMS 0x000000079fe00000, 0x000000079fe00000| Untracked -|1260|0x00000007a0000000, 0x00000007a0000000, 0x00000007a0200000| 0%| F| |TAMS 0x00000007a0000000, 0x00000007a0000000| Untracked -|1261|0x00000007a0200000, 0x00000007a0200000, 0x00000007a0400000| 0%| F| |TAMS 0x00000007a0200000, 0x00000007a0200000| Untracked -|1262|0x00000007a0400000, 0x00000007a0400000, 0x00000007a0600000| 0%| F| |TAMS 0x00000007a0400000, 0x00000007a0400000| Untracked -|1263|0x00000007a0600000, 0x00000007a0600000, 0x00000007a0800000| 0%| F| |TAMS 0x00000007a0600000, 0x00000007a0600000| Untracked -|1264|0x00000007a0800000, 0x00000007a0800000, 0x00000007a0a00000| 0%| F| |TAMS 0x00000007a0800000, 0x00000007a0800000| Untracked -|1265|0x00000007a0a00000, 0x00000007a0a00000, 0x00000007a0c00000| 0%| F| |TAMS 0x00000007a0a00000, 0x00000007a0a00000| Untracked -|1266|0x00000007a0c00000, 0x00000007a0c00000, 0x00000007a0e00000| 0%| F| |TAMS 0x00000007a0c00000, 0x00000007a0c00000| Untracked -|1267|0x00000007a0e00000, 0x00000007a0e00000, 0x00000007a1000000| 0%| F| |TAMS 0x00000007a0e00000, 0x00000007a0e00000| Untracked -|1268|0x00000007a1000000, 0x00000007a1000000, 0x00000007a1200000| 0%| F| |TAMS 0x00000007a1000000, 0x00000007a1000000| Untracked -|1269|0x00000007a1200000, 0x00000007a1200000, 0x00000007a1400000| 0%| F| |TAMS 0x00000007a1200000, 0x00000007a1200000| Untracked -|1270|0x00000007a1400000, 0x00000007a1400000, 0x00000007a1600000| 0%| F| |TAMS 0x00000007a1400000, 0x00000007a1400000| Untracked -|1271|0x00000007a1600000, 0x00000007a1600000, 0x00000007a1800000| 0%| F| |TAMS 0x00000007a1600000, 0x00000007a1600000| Untracked -|1272|0x00000007a1800000, 0x00000007a1800000, 0x00000007a1a00000| 0%| F| |TAMS 0x00000007a1800000, 0x00000007a1800000| Untracked -|1273|0x00000007a1a00000, 0x00000007a1a00000, 0x00000007a1c00000| 0%| F| |TAMS 0x00000007a1a00000, 0x00000007a1a00000| Untracked -|1274|0x00000007a1c00000, 0x00000007a1c00000, 0x00000007a1e00000| 0%| F| |TAMS 0x00000007a1c00000, 0x00000007a1c00000| Untracked -|1275|0x00000007a1e00000, 0x00000007a1e00000, 0x00000007a2000000| 0%| F| |TAMS 0x00000007a1e00000, 0x00000007a1e00000| Untracked -|1276|0x00000007a2000000, 0x00000007a2000000, 0x00000007a2200000| 0%| F| |TAMS 0x00000007a2000000, 0x00000007a2000000| Untracked -|1277|0x00000007a2200000, 0x00000007a2200000, 0x00000007a2400000| 0%| F| |TAMS 0x00000007a2200000, 0x00000007a2200000| Untracked -|1278|0x00000007a2400000, 0x00000007a2400000, 0x00000007a2600000| 0%| F| |TAMS 0x00000007a2400000, 0x00000007a2400000| Untracked -|1279|0x00000007a2600000, 0x00000007a2600000, 0x00000007a2800000| 0%| F| |TAMS 0x00000007a2600000, 0x00000007a2600000| Untracked -|1280|0x00000007a2800000, 0x00000007a2800000, 0x00000007a2a00000| 0%| F| |TAMS 0x00000007a2800000, 0x00000007a2800000| Untracked -|1281|0x00000007a2a00000, 0x00000007a2a00000, 0x00000007a2c00000| 0%| F| |TAMS 0x00000007a2a00000, 0x00000007a2a00000| Untracked -|1282|0x00000007a2c00000, 0x00000007a2c00000, 0x00000007a2e00000| 0%| F| |TAMS 0x00000007a2c00000, 0x00000007a2c00000| Untracked -|1283|0x00000007a2e00000, 0x00000007a2e00000, 0x00000007a3000000| 0%| F| |TAMS 0x00000007a2e00000, 0x00000007a2e00000| Untracked -|1284|0x00000007a3000000, 0x00000007a3000000, 0x00000007a3200000| 0%| F| |TAMS 0x00000007a3000000, 0x00000007a3000000| Untracked -|1285|0x00000007a3200000, 0x00000007a3200000, 0x00000007a3400000| 0%| F| |TAMS 0x00000007a3200000, 0x00000007a3200000| Untracked -|1286|0x00000007a3400000, 0x00000007a3400000, 0x00000007a3600000| 0%| F| |TAMS 0x00000007a3400000, 0x00000007a3400000| Untracked -|1287|0x00000007a3600000, 0x00000007a3600000, 0x00000007a3800000| 0%| F| |TAMS 0x00000007a3600000, 0x00000007a3600000| Untracked -|1288|0x00000007a3800000, 0x00000007a3800000, 0x00000007a3a00000| 0%| F| |TAMS 0x00000007a3800000, 0x00000007a3800000| Untracked -|1289|0x00000007a3a00000, 0x00000007a3a00000, 0x00000007a3c00000| 0%| F| |TAMS 0x00000007a3a00000, 0x00000007a3a00000| Untracked -|1290|0x00000007a3c00000, 0x00000007a3c00000, 0x00000007a3e00000| 0%| F| |TAMS 0x00000007a3c00000, 0x00000007a3c00000| Untracked -|1291|0x00000007a3e00000, 0x00000007a3e00000, 0x00000007a4000000| 0%| F| |TAMS 0x00000007a3e00000, 0x00000007a3e00000| Untracked -|1292|0x00000007a4000000, 0x00000007a4000000, 0x00000007a4200000| 0%| F| |TAMS 0x00000007a4000000, 0x00000007a4000000| Untracked -|1293|0x00000007a4200000, 0x00000007a4200000, 0x00000007a4400000| 0%| F| |TAMS 0x00000007a4200000, 0x00000007a4200000| Untracked -|1294|0x00000007a4400000, 0x00000007a4400000, 0x00000007a4600000| 0%| F| |TAMS 0x00000007a4400000, 0x00000007a4400000| Untracked -|1295|0x00000007a4600000, 0x00000007a4600000, 0x00000007a4800000| 0%| F| |TAMS 0x00000007a4600000, 0x00000007a4600000| Untracked -|1296|0x00000007a4800000, 0x00000007a4800000, 0x00000007a4a00000| 0%| F| |TAMS 0x00000007a4800000, 0x00000007a4800000| Untracked -|1297|0x00000007a4a00000, 0x00000007a4a00000, 0x00000007a4c00000| 0%| F| |TAMS 0x00000007a4a00000, 0x00000007a4a00000| Untracked -|1298|0x00000007a4c00000, 0x00000007a4c00000, 0x00000007a4e00000| 0%| F| |TAMS 0x00000007a4c00000, 0x00000007a4c00000| Untracked -|1299|0x00000007a4e00000, 0x00000007a4e00000, 0x00000007a5000000| 0%| F| |TAMS 0x00000007a4e00000, 0x00000007a4e00000| Untracked -|1300|0x00000007a5000000, 0x00000007a5000000, 0x00000007a5200000| 0%| F| |TAMS 0x00000007a5000000, 0x00000007a5000000| Untracked -|1301|0x00000007a5200000, 0x00000007a5200000, 0x00000007a5400000| 0%| F| |TAMS 0x00000007a5200000, 0x00000007a5200000| Untracked -|1302|0x00000007a5400000, 0x00000007a5400000, 0x00000007a5600000| 0%| F| |TAMS 0x00000007a5400000, 0x00000007a5400000| Untracked -|1303|0x00000007a5600000, 0x00000007a5600000, 0x00000007a5800000| 0%| F| |TAMS 0x00000007a5600000, 0x00000007a5600000| Untracked -|1304|0x00000007a5800000, 0x00000007a5800000, 0x00000007a5a00000| 0%| F| |TAMS 0x00000007a5800000, 0x00000007a5800000| Untracked -|1305|0x00000007a5a00000, 0x00000007a5a00000, 0x00000007a5c00000| 0%| F| |TAMS 0x00000007a5a00000, 0x00000007a5a00000| Untracked -|1306|0x00000007a5c00000, 0x00000007a5c00000, 0x00000007a5e00000| 0%| F| |TAMS 0x00000007a5c00000, 0x00000007a5c00000| Untracked -|1307|0x00000007a5e00000, 0x00000007a5e00000, 0x00000007a6000000| 0%| F| |TAMS 0x00000007a5e00000, 0x00000007a5e00000| Untracked -|1308|0x00000007a6000000, 0x00000007a6000000, 0x00000007a6200000| 0%| F| |TAMS 0x00000007a6000000, 0x00000007a6000000| Untracked -|1309|0x00000007a6200000, 0x00000007a6200000, 0x00000007a6400000| 0%| F| |TAMS 0x00000007a6200000, 0x00000007a6200000| Untracked -|1310|0x00000007a6400000, 0x00000007a6400000, 0x00000007a6600000| 0%| F| |TAMS 0x00000007a6400000, 0x00000007a6400000| Untracked -|1311|0x00000007a6600000, 0x00000007a6600000, 0x00000007a6800000| 0%| F| |TAMS 0x00000007a6600000, 0x00000007a6600000| Untracked -|1312|0x00000007a6800000, 0x00000007a6800000, 0x00000007a6a00000| 0%| F| |TAMS 0x00000007a6800000, 0x00000007a6800000| Untracked -|1313|0x00000007a6a00000, 0x00000007a6a00000, 0x00000007a6c00000| 0%| F| |TAMS 0x00000007a6a00000, 0x00000007a6a00000| Untracked -|1314|0x00000007a6c00000, 0x00000007a6c00000, 0x00000007a6e00000| 0%| F| |TAMS 0x00000007a6c00000, 0x00000007a6c00000| Untracked -|1315|0x00000007a6e00000, 0x00000007a6e00000, 0x00000007a7000000| 0%| F| |TAMS 0x00000007a6e00000, 0x00000007a6e00000| Untracked -|1316|0x00000007a7000000, 0x00000007a7000000, 0x00000007a7200000| 0%| F| |TAMS 0x00000007a7000000, 0x00000007a7000000| Untracked -|1317|0x00000007a7200000, 0x00000007a7200000, 0x00000007a7400000| 0%| F| |TAMS 0x00000007a7200000, 0x00000007a7200000| Untracked -|1318|0x00000007a7400000, 0x00000007a7400000, 0x00000007a7600000| 0%| F| |TAMS 0x00000007a7400000, 0x00000007a7400000| Untracked -|1319|0x00000007a7600000, 0x00000007a7600000, 0x00000007a7800000| 0%| F| |TAMS 0x00000007a7600000, 0x00000007a7600000| Untracked -|1320|0x00000007a7800000, 0x00000007a7800000, 0x00000007a7a00000| 0%| F| |TAMS 0x00000007a7800000, 0x00000007a7800000| Untracked -|1321|0x00000007a7a00000, 0x00000007a7a00000, 0x00000007a7c00000| 0%| F| |TAMS 0x00000007a7a00000, 0x00000007a7a00000| Untracked -|1322|0x00000007a7c00000, 0x00000007a7c00000, 0x00000007a7e00000| 0%| F| |TAMS 0x00000007a7c00000, 0x00000007a7c00000| Untracked -|1323|0x00000007a7e00000, 0x00000007a7e00000, 0x00000007a8000000| 0%| F| |TAMS 0x00000007a7e00000, 0x00000007a7e00000| Untracked -|1324|0x00000007a8000000, 0x00000007a8000000, 0x00000007a8200000| 0%| F| |TAMS 0x00000007a8000000, 0x00000007a8000000| Untracked -|1325|0x00000007a8200000, 0x00000007a8200000, 0x00000007a8400000| 0%| F| |TAMS 0x00000007a8200000, 0x00000007a8200000| Untracked -|1326|0x00000007a8400000, 0x00000007a8400000, 0x00000007a8600000| 0%| F| |TAMS 0x00000007a8400000, 0x00000007a8400000| Untracked -|1327|0x00000007a8600000, 0x00000007a8600000, 0x00000007a8800000| 0%| F| |TAMS 0x00000007a8600000, 0x00000007a8600000| Untracked -|1328|0x00000007a8800000, 0x00000007a8800000, 0x00000007a8a00000| 0%| F| |TAMS 0x00000007a8800000, 0x00000007a8800000| Untracked -|1329|0x00000007a8a00000, 0x00000007a8a00000, 0x00000007a8c00000| 0%| F| |TAMS 0x00000007a8a00000, 0x00000007a8a00000| Untracked -|1330|0x00000007a8c00000, 0x00000007a8c00000, 0x00000007a8e00000| 0%| F| |TAMS 0x00000007a8c00000, 0x00000007a8c00000| Untracked -|1331|0x00000007a8e00000, 0x00000007a8e00000, 0x00000007a9000000| 0%| F| |TAMS 0x00000007a8e00000, 0x00000007a8e00000| Untracked -|1332|0x00000007a9000000, 0x00000007a9000000, 0x00000007a9200000| 0%| F| |TAMS 0x00000007a9000000, 0x00000007a9000000| Untracked -|1333|0x00000007a9200000, 0x00000007a9200000, 0x00000007a9400000| 0%| F| |TAMS 0x00000007a9200000, 0x00000007a9200000| Untracked -|1334|0x00000007a9400000, 0x00000007a9400000, 0x00000007a9600000| 0%| F| |TAMS 0x00000007a9400000, 0x00000007a9400000| Untracked -|1335|0x00000007a9600000, 0x00000007a9600000, 0x00000007a9800000| 0%| F| |TAMS 0x00000007a9600000, 0x00000007a9600000| Untracked -|1336|0x00000007a9800000, 0x00000007a9800000, 0x00000007a9a00000| 0%| F| |TAMS 0x00000007a9800000, 0x00000007a9800000| Untracked -|1337|0x00000007a9a00000, 0x00000007a9a00000, 0x00000007a9c00000| 0%| F| |TAMS 0x00000007a9a00000, 0x00000007a9a00000| Untracked -|1338|0x00000007a9c00000, 0x00000007a9c00000, 0x00000007a9e00000| 0%| F| |TAMS 0x00000007a9c00000, 0x00000007a9c00000| Untracked -|1339|0x00000007a9e00000, 0x00000007a9e00000, 0x00000007aa000000| 0%| F| |TAMS 0x00000007a9e00000, 0x00000007a9e00000| Untracked -|1340|0x00000007aa000000, 0x00000007aa000000, 0x00000007aa200000| 0%| F| |TAMS 0x00000007aa000000, 0x00000007aa000000| Untracked -|1341|0x00000007aa200000, 0x00000007aa200000, 0x00000007aa400000| 0%| F| |TAMS 0x00000007aa200000, 0x00000007aa200000| Untracked -|1342|0x00000007aa400000, 0x00000007aa400000, 0x00000007aa600000| 0%| F| |TAMS 0x00000007aa400000, 0x00000007aa400000| Untracked -|1343|0x00000007aa600000, 0x00000007aa600000, 0x00000007aa800000| 0%| F| |TAMS 0x00000007aa600000, 0x00000007aa600000| Untracked -|1344|0x00000007aa800000, 0x00000007aa800000, 0x00000007aaa00000| 0%| F| |TAMS 0x00000007aa800000, 0x00000007aa800000| Untracked -|1345|0x00000007aaa00000, 0x00000007aaa00000, 0x00000007aac00000| 0%| F| |TAMS 0x00000007aaa00000, 0x00000007aaa00000| Untracked -|1346|0x00000007aac00000, 0x00000007aac00000, 0x00000007aae00000| 0%| F| |TAMS 0x00000007aac00000, 0x00000007aac00000| Untracked -|1347|0x00000007aae00000, 0x00000007aae00000, 0x00000007ab000000| 0%| F| |TAMS 0x00000007aae00000, 0x00000007aae00000| Untracked -|1348|0x00000007ab000000, 0x00000007ab000000, 0x00000007ab200000| 0%| F| |TAMS 0x00000007ab000000, 0x00000007ab000000| Untracked -|1349|0x00000007ab200000, 0x00000007ab200000, 0x00000007ab400000| 0%| F| |TAMS 0x00000007ab200000, 0x00000007ab200000| Untracked -|1350|0x00000007ab400000, 0x00000007ab400000, 0x00000007ab600000| 0%| F| |TAMS 0x00000007ab400000, 0x00000007ab400000| Untracked -|1351|0x00000007ab600000, 0x00000007ab600000, 0x00000007ab800000| 0%| F| |TAMS 0x00000007ab600000, 0x00000007ab600000| Untracked -|1352|0x00000007ab800000, 0x00000007ab800000, 0x00000007aba00000| 0%| F| |TAMS 0x00000007ab800000, 0x00000007ab800000| Untracked -|1353|0x00000007aba00000, 0x00000007aba00000, 0x00000007abc00000| 0%| F| |TAMS 0x00000007aba00000, 0x00000007aba00000| Untracked -|1354|0x00000007abc00000, 0x00000007abc00000, 0x00000007abe00000| 0%| F| |TAMS 0x00000007abc00000, 0x00000007abc00000| Untracked -|1355|0x00000007abe00000, 0x00000007abe00000, 0x00000007ac000000| 0%| F| |TAMS 0x00000007abe00000, 0x00000007abe00000| Untracked -|1356|0x00000007ac000000, 0x00000007ac000000, 0x00000007ac200000| 0%| F| |TAMS 0x00000007ac000000, 0x00000007ac000000| Untracked -|1357|0x00000007ac200000, 0x00000007ac200000, 0x00000007ac400000| 0%| F| |TAMS 0x00000007ac200000, 0x00000007ac200000| Untracked -|1358|0x00000007ac400000, 0x00000007ac400000, 0x00000007ac600000| 0%| F| |TAMS 0x00000007ac400000, 0x00000007ac400000| Untracked -|1359|0x00000007ac600000, 0x00000007ac600000, 0x00000007ac800000| 0%| F| |TAMS 0x00000007ac600000, 0x00000007ac600000| Untracked -|1360|0x00000007ac800000, 0x00000007ac800000, 0x00000007aca00000| 0%| F| |TAMS 0x00000007ac800000, 0x00000007ac800000| Untracked -|1361|0x00000007aca00000, 0x00000007aca00000, 0x00000007acc00000| 0%| F| |TAMS 0x00000007aca00000, 0x00000007aca00000| Untracked -|1362|0x00000007acc00000, 0x00000007acc00000, 0x00000007ace00000| 0%| F| |TAMS 0x00000007acc00000, 0x00000007acc00000| Untracked -|1363|0x00000007ace00000, 0x00000007ace00000, 0x00000007ad000000| 0%| F| |TAMS 0x00000007ace00000, 0x00000007ace00000| Untracked -|1364|0x00000007ad000000, 0x00000007ad000000, 0x00000007ad200000| 0%| F| |TAMS 0x00000007ad000000, 0x00000007ad000000| Untracked -|1365|0x00000007ad200000, 0x00000007ad200000, 0x00000007ad400000| 0%| F| |TAMS 0x00000007ad200000, 0x00000007ad200000| Untracked -|1366|0x00000007ad400000, 0x00000007ad400000, 0x00000007ad600000| 0%| F| |TAMS 0x00000007ad400000, 0x00000007ad400000| Untracked -|1367|0x00000007ad600000, 0x00000007ad600000, 0x00000007ad800000| 0%| F| |TAMS 0x00000007ad600000, 0x00000007ad600000| Untracked -|1368|0x00000007ad800000, 0x00000007ad800000, 0x00000007ada00000| 0%| F| |TAMS 0x00000007ad800000, 0x00000007ad800000| Untracked -|1369|0x00000007ada00000, 0x00000007ada00000, 0x00000007adc00000| 0%| F| |TAMS 0x00000007ada00000, 0x00000007ada00000| Untracked -|1370|0x00000007adc00000, 0x00000007adc00000, 0x00000007ade00000| 0%| F| |TAMS 0x00000007adc00000, 0x00000007adc00000| Untracked -|1371|0x00000007ade00000, 0x00000007ade00000, 0x00000007ae000000| 0%| F| |TAMS 0x00000007ade00000, 0x00000007ade00000| Untracked -|1372|0x00000007ae000000, 0x00000007ae000000, 0x00000007ae200000| 0%| F| |TAMS 0x00000007ae000000, 0x00000007ae000000| Untracked -|1373|0x00000007ae200000, 0x00000007ae200000, 0x00000007ae400000| 0%| F| |TAMS 0x00000007ae200000, 0x00000007ae200000| Untracked -|1374|0x00000007ae400000, 0x00000007ae400000, 0x00000007ae600000| 0%| F| |TAMS 0x00000007ae400000, 0x00000007ae400000| Untracked -|1375|0x00000007ae600000, 0x00000007ae600000, 0x00000007ae800000| 0%| F| |TAMS 0x00000007ae600000, 0x00000007ae600000| Untracked -|1376|0x00000007ae800000, 0x00000007ae800000, 0x00000007aea00000| 0%| F| |TAMS 0x00000007ae800000, 0x00000007ae800000| Untracked -|1377|0x00000007aea00000, 0x00000007aea00000, 0x00000007aec00000| 0%| F| |TAMS 0x00000007aea00000, 0x00000007aea00000| Untracked -|1378|0x00000007aec00000, 0x00000007aec00000, 0x00000007aee00000| 0%| F| |TAMS 0x00000007aec00000, 0x00000007aec00000| Untracked -|1379|0x00000007aee00000, 0x00000007aee00000, 0x00000007af000000| 0%| F| |TAMS 0x00000007aee00000, 0x00000007aee00000| Untracked -|1380|0x00000007af000000, 0x00000007af000000, 0x00000007af200000| 0%| F| |TAMS 0x00000007af000000, 0x00000007af000000| Untracked -|1381|0x00000007af200000, 0x00000007af200000, 0x00000007af400000| 0%| F| |TAMS 0x00000007af200000, 0x00000007af200000| Untracked -|1382|0x00000007af400000, 0x00000007af400000, 0x00000007af600000| 0%| F| |TAMS 0x00000007af400000, 0x00000007af400000| Untracked -|1383|0x00000007af600000, 0x00000007af600000, 0x00000007af800000| 0%| F| |TAMS 0x00000007af600000, 0x00000007af600000| Untracked -|1384|0x00000007af800000, 0x00000007af800000, 0x00000007afa00000| 0%| F| |TAMS 0x00000007af800000, 0x00000007af800000| Untracked -|1385|0x00000007afa00000, 0x00000007afa00000, 0x00000007afc00000| 0%| F| |TAMS 0x00000007afa00000, 0x00000007afa00000| Untracked -|1386|0x00000007afc00000, 0x00000007afc00000, 0x00000007afe00000| 0%| F| |TAMS 0x00000007afc00000, 0x00000007afc00000| Untracked -|1387|0x00000007afe00000, 0x00000007afe00000, 0x00000007b0000000| 0%| F| |TAMS 0x00000007afe00000, 0x00000007afe00000| Untracked -|1388|0x00000007b0000000, 0x00000007b0000000, 0x00000007b0200000| 0%| F| |TAMS 0x00000007b0000000, 0x00000007b0000000| Untracked -|1389|0x00000007b0200000, 0x00000007b0200000, 0x00000007b0400000| 0%| F| |TAMS 0x00000007b0200000, 0x00000007b0200000| Untracked -|1390|0x00000007b0400000, 0x00000007b0400000, 0x00000007b0600000| 0%| F| |TAMS 0x00000007b0400000, 0x00000007b0400000| Untracked -|1391|0x00000007b0600000, 0x00000007b0600000, 0x00000007b0800000| 0%| F| |TAMS 0x00000007b0600000, 0x00000007b0600000| Untracked -|1392|0x00000007b0800000, 0x00000007b0800000, 0x00000007b0a00000| 0%| F| |TAMS 0x00000007b0800000, 0x00000007b0800000| Untracked -|1393|0x00000007b0a00000, 0x00000007b0a00000, 0x00000007b0c00000| 0%| F| |TAMS 0x00000007b0a00000, 0x00000007b0a00000| Untracked -|1394|0x00000007b0c00000, 0x00000007b0c00000, 0x00000007b0e00000| 0%| F| |TAMS 0x00000007b0c00000, 0x00000007b0c00000| Untracked -|1395|0x00000007b0e00000, 0x00000007b0e00000, 0x00000007b1000000| 0%| F| |TAMS 0x00000007b0e00000, 0x00000007b0e00000| Untracked -|1396|0x00000007b1000000, 0x00000007b1000000, 0x00000007b1200000| 0%| F| |TAMS 0x00000007b1000000, 0x00000007b1000000| Untracked -|1397|0x00000007b1200000, 0x00000007b1200000, 0x00000007b1400000| 0%| F| |TAMS 0x00000007b1200000, 0x00000007b1200000| Untracked -|1398|0x00000007b1400000, 0x00000007b1400000, 0x00000007b1600000| 0%| F| |TAMS 0x00000007b1400000, 0x00000007b1400000| Untracked -|1399|0x00000007b1600000, 0x00000007b1600000, 0x00000007b1800000| 0%| F| |TAMS 0x00000007b1600000, 0x00000007b1600000| Untracked -|1400|0x00000007b1800000, 0x00000007b1800000, 0x00000007b1a00000| 0%| F| |TAMS 0x00000007b1800000, 0x00000007b1800000| Untracked -|1401|0x00000007b1a00000, 0x00000007b1a00000, 0x00000007b1c00000| 0%| F| |TAMS 0x00000007b1a00000, 0x00000007b1a00000| Untracked -|1402|0x00000007b1c00000, 0x00000007b1c00000, 0x00000007b1e00000| 0%| F| |TAMS 0x00000007b1c00000, 0x00000007b1c00000| Untracked -|1403|0x00000007b1e00000, 0x00000007b1e00000, 0x00000007b2000000| 0%| F| |TAMS 0x00000007b1e00000, 0x00000007b1e00000| Untracked -|1404|0x00000007b2000000, 0x00000007b2000000, 0x00000007b2200000| 0%| F| |TAMS 0x00000007b2000000, 0x00000007b2000000| Untracked -|1405|0x00000007b2200000, 0x00000007b2200000, 0x00000007b2400000| 0%| F| |TAMS 0x00000007b2200000, 0x00000007b2200000| Untracked -|1406|0x00000007b2400000, 0x00000007b2400000, 0x00000007b2600000| 0%| F| |TAMS 0x00000007b2400000, 0x00000007b2400000| Untracked -|1407|0x00000007b2600000, 0x00000007b2600000, 0x00000007b2800000| 0%| F| |TAMS 0x00000007b2600000, 0x00000007b2600000| Untracked -|1408|0x00000007b2800000, 0x00000007b2800000, 0x00000007b2a00000| 0%| F| |TAMS 0x00000007b2800000, 0x00000007b2800000| Untracked -|1409|0x00000007b2a00000, 0x00000007b2a00000, 0x00000007b2c00000| 0%| F| |TAMS 0x00000007b2a00000, 0x00000007b2a00000| Untracked -|1410|0x00000007b2c00000, 0x00000007b2c00000, 0x00000007b2e00000| 0%| F| |TAMS 0x00000007b2c00000, 0x00000007b2c00000| Untracked -|1411|0x00000007b2e00000, 0x00000007b2e00000, 0x00000007b3000000| 0%| F| |TAMS 0x00000007b2e00000, 0x00000007b2e00000| Untracked -|1412|0x00000007b3000000, 0x00000007b3000000, 0x00000007b3200000| 0%| F| |TAMS 0x00000007b3000000, 0x00000007b3000000| Untracked -|1413|0x00000007b3200000, 0x00000007b3200000, 0x00000007b3400000| 0%| F| |TAMS 0x00000007b3200000, 0x00000007b3200000| Untracked -|1414|0x00000007b3400000, 0x00000007b3400000, 0x00000007b3600000| 0%| F| |TAMS 0x00000007b3400000, 0x00000007b3400000| Untracked -|1415|0x00000007b3600000, 0x00000007b3600000, 0x00000007b3800000| 0%| F| |TAMS 0x00000007b3600000, 0x00000007b3600000| Untracked -|1416|0x00000007b3800000, 0x00000007b3800000, 0x00000007b3a00000| 0%| F| |TAMS 0x00000007b3800000, 0x00000007b3800000| Untracked -|1417|0x00000007b3a00000, 0x00000007b3a00000, 0x00000007b3c00000| 0%| F| |TAMS 0x00000007b3a00000, 0x00000007b3a00000| Untracked -|1418|0x00000007b3c00000, 0x00000007b3c00000, 0x00000007b3e00000| 0%| F| |TAMS 0x00000007b3c00000, 0x00000007b3c00000| Untracked -|1419|0x00000007b3e00000, 0x00000007b3e00000, 0x00000007b4000000| 0%| F| |TAMS 0x00000007b3e00000, 0x00000007b3e00000| Untracked -|1420|0x00000007b4000000, 0x00000007b4000000, 0x00000007b4200000| 0%| F| |TAMS 0x00000007b4000000, 0x00000007b4000000| Untracked -|1421|0x00000007b4200000, 0x00000007b4200000, 0x00000007b4400000| 0%| F| |TAMS 0x00000007b4200000, 0x00000007b4200000| Untracked -|1422|0x00000007b4400000, 0x00000007b4400000, 0x00000007b4600000| 0%| F| |TAMS 0x00000007b4400000, 0x00000007b4400000| Untracked -|1423|0x00000007b4600000, 0x00000007b4600000, 0x00000007b4800000| 0%| F| |TAMS 0x00000007b4600000, 0x00000007b4600000| Untracked -|1424|0x00000007b4800000, 0x00000007b4800000, 0x00000007b4a00000| 0%| F| |TAMS 0x00000007b4800000, 0x00000007b4800000| Untracked -|1425|0x00000007b4a00000, 0x00000007b4a00000, 0x00000007b4c00000| 0%| F| |TAMS 0x00000007b4a00000, 0x00000007b4a00000| Untracked -|1426|0x00000007b4c00000, 0x00000007b4c00000, 0x00000007b4e00000| 0%| F| |TAMS 0x00000007b4c00000, 0x00000007b4c00000| Untracked -|1427|0x00000007b4e00000, 0x00000007b4e00000, 0x00000007b5000000| 0%| F| |TAMS 0x00000007b4e00000, 0x00000007b4e00000| Untracked -|1428|0x00000007b5000000, 0x00000007b5000000, 0x00000007b5200000| 0%| F| |TAMS 0x00000007b5000000, 0x00000007b5000000| Untracked -|1429|0x00000007b5200000, 0x00000007b5200000, 0x00000007b5400000| 0%| F| |TAMS 0x00000007b5200000, 0x00000007b5200000| Untracked -|1430|0x00000007b5400000, 0x00000007b5400000, 0x00000007b5600000| 0%| F| |TAMS 0x00000007b5400000, 0x00000007b5400000| Untracked -|1431|0x00000007b5600000, 0x00000007b5600000, 0x00000007b5800000| 0%| F| |TAMS 0x00000007b5600000, 0x00000007b5600000| Untracked -|1432|0x00000007b5800000, 0x00000007b5800000, 0x00000007b5a00000| 0%| F| |TAMS 0x00000007b5800000, 0x00000007b5800000| Untracked -|1433|0x00000007b5a00000, 0x00000007b5a00000, 0x00000007b5c00000| 0%| F| |TAMS 0x00000007b5a00000, 0x00000007b5a00000| Untracked -|1434|0x00000007b5c00000, 0x00000007b5c00000, 0x00000007b5e00000| 0%| F| |TAMS 0x00000007b5c00000, 0x00000007b5c00000| Untracked -|1435|0x00000007b5e00000, 0x00000007b5e00000, 0x00000007b6000000| 0%| F| |TAMS 0x00000007b5e00000, 0x00000007b5e00000| Untracked -|1436|0x00000007b6000000, 0x00000007b6000000, 0x00000007b6200000| 0%| F| |TAMS 0x00000007b6000000, 0x00000007b6000000| Untracked -|1437|0x00000007b6200000, 0x00000007b6200000, 0x00000007b6400000| 0%| F| |TAMS 0x00000007b6200000, 0x00000007b6200000| Untracked -|1438|0x00000007b6400000, 0x00000007b6400000, 0x00000007b6600000| 0%| F| |TAMS 0x00000007b6400000, 0x00000007b6400000| Untracked -|1439|0x00000007b6600000, 0x00000007b6600000, 0x00000007b6800000| 0%| F| |TAMS 0x00000007b6600000, 0x00000007b6600000| Untracked -|1440|0x00000007b6800000, 0x00000007b6800000, 0x00000007b6a00000| 0%| F| |TAMS 0x00000007b6800000, 0x00000007b6800000| Untracked -|1441|0x00000007b6a00000, 0x00000007b6a00000, 0x00000007b6c00000| 0%| F| |TAMS 0x00000007b6a00000, 0x00000007b6a00000| Untracked -|1442|0x00000007b6c00000, 0x00000007b6e00000, 0x00000007b6e00000|100%| S|CS|TAMS 0x00000007b6c00000, 0x00000007b6c00000| Complete -|1443|0x00000007b6e00000, 0x00000007b7000000, 0x00000007b7000000|100%| S|CS|TAMS 0x00000007b6e00000, 0x00000007b6e00000| Complete -|1444|0x00000007b7000000, 0x00000007b7200000, 0x00000007b7200000|100%| S|CS|TAMS 0x00000007b7000000, 0x00000007b7000000| Complete -|1445|0x00000007b7200000, 0x00000007b7400000, 0x00000007b7400000|100%| S|CS|TAMS 0x00000007b7200000, 0x00000007b7200000| Complete -|1446|0x00000007b7400000, 0x00000007b7600000, 0x00000007b7600000|100%| S|CS|TAMS 0x00000007b7400000, 0x00000007b7400000| Complete -|1447|0x00000007b7600000, 0x00000007b7800000, 0x00000007b7800000|100%| S|CS|TAMS 0x00000007b7600000, 0x00000007b7600000| Complete -|1448|0x00000007b7800000, 0x00000007b7a00000, 0x00000007b7a00000|100%| S|CS|TAMS 0x00000007b7800000, 0x00000007b7800000| Complete -|1449|0x00000007b7a00000, 0x00000007b7c00000, 0x00000007b7c00000|100%| S|CS|TAMS 0x00000007b7a00000, 0x00000007b7a00000| Complete -|1450|0x00000007b7c00000, 0x00000007b7e00000, 0x00000007b7e00000|100%| S|CS|TAMS 0x00000007b7c00000, 0x00000007b7c00000| Complete -|1451|0x00000007b7e00000, 0x00000007b8000000, 0x00000007b8000000|100%| S|CS|TAMS 0x00000007b7e00000, 0x00000007b7e00000| Complete -|1452|0x00000007b8000000, 0x00000007b8200000, 0x00000007b8200000|100%| S|CS|TAMS 0x00000007b8000000, 0x00000007b8000000| Complete -|1453|0x00000007b8200000, 0x00000007b8400000, 0x00000007b8400000|100%| S|CS|TAMS 0x00000007b8200000, 0x00000007b8200000| Complete -|1454|0x00000007b8400000, 0x00000007b8600000, 0x00000007b8600000|100%| S|CS|TAMS 0x00000007b8400000, 0x00000007b8400000| Complete -|1455|0x00000007b8600000, 0x00000007b8800000, 0x00000007b8800000|100%| S|CS|TAMS 0x00000007b8600000, 0x00000007b8600000| Complete -|1456|0x00000007b8800000, 0x00000007b8a00000, 0x00000007b8a00000|100%| S|CS|TAMS 0x00000007b8800000, 0x00000007b8800000| Complete -|1457|0x00000007b8a00000, 0x00000007b8c00000, 0x00000007b8c00000|100%| S|CS|TAMS 0x00000007b8a00000, 0x00000007b8a00000| Complete -|1458|0x00000007b8c00000, 0x00000007b8e00000, 0x00000007b8e00000|100%| S|CS|TAMS 0x00000007b8c00000, 0x00000007b8c00000| Complete -|1459|0x00000007b8e00000, 0x00000007b9000000, 0x00000007b9000000|100%| S|CS|TAMS 0x00000007b8e00000, 0x00000007b8e00000| Complete -|1460|0x00000007b9000000, 0x00000007b9200000, 0x00000007b9200000|100%| S|CS|TAMS 0x00000007b9000000, 0x00000007b9000000| Complete -|1461|0x00000007b9200000, 0x00000007b9400000, 0x00000007b9400000|100%| S|CS|TAMS 0x00000007b9200000, 0x00000007b9200000| Complete -|1462|0x00000007b9400000, 0x00000007b9600000, 0x00000007b9600000|100%| S|CS|TAMS 0x00000007b9400000, 0x00000007b9400000| Complete -|1463|0x00000007b9600000, 0x00000007b9800000, 0x00000007b9800000|100%| S|CS|TAMS 0x00000007b9600000, 0x00000007b9600000| Complete -|1464|0x00000007b9800000, 0x00000007b9a00000, 0x00000007b9a00000|100%| S|CS|TAMS 0x00000007b9800000, 0x00000007b9800000| Complete -|1465|0x00000007b9a00000, 0x00000007b9c00000, 0x00000007b9c00000|100%| S|CS|TAMS 0x00000007b9a00000, 0x00000007b9a00000| Complete -|1466|0x00000007b9c00000, 0x00000007b9e00000, 0x00000007b9e00000|100%| S|CS|TAMS 0x00000007b9c00000, 0x00000007b9c00000| Complete -|1467|0x00000007b9e00000, 0x00000007ba000000, 0x00000007ba000000|100%| S|CS|TAMS 0x00000007b9e00000, 0x00000007b9e00000| Complete -|1468|0x00000007ba000000, 0x00000007ba200000, 0x00000007ba200000|100%| S|CS|TAMS 0x00000007ba000000, 0x00000007ba000000| Complete -|1469|0x00000007ba200000, 0x00000007ba400000, 0x00000007ba400000|100%| S|CS|TAMS 0x00000007ba200000, 0x00000007ba200000| Complete -|1470|0x00000007ba400000, 0x00000007ba600000, 0x00000007ba600000|100%| S|CS|TAMS 0x00000007ba400000, 0x00000007ba400000| Complete -|1471|0x00000007ba600000, 0x00000007ba800000, 0x00000007ba800000|100%| S|CS|TAMS 0x00000007ba600000, 0x00000007ba600000| Complete -|1472|0x00000007ba800000, 0x00000007baa00000, 0x00000007baa00000|100%| S|CS|TAMS 0x00000007ba800000, 0x00000007ba800000| Complete -|1473|0x00000007baa00000, 0x00000007bac00000, 0x00000007bac00000|100%| S|CS|TAMS 0x00000007baa00000, 0x00000007baa00000| Complete -|1474|0x00000007bac00000, 0x00000007bae00000, 0x00000007bae00000|100%| S|CS|TAMS 0x00000007bac00000, 0x00000007bac00000| Complete -|1475|0x00000007bae00000, 0x00000007bb000000, 0x00000007bb000000|100%| S|CS|TAMS 0x00000007bae00000, 0x00000007bae00000| Complete -|1476|0x00000007bb000000, 0x00000007bb200000, 0x00000007bb200000|100%| S|CS|TAMS 0x00000007bb000000, 0x00000007bb000000| Complete -|1477|0x00000007bb200000, 0x00000007bb400000, 0x00000007bb400000|100%| S|CS|TAMS 0x00000007bb200000, 0x00000007bb200000| Complete -|1478|0x00000007bb400000, 0x00000007bb600000, 0x00000007bb600000|100%| S|CS|TAMS 0x00000007bb400000, 0x00000007bb400000| Complete -|1479|0x00000007bb600000, 0x00000007bb800000, 0x00000007bb800000|100%| S|CS|TAMS 0x00000007bb600000, 0x00000007bb600000| Complete -|1480|0x00000007bb800000, 0x00000007bb800000, 0x00000007bba00000| 0%| F| |TAMS 0x00000007bb800000, 0x00000007bb800000| Untracked -|1481|0x00000007bba00000, 0x00000007bba00000, 0x00000007bbc00000| 0%| F| |TAMS 0x00000007bba00000, 0x00000007bba00000| Untracked -|1482|0x00000007bbc00000, 0x00000007bbc00000, 0x00000007bbe00000| 0%| F| |TAMS 0x00000007bbc00000, 0x00000007bbc00000| Untracked -|1483|0x00000007bbe00000, 0x00000007bbe00000, 0x00000007bc000000| 0%| F| |TAMS 0x00000007bbe00000, 0x00000007bbe00000| Untracked -|1484|0x00000007bc000000, 0x00000007bc000000, 0x00000007bc200000| 0%| F| |TAMS 0x00000007bc000000, 0x00000007bc000000| Untracked -|1485|0x00000007bc200000, 0x00000007bc200000, 0x00000007bc400000| 0%| F| |TAMS 0x00000007bc200000, 0x00000007bc200000| Untracked -|1486|0x00000007bc400000, 0x00000007bc400000, 0x00000007bc600000| 0%| F| |TAMS 0x00000007bc400000, 0x00000007bc400000| Untracked -|1487|0x00000007bc600000, 0x00000007bc600000, 0x00000007bc800000| 0%| F| |TAMS 0x00000007bc600000, 0x00000007bc600000| Untracked -|1488|0x00000007bc800000, 0x00000007bc800000, 0x00000007bca00000| 0%| F| |TAMS 0x00000007bc800000, 0x00000007bc800000| Untracked -|1489|0x00000007bca00000, 0x00000007bca00000, 0x00000007bcc00000| 0%| F| |TAMS 0x00000007bca00000, 0x00000007bca00000| Untracked -|1490|0x00000007bcc00000, 0x00000007bcc00000, 0x00000007bce00000| 0%| F| |TAMS 0x00000007bcc00000, 0x00000007bcc00000| Untracked -|1491|0x00000007bce00000, 0x00000007bce00000, 0x00000007bd000000| 0%| F| |TAMS 0x00000007bce00000, 0x00000007bce00000| Untracked -|1492|0x00000007bd000000, 0x00000007bd000000, 0x00000007bd200000| 0%| F| |TAMS 0x00000007bd000000, 0x00000007bd000000| Untracked -|1493|0x00000007bd200000, 0x00000007bd200000, 0x00000007bd400000| 0%| F| |TAMS 0x00000007bd200000, 0x00000007bd200000| Untracked -|1494|0x00000007bd400000, 0x00000007bd400000, 0x00000007bd600000| 0%| F| |TAMS 0x00000007bd400000, 0x00000007bd400000| Untracked -|1495|0x00000007bd600000, 0x00000007bd600000, 0x00000007bd800000| 0%| F| |TAMS 0x00000007bd600000, 0x00000007bd600000| Untracked -|1496|0x00000007bd800000, 0x00000007bd800000, 0x00000007bda00000| 0%| F| |TAMS 0x00000007bd800000, 0x00000007bd800000| Untracked -|1497|0x00000007bda00000, 0x00000007bda00000, 0x00000007bdc00000| 0%| F| |TAMS 0x00000007bda00000, 0x00000007bda00000| Untracked -|1498|0x00000007bdc00000, 0x00000007bdc00000, 0x00000007bde00000| 0%| F| |TAMS 0x00000007bdc00000, 0x00000007bdc00000| Untracked -|1499|0x00000007bde00000, 0x00000007bde00000, 0x00000007be000000| 0%| F| |TAMS 0x00000007bde00000, 0x00000007bde00000| Untracked -|1500|0x00000007be000000, 0x00000007be000000, 0x00000007be200000| 0%| F| |TAMS 0x00000007be000000, 0x00000007be000000| Untracked -|1501|0x00000007be200000, 0x00000007be200000, 0x00000007be400000| 0%| F| |TAMS 0x00000007be200000, 0x00000007be200000| Untracked -|1502|0x00000007be400000, 0x00000007be400000, 0x00000007be600000| 0%| F| |TAMS 0x00000007be400000, 0x00000007be400000| Untracked -|1503|0x00000007be600000, 0x00000007be600000, 0x00000007be800000| 0%| F| |TAMS 0x00000007be600000, 0x00000007be600000| Untracked -|1504|0x00000007be800000, 0x00000007be800000, 0x00000007bea00000| 0%| F| |TAMS 0x00000007be800000, 0x00000007be800000| Untracked -|1505|0x00000007bea00000, 0x00000007bea00000, 0x00000007bec00000| 0%| F| |TAMS 0x00000007bea00000, 0x00000007bea00000| Untracked -|1506|0x00000007bec00000, 0x00000007bec00000, 0x00000007bee00000| 0%| F| |TAMS 0x00000007bec00000, 0x00000007bec00000| Untracked -|1507|0x00000007bee00000, 0x00000007bee00000, 0x00000007bf000000| 0%| F| |TAMS 0x00000007bee00000, 0x00000007bee00000| Untracked -|1508|0x00000007bf000000, 0x00000007bf000000, 0x00000007bf200000| 0%| F| |TAMS 0x00000007bf000000, 0x00000007bf000000| Untracked -|1509|0x00000007bf200000, 0x00000007bf200000, 0x00000007bf400000| 0%| F| |TAMS 0x00000007bf200000, 0x00000007bf200000| Untracked -|1510|0x00000007bf400000, 0x00000007bf400000, 0x00000007bf600000| 0%| F| |TAMS 0x00000007bf400000, 0x00000007bf400000| Untracked -|1511|0x00000007bf600000, 0x00000007bf600000, 0x00000007bf800000| 0%| F| |TAMS 0x00000007bf600000, 0x00000007bf600000| Untracked -|1512|0x00000007bf800000, 0x00000007bf800000, 0x00000007bfa00000| 0%| F| |TAMS 0x00000007bf800000, 0x00000007bf800000| Untracked -|1513|0x00000007bfa00000, 0x00000007bfa00000, 0x00000007bfc00000| 0%| F| |TAMS 0x00000007bfa00000, 0x00000007bfa00000| Untracked -|1514|0x00000007bfc00000, 0x00000007bfc00000, 0x00000007bfe00000| 0%| F| |TAMS 0x00000007bfc00000, 0x00000007bfc00000| Untracked -|1515|0x00000007bfe00000, 0x00000007bfe00000, 0x00000007c0000000| 0%| F| |TAMS 0x00000007bfe00000, 0x00000007bfe00000| Untracked -|1516|0x00000007c0000000, 0x00000007c0000000, 0x00000007c0200000| 0%| F| |TAMS 0x00000007c0000000, 0x00000007c0000000| Untracked -|1517|0x00000007c0200000, 0x00000007c0200000, 0x00000007c0400000| 0%| F| |TAMS 0x00000007c0200000, 0x00000007c0200000| Untracked -|1518|0x00000007c0400000, 0x00000007c0400000, 0x00000007c0600000| 0%| F| |TAMS 0x00000007c0400000, 0x00000007c0400000| Untracked -|1519|0x00000007c0600000, 0x00000007c0600000, 0x00000007c0800000| 0%| F| |TAMS 0x00000007c0600000, 0x00000007c0600000| Untracked -|1520|0x00000007c0800000, 0x00000007c0800000, 0x00000007c0a00000| 0%| F| |TAMS 0x00000007c0800000, 0x00000007c0800000| Untracked -|1521|0x00000007c0a00000, 0x00000007c0a00000, 0x00000007c0c00000| 0%| F| |TAMS 0x00000007c0a00000, 0x00000007c0a00000| Untracked -|1522|0x00000007c0c00000, 0x00000007c0c00000, 0x00000007c0e00000| 0%| F| |TAMS 0x00000007c0c00000, 0x00000007c0c00000| Untracked -|1523|0x00000007c0e00000, 0x00000007c0e00000, 0x00000007c1000000| 0%| F| |TAMS 0x00000007c0e00000, 0x00000007c0e00000| Untracked -|1524|0x00000007c1000000, 0x00000007c1000000, 0x00000007c1200000| 0%| F| |TAMS 0x00000007c1000000, 0x00000007c1000000| Untracked -|1525|0x00000007c1200000, 0x00000007c1200000, 0x00000007c1400000| 0%| F| |TAMS 0x00000007c1200000, 0x00000007c1200000| Untracked -|1526|0x00000007c1400000, 0x00000007c1400000, 0x00000007c1600000| 0%| F| |TAMS 0x00000007c1400000, 0x00000007c1400000| Untracked -|1527|0x00000007c1600000, 0x00000007c1600000, 0x00000007c1800000| 0%| F| |TAMS 0x00000007c1600000, 0x00000007c1600000| Untracked -|1528|0x00000007c1800000, 0x00000007c1800000, 0x00000007c1a00000| 0%| F| |TAMS 0x00000007c1800000, 0x00000007c1800000| Untracked -|1529|0x00000007c1a00000, 0x00000007c1a00000, 0x00000007c1c00000| 0%| F| |TAMS 0x00000007c1a00000, 0x00000007c1a00000| Untracked -|1530|0x00000007c1c00000, 0x00000007c1c00000, 0x00000007c1e00000| 0%| F| |TAMS 0x00000007c1c00000, 0x00000007c1c00000| Untracked -|1531|0x00000007c1e00000, 0x00000007c1e00000, 0x00000007c2000000| 0%| F| |TAMS 0x00000007c1e00000, 0x00000007c1e00000| Untracked -|1532|0x00000007c2000000, 0x00000007c2000000, 0x00000007c2200000| 0%| F| |TAMS 0x00000007c2000000, 0x00000007c2000000| Untracked -|1533|0x00000007c2200000, 0x00000007c2200000, 0x00000007c2400000| 0%| F| |TAMS 0x00000007c2200000, 0x00000007c2200000| Untracked -|1534|0x00000007c2400000, 0x00000007c2400000, 0x00000007c2600000| 0%| F| |TAMS 0x00000007c2400000, 0x00000007c2400000| Untracked -|1535|0x00000007c2600000, 0x00000007c2600000, 0x00000007c2800000| 0%| F| |TAMS 0x00000007c2600000, 0x00000007c2600000| Untracked -|1536|0x00000007c2800000, 0x00000007c2800000, 0x00000007c2a00000| 0%| F| |TAMS 0x00000007c2800000, 0x00000007c2800000| Untracked -|1537|0x00000007c2a00000, 0x00000007c2a00000, 0x00000007c2c00000| 0%| F| |TAMS 0x00000007c2a00000, 0x00000007c2a00000| Untracked -|1538|0x00000007c2c00000, 0x00000007c2c00000, 0x00000007c2e00000| 0%| F| |TAMS 0x00000007c2c00000, 0x00000007c2c00000| Untracked -|1539|0x00000007c2e00000, 0x00000007c2e00000, 0x00000007c3000000| 0%| F| |TAMS 0x00000007c2e00000, 0x00000007c2e00000| Untracked -|1540|0x00000007c3000000, 0x00000007c3000000, 0x00000007c3200000| 0%| F| |TAMS 0x00000007c3000000, 0x00000007c3000000| Untracked -|1541|0x00000007c3200000, 0x00000007c3200000, 0x00000007c3400000| 0%| F| |TAMS 0x00000007c3200000, 0x00000007c3200000| Untracked -|1542|0x00000007c3400000, 0x00000007c3400000, 0x00000007c3600000| 0%| F| |TAMS 0x00000007c3400000, 0x00000007c3400000| Untracked -|1543|0x00000007c3600000, 0x00000007c3600000, 0x00000007c3800000| 0%| F| |TAMS 0x00000007c3600000, 0x00000007c3600000| Untracked -|1544|0x00000007c3800000, 0x00000007c3800000, 0x00000007c3a00000| 0%| F| |TAMS 0x00000007c3800000, 0x00000007c3800000| Untracked -|1545|0x00000007c3a00000, 0x00000007c3a00000, 0x00000007c3c00000| 0%| F| |TAMS 0x00000007c3a00000, 0x00000007c3a00000| Untracked -|1546|0x00000007c3c00000, 0x00000007c3c00000, 0x00000007c3e00000| 0%| F| |TAMS 0x00000007c3c00000, 0x00000007c3c00000| Untracked -|1547|0x00000007c3e00000, 0x00000007c3e00000, 0x00000007c4000000| 0%| F| |TAMS 0x00000007c3e00000, 0x00000007c3e00000| Untracked -|1548|0x00000007c4000000, 0x00000007c4000000, 0x00000007c4200000| 0%| F| |TAMS 0x00000007c4000000, 0x00000007c4000000| Untracked -|1549|0x00000007c4200000, 0x00000007c4200000, 0x00000007c4400000| 0%| F| |TAMS 0x00000007c4200000, 0x00000007c4200000| Untracked -|1550|0x00000007c4400000, 0x00000007c4400000, 0x00000007c4600000| 0%| F| |TAMS 0x00000007c4400000, 0x00000007c4400000| Untracked -|1551|0x00000007c4600000, 0x00000007c4600000, 0x00000007c4800000| 0%| F| |TAMS 0x00000007c4600000, 0x00000007c4600000| Untracked -|1552|0x00000007c4800000, 0x00000007c4800000, 0x00000007c4a00000| 0%| F| |TAMS 0x00000007c4800000, 0x00000007c4800000| Untracked -|1553|0x00000007c4a00000, 0x00000007c4a00000, 0x00000007c4c00000| 0%| F| |TAMS 0x00000007c4a00000, 0x00000007c4a00000| Untracked -|1554|0x00000007c4c00000, 0x00000007c4c00000, 0x00000007c4e00000| 0%| F| |TAMS 0x00000007c4c00000, 0x00000007c4c00000| Untracked -|1555|0x00000007c4e00000, 0x00000007c4e00000, 0x00000007c5000000| 0%| F| |TAMS 0x00000007c4e00000, 0x00000007c4e00000| Untracked -|1556|0x00000007c5000000, 0x00000007c5000000, 0x00000007c5200000| 0%| F| |TAMS 0x00000007c5000000, 0x00000007c5000000| Untracked -|1557|0x00000007c5200000, 0x00000007c5200000, 0x00000007c5400000| 0%| F| |TAMS 0x00000007c5200000, 0x00000007c5200000| Untracked -|1558|0x00000007c5400000, 0x00000007c5400000, 0x00000007c5600000| 0%| F| |TAMS 0x00000007c5400000, 0x00000007c5400000| Untracked -|1559|0x00000007c5600000, 0x00000007c5600000, 0x00000007c5800000| 0%| F| |TAMS 0x00000007c5600000, 0x00000007c5600000| Untracked -|1560|0x00000007c5800000, 0x00000007c5800000, 0x00000007c5a00000| 0%| F| |TAMS 0x00000007c5800000, 0x00000007c5800000| Untracked -|1561|0x00000007c5a00000, 0x00000007c5a00000, 0x00000007c5c00000| 0%| F| |TAMS 0x00000007c5a00000, 0x00000007c5a00000| Untracked -|1562|0x00000007c5c00000, 0x00000007c5c00000, 0x00000007c5e00000| 0%| F| |TAMS 0x00000007c5c00000, 0x00000007c5c00000| Untracked -|1563|0x00000007c5e00000, 0x00000007c5e00000, 0x00000007c6000000| 0%| F| |TAMS 0x00000007c5e00000, 0x00000007c5e00000| Untracked -|1564|0x00000007c6000000, 0x00000007c6000000, 0x00000007c6200000| 0%| F| |TAMS 0x00000007c6000000, 0x00000007c6000000| Untracked -|1565|0x00000007c6200000, 0x00000007c6200000, 0x00000007c6400000| 0%| F| |TAMS 0x00000007c6200000, 0x00000007c6200000| Untracked -|1566|0x00000007c6400000, 0x00000007c6400000, 0x00000007c6600000| 0%| F| |TAMS 0x00000007c6400000, 0x00000007c6400000| Untracked -|1567|0x00000007c6600000, 0x00000007c6600000, 0x00000007c6800000| 0%| F| |TAMS 0x00000007c6600000, 0x00000007c6600000| Untracked -|1568|0x00000007c6800000, 0x00000007c6800000, 0x00000007c6a00000| 0%| F| |TAMS 0x00000007c6800000, 0x00000007c6800000| Untracked -|1569|0x00000007c6a00000, 0x00000007c6a00000, 0x00000007c6c00000| 0%| F| |TAMS 0x00000007c6a00000, 0x00000007c6a00000| Untracked -|1570|0x00000007c6c00000, 0x00000007c6c00000, 0x00000007c6e00000| 0%| F| |TAMS 0x00000007c6c00000, 0x00000007c6c00000| Untracked -|1571|0x00000007c6e00000, 0x00000007c6e00000, 0x00000007c7000000| 0%| F| |TAMS 0x00000007c6e00000, 0x00000007c6e00000| Untracked -|1572|0x00000007c7000000, 0x00000007c7000000, 0x00000007c7200000| 0%| F| |TAMS 0x00000007c7000000, 0x00000007c7000000| Untracked -|1573|0x00000007c7200000, 0x00000007c7200000, 0x00000007c7400000| 0%| F| |TAMS 0x00000007c7200000, 0x00000007c7200000| Untracked -|1574|0x00000007c7400000, 0x00000007c7400000, 0x00000007c7600000| 0%| F| |TAMS 0x00000007c7400000, 0x00000007c7400000| Untracked -|1575|0x00000007c7600000, 0x00000007c7600000, 0x00000007c7800000| 0%| F| |TAMS 0x00000007c7600000, 0x00000007c7600000| Untracked -|1576|0x00000007c7800000, 0x00000007c7800000, 0x00000007c7a00000| 0%| F| |TAMS 0x00000007c7800000, 0x00000007c7800000| Untracked -|1577|0x00000007c7a00000, 0x00000007c7a00000, 0x00000007c7c00000| 0%| F| |TAMS 0x00000007c7a00000, 0x00000007c7a00000| Untracked -|1578|0x00000007c7c00000, 0x00000007c7c00000, 0x00000007c7e00000| 0%| F| |TAMS 0x00000007c7c00000, 0x00000007c7c00000| Untracked -|1579|0x00000007c7e00000, 0x00000007c7e00000, 0x00000007c8000000| 0%| F| |TAMS 0x00000007c7e00000, 0x00000007c7e00000| Untracked -|1580|0x00000007c8000000, 0x00000007c8000000, 0x00000007c8200000| 0%| F| |TAMS 0x00000007c8000000, 0x00000007c8000000| Untracked -|1581|0x00000007c8200000, 0x00000007c8200000, 0x00000007c8400000| 0%| F| |TAMS 0x00000007c8200000, 0x00000007c8200000| Untracked -|1582|0x00000007c8400000, 0x00000007c8400000, 0x00000007c8600000| 0%| F| |TAMS 0x00000007c8400000, 0x00000007c8400000| Untracked -|1583|0x00000007c8600000, 0x00000007c8600000, 0x00000007c8800000| 0%| F| |TAMS 0x00000007c8600000, 0x00000007c8600000| Untracked -|1584|0x00000007c8800000, 0x00000007c8800000, 0x00000007c8a00000| 0%| F| |TAMS 0x00000007c8800000, 0x00000007c8800000| Untracked -|1585|0x00000007c8a00000, 0x00000007c8a00000, 0x00000007c8c00000| 0%| F| |TAMS 0x00000007c8a00000, 0x00000007c8a00000| Untracked -|1586|0x00000007c8c00000, 0x00000007c8c00000, 0x00000007c8e00000| 0%| F| |TAMS 0x00000007c8c00000, 0x00000007c8c00000| Untracked -|1587|0x00000007c8e00000, 0x00000007c8e00000, 0x00000007c9000000| 0%| F| |TAMS 0x00000007c8e00000, 0x00000007c8e00000| Untracked -|1588|0x00000007c9000000, 0x00000007c9000000, 0x00000007c9200000| 0%| F| |TAMS 0x00000007c9000000, 0x00000007c9000000| Untracked -|1589|0x00000007c9200000, 0x00000007c9200000, 0x00000007c9400000| 0%| F| |TAMS 0x00000007c9200000, 0x00000007c9200000| Untracked -|1590|0x00000007c9400000, 0x00000007c9400000, 0x00000007c9600000| 0%| F| |TAMS 0x00000007c9400000, 0x00000007c9400000| Untracked -|1591|0x00000007c9600000, 0x00000007c9600000, 0x00000007c9800000| 0%| F| |TAMS 0x00000007c9600000, 0x00000007c9600000| Untracked -|1592|0x00000007c9800000, 0x00000007c9800000, 0x00000007c9a00000| 0%| F| |TAMS 0x00000007c9800000, 0x00000007c9800000| Untracked -|1593|0x00000007c9a00000, 0x00000007c9a00000, 0x00000007c9c00000| 0%| F| |TAMS 0x00000007c9a00000, 0x00000007c9a00000| Untracked -|1594|0x00000007c9c00000, 0x00000007c9c00000, 0x00000007c9e00000| 0%| F| |TAMS 0x00000007c9c00000, 0x00000007c9c00000| Untracked -|1595|0x00000007c9e00000, 0x00000007c9e00000, 0x00000007ca000000| 0%| F| |TAMS 0x00000007c9e00000, 0x00000007c9e00000| Untracked -|1596|0x00000007ca000000, 0x00000007ca000000, 0x00000007ca200000| 0%| F| |TAMS 0x00000007ca000000, 0x00000007ca000000| Untracked -|1597|0x00000007ca200000, 0x00000007ca200000, 0x00000007ca400000| 0%| F| |TAMS 0x00000007ca200000, 0x00000007ca200000| Untracked -|1598|0x00000007ca400000, 0x00000007ca400000, 0x00000007ca600000| 0%| F| |TAMS 0x00000007ca400000, 0x00000007ca400000| Untracked -|1599|0x00000007ca600000, 0x00000007ca600000, 0x00000007ca800000| 0%| F| |TAMS 0x00000007ca600000, 0x00000007ca600000| Untracked -|1600|0x00000007ca800000, 0x00000007ca800000, 0x00000007caa00000| 0%| F| |TAMS 0x00000007ca800000, 0x00000007ca800000| Untracked -|1601|0x00000007caa00000, 0x00000007caa00000, 0x00000007cac00000| 0%| F| |TAMS 0x00000007caa00000, 0x00000007caa00000| Untracked -|1602|0x00000007cac00000, 0x00000007cac00000, 0x00000007cae00000| 0%| F| |TAMS 0x00000007cac00000, 0x00000007cac00000| Untracked -|1603|0x00000007cae00000, 0x00000007cae00000, 0x00000007cb000000| 0%| F| |TAMS 0x00000007cae00000, 0x00000007cae00000| Untracked -|1604|0x00000007cb000000, 0x00000007cb000000, 0x00000007cb200000| 0%| F| |TAMS 0x00000007cb000000, 0x00000007cb000000| Untracked -|1605|0x00000007cb200000, 0x00000007cb200000, 0x00000007cb400000| 0%| F| |TAMS 0x00000007cb200000, 0x00000007cb200000| Untracked -|1606|0x00000007cb400000, 0x00000007cb400000, 0x00000007cb600000| 0%| F| |TAMS 0x00000007cb400000, 0x00000007cb400000| Untracked -|1607|0x00000007cb600000, 0x00000007cb600000, 0x00000007cb800000| 0%| F| |TAMS 0x00000007cb600000, 0x00000007cb600000| Untracked -|1608|0x00000007cb800000, 0x00000007cb800000, 0x00000007cba00000| 0%| F| |TAMS 0x00000007cb800000, 0x00000007cb800000| Untracked -|1609|0x00000007cba00000, 0x00000007cba00000, 0x00000007cbc00000| 0%| F| |TAMS 0x00000007cba00000, 0x00000007cba00000| Untracked -|1610|0x00000007cbc00000, 0x00000007cbc00000, 0x00000007cbe00000| 0%| F| |TAMS 0x00000007cbc00000, 0x00000007cbc00000| Untracked -|1611|0x00000007cbe00000, 0x00000007cbe00000, 0x00000007cc000000| 0%| F| |TAMS 0x00000007cbe00000, 0x00000007cbe00000| Untracked -|1612|0x00000007cc000000, 0x00000007cc000000, 0x00000007cc200000| 0%| F| |TAMS 0x00000007cc000000, 0x00000007cc000000| Untracked -|1613|0x00000007cc200000, 0x00000007cc200000, 0x00000007cc400000| 0%| F| |TAMS 0x00000007cc200000, 0x00000007cc200000| Untracked -|1614|0x00000007cc400000, 0x00000007cc400000, 0x00000007cc600000| 0%| F| |TAMS 0x00000007cc400000, 0x00000007cc400000| Untracked -|1615|0x00000007cc600000, 0x00000007cc600000, 0x00000007cc800000| 0%| F| |TAMS 0x00000007cc600000, 0x00000007cc600000| Untracked -|1616|0x00000007cc800000, 0x00000007cc800000, 0x00000007cca00000| 0%| F| |TAMS 0x00000007cc800000, 0x00000007cc800000| Untracked -|1617|0x00000007cca00000, 0x00000007cca00000, 0x00000007ccc00000| 0%| F| |TAMS 0x00000007cca00000, 0x00000007cca00000| Untracked -|1618|0x00000007ccc00000, 0x00000007ccc00000, 0x00000007cce00000| 0%| F| |TAMS 0x00000007ccc00000, 0x00000007ccc00000| Untracked -|1619|0x00000007cce00000, 0x00000007cce00000, 0x00000007cd000000| 0%| F| |TAMS 0x00000007cce00000, 0x00000007cce00000| Untracked -|1620|0x00000007cd000000, 0x00000007cd000000, 0x00000007cd200000| 0%| F| |TAMS 0x00000007cd000000, 0x00000007cd000000| Untracked -|1621|0x00000007cd200000, 0x00000007cd200000, 0x00000007cd400000| 0%| F| |TAMS 0x00000007cd200000, 0x00000007cd200000| Untracked -|1622|0x00000007cd400000, 0x00000007cd400000, 0x00000007cd600000| 0%| F| |TAMS 0x00000007cd400000, 0x00000007cd400000| Untracked -|1623|0x00000007cd600000, 0x00000007cd600000, 0x00000007cd800000| 0%| F| |TAMS 0x00000007cd600000, 0x00000007cd600000| Untracked -|1624|0x00000007cd800000, 0x00000007cd800000, 0x00000007cda00000| 0%| F| |TAMS 0x00000007cd800000, 0x00000007cd800000| Untracked -|1625|0x00000007cda00000, 0x00000007cda00000, 0x00000007cdc00000| 0%| F| |TAMS 0x00000007cda00000, 0x00000007cda00000| Untracked -|1626|0x00000007cdc00000, 0x00000007cdc00000, 0x00000007cde00000| 0%| F| |TAMS 0x00000007cdc00000, 0x00000007cdc00000| Untracked -|1627|0x00000007cde00000, 0x00000007cde00000, 0x00000007ce000000| 0%| F| |TAMS 0x00000007cde00000, 0x00000007cde00000| Untracked -|1628|0x00000007ce000000, 0x00000007ce000000, 0x00000007ce200000| 0%| F| |TAMS 0x00000007ce000000, 0x00000007ce000000| Untracked -|1629|0x00000007ce200000, 0x00000007ce200000, 0x00000007ce400000| 0%| F| |TAMS 0x00000007ce200000, 0x00000007ce200000| Untracked -|1630|0x00000007ce400000, 0x00000007ce400000, 0x00000007ce600000| 0%| F| |TAMS 0x00000007ce400000, 0x00000007ce400000| Untracked -|1631|0x00000007ce600000, 0x00000007ce600000, 0x00000007ce800000| 0%| F| |TAMS 0x00000007ce600000, 0x00000007ce600000| Untracked -|1632|0x00000007ce800000, 0x00000007ce800000, 0x00000007cea00000| 0%| F| |TAMS 0x00000007ce800000, 0x00000007ce800000| Untracked -|1633|0x00000007cea00000, 0x00000007cea00000, 0x00000007cec00000| 0%| F| |TAMS 0x00000007cea00000, 0x00000007cea00000| Untracked -|1634|0x00000007cec00000, 0x00000007cec00000, 0x00000007cee00000| 0%| F| |TAMS 0x00000007cec00000, 0x00000007cec00000| Untracked -|1635|0x00000007cee00000, 0x00000007cee00000, 0x00000007cf000000| 0%| F| |TAMS 0x00000007cee00000, 0x00000007cee00000| Untracked -|1636|0x00000007cf000000, 0x00000007cf000000, 0x00000007cf200000| 0%| F| |TAMS 0x00000007cf000000, 0x00000007cf000000| Untracked -|1637|0x00000007cf200000, 0x00000007cf200000, 0x00000007cf400000| 0%| F| |TAMS 0x00000007cf200000, 0x00000007cf200000| Untracked -|1638|0x00000007cf400000, 0x00000007cf400000, 0x00000007cf600000| 0%| F| |TAMS 0x00000007cf400000, 0x00000007cf400000| Untracked -|1639|0x00000007cf600000, 0x00000007cf600000, 0x00000007cf800000| 0%| F| |TAMS 0x00000007cf600000, 0x00000007cf600000| Untracked -|1640|0x00000007cf800000, 0x00000007cf800000, 0x00000007cfa00000| 0%| F| |TAMS 0x00000007cf800000, 0x00000007cf800000| Untracked -|1641|0x00000007cfa00000, 0x00000007cfa00000, 0x00000007cfc00000| 0%| F| |TAMS 0x00000007cfa00000, 0x00000007cfa00000| Untracked -|1642|0x00000007cfc00000, 0x00000007cfc00000, 0x00000007cfe00000| 0%| F| |TAMS 0x00000007cfc00000, 0x00000007cfc00000| Untracked -|1643|0x00000007cfe00000, 0x00000007cfe00000, 0x00000007d0000000| 0%| F| |TAMS 0x00000007cfe00000, 0x00000007cfe00000| Untracked -|1644|0x00000007d0000000, 0x00000007d0000000, 0x00000007d0200000| 0%| F| |TAMS 0x00000007d0000000, 0x00000007d0000000| Untracked -|1645|0x00000007d0200000, 0x00000007d0200000, 0x00000007d0400000| 0%| F| |TAMS 0x00000007d0200000, 0x00000007d0200000| Untracked -|1646|0x00000007d0400000, 0x00000007d0400000, 0x00000007d0600000| 0%| F| |TAMS 0x00000007d0400000, 0x00000007d0400000| Untracked -|1647|0x00000007d0600000, 0x00000007d0600000, 0x00000007d0800000| 0%| F| |TAMS 0x00000007d0600000, 0x00000007d0600000| Untracked -|1648|0x00000007d0800000, 0x00000007d0800000, 0x00000007d0a00000| 0%| F| |TAMS 0x00000007d0800000, 0x00000007d0800000| Untracked -|1649|0x00000007d0a00000, 0x00000007d0a00000, 0x00000007d0c00000| 0%| F| |TAMS 0x00000007d0a00000, 0x00000007d0a00000| Untracked -|1650|0x00000007d0c00000, 0x00000007d0c00000, 0x00000007d0e00000| 0%| F| |TAMS 0x00000007d0c00000, 0x00000007d0c00000| Untracked -|1651|0x00000007d0e00000, 0x00000007d0e00000, 0x00000007d1000000| 0%| F| |TAMS 0x00000007d0e00000, 0x00000007d0e00000| Untracked -|1652|0x00000007d1000000, 0x00000007d1000000, 0x00000007d1200000| 0%| F| |TAMS 0x00000007d1000000, 0x00000007d1000000| Untracked -|1653|0x00000007d1200000, 0x00000007d1200000, 0x00000007d1400000| 0%| F| |TAMS 0x00000007d1200000, 0x00000007d1200000| Untracked -|1654|0x00000007d1400000, 0x00000007d1400000, 0x00000007d1600000| 0%| F| |TAMS 0x00000007d1400000, 0x00000007d1400000| Untracked -|1655|0x00000007d1600000, 0x00000007d1600000, 0x00000007d1800000| 0%| F| |TAMS 0x00000007d1600000, 0x00000007d1600000| Untracked -|1656|0x00000007d1800000, 0x00000007d1800000, 0x00000007d1a00000| 0%| F| |TAMS 0x00000007d1800000, 0x00000007d1800000| Untracked -|1657|0x00000007d1a00000, 0x00000007d1a00000, 0x00000007d1c00000| 0%| F| |TAMS 0x00000007d1a00000, 0x00000007d1a00000| Untracked -|1658|0x00000007d1c00000, 0x00000007d1c00000, 0x00000007d1e00000| 0%| F| |TAMS 0x00000007d1c00000, 0x00000007d1c00000| Untracked -|1659|0x00000007d1e00000, 0x00000007d1e00000, 0x00000007d2000000| 0%| F| |TAMS 0x00000007d1e00000, 0x00000007d1e00000| Untracked -|1660|0x00000007d2000000, 0x00000007d2000000, 0x00000007d2200000| 0%| F| |TAMS 0x00000007d2000000, 0x00000007d2000000| Untracked -|1661|0x00000007d2200000, 0x00000007d2200000, 0x00000007d2400000| 0%| F| |TAMS 0x00000007d2200000, 0x00000007d2200000| Untracked -|1662|0x00000007d2400000, 0x00000007d2400000, 0x00000007d2600000| 0%| F| |TAMS 0x00000007d2400000, 0x00000007d2400000| Untracked -|1663|0x00000007d2600000, 0x00000007d2600000, 0x00000007d2800000| 0%| F| |TAMS 0x00000007d2600000, 0x00000007d2600000| Untracked -|1664|0x00000007d2800000, 0x00000007d2800000, 0x00000007d2a00000| 0%| F| |TAMS 0x00000007d2800000, 0x00000007d2800000| Untracked -|1665|0x00000007d2a00000, 0x00000007d2a00000, 0x00000007d2c00000| 0%| F| |TAMS 0x00000007d2a00000, 0x00000007d2a00000| Untracked -|1666|0x00000007d2c00000, 0x00000007d2c00000, 0x00000007d2e00000| 0%| F| |TAMS 0x00000007d2c00000, 0x00000007d2c00000| Untracked -|1667|0x00000007d2e00000, 0x00000007d2e00000, 0x00000007d3000000| 0%| F| |TAMS 0x00000007d2e00000, 0x00000007d2e00000| Untracked -|1668|0x00000007d3000000, 0x00000007d3000000, 0x00000007d3200000| 0%| F| |TAMS 0x00000007d3000000, 0x00000007d3000000| Untracked -|1669|0x00000007d3200000, 0x00000007d3200000, 0x00000007d3400000| 0%| F| |TAMS 0x00000007d3200000, 0x00000007d3200000| Untracked -|1670|0x00000007d3400000, 0x00000007d3400000, 0x00000007d3600000| 0%| F| |TAMS 0x00000007d3400000, 0x00000007d3400000| Untracked -|1671|0x00000007d3600000, 0x00000007d3600000, 0x00000007d3800000| 0%| F| |TAMS 0x00000007d3600000, 0x00000007d3600000| Untracked -|1672|0x00000007d3800000, 0x00000007d3800000, 0x00000007d3a00000| 0%| F| |TAMS 0x00000007d3800000, 0x00000007d3800000| Untracked -|1673|0x00000007d3a00000, 0x00000007d3a00000, 0x00000007d3c00000| 0%| F| |TAMS 0x00000007d3a00000, 0x00000007d3a00000| Untracked -|1674|0x00000007d3c00000, 0x00000007d3c00000, 0x00000007d3e00000| 0%| F| |TAMS 0x00000007d3c00000, 0x00000007d3c00000| Untracked -|1675|0x00000007d3e00000, 0x00000007d3e00000, 0x00000007d4000000| 0%| F| |TAMS 0x00000007d3e00000, 0x00000007d3e00000| Untracked -|1676|0x00000007d4000000, 0x00000007d4000000, 0x00000007d4200000| 0%| F| |TAMS 0x00000007d4000000, 0x00000007d4000000| Untracked -|1677|0x00000007d4200000, 0x00000007d4200000, 0x00000007d4400000| 0%| F| |TAMS 0x00000007d4200000, 0x00000007d4200000| Untracked -|1678|0x00000007d4400000, 0x00000007d4400000, 0x00000007d4600000| 0%| F| |TAMS 0x00000007d4400000, 0x00000007d4400000| Untracked -|1679|0x00000007d4600000, 0x00000007d4600000, 0x00000007d4800000| 0%| F| |TAMS 0x00000007d4600000, 0x00000007d4600000| Untracked -|1680|0x00000007d4800000, 0x00000007d4800000, 0x00000007d4a00000| 0%| F| |TAMS 0x00000007d4800000, 0x00000007d4800000| Untracked -|1681|0x00000007d4a00000, 0x00000007d4a00000, 0x00000007d4c00000| 0%| F| |TAMS 0x00000007d4a00000, 0x00000007d4a00000| Untracked -|1682|0x00000007d4c00000, 0x00000007d4c00000, 0x00000007d4e00000| 0%| F| |TAMS 0x00000007d4c00000, 0x00000007d4c00000| Untracked -|1683|0x00000007d4e00000, 0x00000007d4e00000, 0x00000007d5000000| 0%| F| |TAMS 0x00000007d4e00000, 0x00000007d4e00000| Untracked -|1684|0x00000007d5000000, 0x00000007d5000000, 0x00000007d5200000| 0%| F| |TAMS 0x00000007d5000000, 0x00000007d5000000| Untracked -|1685|0x00000007d5200000, 0x00000007d5200000, 0x00000007d5400000| 0%| F| |TAMS 0x00000007d5200000, 0x00000007d5200000| Untracked -|1686|0x00000007d5400000, 0x00000007d5400000, 0x00000007d5600000| 0%| F| |TAMS 0x00000007d5400000, 0x00000007d5400000| Untracked -|1687|0x00000007d5600000, 0x00000007d5600000, 0x00000007d5800000| 0%| F| |TAMS 0x00000007d5600000, 0x00000007d5600000| Untracked -|1688|0x00000007d5800000, 0x00000007d5800000, 0x00000007d5a00000| 0%| F| |TAMS 0x00000007d5800000, 0x00000007d5800000| Untracked -|1689|0x00000007d5a00000, 0x00000007d5a00000, 0x00000007d5c00000| 0%| F| |TAMS 0x00000007d5a00000, 0x00000007d5a00000| Untracked -|1690|0x00000007d5c00000, 0x00000007d5c00000, 0x00000007d5e00000| 0%| F| |TAMS 0x00000007d5c00000, 0x00000007d5c00000| Untracked -|1691|0x00000007d5e00000, 0x00000007d5e00000, 0x00000007d6000000| 0%| F| |TAMS 0x00000007d5e00000, 0x00000007d5e00000| Untracked -|1692|0x00000007d6000000, 0x00000007d6000000, 0x00000007d6200000| 0%| F| |TAMS 0x00000007d6000000, 0x00000007d6000000| Untracked -|1693|0x00000007d6200000, 0x00000007d6200000, 0x00000007d6400000| 0%| F| |TAMS 0x00000007d6200000, 0x00000007d6200000| Untracked -|1694|0x00000007d6400000, 0x00000007d6400000, 0x00000007d6600000| 0%| F| |TAMS 0x00000007d6400000, 0x00000007d6400000| Untracked -|1695|0x00000007d6600000, 0x00000007d6600000, 0x00000007d6800000| 0%| F| |TAMS 0x00000007d6600000, 0x00000007d6600000| Untracked -|1696|0x00000007d6800000, 0x00000007d6800000, 0x00000007d6a00000| 0%| F| |TAMS 0x00000007d6800000, 0x00000007d6800000| Untracked -|1697|0x00000007d6a00000, 0x00000007d6a00000, 0x00000007d6c00000| 0%| F| |TAMS 0x00000007d6a00000, 0x00000007d6a00000| Untracked -|1698|0x00000007d6c00000, 0x00000007d6c00000, 0x00000007d6e00000| 0%| F| |TAMS 0x00000007d6c00000, 0x00000007d6c00000| Untracked -|1699|0x00000007d6e00000, 0x00000007d6e00000, 0x00000007d7000000| 0%| F| |TAMS 0x00000007d6e00000, 0x00000007d6e00000| Untracked -|1700|0x00000007d7000000, 0x00000007d7000000, 0x00000007d7200000| 0%| F| |TAMS 0x00000007d7000000, 0x00000007d7000000| Untracked -|1701|0x00000007d7200000, 0x00000007d7200000, 0x00000007d7400000| 0%| F| |TAMS 0x00000007d7200000, 0x00000007d7200000| Untracked -|1702|0x00000007d7400000, 0x00000007d7400000, 0x00000007d7600000| 0%| F| |TAMS 0x00000007d7400000, 0x00000007d7400000| Untracked -|1703|0x00000007d7600000, 0x00000007d7600000, 0x00000007d7800000| 0%| F| |TAMS 0x00000007d7600000, 0x00000007d7600000| Untracked -|1704|0x00000007d7800000, 0x00000007d7800000, 0x00000007d7a00000| 0%| F| |TAMS 0x00000007d7800000, 0x00000007d7800000| Untracked -|1705|0x00000007d7a00000, 0x00000007d7a00000, 0x00000007d7c00000| 0%| F| |TAMS 0x00000007d7a00000, 0x00000007d7a00000| Untracked -|1706|0x00000007d7c00000, 0x00000007d7c00000, 0x00000007d7e00000| 0%| F| |TAMS 0x00000007d7c00000, 0x00000007d7c00000| Untracked -|1707|0x00000007d7e00000, 0x00000007d7e00000, 0x00000007d8000000| 0%| F| |TAMS 0x00000007d7e00000, 0x00000007d7e00000| Untracked -|1708|0x00000007d8000000, 0x00000007d8000000, 0x00000007d8200000| 0%| F| |TAMS 0x00000007d8000000, 0x00000007d8000000| Untracked -|1709|0x00000007d8200000, 0x00000007d8200000, 0x00000007d8400000| 0%| F| |TAMS 0x00000007d8200000, 0x00000007d8200000| Untracked -|1710|0x00000007d8400000, 0x00000007d8400000, 0x00000007d8600000| 0%| F| |TAMS 0x00000007d8400000, 0x00000007d8400000| Untracked -|1711|0x00000007d8600000, 0x00000007d8600000, 0x00000007d8800000| 0%| F| |TAMS 0x00000007d8600000, 0x00000007d8600000| Untracked -|1712|0x00000007d8800000, 0x00000007d8800000, 0x00000007d8a00000| 0%| F| |TAMS 0x00000007d8800000, 0x00000007d8800000| Untracked -|1713|0x00000007d8a00000, 0x00000007d8a00000, 0x00000007d8c00000| 0%| F| |TAMS 0x00000007d8a00000, 0x00000007d8a00000| Untracked -|1714|0x00000007d8c00000, 0x00000007d8c00000, 0x00000007d8e00000| 0%| F| |TAMS 0x00000007d8c00000, 0x00000007d8c00000| Untracked -|1715|0x00000007d8e00000, 0x00000007d8e00000, 0x00000007d9000000| 0%| F| |TAMS 0x00000007d8e00000, 0x00000007d8e00000| Untracked -|1716|0x00000007d9000000, 0x00000007d9000000, 0x00000007d9200000| 0%| F| |TAMS 0x00000007d9000000, 0x00000007d9000000| Untracked -|1717|0x00000007d9200000, 0x00000007d9200000, 0x00000007d9400000| 0%| F| |TAMS 0x00000007d9200000, 0x00000007d9200000| Untracked -|1718|0x00000007d9400000, 0x00000007d9400000, 0x00000007d9600000| 0%| F| |TAMS 0x00000007d9400000, 0x00000007d9400000| Untracked -|1719|0x00000007d9600000, 0x00000007d9600000, 0x00000007d9800000| 0%| F| |TAMS 0x00000007d9600000, 0x00000007d9600000| Untracked -|1720|0x00000007d9800000, 0x00000007d9800000, 0x00000007d9a00000| 0%| F| |TAMS 0x00000007d9800000, 0x00000007d9800000| Untracked -|1721|0x00000007d9a00000, 0x00000007d9a00000, 0x00000007d9c00000| 0%| F| |TAMS 0x00000007d9a00000, 0x00000007d9a00000| Untracked -|1722|0x00000007d9c00000, 0x00000007d9c00000, 0x00000007d9e00000| 0%| F| |TAMS 0x00000007d9c00000, 0x00000007d9c00000| Untracked -|1723|0x00000007d9e00000, 0x00000007d9e00000, 0x00000007da000000| 0%| F| |TAMS 0x00000007d9e00000, 0x00000007d9e00000| Untracked -|1724|0x00000007da000000, 0x00000007da000000, 0x00000007da200000| 0%| F| |TAMS 0x00000007da000000, 0x00000007da000000| Untracked -|1725|0x00000007da200000, 0x00000007da200000, 0x00000007da400000| 0%| F| |TAMS 0x00000007da200000, 0x00000007da200000| Untracked -|1726|0x00000007da400000, 0x00000007da400000, 0x00000007da600000| 0%| F| |TAMS 0x00000007da400000, 0x00000007da400000| Untracked -|1727|0x00000007da600000, 0x00000007da600000, 0x00000007da800000| 0%| F| |TAMS 0x00000007da600000, 0x00000007da600000| Untracked -|1728|0x00000007da800000, 0x00000007da800000, 0x00000007daa00000| 0%| F| |TAMS 0x00000007da800000, 0x00000007da800000| Untracked -|1729|0x00000007daa00000, 0x00000007daa00000, 0x00000007dac00000| 0%| F| |TAMS 0x00000007daa00000, 0x00000007daa00000| Untracked -|1730|0x00000007dac00000, 0x00000007dac00000, 0x00000007dae00000| 0%| F| |TAMS 0x00000007dac00000, 0x00000007dac00000| Untracked -|1731|0x00000007dae00000, 0x00000007dae00000, 0x00000007db000000| 0%| F| |TAMS 0x00000007dae00000, 0x00000007dae00000| Untracked -|1732|0x00000007db000000, 0x00000007db000000, 0x00000007db200000| 0%| F| |TAMS 0x00000007db000000, 0x00000007db000000| Untracked -|1733|0x00000007db200000, 0x00000007db200000, 0x00000007db400000| 0%| F| |TAMS 0x00000007db200000, 0x00000007db200000| Untracked -|1734|0x00000007db400000, 0x00000007db400000, 0x00000007db600000| 0%| F| |TAMS 0x00000007db400000, 0x00000007db400000| Untracked -|1735|0x00000007db600000, 0x00000007db600000, 0x00000007db800000| 0%| F| |TAMS 0x00000007db600000, 0x00000007db600000| Untracked -|1736|0x00000007db800000, 0x00000007db800000, 0x00000007dba00000| 0%| F| |TAMS 0x00000007db800000, 0x00000007db800000| Untracked -|1737|0x00000007dba00000, 0x00000007dba00000, 0x00000007dbc00000| 0%| F| |TAMS 0x00000007dba00000, 0x00000007dba00000| Untracked -|1738|0x00000007dbc00000, 0x00000007dbc00000, 0x00000007dbe00000| 0%| F| |TAMS 0x00000007dbc00000, 0x00000007dbc00000| Untracked -|1739|0x00000007dbe00000, 0x00000007dbe00000, 0x00000007dc000000| 0%| F| |TAMS 0x00000007dbe00000, 0x00000007dbe00000| Untracked -|1740|0x00000007dc000000, 0x00000007dc000000, 0x00000007dc200000| 0%| F| |TAMS 0x00000007dc000000, 0x00000007dc000000| Untracked -|1741|0x00000007dc200000, 0x00000007dc200000, 0x00000007dc400000| 0%| F| |TAMS 0x00000007dc200000, 0x00000007dc200000| Untracked -|1742|0x00000007dc400000, 0x00000007dc400000, 0x00000007dc600000| 0%| F| |TAMS 0x00000007dc400000, 0x00000007dc400000| Untracked -|1743|0x00000007dc600000, 0x00000007dc600000, 0x00000007dc800000| 0%| F| |TAMS 0x00000007dc600000, 0x00000007dc600000| Untracked -|1744|0x00000007dc800000, 0x00000007dc800000, 0x00000007dca00000| 0%| F| |TAMS 0x00000007dc800000, 0x00000007dc800000| Untracked -|1745|0x00000007dca00000, 0x00000007dca00000, 0x00000007dcc00000| 0%| F| |TAMS 0x00000007dca00000, 0x00000007dca00000| Untracked -|1746|0x00000007dcc00000, 0x00000007dcc00000, 0x00000007dce00000| 0%| F| |TAMS 0x00000007dcc00000, 0x00000007dcc00000| Untracked -|1747|0x00000007dce00000, 0x00000007dce00000, 0x00000007dd000000| 0%| F| |TAMS 0x00000007dce00000, 0x00000007dce00000| Untracked -|1748|0x00000007dd000000, 0x00000007dd000000, 0x00000007dd200000| 0%| F| |TAMS 0x00000007dd000000, 0x00000007dd000000| Untracked -|1749|0x00000007dd200000, 0x00000007dd200000, 0x00000007dd400000| 0%| F| |TAMS 0x00000007dd200000, 0x00000007dd200000| Untracked -|1750|0x00000007dd400000, 0x00000007dd400000, 0x00000007dd600000| 0%| F| |TAMS 0x00000007dd400000, 0x00000007dd400000| Untracked -|1751|0x00000007dd600000, 0x00000007dd600000, 0x00000007dd800000| 0%| F| |TAMS 0x00000007dd600000, 0x00000007dd600000| Untracked -|1752|0x00000007dd800000, 0x00000007dd800000, 0x00000007dda00000| 0%| F| |TAMS 0x00000007dd800000, 0x00000007dd800000| Untracked -|1753|0x00000007dda00000, 0x00000007dda00000, 0x00000007ddc00000| 0%| F| |TAMS 0x00000007dda00000, 0x00000007dda00000| Untracked -|1754|0x00000007ddc00000, 0x00000007ddc00000, 0x00000007dde00000| 0%| F| |TAMS 0x00000007ddc00000, 0x00000007ddc00000| Untracked -|1755|0x00000007dde00000, 0x00000007dde00000, 0x00000007de000000| 0%| F| |TAMS 0x00000007dde00000, 0x00000007dde00000| Untracked -|1756|0x00000007de000000, 0x00000007de000000, 0x00000007de200000| 0%| F| |TAMS 0x00000007de000000, 0x00000007de000000| Untracked -|1757|0x00000007de200000, 0x00000007de200000, 0x00000007de400000| 0%| F| |TAMS 0x00000007de200000, 0x00000007de200000| Untracked -|1758|0x00000007de400000, 0x00000007de400000, 0x00000007de600000| 0%| F| |TAMS 0x00000007de400000, 0x00000007de400000| Untracked -|1759|0x00000007de600000, 0x00000007de600000, 0x00000007de800000| 0%| F| |TAMS 0x00000007de600000, 0x00000007de600000| Untracked -|1760|0x00000007de800000, 0x00000007de800000, 0x00000007dea00000| 0%| F| |TAMS 0x00000007de800000, 0x00000007de800000| Untracked -|1761|0x00000007dea00000, 0x00000007dea00000, 0x00000007dec00000| 0%| F| |TAMS 0x00000007dea00000, 0x00000007dea00000| Untracked -|1762|0x00000007dec00000, 0x00000007dec00000, 0x00000007dee00000| 0%| F| |TAMS 0x00000007dec00000, 0x00000007dec00000| Untracked -|1763|0x00000007dee00000, 0x00000007dee00000, 0x00000007df000000| 0%| F| |TAMS 0x00000007dee00000, 0x00000007dee00000| Untracked -|1764|0x00000007df000000, 0x00000007df000000, 0x00000007df200000| 0%| F| |TAMS 0x00000007df000000, 0x00000007df000000| Untracked -|1765|0x00000007df200000, 0x00000007df200000, 0x00000007df400000| 0%| F| |TAMS 0x00000007df200000, 0x00000007df200000| Untracked -|1766|0x00000007df400000, 0x00000007df400000, 0x00000007df600000| 0%| F| |TAMS 0x00000007df400000, 0x00000007df400000| Untracked -|1767|0x00000007df600000, 0x00000007df600000, 0x00000007df800000| 0%| F| |TAMS 0x00000007df600000, 0x00000007df600000| Untracked -|1768|0x00000007df800000, 0x00000007df800000, 0x00000007dfa00000| 0%| F| |TAMS 0x00000007df800000, 0x00000007df800000| Untracked -|1769|0x00000007dfa00000, 0x00000007dfa00000, 0x00000007dfc00000| 0%| F| |TAMS 0x00000007dfa00000, 0x00000007dfa00000| Untracked -|1770|0x00000007dfc00000, 0x00000007dfc00000, 0x00000007dfe00000| 0%| F| |TAMS 0x00000007dfc00000, 0x00000007dfc00000| Untracked -|1771|0x00000007dfe00000, 0x00000007dfe00000, 0x00000007e0000000| 0%| F| |TAMS 0x00000007dfe00000, 0x00000007dfe00000| Untracked -|1772|0x00000007e0000000, 0x00000007e0000000, 0x00000007e0200000| 0%| F| |TAMS 0x00000007e0000000, 0x00000007e0000000| Untracked -|1773|0x00000007e0200000, 0x00000007e0200000, 0x00000007e0400000| 0%| F| |TAMS 0x00000007e0200000, 0x00000007e0200000| Untracked -|1774|0x00000007e0400000, 0x00000007e0400000, 0x00000007e0600000| 0%| F| |TAMS 0x00000007e0400000, 0x00000007e0400000| Untracked -|1775|0x00000007e0600000, 0x00000007e0600000, 0x00000007e0800000| 0%| F| |TAMS 0x00000007e0600000, 0x00000007e0600000| Untracked -|1776|0x00000007e0800000, 0x00000007e0800000, 0x00000007e0a00000| 0%| F| |TAMS 0x00000007e0800000, 0x00000007e0800000| Untracked - -Card table byte_map: [0x000001fbf8140000,0x000001fbf8930000] _byte_map_base: 0x000001fbf492c000 - -Marking Bits (Prev, Next): (CMBitMap*) 0x000001fbef3d29c0, (CMBitMap*) 0x000001fbef3d2980 - Prev Bits: [0x000001fb8f000000, 0x000001fb92f60000) - Next Bits: [0x000001fbf9120000, 0x000001fbfd080000) - -Polling page: 0x000001fbed530000 - -Metaspace: - -Usage: - Non-class: 122.00 MB used. - Class: 22.20 MB used. - Both: 144.19 MB used. - -Virtual space: - Non-class space: 128.00 MB reserved, 122.94 MB ( 96%) committed, 2 nodes. - Class space: 1.00 GB reserved, 23.00 MB ( 2%) committed, 1 nodes. - Both: 1.12 GB reserved, 145.94 MB ( 13%) committed. - -Chunk freelists: - Non-Class: 5.09 MB - Class: 9.03 MB - Both: 14.13 MB - -MaxMetaspaceSize: unlimited -CompressedClassSpaceSize: 1.00 GB -Initial GC threshold: 21.00 MB -Current GC threshold: 235.12 MB -CDS: on -MetaspaceReclaimPolicy: balanced - - commit_granule_bytes: 65536. - - commit_granule_words: 8192. - - virtual_space_node_default_size: 8388608. - - enlarge_chunks_in_place: 1. - - new_chunks_are_fully_committed: 0. - - uncommit_free_chunks: 1. - - use_allocation_guard: 0. - - handle_deallocations: 1. - - -Internal statistics: - -num_allocs_failed_limit: 12. -num_arena_births: 2830. -num_arena_deaths: 28. -num_vsnodes_births: 3. -num_vsnodes_deaths: 0. -num_space_committed: 2329. -num_space_uncommitted: 0. -num_chunks_returned_to_freelist: 52. -num_chunks_taken_from_freelist: 9150. -num_chunk_merges: 26. -num_chunk_splits: 5882. -num_chunks_enlarged: 3875. -num_inconsistent_stats: 0. - -CodeHeap 'non-profiled nmethods': size=119168Kb used=19388Kb max_used=19388Kb free=99779Kb - bounds [0x000001fb87ba0000, 0x000001fb88e90000, 0x000001fb8f000000] -CodeHeap 'profiled nmethods': size=119104Kb used=30503Kb max_used=30949Kb free=88601Kb - bounds [0x000001fb80000000, 0x000001fb81e70000, 0x000001fb87450000] -CodeHeap 'non-nmethods': size=7488Kb used=3061Kb max_used=4222Kb free=4426Kb - bounds [0x000001fb87450000, 0x000001fb87880000, 0x000001fb87ba0000] - total_blobs=20156 nmethods=17982 adapters=2084 - compilation: enabled - stopped_count=0, restarted_count=0 - full_count=0 - -Compilation events (20 events): -Event: 38.601 Thread 0x000001fbff59f8c0 nmethod 25018 0x000001fb88e8c210 code [0x000001fb88e8c3a0, 0x000001fb88e8c458] -Event: 38.601 Thread 0x000001fbff59f8c0 25011 4 java.util.stream.Nodes$IntArrayNode::asPrimitiveArray (5 bytes) -Event: 38.601 Thread 0x000001fbff59f8c0 nmethod 25011 0x000001fb88e8c510 code [0x000001fb88e8c6a0, 0x000001fb88e8c758] -Event: 38.601 Thread 0x000001fbff59f8c0 25019 4 java.util.stream.Nodes$IntFixedNodeBuilder::begin (52 bytes) -Event: 38.601 Thread 0x000001fbff59f8c0 nmethod 25019 0x000001fb88e8c810 code [0x000001fb88e8c9a0, 0x000001fb88e8ca58] -Event: 38.601 Thread 0x000001fbff59f8c0 25024 4 java.util.stream.Nodes$IntFixedNodeBuilder::build (5 bytes) -Event: 38.602 Thread 0x000001fbff59f8c0 nmethod 25024 0x000001fb88e8cb10 code [0x000001fb88e8cca0, 0x000001fb88e8cd58] -Event: 38.602 Thread 0x000001fbff59f8c0 24989 4 com.mojang.brigadier.tree.ArgumentCommandNode::hashCode (23 bytes) -Event: 38.604 Thread 0x000001fbff59f8c0 nmethod 24989 0x000001fb88e8ce10 code [0x000001fb88e8cfa0, 0x000001fb88e8d288] -Event: 38.604 Thread 0x000001fbff59f8c0 25114 4 java.lang.invoke.LambdaForm$MH/0x000001fb95222000::linkToTargetMethod (10 bytes) -Event: 38.605 Thread 0x000001fbff59f8c0 nmethod 25114 0x000001fb88e8d490 code [0x000001fb88e8d620, 0x000001fb88e8d6f8] -Event: 38.605 Thread 0x000001fbff59f8c0 25115 4 java.lang.invoke.LambdaForm$DMH/0x000001fb95221c00::newInvokeSpecial (27 bytes) -Event: 38.606 Thread 0x000001fbff59f8c0 nmethod 25115 0x000001fb88e8d810 code [0x000001fb88e8d9a0, 0x000001fb88e8dba8] -Event: 38.606 Thread 0x000001fbff59f8c0 24906 4 com.google.common.collect.ImmutableMap::isEmpty (13 bytes) -Event: 38.606 Thread 0x000001fbff59f8c0 nmethod 24906 0x000001fb88e8dd90 code [0x000001fb88e8df20, 0x000001fb88e8dfd8] -Event: 38.606 Thread 0x000001fbff59f8c0 24936 4 net.minecraft.advancements.Advancement::hashCode (8 bytes) -Event: 38.610 Thread 0x000001fbff59f8c0 nmethod 24936 0x000001fb88e8e090 code [0x000001fb88e8e240, 0x000001fb88e8e6f8] -Event: 38.610 Thread 0x000001fbff59f8c0 25002 4 com.mojang.brigadier.tree.ArgumentCommandNode::equals (59 bytes) -Event: 38.612 Thread 0x000001fbff59f8c0 nmethod 25002 0x000001fb88e8ea10 code [0x000001fb88e8ebc0, 0x000001fb88e8eee8] -Event: 38.612 Thread 0x000001fbff59f8c0 24886 4 net.minecraftforge.registries.NamespacedWrapper::getOptional (12 bytes) - -GC Heap History (20 events): -Event: 35.414 GC heap after -{Heap after GC invocations=58 (full 0): - garbage-first heap total 2318336K, used 1069538K [0x0000000702800000, 0x0000000800000000) - region size 2048K, 44 young (90112K), 44 survivors (90112K) - Metaspace used 142581K, committed 144320K, reserved 1179648K - class space used 21935K, committed 22720K, reserved 1048576K -} -Event: 35.444 GC heap before -{Heap before GC invocations=58 (full 0): - garbage-first heap total 2318336K, used 1094114K [0x0000000702800000, 0x0000000800000000) - region size 2048K, 56 young (114688K), 44 survivors (90112K) - Metaspace used 142584K, committed 144320K, reserved 1179648K - class space used 21936K, committed 22720K, reserved 1048576K -} -Event: 35.473 GC heap after -{Heap after GC invocations=59 (full 0): - garbage-first heap total 2318336K, used 1073108K [0x0000000702800000, 0x0000000800000000) - region size 2048K, 7 young (14336K), 7 survivors (14336K) - Metaspace used 142584K, committed 144320K, reserved 1179648K - class space used 21936K, committed 22720K, reserved 1048576K -} -Event: 35.735 GC heap before -{Heap before GC invocations=59 (full 0): - garbage-first heap total 2318336K, used 1699796K [0x0000000702800000, 0x0000000800000000) - region size 2048K, 313 young (641024K), 7 survivors (14336K) - Metaspace used 142590K, committed 144320K, reserved 1179648K - class space used 21936K, committed 22720K, reserved 1048576K -} -Event: 35.883 GC heap after -{Heap after GC invocations=60 (full 0): - garbage-first heap total 2318336K, used 1463269K [0x0000000702800000, 0x0000000800000000) - region size 2048K, 40 young (81920K), 40 survivors (81920K) - Metaspace used 142590K, committed 144320K, reserved 1179648K - class space used 21936K, committed 22720K, reserved 1048576K -} -Event: 36.003 GC heap before -{Heap before GC invocations=60 (full 0): - garbage-first heap total 2318336K, used 1764325K [0x0000000702800000, 0x0000000800000000) - region size 2048K, 187 young (382976K), 40 survivors (81920K) - Metaspace used 142591K, committed 144320K, reserved 1179648K - class space used 21936K, committed 22720K, reserved 1048576K -} -Event: 36.103 GC heap after -{Heap after GC invocations=61 (full 0): - garbage-first heap total 2318336K, used 1653760K [0x0000000702800000, 0x0000000800000000) - region size 2048K, 24 young (49152K), 24 survivors (49152K) - Metaspace used 142591K, committed 144320K, reserved 1179648K - class space used 21936K, committed 22720K, reserved 1048576K -} -Event: 36.181 GC heap before -{Heap before GC invocations=61 (full 0): - garbage-first heap total 2318336K, used 1840128K [0x0000000702800000, 0x0000000800000000) - region size 2048K, 115 young (235520K), 24 survivors (49152K) - Metaspace used 142593K, committed 144320K, reserved 1179648K - class space used 21936K, committed 22720K, reserved 1048576K -} -Event: 36.236 GC heap after -{Heap after GC invocations=62 (full 0): - garbage-first heap total 2318336K, used 1775616K [0x0000000702800000, 0x0000000800000000) - region size 2048K, 15 young (30720K), 15 survivors (30720K) - Metaspace used 142593K, committed 144320K, reserved 1179648K - class space used 21936K, committed 22720K, reserved 1048576K -} -Event: 36.295 GC heap before -{Heap before GC invocations=62 (full 0): - garbage-first heap total 2318336K, used 1904640K [0x0000000702800000, 0x0000000800000000) - region size 2048K, 78 young (159744K), 15 survivors (30720K) - Metaspace used 142593K, committed 144320K, reserved 1179648K - class space used 21936K, committed 22720K, reserved 1048576K -} -Event: 36.596 GC heap after -{Heap after GC invocations=63 (full 0): - garbage-first heap total 3053568K, used 1862656K [0x0000000702800000, 0x0000000800000000) - region size 2048K, 10 young (20480K), 10 survivors (20480K) - Metaspace used 142593K, committed 144320K, reserved 1179648K - class space used 21936K, committed 22720K, reserved 1048576K -} -Event: 36.754 GC heap before -{Heap before GC invocations=63 (full 0): - garbage-first heap total 3053568K, used 1993728K [0x0000000702800000, 0x0000000800000000) - region size 2048K, 74 young (151552K), 10 survivors (20480K) - Metaspace used 142593K, committed 144320K, reserved 1179648K - class space used 21936K, committed 22720K, reserved 1048576K -} -Event: 36.790 GC heap after -{Heap after GC invocations=64 (full 0): - garbage-first heap total 3053568K, used 1951744K [0x0000000702800000, 0x0000000800000000) - region size 2048K, 10 young (20480K), 10 survivors (20480K) - Metaspace used 142593K, committed 144320K, reserved 1179648K - class space used 21936K, committed 22720K, reserved 1048576K -} -Event: 37.050 GC heap before -{Heap before GC invocations=64 (full 0): - garbage-first heap total 3053568K, used 2291712K [0x0000000702800000, 0x0000000800000000) - region size 2048K, 176 young (360448K), 10 survivors (20480K) - Metaspace used 142607K, committed 144384K, reserved 1179648K - class space used 21939K, committed 22720K, reserved 1048576K -} -Event: 37.125 GC heap after -{Heap after GC invocations=65 (full 0): - garbage-first heap total 3053568K, used 2170880K [0x0000000702800000, 0x0000000800000000) - region size 2048K, 22 young (45056K), 22 survivors (45056K) - Metaspace used 142607K, committed 144384K, reserved 1179648K - class space used 21939K, committed 22720K, reserved 1048576K -} -Event: 37.519 GC heap before -{Heap before GC invocations=66 (full 0): - garbage-first heap total 3639296K, used 2408448K [0x0000000702800000, 0x0000000800000000) - region size 2048K, 138 young (282624K), 22 survivors (45056K) - Metaspace used 144432K, committed 146176K, reserved 1179648K - class space used 22184K, committed 22976K, reserved 1048576K -} -Event: 37.551 GC heap after -{Heap after GC invocations=67 (full 0): - garbage-first heap total 3639296K, used 2264064K [0x0000000702800000, 0x0000000800000000) - region size 2048K, 18 young (36864K), 18 survivors (36864K) - Metaspace used 144432K, committed 146176K, reserved 1179648K - class space used 22184K, committed 22976K, reserved 1048576K -} -Event: 37.694 GC heap before -{Heap before GC invocations=67 (full 0): - garbage-first heap total 3639296K, used 2405376K [0x0000000702800000, 0x0000000800000000) - region size 2048K, 88 young (180224K), 18 survivors (36864K) - Metaspace used 145442K, committed 147200K, reserved 1179648K - class space used 22368K, committed 23168K, reserved 1048576K -} -Event: 37.711 GC heap after -{Heap after GC invocations=68 (full 0): - garbage-first heap total 3639296K, used 2022400K [0x0000000702800000, 0x0000000800000000) - region size 2048K, 11 young (22528K), 11 survivors (22528K) - Metaspace used 145442K, committed 147200K, reserved 1179648K - class space used 22368K, committed 23168K, reserved 1048576K -} -Event: 38.667 GC heap before -{Heap before GC invocations=68 (full 0): - garbage-first heap total 3639296K, used 2612224K [0x0000000702800000, 0x0000000800000000) - region size 2048K, 297 young (608256K), 11 survivors (22528K) - Metaspace used 147655K, committed 149440K, reserved 1179648K - class space used 22729K, committed 23552K, reserved 1048576K -} - -Dll operation events (16 events): -Event: 0.007 Loaded shared library C:\Program Files\Eclipse Adoptium\jdk-17.0.17.10-hotspot\bin\java.dll -Event: 0.020 Loaded shared library C:\Program Files\Eclipse Adoptium\jdk-17.0.17.10-hotspot\bin\jsvml.dll -Event: 0.095 Loaded shared library C:\Program Files\Eclipse Adoptium\jdk-17.0.17.10-hotspot\bin\net.dll -Event: 0.096 Loaded shared library C:\Program Files\Eclipse Adoptium\jdk-17.0.17.10-hotspot\bin\nio.dll -Event: 0.098 Loaded shared library C:\Program Files\Eclipse Adoptium\jdk-17.0.17.10-hotspot\bin\zip.dll -Event: 0.144 Loaded shared library C:\Program Files\Eclipse Adoptium\jdk-17.0.17.10-hotspot\bin\jimage.dll -Event: 0.398 Loaded shared library C:\Program Files\Eclipse Adoptium\jdk-17.0.17.10-hotspot\bin\verify.dll -Event: 1.796 Loaded shared library C:\Program Files\Eclipse Adoptium\jdk-17.0.17.10-hotspot\bin\management.dll -Event: 1.800 Loaded shared library C:\Program Files\Eclipse Adoptium\jdk-17.0.17.10-hotspot\bin\management_ext.dll -Event: 2.531 Loaded shared library C:\Users\Utilisateur\AppData\Local\Temp\lwjglUtilisateur\3.3.1-build-7\lwjgl.dll -Event: 2.857 Loaded shared library C:\Users\Utilisateur\AppData\Local\Temp\lwjglUtilisateur\3.3.1-build-7\lwjgl_stb.dll -Event: 2.918 Loaded shared library C:\Users\Utilisateur\AppData\Local\Temp\lwjglUtilisateur\3.3.1-build-7\lwjgl_opengl.dll -Event: 8.196 Loaded shared library C:\Users\Utilisateur\AppData\Local\Temp\jna-1082121059\jna17725892220550122580.dll -Event: 14.504 Loaded shared library C:\Program Files\Eclipse Adoptium\jdk-17.0.17.10-hotspot\bin\sunmscapi.dll -Event: 14.705 Loaded shared library C:\Program Files\Eclipse Adoptium\jdk-17.0.17.10-hotspot\bin\extnet.dll -Event: 35.277 Loaded shared library C:\Program Files\Eclipse Adoptium\jdk-17.0.17.10-hotspot\bin\awt.dll - -Deoptimization events (20 events): -Event: 38.561 Thread 0x000001fbe8a2f800 DEOPT PACKING pc=0x000001fb81c357b6 sp=0x000000c5544feeb0 -Event: 38.561 Thread 0x000001fbe8a2f800 DEOPT UNPACKING pc=0x000001fb874a7143 sp=0x000000c5544fe3f0 mode 0 -Event: 38.562 Thread 0x000001fbe787fa80 DEOPT PACKING pc=0x000001fb81c357b6 sp=0x000000c5540fed40 -Event: 38.562 Thread 0x000001fbe787fa80 DEOPT UNPACKING pc=0x000001fb874a7143 sp=0x000000c5540fe280 mode 0 -Event: 38.563 Thread 0x000001fbe8a6f6a0 DEOPT PACKING pc=0x000001fb81c357b6 sp=0x000000c553cff190 -Event: 38.563 Thread 0x000001fbe8a6f6a0 DEOPT UNPACKING pc=0x000001fb874a7143 sp=0x000000c553cfe6d0 mode 0 -Event: 38.564 Thread 0x000001fbe8a31150 DEOPT PACKING pc=0x000001fb81c357b6 sp=0x000000c5549feee0 -Event: 38.564 Thread 0x000001fbe8a31150 DEOPT UNPACKING pc=0x000001fb874a7143 sp=0x000000c5549fe420 mode 0 -Event: 38.566 Thread 0x000001fbdff992d0 DEOPT PACKING pc=0x000001fb81c357b6 sp=0x000000c553fff270 -Event: 38.566 Thread 0x000001fbdff992d0 DEOPT UNPACKING pc=0x000001fb874a7143 sp=0x000000c553ffe7b0 mode 0 -Event: 38.567 Thread 0x000001fbe8a339d0 DEOPT PACKING pc=0x000001fb81c357b6 sp=0x000000c554fff3b0 -Event: 38.567 Thread 0x000001fbe8a339d0 DEOPT UNPACKING pc=0x000001fb874a7143 sp=0x000000c554ffe8f0 mode 0 -Event: 38.567 Thread 0x000001fbe8a6fbb0 DEOPT PACKING pc=0x000001fb81c357b6 sp=0x000000c553eff230 -Event: 38.567 Thread 0x000001fbe8a6fbb0 DEOPT UNPACKING pc=0x000001fb874a7143 sp=0x000000c553efe770 mode 0 -Event: 38.568 Thread 0x000001fbe8a6dd50 DEOPT PACKING pc=0x000001fb81c357b6 sp=0x000000c5523feda0 -Event: 38.568 Thread 0x000001fbe8a6dd50 DEOPT UNPACKING pc=0x000001fb874a7143 sp=0x000000c5523fe2e0 mode 0 -Event: 38.569 Thread 0x000001fbe8a2f800 DEOPT PACKING pc=0x000001fb81c357b6 sp=0x000000c5544feeb0 -Event: 38.569 Thread 0x000001fbe8a2f800 DEOPT UNPACKING pc=0x000001fb874a7143 sp=0x000000c5544fe3f0 mode 0 -Event: 38.570 Thread 0x000001fbe8a6f6a0 DEOPT PACKING pc=0x000001fb81c357b6 sp=0x000000c553cff190 -Event: 38.570 Thread 0x000001fbe8a6f6a0 DEOPT UNPACKING pc=0x000001fb874a7143 sp=0x000000c553cfe6d0 mode 0 - -Classes loaded (20 events): -Event: 37.471 Loading class java/nio/channels/NotYetConnectedException -Event: 37.471 Loading class java/nio/channels/NotYetConnectedException done -Event: 37.474 Loading class java/util/concurrent/atomic/AtomicLongFieldUpdater -Event: 37.475 Loading class java/util/concurrent/atomic/AtomicLongFieldUpdater done -Event: 37.475 Loading class java/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater -Event: 37.475 Loading class java/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater done -Event: 37.475 Loading class java/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater$1 -Event: 37.476 Loading class java/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater$1 done -Event: 37.566 Loading class java/nio/channels/AlreadyConnectedException -Event: 37.567 Loading class java/nio/channels/AlreadyConnectedException done -Event: 37.567 Loading class java/nio/channels/ConnectionPendingException -Event: 37.568 Loading class java/nio/channels/ConnectionPendingException done -Event: 37.578 Loading class java/nio/channels/UnsupportedAddressTypeException -Event: 37.579 Loading class java/nio/channels/UnsupportedAddressTypeException done -Event: 38.187 Loading class java/lang/Math$RandomNumberGeneratorHolder -Event: 38.187 Loading class java/lang/Math$RandomNumberGeneratorHolder done -Event: 38.271 Loading class java/util/IdentityHashMap$EntrySpliterator -Event: 38.273 Loading class java/util/IdentityHashMap$EntrySpliterator done -Event: 38.341 Loading class java/util/concurrent/PriorityBlockingQueue -Event: 38.342 Loading class java/util/concurrent/PriorityBlockingQueue done - -Classes unloaded (14 events): -Event: 17.039 Thread 0x000001fbff57a010 Unloading class 0x000001fb95c19c00 'java/lang/invoke/LambdaForm$DMH+0x000001fb95c19c00' -Event: 33.922 Thread 0x000001fbff57a010 Unloading class 0x000001fb9642c400 'java/lang/invoke/LambdaForm$DMH+0x000001fb9642c400' -Event: 33.922 Thread 0x000001fbff57a010 Unloading class 0x000001fb9642c800 'java/lang/invoke/LambdaForm$DMH+0x000001fb9642c800' -Event: 33.922 Thread 0x000001fbff57a010 Unloading class 0x000001fb9627a800 'java/lang/invoke/LambdaForm$DMH+0x000001fb9627a800' -Event: 33.922 Thread 0x000001fbff57a010 Unloading class 0x000001fb9627a400 'java/lang/invoke/LambdaForm$DMH+0x000001fb9627a400' -Event: 33.922 Thread 0x000001fbff57a010 Unloading class 0x000001fb9627a000 'java/lang/invoke/LambdaForm$DMH+0x000001fb9627a000' -Event: 33.922 Thread 0x000001fbff57a010 Unloading class 0x000001fb96279c00 'java/lang/invoke/LambdaForm$DMH+0x000001fb96279c00' -Event: 33.922 Thread 0x000001fbff57a010 Unloading class 0x000001fb96279400 'java/lang/invoke/LambdaForm$DMH+0x000001fb96279400' -Event: 33.922 Thread 0x000001fbff57a010 Unloading class 0x000001fb96279800 'java/lang/invoke/LambdaForm$DMH+0x000001fb96279800' -Event: 33.922 Thread 0x000001fbff57a010 Unloading class 0x000001fb96278c00 'java/lang/invoke/LambdaForm$DMH+0x000001fb96278c00' -Event: 33.922 Thread 0x000001fbff57a010 Unloading class 0x000001fb96279000 'java/lang/invoke/LambdaForm$DMH+0x000001fb96279000' -Event: 33.922 Thread 0x000001fbff57a010 Unloading class 0x000001fb96278800 'java/lang/invoke/LambdaForm$DMH+0x000001fb96278800' -Event: 33.922 Thread 0x000001fbff57a010 Unloading class 0x000001fb9624cc00 'java/lang/invoke/LambdaForm$DMH+0x000001fb9624cc00' -Event: 33.922 Thread 0x000001fbff57a010 Unloading class 0x000001fb9624c800 'java/lang/invoke/LambdaForm$DMH+0x000001fb9624c800' - -Classes redefined (0 events): -No events - -Internal exceptions (20 events): -Event: 37.329 Thread 0x000001fbe8a35830 Exception (0x00000007db04ecf0) -thrown [s\src\hotspot\share\prims\jni.cpp, line 516] -Event: 37.407 Thread 0x000001fbef365e40 Exception (0x00000007d815d3f8) -thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 759] -Event: 37.407 Thread 0x000001fbef365e40 Exception (0x00000007d81610d0) -thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 759] -Event: 37.432 Thread 0x000001fbe8a35830 Exception (0x00000007d71d4d68) -thrown [s\src\hotspot\share\prims\jni.cpp, line 516] -Event: 37.599 Thread 0x000001fbdff53480 Exception (0x00000007de179d98) -thrown [s\src\hotspot\share\prims\jni.cpp, line 516] -Event: 37.742 Thread 0x000001fbdff501e0 Exception (0x00000007df074bf0) -thrown [s\src\hotspot\share\prims\jni.cpp, line 516] -Event: 37.767 Thread 0x000001fbdff53480 Exception (0x00000007dd7a2890) -thrown [s\src\hotspot\share\prims\jni.cpp, line 516] -Event: 37.775 Thread 0x000001fbdff53480 Exception (0x00000007dcc9ab48) -thrown [s\src\hotspot\share\prims\jni.cpp, line 516] -Event: 37.861 Thread 0x000001fbdff53ea0 Exception (0x00000007d8d77488) -thrown [s\src\hotspot\share\prims\jni.cpp, line 516] -Event: 37.944 Thread 0x000001fbdff53480 Exception (0x00000007d23e1948) -thrown [s\src\hotspot\share\prims\jni.cpp, line 516] -Event: 37.957 Thread 0x000001fbe8a35830 Exception (0x00000007d17dbb08) -thrown [s\src\hotspot\share\prims\jni.cpp, line 516] -Event: 38.063 Thread 0x000001fbdff53480 Exception (0x00000007cb878568) -thrown [s\src\hotspot\share\prims\jni.cpp, line 516] -Event: 38.214 Thread 0x000001fbdff51620 Exception (0x00000007c5778898) -thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 826] -Event: 38.313 Thread 0x000001fbef365e40 Exception (0x00000007c4b4a298) -thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 759] -Event: 38.314 Thread 0x000001fbef365e40 Exception (0x00000007c4b4d978) -thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 759] -Event: 38.355 Thread 0x000001fbdff51620 Exception (0x00000007c479aa80) -thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 759] -Event: 38.355 Thread 0x000001fbdff51620 Exception (0x00000007c47a2340) -thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 759] -Event: 38.415 Thread 0x000001fbdff51620 Exception (0x00000007c45a16c0) -thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 759] -Event: 38.425 Thread 0x000001fbdff51620 Exception (0x00000007c45a5790) -thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 759] -Event: 38.425 Thread 0x000001fbdff51620 Exception (0x00000007c45a9318) -thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 759] - -VM Operations (20 events): -Event: 37.551 Executing VM operation: G1CollectForAllocation done -Event: 37.694 Executing VM operation: G1CollectForAllocation -Event: 37.711 Executing VM operation: G1CollectForAllocation done -Event: 37.799 Executing VM operation: HandshakeAllThreads -Event: 37.799 Executing VM operation: HandshakeAllThreads done -Event: 38.157 Executing VM operation: HandshakeAllThreads -Event: 38.157 Executing VM operation: HandshakeAllThreads done -Event: 38.249 Executing VM operation: HandshakeAllThreads -Event: 38.249 Executing VM operation: HandshakeAllThreads done -Event: 38.287 Executing VM operation: ICBufferFull -Event: 38.288 Executing VM operation: ICBufferFull done -Event: 38.308 Executing VM operation: HandshakeAllThreads -Event: 38.308 Executing VM operation: HandshakeAllThreads done -Event: 38.321 Executing VM operation: HandshakeAllThreads -Event: 38.321 Executing VM operation: HandshakeAllThreads done -Event: 38.325 Executing VM operation: HandshakeAllThreads -Event: 38.325 Executing VM operation: HandshakeAllThreads done -Event: 38.331 Executing VM operation: HandshakeAllThreads -Event: 38.331 Executing VM operation: HandshakeAllThreads done -Event: 38.626 Executing VM operation: G1CollectForAllocation - -Memory protections (0 events): -No events - -Nmethod flushes (20 events): -Event: 38.187 Thread 0x000001fb93429fc0 flushing nmethod 0x000001fb81b68290 -Event: 38.187 Thread 0x000001fb93429fc0 flushing nmethod 0x000001fb81b6a790 -Event: 38.187 Thread 0x000001fb93429fc0 flushing nmethod 0x000001fb81c1ec90 -Event: 38.187 Thread 0x000001fb93429fc0 flushing nmethod 0x000001fb81c4a410 -Event: 38.187 Thread 0x000001fb93429fc0 flushing nmethod 0x000001fb81c4fd90 -Event: 38.187 Thread 0x000001fb93429fc0 flushing nmethod 0x000001fb81c56990 -Event: 38.188 Thread 0x000001fb93429fc0 flushing nmethod 0x000001fb81d10f10 -Event: 38.188 Thread 0x000001fb93429fc0 flushing nmethod 0x000001fb81d53f90 -Event: 38.188 Thread 0x000001fb93429fc0 flushing nmethod 0x000001fb81d56290 -Event: 38.188 Thread 0x000001fb93429fc0 flushing nmethod 0x000001fb81d5ca10 -Event: 38.188 Thread 0x000001fb93429fc0 flushing nmethod 0x000001fb81d64f10 -Event: 38.188 Thread 0x000001fb93429fc0 flushing nmethod 0x000001fb81d6ba10 -Event: 38.188 Thread 0x000001fb93429fc0 flushing nmethod 0x000001fb81d90190 -Event: 38.188 Thread 0x000001fb93429fc0 flushing nmethod 0x000001fb81d93c90 -Event: 38.188 Thread 0x000001fb93429fc0 flushing nmethod 0x000001fb81da9490 -Event: 38.188 Thread 0x000001fb93429fc0 flushing osr nmethod 0x000001fb81da9a10 -Event: 38.188 Thread 0x000001fb93429fc0 flushing nmethod 0x000001fb81df9590 -Event: 38.188 Thread 0x000001fb93429fc0 flushing nmethod 0x000001fb81e1c210 -Event: 38.188 Thread 0x000001fb93429fc0 flushing nmethod 0x000001fb81e1f090 -Event: 38.188 Thread 0x000001fb93429fc0 flushing nmethod 0x000001fb81e2aa10 - -Events (20 events): -Event: 33.348 Thread 0x000001fbe8a35830 Thread added: 0x000001fbdff53480 -Event: 33.801 Thread 0x000001fbde3fa920 Thread exited: 0x000001fbde3fa920 -Event: 33.801 Thread 0x000001fbde3f8e90 Thread exited: 0x000001fbde3f8e90 -Event: 33.809 Thread 0x000001fbdc4abc60 Thread added: 0x000001fbde3f9930 -Event: 33.809 Thread 0x000001fbdc4abc60 Thread added: 0x000001fbde3fc3b0 -Event: 33.842 Thread 0x000001fbdff53480 Thread added: 0x000001fbdff501e0 -Event: 33.935 Thread 0x000001fbdff53480 Thread added: 0x000001fbdff53ea0 -Event: 33.938 Thread 0x000001fbe8a35d40 Thread exited: 0x000001fbe8a35d40 -Event: 33.938 Thread 0x000001fbe8a36250 Thread exited: 0x000001fbe8a36250 -Event: 33.938 Thread 0x000001fbe8a34900 Thread exited: 0x000001fbe8a34900 -Event: 35.293 Thread 0x000001fbdff51620 Thread added: 0x000001fbdff57650 -Event: 36.681 Thread 0x000001fbdc4abc60 Thread exited: 0x000001fbdc4abc60 -Event: 36.807 Thread 0x000001fbdc4af6d0 Thread exited: 0x000001fbdc4af6d0 -Event: 36.855 Thread 0x000001fbde3fc3b0 Thread exited: 0x000001fbde3fc3b0 -Event: 37.517 Thread 0x000001fbef365e40 Thread added: 0x000001fbdff552e0 -Event: 37.571 Thread 0x000001fbef365e40 Thread added: 0x000001fbdff543b0 -Event: 37.582 Thread 0x000001fbdff552e0 Thread added: 0x000001fbdff56720 -Event: 37.758 Thread 0x000001fbdff53ea0 Thread added: 0x000001fbdff548c0 -Event: 38.332 Thread 0x000001fbdff50c00 Thread exited: 0x000001fbdff50c00 -Event: 38.332 Thread 0x000001fbef365e40 Thread added: 0x000001fbdff50c00 - - -Dynamic libraries: -0x00007ff709f60000 - 0x00007ff709f6e000 C:\Program Files\Eclipse Adoptium\jdk-17.0.17.10-hotspot\bin\java.exe -0x00007ffa5a740000 - 0x00007ffa5a9a7000 C:\WINDOWS\SYSTEM32\ntdll.dll -0x00007ffa58c20000 - 0x00007ffa58ce9000 C:\WINDOWS\System32\KERNEL32.DLL -0x00007ffa57350000 - 0x00007ffa57747000 C:\WINDOWS\System32\KERNELBASE.dll -0x00007ffa581c0000 - 0x00007ffa5830b000 C:\WINDOWS\System32\ucrtbase.dll -0x00007ffa1aa70000 - 0x00007ffa1aa88000 C:\Program Files\Eclipse Adoptium\jdk-17.0.17.10-hotspot\bin\jli.dll -0x00007ff9ef380000 - 0x00007ff9ef39e000 C:\Program Files\Eclipse Adoptium\jdk-17.0.17.10-hotspot\bin\VCRUNTIME140.dll -0x00007ffa58870000 - 0x00007ffa58a36000 C:\WINDOWS\System32\USER32.dll -0x00007ffa58490000 - 0x00007ffa584b7000 C:\WINDOWS\System32\win32u.dll -0x00007ffa3c770000 - 0x00007ffa3ca02000 C:\WINDOWS\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.26100.8457_none_3e0b2faee331e92d\COMCTL32.dll -0x00007ffa592d0000 - 0x00007ffa592fb000 C:\WINDOWS\System32\GDI32.dll -0x00007ffa58d90000 - 0x00007ffa58e39000 C:\WINDOWS\System32\msvcrt.dll -0x00007ffa57220000 - 0x00007ffa5734c000 C:\WINDOWS\System32\gdi32full.dll -0x00007ffa57170000 - 0x00007ffa57213000 C:\WINDOWS\System32\msvcp_win.dll -0x00007ffa587a0000 - 0x00007ffa587d2000 C:\WINDOWS\System32\IMM32.DLL -0x00007ffa23160000 - 0x00007ffa2316c000 C:\Program Files\Eclipse Adoptium\jdk-17.0.17.10-hotspot\bin\vcruntime140_1.dll -0x00007ff9ed920000 - 0x00007ff9ed9ad000 C:\Program Files\Eclipse Adoptium\jdk-17.0.17.10-hotspot\bin\msvcp140.dll -0x00007ff971fc0000 - 0x00007ff972c2b000 C:\Program Files\Eclipse Adoptium\jdk-17.0.17.10-hotspot\bin\server\jvm.dll -0x00007ffa59f70000 - 0x00007ffa5a026000 C:\WINDOWS\System32\ADVAPI32.dll -0x00007ffa59360000 - 0x00007ffa59407000 C:\WINDOWS\System32\sechost.dll -0x00007ffa59e50000 - 0x00007ffa59f68000 C:\WINDOWS\System32\RPCRT4.dll -0x00007ffa587e0000 - 0x00007ffa58860000 C:\WINDOWS\System32\WS2_32.dll -0x00007ffa56e20000 - 0x00007ffa56e7e000 C:\WINDOWS\SYSTEM32\POWRPROF.dll -0x00007ffa4aac0000 - 0x00007ffa4aaf6000 C:\WINDOWS\SYSTEM32\WINMM.dll -0x00007ffa50d10000 - 0x00007ffa50d1b000 C:\WINDOWS\SYSTEM32\VERSION.dll -0x00007ffa56e00000 - 0x00007ffa56e14000 C:\WINDOWS\SYSTEM32\UMPDC.dll -0x00007ffa55ec0000 - 0x00007ffa55edb000 C:\WINDOWS\SYSTEM32\kernel.appcore.dll -0x00007ffa1aa60000 - 0x00007ffa1aa6a000 C:\Program Files\Eclipse Adoptium\jdk-17.0.17.10-hotspot\bin\jimage.dll -0x00007ffa41410000 - 0x00007ffa41652000 C:\WINDOWS\SYSTEM32\DBGHELP.DLL -0x00007ffa5a290000 - 0x00007ffa5a613000 C:\WINDOWS\System32\combase.dll -0x00007ffa59410000 - 0x00007ffa594e9000 C:\WINDOWS\System32\OLEAUT32.dll -0x00007ffa38cb0000 - 0x00007ffa38ceb000 C:\WINDOWS\SYSTEM32\dbgcore.DLL -0x00007ffa57750000 - 0x00007ffa577f8000 C:\WINDOWS\System32\bcryptPrimitives.dll -0x00007ff9ef350000 - 0x00007ff9ef375000 C:\Program Files\Eclipse Adoptium\jdk-17.0.17.10-hotspot\bin\java.dll -0x00007ff97dbb0000 - 0x00007ff97dc87000 C:\Program Files\Eclipse Adoptium\jdk-17.0.17.10-hotspot\bin\jsvml.dll -0x00007ffa59570000 - 0x00007ffa59cde000 C:\WINDOWS\System32\SHELL32.dll -0x00007ffa57890000 - 0x00007ffa580fc000 C:\WINDOWS\System32\windows.storage.dll -0x00007ffa5a190000 - 0x00007ffa5a286000 C:\WINDOWS\System32\SHCORE.dll -0x00007ffa59500000 - 0x00007ffa59566000 C:\WINDOWS\System32\shlwapi.dll -0x00007ffa57090000 - 0x00007ffa570b9000 C:\WINDOWS\SYSTEM32\profapi.dll -0x00007ff9ef330000 - 0x00007ff9ef34a000 C:\Program Files\Eclipse Adoptium\jdk-17.0.17.10-hotspot\bin\net.dll -0x00007ffa51820000 - 0x00007ffa51949000 C:\WINDOWS\SYSTEM32\WINHTTP.dll -0x00007ffa56410000 - 0x00007ffa5647c000 C:\WINDOWS\system32\mswsock.dll -0x00007ff9ee060000 - 0x00007ff9ee076000 C:\Program Files\Eclipse Adoptium\jdk-17.0.17.10-hotspot\bin\nio.dll -0x00007ff9ee040000 - 0x00007ff9ee058000 C:\Program Files\Eclipse Adoptium\jdk-17.0.17.10-hotspot\bin\zip.dll -0x00007ff9ee030000 - 0x00007ff9ee040000 C:\Program Files\Eclipse Adoptium\jdk-17.0.17.10-hotspot\bin\verify.dll -0x00007ff9efe10000 - 0x00007ff9efe1a000 C:\Program Files\Eclipse Adoptium\jdk-17.0.17.10-hotspot\bin\management.dll -0x00007ff9efe00000 - 0x00007ff9efe0c000 C:\Program Files\Eclipse Adoptium\jdk-17.0.17.10-hotspot\bin\management_ext.dll -0x00007ffa594f0000 - 0x00007ffa594f8000 C:\WINDOWS\System32\PSAPI.DLL -0x00007ffa30ca0000 - 0x00007ffa30cb8000 C:\WINDOWS\system32\napinsp.dll -0x00007ffa558f0000 - 0x00007ffa55a22000 C:\WINDOWS\SYSTEM32\DNSAPI.dll -0x00007ffa558b0000 - 0x00007ffa558e2000 C:\WINDOWS\SYSTEM32\IPHLPAPI.DLL -0x00007ffa58cf0000 - 0x00007ffa58cfa000 C:\WINDOWS\System32\NSI.dll -0x00007ffa30c80000 - 0x00007ffa30c93000 C:\WINDOWS\System32\winrnr.dll -0x00007ffa30c50000 - 0x00007ffa30c72000 C:\WINDOWS\system32\nlansp_c.dll -0x00007ffa30c30000 - 0x00007ffa30c46000 C:\WINDOWS\system32\wshbth.dll -0x00007ffa50a30000 - 0x00007ffa50a3b000 C:\Windows\System32\rasadhlp.dll -0x00007ffa50df0000 - 0x00007ffa50e76000 C:\WINDOWS\System32\fwpuclnt.dll -0x00007ff9ed890000 - 0x00007ff9ed905000 C:\Users\Utilisateur\AppData\Local\Temp\lwjglUtilisateur\3.3.1-build-7\lwjgl.dll -0x00007ff97db40000 - 0x00007ff97dba1000 C:\Users\UTILIS~1\AppData\Local\Temp\lwjglUtilisateur\3.3.1-build-7\glfw.dll -0x00007ff97daf0000 - 0x00007ff97db3b000 C:\WINDOWS\SYSTEM32\dinput8.dll -0x00007ff9d3570000 - 0x00007ff9d358c000 C:\WINDOWS\SYSTEM32\xinput1_4.dll -0x00007ffa56d40000 - 0x00007ffa56d6d000 C:\WINDOWS\SYSTEM32\DEVOBJ.dll -0x00007ffa56d70000 - 0x00007ffa56dc1000 C:\WINDOWS\SYSTEM32\cfgmgr32.dll -0x00007ffa54ef0000 - 0x00007ffa54f1f000 C:\WINDOWS\SYSTEM32\dwmapi.dll -0x00007ffa233f0000 - 0x00007ffa235d3000 C:\WINDOWS\SYSTEM32\inputhost.dll -0x00007ffa54430000 - 0x00007ffa54557000 C:\WINDOWS\SYSTEM32\CoreMessaging.dll -0x00007ffa54c10000 - 0x00007ffa54cba000 C:\WINDOWS\system32\uxtheme.dll -0x00007ffa56670000 - 0x00007ffa5667c000 C:\WINDOWS\SYSTEM32\CRYPTBASE.DLL -0x00007ffa59cf0000 - 0x00007ffa59e4c000 C:\WINDOWS\System32\MSCTF.dll -0x00007ffa39ec0000 - 0x00007ffa39fcf000 C:\WINDOWS\SYSTEM32\opengl32.dll -0x00007ffa398a0000 - 0x00007ffa398cd000 C:\WINDOWS\SYSTEM32\GLU32.dll -0x00007ffa54d10000 - 0x00007ffa54d55000 C:\WINDOWS\SYSTEM32\dxcore.dll -0x00007ffa52ae0000 - 0x00007ffa52afd000 C:\WINDOWS\SYSTEM32\windows.staterepositorycore.dll -0x00007ff9ac740000 - 0x00007ff9af065000 C:\WINDOWS\System32\DriverStore\FileRepository\nv_dispig.inf_amd64_f4c7a2fd13e0f763\nvoglv64.dll -0x00007ffa58e40000 - 0x00007ffa592c7000 C:\WINDOWS\System32\SETUPAPI.dll -0x00007ffa585d0000 - 0x00007ffa58767000 C:\WINDOWS\System32\ole32.dll -0x00007ffa54a80000 - 0x00007ffa54aa9000 C:\WINDOWS\SYSTEM32\WTSAPI32.dll -0x00007ffa58310000 - 0x00007ffa58488000 C:\WINDOWS\System32\CRYPT32.dll -0x00007ffa56160000 - 0x00007ffa561a9000 C:\WINDOWS\SYSTEM32\SspiCli.dll -0x00007ffa56870000 - 0x00007ffa56883000 C:\WINDOWS\SYSTEM32\msasn1.dll -0x00007ffa50cd0000 - 0x00007ffa50d0b000 C:\WINDOWS\SYSTEM32\cryptnet.dll -0x00007ffa56710000 - 0x00007ffa5677a000 C:\WINDOWS\SYSTEM32\wldp.dll -0x00007ffa50b50000 - 0x00007ffa50cc8000 C:\WINDOWS\SYSTEM32\drvstore.dll -0x00007ffa57800000 - 0x00007ffa57882000 C:\WINDOWS\System32\WINTRUST.dll -0x00007ffa55fe0000 - 0x00007ffa56016000 C:\WINDOWS\SYSTEM32\ntmarta.dll -0x00007ffa58770000 - 0x00007ffa58790000 C:\WINDOWS\System32\imagehlp.dll -0x00007ffa56810000 - 0x00007ffa5682b000 C:\WINDOWS\System32\CRYPTSP.dll -0x00007ffa55e20000 - 0x00007ffa55e59000 C:\WINDOWS\system32\rsaenh.dll -0x00007ffa57060000 - 0x00007ffa5708a000 C:\WINDOWS\System32\bcrypt.dll -0x00007ffa4bc30000 - 0x00007ffa5092f000 C:\WINDOWS\System32\DriverStore\FileRepository\nv_dispig.inf_amd64_f4c7a2fd13e0f763\nvgpucomp64.dll -0x00007ffa56920000 - 0x00007ffa56982000 C:\WINDOWS\SYSTEM32\WINSTA.dll -0x00007ff97d890000 - 0x00007ff97dae9000 C:\Users\UTILIS~1\AppData\Local\Temp\lwjglUtilisateur\3.3.1-build-7\jemalloc.dll -0x00007ff97d800000 - 0x00007ff97d881000 C:\Users\Utilisateur\AppData\Local\Temp\lwjglUtilisateur\3.3.1-build-7\lwjgl_stb.dll -0x00007ffa1fc10000 - 0x00007ffa1fd56000 C:\WINDOWS\SYSTEM32\textinputframework.dll -0x00007ff97d7a0000 - 0x00007ff97d7fd000 C:\Users\Utilisateur\AppData\Local\Temp\lwjglUtilisateur\3.3.1-build-7\lwjgl_opengl.dll -0x00007ff9d9ca0000 - 0x00007ff9d9cf6000 C:\WINDOWS\SYSTEM32\pdh.dll -0x00007ff9efde0000 - 0x00007ff9efdf2000 C:\WINDOWS\System32\perfproc.dll -0x00007ffa396f0000 - 0x00007ffa39701000 C:\WINDOWS\System32\perfos.dll -0x00007ffa54cc0000 - 0x00007ffa54cd2000 C:\WINDOWS\SYSTEM32\pfclient.dll -0x00007ffa564c0000 - 0x00007ffa564f3000 C:\WINDOWS\SYSTEM32\USERENV.dll -0x00007ffa517f0000 - 0x00007ffa5180d000 C:\WINDOWS\SYSTEM32\dhcpcsvc6.DLL -0x00007ffa51540000 - 0x00007ffa51565000 C:\WINDOWS\SYSTEM32\dhcpcsvc.DLL -0x00007ff9ef3a0000 - 0x00007ff9ef3e0000 C:\Users\Utilisateur\AppData\Local\Temp\jna-1082121059\jna17725892220550122580.dll -0x00007ffa5a050000 - 0x00007ffa5a0fe000 C:\WINDOWS\System32\clbcatq.dll -0x00007ffa43770000 - 0x00007ffa4378d000 C:\WINDOWS\SYSTEM32\amsi.dll -0x00007ff9efdd0000 - 0x00007ff9efdde000 C:\Program Files\Eclipse Adoptium\jdk-17.0.17.10-hotspot\bin\sunmscapi.dll -0x00007ffa569e0000 - 0x00007ffa56a10000 C:\WINDOWS\SYSTEM32\ncrypt.dll -0x00007ffa56990000 - 0x00007ffa569cf000 C:\WINDOWS\SYSTEM32\NTASN1.dll -0x00007ffa39740000 - 0x00007ffa397ff000 C:\WINDOWS\SYSTEM32\mscms.dll -0x00007ff978160000 - 0x00007ff9781a9000 C:\WINDOWS\SYSTEM32\icm32.dll -0x00007ff9ee020000 - 0x00007ff9ee029000 C:\Program Files\Eclipse Adoptium\jdk-17.0.17.10-hotspot\bin\extnet.dll -0x00007ff97d110000 - 0x00007ff97d2a7000 C:\Users\UTILIS~1\AppData\Local\Temp\lwjglUtilisateur\3.3.1-build-7\OpenAL.dll -0x00007ffa497d0000 - 0x00007ffa49869000 C:\WINDOWS\System32\MMDevApi.dll -0x00007ff9a2d70000 - 0x00007ff9a2ee3000 C:\WINDOWS\System32\Speech\Common\sapi.dll -0x00007ffa136c0000 - 0x00007ffa136c8000 C:\WINDOWS\system32\wshunix.dll -0x00007ffa41780000 - 0x00007ffa41933000 C:\WINDOWS\SYSTEM32\AUDIOSES.DLL -0x00007ffa55180000 - 0x00007ffa55194000 C:\WINDOWS\SYSTEM32\resourcepolicyclient.dll -0x00007ffa3a170000 - 0x00007ffa3a34d000 C:\WINDOWS\system32\urlmon.dll -0x00007ffa3dd70000 - 0x00007ffa3e034000 C:\WINDOWS\SYSTEM32\iertutil.dll -0x00007ffa558a0000 - 0x00007ffa558ad000 C:\WINDOWS\SYSTEM32\netutils.dll -0x00007ffa4b490000 - 0x00007ffa4b4b9000 C:\WINDOWS\SYSTEM32\srvcli.dll -0x00007ffa51250000 - 0x00007ffa51532000 C:\WINDOWS\SYSTEM32\CoreUIComponents.dll -0x00007ffa51b00000 - 0x00007ffa51c6a000 C:\WINDOWS\SYSTEM32\wintypes.dll -0x00007ff979de0000 - 0x00007ff979f71000 C:\Program Files\Eclipse Adoptium\jdk-17.0.17.10-hotspot\bin\awt.dll -0x00007ffa549c0000 - 0x00007ffa54a60000 C:\WINDOWS\SYSTEM32\apphelp.dll - -dbghelp: loaded successfully - version: 4.0.5 - missing functions: none -symbol engine: initialized successfully - sym options: 0x614 - pdb path: .;C:\Program Files\Eclipse Adoptium\jdk-17.0.17.10-hotspot\bin;C:\WINDOWS\SYSTEM32;C:\WINDOWS\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.26100.8457_none_3e0b2faee331e92d;C:\Program Files\Eclipse Adoptium\jdk-17.0.17.10-hotspot\bin\server;C:\Users\Utilisateur\AppData\Local\Temp\lwjglUtilisateur\3.3.1-build-7;C:\Users\UTILIS~1\AppData\Local\Temp\lwjglUtilisateur\3.3.1-build-7;C:\WINDOWS\System32\DriverStore\FileRepository\nv_dispig.inf_amd64_f4c7a2fd13e0f763;C:\Users\Utilisateur\AppData\Local\Temp\jna-1082121059;C:\WINDOWS\System32\Speech\Common - -VM Arguments: -jvm_args: -Dforge.enableGameTest=true -Dforge.logging.console.level=debug -Dforge.logging.markers=REGISTRIES -DignoreList=bootstraplauncher,securejarhandler,asm-commons,asm-util,asm-analysis,asm-tree,asm,JarJarFileSystems,client-extra,fmlcore,javafmllanguage,lowcodelanguage,mclanguage,forge- -Djava.net.preferIPv6Addresses=system -DlegacyClassPath.file=C:\Users\Utilisateur\Documents\travail\ynov\ydays\CreateNuclearForge\build\classpath\runClient_minecraftClasspath.txt -DmergeModules=jna-5.10.0.jar,jna-platform-5.10.0.jar -Dmixin.debug.export=true -Dmixin.debug.verbose=true -Dmixin.env.refMapRemappingFile=C:\Users\Utilisateur\Documents\travail\ynov\ydays\CreateNuclearForge/build/createSrgToMcp/output.srg -Dmixin.env.remapRefMap=true -Dnet.minecraftforge.gradle.GradleStart.srg.srg-mcp=C:\Users\Utilisateur\Documents\travail\ynov\ydays\CreateNuclearForge\build\createSrgToMcp\output.srg --module-path=C:\Users\Utilisateur\.gradle\caches\modules-2\files-2.1\cpw.mods\bootstraplauncher\1.1.2\c546e00443d8432cda6baa1c860346980742628\bootstraplauncher-1.1.2.jar;C:\Users\Utilisateur\.gradle\caches\modules-2\files-2.1\cpw.mods\securejarhandler\2.1.10\51e6a22c6c716beb11e244bf5b8be480f51dd6b5\securejarhandler-2.1.10.jar;C:\Users\Utilisateur\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-commons\9.5\19ab5b5800a3910d30d3a3e64fdb00fd0cb42de0\asm-commons-9.5.jar;C:\Users\Utilisateur\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-util\9.5\64b5a1fc8c1b15ed2efd6a063e976bc8d3dc5ffe\asm-util-9.5.jar;C:\Users\Utilisateur\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-analysis\9.5\490bacc77de7cbc0be1a30bb3471072d705be4a4\asm-analysis-9.5.jar;C:\Users\Utilisateur\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-tree\9.5\fd33c8b6373abaa675be407082fdfda35021254a\asm-tree-9.5.jar;C:\Users\Utilisateur\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm\9.5\dc6ea1875f4d64fbc85e1691c95b96a3d8569c90\asm-9.5.jar;C:\Users\Utilisateur\.gradle\caches\modules-2\files-2.1\net.minecraftforge\JarJarFileSystems\0.3.19\2464eb7d6b9ddb9db36a82cf8a95193e5c6fe020\JarJarFileSystems-0.3.19.jar --add-modules=ALL-MODULE-PATH --add-opens=java.base/java.util.jar=cpw.mods.securejarhandler --add-opens=java.base/java.lang.invoke=cpw.mods.securejarhandler --add-exports=java.base/sun.security.util=cpw.mods.securejarhandler --add-exports=jdk.naming.dns/com.sun.jndi.dns=java.naming -XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump -Dfile.encoding=UTF-8 -Duser.country=FR -Duser.language=fr -Duser.variant -java_command: cpw.mods.bootstraplauncher.BootstrapLauncher --launchTarget forgeclientuserdev --version MOD_DEV --assetIndex 5 --assetsDir C:\Users\Utilisateur\.gradle\caches\forge_gradle\assets --gameDir . --fml.forgeVersion 47.2.6 --fml.mcVersion 1.20.1 --fml.forgeGroup net.minecraftforge --fml.mcpVersion 20230612.114412 --mixin.config createnuclear.forge.mixins.json -java_class_path (initial): C:\Users\Utilisateur\Documents\travail\ynov\ydays\CreateNuclearForge\build\classes\java\main;C:\Users\Utilisateur\Documents\travail\ynov\ydays\CreateNuclearForge\build\resources\main;C:\Users\Utilisateur\.gradle\caches\forge_gradle\deobf_dependencies\curse\maven\jade-324717\6106101_mapped_parchment_2023.09.03-1.20.1\jade-324717-6106101_mapped_parchment_2023.09.03-1.20.1.jar;C:\Users\Utilisateur\.gradle\caches\forge_gradle\deobf_dependencies\com\simibubi\create\create-1.20.1\6.0.8-289_mapped_parchment_2023.09.03-1.20.1\create-1.20.1-6.0.8-289_mapped_parchment_2023.09.03-1.20.1-slim.jar;C:\Users\Utilisateur\.gradle\caches\forge_gradle\deobf_dependencies\net\createmod\ponder\Ponder-Forge-1.20.1\1.0.91_mapped_parchment_2023.09.03-1.20.1\Ponder-Forge-1.20.1-1.0.91_mapped_parchment_2023.09.03-1.20.1.jar;C:\Users\Utilisateur\.gradle\caches\forge_gradle\deobf_dependencies\com\tterrag\registrate\Registrate\MC1.20-1.3.3_mapped_parchment_2023.09.03-1.20.1\Registrate-MC1.20-1.3.3_mapped_parchment_2023.09.03-1.20.1.jar;C:\Users\Utilisateur\.gradle\caches\modules-2\files-2.1\io.github.llamalad7\mixinextras-forge\0.4.1\5c35573a7b76103724799ca1174a69699b8a9aec\mixinextras-forge-0.4.1.jar;C:\Users\Utilisateur\Documents\travail\ynov\ydays\CreateNuclearForge\build\fg_cache\net\minecraftforge\forge\1.20.1-47.2.6_mapped_parchment_2023.09.03-1.20.1\forge-1.20.1-47.2.6_mapped_parchment_2023.09.03-1.20.1-recomp.jar;C:\Users\Utilisateur\.gradle\caches\forge_gradle\deobf_dependencies\dev\engine-room\flywheel\flywheel-forge-1.20.1\1.0.5_mapped_parchment_2023.09.03-1.20.1\flywheel-forge-1.20.1-1.0.5_mapped_parchment_2023.09.03-1.20.1.jar;C:\Users\Utilisateur\.gradle\caches\forge_gradle\deobf_dependencies\mezz\jei\jei-1.20.1-forge\15.20.0.105_mapped_parchment_2023.09.03-1.20.1\jei-1.20.1-forge-15.20.0.105_mapped_parchment_2023.09.03-1.20.1.jar;C:\Users\Utilisateur\.gradle\caches\forge_gradle\minecraft_repo\versions\1.20.1\client-extra.jar;C:\Users\Utilisateur\.gradl -Launcher Type: SUN_STANDARD - -[Global flags] - intx CICompilerCount = 12 {product} {ergonomic} - uint ConcGCThreads = 4 {product} {ergonomic} - uint G1ConcRefinementThreads = 15 {product} {ergonomic} - size_t G1HeapRegionSize = 2097152 {product} {ergonomic} - uintx GCDrainStackTargetSize = 64 {product} {ergonomic} - ccstr HeapDumpPath = MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump {manageable} {command line} - size_t InitialHeapSize = 266338304 {product} {ergonomic} - size_t MarkStackSize = 4194304 {product} {ergonomic} - size_t MaxHeapSize = 4253024256 {product} {ergonomic} - size_t MaxNewSize = 2550136832 {product} {ergonomic} - size_t MinHeapDeltaBytes = 2097152 {product} {ergonomic} - size_t MinHeapSize = 8388608 {product} {ergonomic} - uintx NonNMethodCodeHeapSize = 7602480 {pd product} {ergonomic} - uintx NonProfiledCodeHeapSize = 122027880 {pd product} {ergonomic} - uintx ProfiledCodeHeapSize = 122027880 {pd product} {ergonomic} - uintx ReservedCodeCacheSize = 251658240 {pd product} {ergonomic} - bool SegmentedCodeCache = true {product} {ergonomic} - size_t SoftMaxHeapSize = 4253024256 {manageable} {ergonomic} - bool UseCompressedClassPointers = true {product lp64_product} {ergonomic} - bool UseCompressedOops = true {product lp64_product} {ergonomic} - bool UseG1GC = true {product} {ergonomic} - bool UseLargePagesIndividualAllocation = false {pd product} {ergonomic} - -Logging: -Log output configuration: - #0: stdout all=warning uptime,level,tags - #1: stderr all=off uptime,level,tags - -Environment Variables: -JAVA_HOME=C:\Program Files\Eclipse Adoptium\jdk-21.0.10.7-hotspot\ -PATH=C:\Program Files\Eclipse Adoptium\jdk-21.0.10.7-hotspot\bin;C:\Program Files\Eclipse Adoptium\jdk-17.0.17.10-hotspot\bin;C:\Program Files\Common Files\Oracle\Java\javapath;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\dotnet\;C:\Program Files\Microsoft SQL Server\150\Tools\Binn\;C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn\;C:\Program Files\Git\cmd;C:\Program Files\nodejs\;C:\Users\Utilisateur\Documents\flutter\bin;C:\Program Files (x86)\Windows Kits\10\Windows Performance Toolkit\;C:\WINDOWS\system32\config\systemprofile\AppData\Local\Muse Hub\lib;C:\Users\Utilisateur\Documents\Mc-Maven\apache-maven-3.9.14\bin;C:\Users\Utilisateur\AppData\Local\Programs\Python\Python311\Scripts\;C:\Users\Utilisateur\AppData\Local\Programs\Python\Python311\;C:\Users\Utilisateur\AppData\Local\Programs\Python\Launcher\;C:\Program Files\MySQL\MySQL Shell 8.0\bin\;C:\Users\Utilisateur\AppData\Local\Microsoft\WindowsApps;C:\Users\Utilisateur\.dotnet\tools;C:\Users\Utilisateur\AppData\Local\Programs\Microsoft VS Code\bin;C:\Users\Utilisateur\AppData\Roaming\npm;C:\Users\Utilisateur\AppData\Local\GitHubDesktop\bin;C:\Users\Utilisateur\AppData\Local\Programs\MiKTeX\miktex\bin\x64\;C:\Users\Utilisateur\AppData\Local\Muse Hub\lib;C:\Users\Utilisateur\AppData\Local\Programs\Antigravity\bin -USERNAME=Utilisateur -OS=Windows_NT -PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 151 Stepping 2, GenuineIntel -TMP=C:\Users\UTILIS~1\AppData\Local\Temp -TEMP=C:\Users\UTILIS~1\AppData\Local\Temp - - - -Periodic native trim disabled - - ---------------- S Y S T E M --------------- - -OS: - Windows 11 , 64 bit Build 26100 (10.0.26100.8328) -OS uptime: 0 days 4:42 hours -Hyper-V role detected - -CPU: total 20 (initial active 20) (10 cores per cpu, 2 threads per core) family 6 model 151 stepping 2 microcode 0x26, cx8, cmov, fxsr, ht, mmx, 3dnowpref, sse, sse2, sse3, ssse3, sse4.1, sse4.2, popcnt, lzcnt, tsc, tscinvbit, avx, avx2, aes, erms, clmul, bmi1, bmi2, adx, sha, fma, vzeroupper, clflush, clflushopt, clwb, hv -Processor Information for all 20 processors : - Max Mhz: 2100, Current Mhz: 2100, Mhz Limit: 2100 - -Memory: 4k page, system-wide physical 16222M (1217M free) -TotalPageFile size 43363M (AvailPageFile size 1114M) -current process WorkingSet (physical memory assigned to process): 3095M, peak: 3114M -current process commit charge ("private bytes"): 5054M, peak: 5277M - -vm_info: OpenJDK 64-Bit Server VM (17.0.17+10) for windows-amd64 JRE (17.0.17+10), built on Oct 21 2025 23:25:32 by "admin" with unknown MS VC++:1942 - -END. diff --git a/run/imgui.ini b/run/imgui.ini deleted file mode 100644 index 4594f4754..000000000 --- a/run/imgui.ini +++ /dev/null @@ -1,25 +0,0 @@ -[Window][Debug##Default] -Pos=60,60 -Size=400,400 -Collapsed=0 - -[Window][2231374] -Pos=1375,100 -Size=525,750 -Collapsed=0 - -[Window][1510026] -Pos=1375,100 -Size=525,750 -Collapsed=0 - -[Window][2099590] -Pos=1375,100 -Size=525,750 -Collapsed=0 - -[Window][1378774] -Pos=1375,100 -Size=525,750 -Collapsed=0 - 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 index a1da9d774..901228130 100644 Binary files a/run/schematics/reactor.nbt and b/run/schematics/reactor.nbt differ diff --git a/run/schematics/reactor5x5.nbt b/run/schematics/reactor5x5.nbt deleted file mode 100644 index b58c68cff..000000000 Binary files a/run/schematics/reactor5x5.nbt and /dev/null differ diff --git a/run/schematics/reactor7x7.nbt b/run/schematics/reactor7x7.nbt deleted file mode 100644 index eeef42b7e..000000000 Binary files a/run/schematics/reactor7x7.nbt and /dev/null differ diff --git a/run/schematics/reactor9x9.nbt b/run/schematics/reactor9x9.nbt index 84b17de9e..5951f274f 100644 Binary files a/run/schematics/reactor9x9.nbt and b/run/schematics/reactor9x9.nbt differ diff --git a/run/schematics/reactor_t1_ponder.nbt b/run/schematics/reactor_t1_ponder.nbt index 213467878..44cd6ae65 100644 Binary files a/run/schematics/reactor_t1_ponder.nbt and b/run/schematics/reactor_t1_ponder.nbt differ diff --git a/run/schematics/reactor_t2_ponder.nbt b/run/schematics/reactor_t2_ponder.nbt index cb7dd20c3..d3b8229d2 100644 Binary files a/run/schematics/reactor_t2_ponder.nbt and b/run/schematics/reactor_t2_ponder.nbt differ diff --git a/run/schematics/reactor_t3_ponder.nbt b/run/schematics/reactor_t3_ponder.nbt index 9cd1fbd7a..9676d99e7 100644 Binary files a/run/schematics/reactor_t3_ponder.nbt and b/run/schematics/reactor_t3_ponder.nbt differ diff --git a/run/schematics/reactorhdsbquifu.nbt b/run/schematics/reactorhdsbquifu.nbt index b62cb11c4..1fb170fcd 100644 Binary files a/run/schematics/reactorhdsbquifu.nbt and b/run/schematics/reactorhdsbquifu.nbt differ diff --git a/run/schematics/setup.nbt b/run/schematics/setup.nbt index 227cf19b5..e753f36bf 100644 Binary files a/run/schematics/setup.nbt and b/run/schematics/setup.nbt differ diff --git a/run/schematics/testalarm.nbt b/run/schematics/testalarm.nbt index 0d8dc14b9..292fa369e 100644 Binary files a/run/schematics/testalarm.nbt and b/run/schematics/testalarm.nbt differ diff --git a/run/servers.dat b/run/servers.dat deleted file mode 100644 index 6a11acf4e..000000000 Binary files a/run/servers.dat and /dev/null differ diff --git a/run/servers.dat_old b/run/servers.dat_old deleted file mode 100644 index 45d28deb4..000000000 Binary files a/run/servers.dat_old and /dev/null differ diff --git a/src/generated/resources/.cache/09bd1f7b209874b6c29086df91c49669495dd477 b/src/generated/resources/.cache/09bd1f7b209874b6c29086df91c49669495dd477 index 7d13fd79d..280b24e5b 100644 --- a/src/generated/resources/.cache/09bd1f7b209874b6c29086df91c49669495dd477 +++ b/src/generated/resources/.cache/09bd1f7b209874b6c29086df91c49669495dd477 @@ -1,2 +1,2 @@ -// 1.20.1 2026-05-18T15:36:13.3470841 CreateNuclear's Custom Sounds -7875d9fd3f2fcdd2b8d4d80e6309406b19c133e1 assets/createnuclear/sounds.json +// 1.20.1 2026-07-13T12:45:23.7622268 CreateNuclear's Custom Sounds +a1cba2accedfe5ba470f187b54e4cc88cf174853 assets/createnuclear/sounds.json diff --git a/src/generated/resources/.cache/15812fa7bc190aa8f0a8644088c7ff563925e506 b/src/generated/resources/.cache/15812fa7bc190aa8f0a8644088c7ff563925e506 index 5014de959..e98ca84ae 100644 --- a/src/generated/resources/.cache/15812fa7bc190aa8f0a8644088c7ff563925e506 +++ b/src/generated/resources/.cache/15812fa7bc190aa8f0a8644088c7ff563925e506 @@ -1,4 +1,4 @@ -// 1.20.1 2026-06-12T10:26:06.6419648 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 @@ -6,14 +6,15 @@ c711d032a04e1a9350ad9bc4d9c4d74f54689862 data/createnuclear/recipes/compacting/u 57154e35ebb09170bb39f5b3a72ecd49182697f2 data/createnuclear/recipes/crushing/granite.json 682ceb2386fe56cd47e46d7ebb3d8185ac78515b data/createnuclear/recipes/crushing/nitrate.json 4feb59d85e86e34ed565c18b6a4df120fe050bc7 data/createnuclear/recipes/crushing/raw_copper.json -e79a01c53e63fe0c0b8519a6b9b76a2044179efa data/createnuclear/recipes/crushing/raw_thorium.json -78ba5a2791f2f30bd22d6a1111447d1a39928277 data/createnuclear/recipes/crushing/raw_thorium_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 diff --git a/src/generated/resources/.cache/3c9854c256b4d84dd9b4b92d1a03ceb45298124f b/src/generated/resources/.cache/3c9854c256b4d84dd9b4b92d1a03ceb45298124f index 6cf217468..3be1c5e78 100644 --- a/src/generated/resources/.cache/3c9854c256b4d84dd9b4b92d1a03ceb45298124f +++ b/src/generated/resources/.cache/3c9854c256b4d84dd9b4b92d1a03ceb45298124f @@ -1,4 +1,4 @@ -// 1.20.1 2026-06-21T16:13:55.3075927 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-07-25T17:11:58.5826537 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 @@ -33,10 +33,10 @@ f628f8c7aa1e150ad2b5a3ce87dbe7f00b462e74 assets/createnuclear/blockstates/polish 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 -bd30dea2e337215430c4510c3eb90e6ec909f4b4 assets/createnuclear/blockstates/reactor_input.json -20c17a81bb3c63d244af9d66da3dc61857900f6c assets/createnuclear/blockstates/reactor_liquid_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 @@ -48,8 +48,8 @@ a2fc21fa320e677fe7690b260ee3f57ebdbd50b6 assets/createnuclear/blockstates/small_ 643a4d44b491a84d0d26e1a8944dffc40e83ce14 assets/createnuclear/blockstates/thorium_ore.json de2884054a21315d8b167f64b206be331d388420 assets/createnuclear/blockstates/uranium.json 4557f548df100ae1d05e3b5711797225f6a39673 assets/createnuclear/blockstates/uranium_ore.json -5ca7680451918fad7c1cf3098b8e110fdbf3965e assets/createnuclear/lang/en_ud.json -2f2b0d22ad4263ba1c17b42bd4b7ec6ec56ccff1 assets/createnuclear/lang/en_us.json +2bc4073631a9c4665f643e94b16e21956660b366 assets/createnuclear/lang/en_ud.json +3e88627550ba81bd8f7df9b720fd04afbc816f1b 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 @@ -119,12 +119,81 @@ d234edb3b6bc81b7300ee65722973b66db0b82d9 assets/createnuclear/models/block/urani a4d5ee44c830e329034a46792280edea53343034 assets/createnuclear/models/block/uranium_ore.json 29394a22ee8655dc22ea51563411505fbcfd2dab assets/createnuclear/models/item/autunite.json 30b11d8da5d02a3e9cebb739b3b9efbee087573c assets/createnuclear/models/item/autunite_pillar.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 3a5955f81eeed80e907bf8e2ee4df14fe42843f0 assets/createnuclear/models/item/blue_cloth.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 @@ -139,10 +208,10 @@ de649e8356e85e802df3e64df8fd663ce62ba16d assets/createnuclear/models/item/cyan_c 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 -bdd9910ec9f3db9829c3ea2d12083126b7c01304 assets/createnuclear/models/item/default_anti_radiation_boots.json -3031c711fcf2b5e9da9662e9367a8d0773ed349c assets/createnuclear/models/item/default_anti_radiation_chestplate.json -a8968e2d92f26957ad91d0d0e5248e65a4cec183 assets/createnuclear/models/item/default_anti_radiation_helmet.json -b67d3df4f90c9efc0308360b6ed502f2d9ad6d06 assets/createnuclear/models/item/default_anti_radiation_leggings.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 @@ -182,12 +251,13 @@ ee9b06de6d4e5f722543a83e5d9f7564ac6d7f70 assets/createnuclear/models/item/reacto 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 -bf5bc112f5a1ecb51f6e324c718257eaa3863b9d assets/createnuclear/models/item/reactor_liquid_input.json 69e464d730b826a0c28ed3cfeab28c4c561ec1b0 assets/createnuclear/models/item/reactor_output.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 @@ -210,6 +280,7 @@ ea04609e8b5c12a7805b1c564bca07fefd6d38ba assets/createnuclear/models/item/uraniu 63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/createnuclear/models/item/wolf_irradiated_spawn_egg.json 8bdc2fabbfc9fcc7c2ad4a3273897659d90b95ab assets/createnuclear/models/item/yellowcake.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 @@ -334,6 +405,7 @@ dfd6b4a2aadbd3c301bb02e980f7790caa4a3746 data/createnuclear/advancements/recipes 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 @@ -379,17 +451,17 @@ af059cd55441441329347fbd569245b539b095db data/createnuclear/loot_tables/blocks/r 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 -1107576382a5ebd9b8d53e1a92306de08a211645 data/createnuclear/loot_tables/blocks/reactor_liquid_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 -bc1497c8412144515b94799c007cfdb277d5736f data/createnuclear/loot_tables/blocks/thorium_block.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 @@ -398,6 +470,7 @@ fba1a7bdb0835c034aa5ef52ebf589123d41b33e data/createnuclear/loot_tables/entities 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 3c2942b0a34c94bf074e19169a7f35834d5cb1cb data/createnuclear/recipes/crafting/items/armors/default_anti_radiation_boots.json @@ -414,6 +487,7 @@ befcdaaf4abf86e29d7f7008d489638c5f3cd6bd data/createnuclear/recipes/crafting/raw 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 @@ -443,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 @@ -535,9 +609,6 @@ ded8acf28ec98ddbd5257b9e7a7a4d8f3686d6df data/createnuclear/recipes/smithing/def a7d4278d8a39649c8b658ad2f3f1d092cb012bdf data/createnuclear/tags/blocks/enriching_fire_base_blocks.json 509b5baa813ae0dc3345fd97754e4088132359ec data/createnuclear/tags/blocks/fan_processing_catalysts/enriched.json bc8701774f57ab000a8f0f1d390702175a6cdbb8 data/createnuclear/tags/blocks/fan_processing_catalysts/snow_powder.json -925cb97bc13b3122fe17e59ff3ec2fe4d1eaacd5 data/createnuclear/tags/blocks/lead_ores.json -baae2dfd7e19770072d6261ec68ce157a32be80c data/createnuclear/tags/blocks/thorium_ores.json -bad88bea18fec41c7ad6fa4d396feacc0346a137 data/createnuclear/tags/blocks/uranium_ores.json ccbc67cba973a8e1e43d0166ddfa5645f6a82aea data/createnuclear/tags/entity_types/irradiated_immune.json 410aa6d101788f25baa176741887c6f314006f29 data/createnuclear/tags/fluids/nitrogen.json dd07a117bf2a657aba3d776ee718829150a1c0af data/createnuclear/tags/fluids/thorium.json @@ -546,25 +617,23 @@ bfd5a561b60a7d59d7f7c248ec75e3571a0f2fed data/createnuclear/tags/fluids/uranium. 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 -baae2dfd7e19770072d6261ec68ce157a32be80c data/createnuclear/tags/items/thorium_ores.json -bad88bea18fec41c7ad6fa4d396feacc0346a137 data/createnuclear/tags/items/uranium_ores.json d8d6ad7a4fc31fd68a98b368207c359fb610f417 data/create/tags/blocks/safe_nbt.json 75f0600da4891d0f4a3329fb44cac6c4945a0b49 data/forge/tags/blocks/glass.json -313a08cba1fa936e4c6188bea816734de777b513 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 -82c4090f813a5b013e1835143d598678a17709e1 data/forge/tags/blocks/ores/thorium.json +3f665c928bcdfaa68700d1da7a28fddcbb7bf802 data/forge/tags/blocks/ores/thorium.json bad88bea18fec41c7ad6fa4d396feacc0346a137 data/forge/tags/blocks/ores/uranium.json 4f1ebc0bb505bc510c52671c5935494270ec7008 data/forge/tags/blocks/ores_in_ground/deepslate.json -f817fac347e5f8ea4878c5c317328b808ab0fa38 data/forge/tags/blocks/ores_in_ground/stone.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 e15fb3153f19574ecf55a117c026f6bf028f3a87 data/forge/tags/items/armors/boots.json fb238dbddaf54871f03731ee7cce881af0932459 data/forge/tags/items/armors/chestplates.json @@ -588,7 +657,7 @@ a77ba3f79cd096f38bd53b5f1b6a5696b864e9df data/forge/tags/items/nuggets.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 -82c4090f813a5b013e1835143d598678a17709e1 data/forge/tags/items/ores/thorium.json +3f665c928bcdfaa68700d1da7a28fddcbb7bf802 data/forge/tags/items/ores/thorium.json bad88bea18fec41c7ad6fa4d396feacc0346a137 data/forge/tags/items/ores/uranium.json fd86e3b3265d7069f3cfff0cfb5d086eea5a813a data/forge/tags/items/raw_materials.json 610ed700de0886bcb4b1c90100c35f3034c53940 data/forge/tags/items/raw_materials/lead.json @@ -611,11 +680,11 @@ 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 -2844dedd4483b2d2ed5abcac2f0eca476c29efa4 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 -a3f4e5e22848384f6463ad5eba3ce6bf07e211c9 data/minecraft/tags/blocks/needs_diamond_tool.json -1e1755f2743626e697608774ec270b1360063133 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 diff --git a/src/generated/resources/.cache/708b1206ce73e235f43eb2a5fd72b93671cfba4e b/src/generated/resources/.cache/708b1206ce73e235f43eb2a5fd72b93671cfba4e index 82b5bc840..de59cc550 100644 --- a/src/generated/resources/.cache/708b1206ce73e235f43eb2a5fd72b93671cfba4e +++ b/src/generated/resources/.cache/708b1206ce73e235f43eb2a5fd72b93671cfba4e @@ -1,8 +1,9 @@ -// 1.20.1 2026-05-12T11:08:49.9141357 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 76731e336..36147ff72 100644 --- a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e +++ b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e @@ -1,9 +1,9 @@ -// 1.20.1 2026-04-22T20:27:45.9021475 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 203072b1b00fca38c88c3c7d9141ce044e1cded3 data/createnuclear/advancements/recipes/misc/blasting/nitrogen_concentrate_for_nitrogen_concentrate.json -605ccb2acc7e944ddbce2e962af3278e47a04627 data/createnuclear/advancements/recipes/misc/blasting/raw_uranium_for_uranium_ore.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 @@ -13,15 +13,15 @@ c14100e996c2146f0c0c062ef489380e11b36b46 data/createnuclear/advancements/recipes 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 4e49562ac3d71b9c1648649ac94858df73b1b2f6 data/createnuclear/advancements/recipes/misc/smelting/nitrogen_concentrate_for_nitrogen_concentrate.json -d7cfc6f1ff4d39df0df526ec3723e8d18d198945 data/createnuclear/advancements/recipes/misc/smelting/raw_uranium_for_uranium_ore.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 ecfe4877ed719c02863e50a2de99a54bca0a6672 data/createnuclear/recipes/blasting/nitrogen_concentrate_for_nitrogen_concentrate.json -978cc9d92268673050da5697482f4013a63a65f1 data/createnuclear/recipes/blasting/raw_uranium_for_uranium_ore.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 @@ -31,7 +31,7 @@ af5d168185e516ea79c335ac7eb6652b99723143 data/createnuclear/recipes/crafting/ste 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 ad4541bf1f0994177d3f6ae830abb279c4d222f3 data/createnuclear/recipes/smelting/nitrogen_concentrate_for_nitrogen_concentrate.json -93fe12ad36a99451009518d71ac105969a1ef2aa data/createnuclear/recipes/smelting/raw_uranium_for_uranium_ore.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 794d02fce..f993613d8 100644 --- a/src/generated/resources/.cache/abc32a97b4e744838610c53dbbbaaf9f7d29a557 +++ b/src/generated/resources/.cache/abc32a97b4e744838610c53dbbbaaf9f7d29a557 @@ -1,4 +1,4 @@ -// 1.20.1 2026-06-21T16:18:31.9417877 Create Nuclear Advancements +// 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 @@ -8,11 +8,11 @@ fe81bbd052ebe4a70c48912b47e12ed4e4523d1d data/createnuclear/advancements/automat 2e8127a4546d680ab502c6e3c71f49d8df2b1b18 data/createnuclear/advancements/coal_dust.json a0d591c0cfa26fbd3ea83da54cdd9f900d58926c data/createnuclear/advancements/craft_enriching_campfire.json 826cf04c3b3768dd1a5834ce24dc4301435fed75 data/createnuclear/advancements/crunchy_uranium.json -c38eb7205068a048d614ce503305430b036bc756 data/createnuclear/advancements/cryogenic_baptism.json +f85ce01405f65f942bbc2960442677ef5a3863d9 data/createnuclear/advancements/cryogenic_baptism.json efcd55929d60b9925ac4833ad1171ddb81dd47a0 data/createnuclear/advancements/dye_anti_radiation_armor.json eda669191bc6149e3feee4a2b9b25b64e1d7da60 data/createnuclear/advancements/enriched_yellowcake.json -f22c294470c3f9d49ff0c61bb73d844758026cd5 data/createnuclear/advancements/first_nitrate.json -b4f188861589d34efa3a3b8eaba23a21a7b0905d data/createnuclear/advancements/first_thorium.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 @@ -24,14 +24,11 @@ e9f9668d36ebd431502b20296f774c83a1d050f0 data/createnuclear/advancements/raw_lea 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 -6cf2ef6ff239288243f69d8763e01eadc1b3f343 data/createnuclear/advancements/reactor_liquid_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 @@ -41,6 +38,7 @@ a44ae76ec00fae36f7df13e43f20ebe389b416d5 data/createnuclear/advancements/steel_i 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 52792f469..8563540a1 100644 --- a/src/generated/resources/.cache/fed443662143001aeb5341375f6f5ef31d10baea +++ b/src/generated/resources/.cache/fed443662143001aeb5341375f6f5ef31d10baea @@ -1,8 +1,8 @@ -// 1.20.1 2026-06-21T14:33:03.588081 CreateNuclear Generated Registry Entries -aa1897ff27a6aa83e2efbee29e12ad6dab2f6a0a data/createnuclear/createnuclear/fluids/type/fallback.json -d7c754aa51cea393a10bce85986c1c0c641150d5 data/createnuclear/createnuclear/fluids/type/nitrogen.json -afee3d8f15bf8285e175f73befba7b46fdc94b19 data/createnuclear/createnuclear/fluids/type/water.json -706132bf26d87ed4a83f8d5f8793ab69a60b98fe data/createnuclear/createnuclear/rods/type/fallback.json +// 1.20.1 2026-07-25T13:29:59.5906396 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 @@ -10,17 +10,18 @@ afee3d8f15bf8285e175f73befba7b46fdc94b19 data/createnuclear/createnuclear/fluids 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 -738687a49c3cd8473d1c511f55e274637fe44478 data/createnuclear/worldgen/biome/irradiated_plain.json -211d1391981d173b8bc490e5af1471441e1df37f 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 -8b44cc21bf02cb04704f081ccef4f7114ea59ae8 data/createnuclear/worldgen/configured_feature/thorium_ore.json +aaa284a4e57635bf05f4539125b33a2f9176ed5b data/createnuclear/worldgen/configured_feature/thorium_ore.json b0e1ee7314412507fd7346cb48b29d105f6186ad data/createnuclear/worldgen/configured_feature/uranium_ore.json 59d61c02881d710b0426a0955f6945b7a12d219f data/createnuclear/worldgen/density_function/irradiated/erosion.json 59d61c02881d710b0426a0955f6945b7a12d219f data/createnuclear/worldgen/density_function/irradiated/final_density.json -98ef3576a3760c63b2667d4b648bb67ff37f3bd2 data/createnuclear/worldgen/noise_settings/irradiated_noise.json -5a035ad45f9039b81e3e55160da3127fe7079ba9 data/createnuclear/worldgen/placed_feature/lead_ore.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 -cc85909071cab20eacbe2c34887c6ed6a02dc51e data/createnuclear/worldgen/placed_feature/striated_ores_overworld.json -0762472dada74fb4592de79d598f8d45d955ea2c data/createnuclear/worldgen/placed_feature/thorium_ore.json -a18aa32c139932d0023abe6caa722992b167114b data/createnuclear/worldgen/placed_feature/uranium_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/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 593b3cbcd..000000000 --- a/src/generated/resources/assets/createnuclear/blockstates/reactor_input.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "variants": { - "facing=down": { - "model": "createnuclear:block/reactor/input/input_vertical", - "x": 180 - }, - "facing=east": { - "model": "createnuclear:block/reactor/input/input", - "y": 270 - }, - "facing=north": { - "model": "createnuclear:block/reactor/input/input", - "y": 180 - }, - "facing=south": { - "model": "createnuclear:block/reactor/input/input" - }, - "facing=up": { - "model": "createnuclear:block/reactor/input/input_vertical" - }, - "facing=west": { - "model": "createnuclear:block/reactor/input/input", - "y": 90 - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/createnuclear/blockstates/reactor_liquid_input.json b/src/generated/resources/assets/createnuclear/blockstates/reactor_liquid_input.json deleted file mode 100644 index 15331d704..000000000 --- a/src/generated/resources/assets/createnuclear/blockstates/reactor_liquid_input.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "variants": { - "facing=down": { - "model": "createnuclear:block/reactor/liquid_input/liquid_input_vertical", - "x": 180 - }, - "facing=east": { - "model": "createnuclear:block/reactor/liquid_input/liquid_input", - "y": 270 - }, - "facing=north": { - "model": "createnuclear:block/reactor/liquid_input/liquid_input", - "y": 180 - }, - "facing=south": { - "model": "createnuclear:block/reactor/liquid_input/liquid_input" - }, - "facing=up": { - "model": "createnuclear:block/reactor/liquid_input/liquid_input_vertical" - }, - "facing=west": { - "model": "createnuclear:block/reactor/liquid_input/liquid_input", - "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/lang/en_ud.json b/src/generated/resources/assets/createnuclear/lang/en_ud.json index 08c8b47bc..66ef52f50 100644 --- a/src/generated/resources/assets/createnuclear/lang/en_ud.json +++ b/src/generated/resources/assets/createnuclear/lang/en_ud.json @@ -17,16 +17,16 @@ "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ɐ ʇǝǝɟ ʎɯ ןǝǝɟ ʇ,uɐɔ I", - "advancement.createnuclear.cryogenic_baptism.desc": "ǝɯıʇ ʇsɹıɟ ǝɥʇ ɹoɟ uǝboɹʇıu pınbıן ǝɥʇ uı ɯıʍS", + "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.first_nitrate": "ǝʇɐɹʇıN ʇsɹıℲ", - "advancement.createnuclear.first_nitrate.desc": "ǝɯıʇ ʇsɹıɟ ǝɥʇ ɹoɟ ǝʇɐɹʇıN doɹᗡ", - "advancement.createnuclear.first_thorium": "ɯnıɹoɥ⟘ ʇsɹıℲ", - "advancement.createnuclear.first_thorium.desc": "ǝɯıʇ ʇsɹıɟ ǝɥʇ ɹoɟ ɯnıɹoɥʇ ʍɐɹ ɐ doɹᗡ", + "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ɐɹ⅁", @@ -55,12 +55,6 @@ "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_liquid_input": "ןǝnℲ pınbıꞀ", - "advancement.createnuclear.reactor_liquid_input.desc": "ɹoʇɔɐǝɹ ɹnoʎ oʇuı ʇuɐןooɔ pınbıן pǝǝɟ oʇ ʇnduı pınbıן ɹ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", @@ -70,11 +64,11 @@ "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ʇɔɐǝɹ ɹɐǝןɔnu Ɩ ɹǝıʇ ɐ ʇɹɐʇs puɐ pןınᗺ", + "advancement.createnuclear.t1.desc": "ɹoʇɔɐǝᴚ ɹɐǝןɔnN Ɩ ɹǝıʇ ɐ pןınᗺ", "advancement.createnuclear.t2": "ᄅ⟘ ɹǝןןoɹʇuoƆ ɹoʇɔɐǝᴚ", - "advancement.createnuclear.t2.desc": "ɹoʇɔɐǝɹ ɹɐǝןɔnu ᄅ ɹǝıʇ ɐ ʇɹɐʇs puɐ pןınᗺ", + "advancement.createnuclear.t2.desc": "ɹoʇɔɐǝᴚ ɹɐǝןɔnN ᄅ ɹǝıʇ ɐ pןınᗺ", "advancement.createnuclear.t3": "Ɛ⟘ ɹǝןןoɹʇuoƆ ɹoʇɔɐǝᴚ", - "advancement.createnuclear.t3.desc": "ɹoʇɔɐǝɹ ɹɐǝןɔnu Ɛ ɹǝıʇ ɐ ʇɹɐʇs puɐ pןınᗺ", + "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Ɔ", @@ -83,6 +77,8 @@ "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Ԁ", @@ -92,6 +88,7 @@ "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Ɔ", @@ -133,17 +130,20 @@ "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_liquid_input": "ʇnduI pınbıꞀ ɹ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", @@ -216,60 +216,65 @@ "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": ")buıɔɐןd ǝǝɹɟ( sʇɐǝɥɹǝʌo ɹoʇɔɐǝɹ ɟı punos ןןıʍ :ɯɹɐןⱯ", - "createnuclear.ponder.reactor_t1.text_11": "ϛ ɹooןℲ", - "createnuclear.ponder.reactor_t1.text_12": "9 ɹooןℲ", - "createnuclear.ponder.reactor_t1.text_13": "ㄥ ɹooןℲ", - "createnuclear.ponder.reactor_t1.text_14": "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_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": ")ǝbpǝ ǝɥʇ uı ʇou buısɐɔ ʎuɐ ǝɔɐןdǝɹ uɐɔ : buıɔɐןd ǝǝɹɟ( poɹ ɟo ʞɔɐʇs ǝuo sǝɹoʇs :ʇnduI", - "createnuclear.ponder.reactor_t1.text_4": ")buıɔɐןd ǝǝɹɟ( pǝʇɔɐɹʇxǝ sı ɹǝʍod pǝʇɐɹǝuǝb ǝɥʇ ǝɹǝɥʍ :ʇndʇnO", - "createnuclear.ponder.reactor_t1.text_5": "Ɛ ɹooןℲ", - "createnuclear.ponder.reactor_t1.text_6": ")buıɔɐןd ǝǝɹɟ( ʇuɐןooɔ ɹoɟ ǝuo puɐ poɹ ןǝnɟ ɟo ʇnduı ǝuo ǝʌɐɥ ʎןǝʞıן ןןıʍ noʎ ǝsnɐɔǝq pǝpǝǝu :ʇnduı puoɔǝS", - "createnuclear.ponder.reactor_t1.text_7": "ㄣ ɹooןℲ", - "createnuclear.ponder.reactor_t1.text_8": ")buıɔɐןd ǝǝɹɟ( ʇǝןuı pınןɟ buıןooɔ :ʇnduI pınbıꞀ", - "createnuclear.ponder.reactor_t1.text_9": "ʇı ʇɹɐʇs oʇ sǝob ʇuıɹdǝnןq ǝɥʇ ǝɹǝɥʍ ǝɔɐןd ǝɥʇ puɐ 'ɹoʇɔɐǝɹ ǝɥʇ ɟo uıɐɹq :ɹǝןןoɹʇuoƆ", + "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": "ʇı ʇɹɐʇs oʇ sǝob ʇuıɹdǝnןq ǝɥʇ ǝɹǝɥʍ ǝɔɐןd ǝɥʇ puɐ 'ɹoʇɔɐǝɹ ǝɥʇ ɟo uıɐɹq :ɹǝןןoɹʇuoƆ", - "createnuclear.ponder.reactor_t2.text_11": ")buıɔɐןd ǝǝɹɟ( sʇɐǝɥɹǝʌo ɹoʇɔɐǝɹ ɟı punos ןןıʍ :ɯɹɐןⱯ", - "createnuclear.ponder.reactor_t2.text_12": "9 ɹooןℲ", - "createnuclear.ponder.reactor_t2.text_13": "ㄥ ɹooןℲ", - "createnuclear.ponder.reactor_t2.text_14": "8 ɹooןℲ", - "createnuclear.ponder.reactor_t2.text_15": "6 ɹooןℲ", - "createnuclear.ponder.reactor_t2.text_16": "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_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": ")ǝbpǝ ǝɥʇ uı ʇou buısɐɔ ʎuɐ ǝɔɐןdǝɹ uɐɔ : buıɔɐןd ǝǝɹɟ( poɹ ɟo ʞɔɐʇs ǝuo sǝɹoʇs :ʇnduI", - "createnuclear.ponder.reactor_t2.text_5": ")buıɔɐןd ǝǝɹɟ( pǝʇɔɐɹʇxǝ sı ɹǝʍod pǝʇɐɹǝuǝb ǝɥʇ ǝɹǝɥʍ :ʇndʇnO", - "createnuclear.ponder.reactor_t2.text_6": "ㄣ ɹooןℲ", - "createnuclear.ponder.reactor_t2.text_7": ")buıɔɐןd ǝǝɹɟ( ʇuɐןooɔ ɹoɟ ǝuo puɐ poɹ ןǝnɟ ɟo ʇnduı ǝuo ǝʌɐɥ ʎןǝʞıן ןןıʍ noʎ ǝsnɐɔǝq pǝpǝǝu :ʇnduı puoɔǝS", - "createnuclear.ponder.reactor_t2.text_8": "ϛ ɹooןℲ", - "createnuclear.ponder.reactor_t2.text_9": ")buıɔɐןd ǝǝɹɟ( ʇǝןuı pınןɟ buıןooɔ :ʇnduI pınbıꞀ", + "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": ")buıɔɐןd ǝǝɹɟ( ʇǝןuı pınןɟ buıןooɔ :ʇnduI pınbıꞀ", - "createnuclear.ponder.reactor_t3.text_11": "ʇı ʇɹɐʇs oʇ sǝob ʇuıɹdǝnןq ǝɥʇ ǝɹǝɥʍ ǝɔɐןd ǝɥʇ puɐ 'ɹoʇɔɐǝɹ ǝɥʇ ɟo uıɐɹq :ɹǝןןoɹʇuoƆ", - "createnuclear.ponder.reactor_t3.text_12": ")buıɔɐןd ǝǝɹɟ( sʇɐǝɥɹǝʌo ɹoʇɔɐǝɹ ɟı punos ןןıʍ :ɯɹɐןⱯ", - "createnuclear.ponder.reactor_t3.text_13": "ㄥ ɹooןℲ", - "createnuclear.ponder.reactor_t3.text_14": "8 ɹooןℲ", - "createnuclear.ponder.reactor_t3.text_15": "6 ɹooןℲ", - "createnuclear.ponder.reactor_t3.text_16": "0Ɩ ɹooןℲ", - "createnuclear.ponder.reactor_t3.text_17": "ƖƖ ɹooןℲ", - "createnuclear.ponder.reactor_t3.text_18": "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_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": ")ǝbpǝ ǝɥʇ uı ʇou buısɐɔ ʎuɐ ǝɔɐןdǝɹ uɐɔ : buıɔɐןd ǝǝɹɟ( poɹ ɟo ʞɔɐʇs ǝuo sǝɹoʇs :ʇnduI", - "createnuclear.ponder.reactor_t3.text_6": ")buıɔɐןd ǝǝɹɟ( pǝʇɔɐɹʇxǝ sı ɹǝʍod pǝʇɐɹǝuǝb ǝɥʇ ǝɹǝɥʍ :ʇndʇnO", - "createnuclear.ponder.reactor_t3.text_7": "ϛ ɹooןℲ", - "createnuclear.ponder.reactor_t3.text_8": ")buıɔɐןd ǝǝɹɟ( ʇuɐןooɔ ɹoɟ ǝuo puɐ poɹ ןǝnɟ ɟo ʇnduı ǝuo ǝʌɐɥ ʎןǝʞıן ןןıʍ noʎ ǝsnɐɔǝq pǝpǝǝu :ʇnduı puoɔǝS", - "createnuclear.ponder.reactor_t3.text_9": "9 ɹ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": "ɯɹɐןⱯ ɹoʇɔɐǝᴚ", + "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", @@ -279,14 +284,19 @@ "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 ɹǝ⅁ıǝ⅁", + "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/casing_break": "buısɐƆ ɹoʇɔɐǝᴚ ʞɐǝɹᗺ", "createnuclear.subtitle.reacteur/casing_fall": "ןןɐℲ buısɐƆ ɹoʇɔɐǝᴚ", "createnuclear.subtitle.reacteur/casing_hit": "buısɐƆ ɹoʇɔɐǝᴚ ʇıH", "createnuclear.subtitle.reacteur/casing_place": "buısɐƆ ɹoʇɔɐǝᴚ ǝɔɐןԀ", "createnuclear.subtitle.reacteur/casing_step": "buısɐƆ ɹoʇɔɐǝᴚ uo dǝʇS", + "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.cloth.color": "%s :ǝɔǝıd ɹoɯɹɐ ɟo ɹoןoƆ", + "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ןℲ", @@ -296,6 +306,7 @@ "createnuclear.tooltip.heatLevel.none": "ǝuoN", "createnuclear.tooltip.heatLevel.safety": "ʎʇǝɟɐS", "createnuclear.tooltip.heatLevel.warning": "buıuɹɐM", + "createnuclear.tooltip.heatRatio": "%d :oıʇɐᴚ ʇɐǝH", "createnuclear.tooltip.item.cooled.rod": " :poᴚ ɹǝןooƆ", "createnuclear.tooltip.item.empty.rod": " :sɯǝʇI ʇnduI", "createnuclear.tooltip.item.fuel.rod": " :poᴚ ןǝnℲ", @@ -306,7 +317,7 @@ "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_protection": "ǝuıpoI uoıʇɔǝʇoɹԀ", + "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ʎɹƆ", @@ -320,6 +331,9 @@ "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ʇɔɐǝᴚ", + "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_cloth": "ɥʇoןƆ ǝnןᗺ", "item.createnuclear.brown_cloth": "ɥʇoןƆ uʍoɹᗺ", @@ -335,7 +349,7 @@ "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.graphite_rod.tooltip.summary": "˙ʇı ǝʇɐɹǝdo oʇ ‾ʇnduı poɹ ɹoʇɔɐǝɹ‾ ǝɥʇ uı pǝsn ǝq oʇ ‾poᴚ‾", "item.createnuclear.gray_cloth": "ɥʇoןƆ ʎɐɹ⅁", "item.createnuclear.green_cloth": "ɥʇoןƆ uǝǝɹ⅁", "item.createnuclear.lead_ingot": "ʇobuI pɐǝꞀ", @@ -360,10 +374,11 @@ "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ɟ puɐ buıןooɔ ɥʇıʍ 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_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ɥ⟘", @@ -371,41 +386,38 @@ "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.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_cloth": "ɥʇoןƆ ʍoןןǝʎ", "item.createnuclear.yellowcake": "ǝʞɐɔʍoןןǝʎ", - "item.minecraft.lingering_potion.effect.potion_of_protection_iodine": "ǝuıpoI uoıʇɔǝʇoɹԀ ɟo uoıʇoԀ buıɹǝbuıꞀ", - "item.minecraft.lingering_potion.effect.potion_of_protection_iodine_augment": "ǝuıpoI uoıʇɔǝʇoɹԀ ɟo uoıʇoԀ buıɹǝbuıꞀ", + "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_protection_iodine": "ǝuıpoI uoıʇɔǝʇoɹԀ ɟo uoıʇoԀ", - "item.minecraft.potion.effect.potion_of_protection_iodine_augment": "ǝuıpoI uoıʇɔǝʇoɹԀ ɟo uoıʇoԀ", + "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_protection_iodine": "ǝuıpoI uoıʇɔǝʇoɹԀ ɟo uoıʇoԀ ɥsɐןdS", - "item.minecraft.splash_potion.effect.potion_of_protection_iodine_augment": "ǝuıpoI uoıʇɔǝʇoɹԀ ɟo uoıʇoԀ ɥsɐןdS", + "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_protection_iodine": "ǝuıpoI uoıʇɔǝʇoɹԀ ɟo ʍoɹɹⱯ", - "item.minecraft.tipped_arrow.effect.potion_of_protection_iodine_augment": "ǝuıpoI uoıʇɔǝʇoɹԀ ɟo ʍoɹɹⱯ", + "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 178c6f6f6..b994eb5ea 100644 --- a/src/generated/resources/assets/createnuclear/lang/en_us.json +++ b/src/generated/resources/assets/createnuclear/lang/en_us.json @@ -17,16 +17,16 @@ "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", + "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.first_nitrate": "First Nitrate", - "advancement.createnuclear.first_nitrate.desc": "Drop Nitrate for the first time", - "advancement.createnuclear.first_thorium": "First Thorium", - "advancement.createnuclear.first_thorium.desc": "Drop a raw thorium for the first time", + "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", @@ -55,12 +55,6 @@ "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_liquid_input": "Liquid Fuel", - "advancement.createnuclear.reactor_liquid_input.desc": "Craft a reactor liquid input to feed liquid coolant 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", @@ -70,11 +64,11 @@ "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 and start a tier 1 nuclear reactor", + "advancement.createnuclear.t1.desc": "Build a tier 1 Nuclear Reactor", "advancement.createnuclear.t2": "Reactor Controller T2", - "advancement.createnuclear.t2.desc": "Build and start a tier 2 nuclear reactor", + "advancement.createnuclear.t2.desc": "Build a tier 2 Nuclear Reactor", "advancement.createnuclear.t3": "Reactor Controller T3", - "advancement.createnuclear.t3.desc": "Build and start a tier 3 nuclear reactor", + "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", @@ -83,6 +77,8 @@ "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", @@ -92,6 +88,7 @@ "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", @@ -133,17 +130,20 @@ "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_liquid_input": "Reactor Liquid Input", "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", @@ -216,60 +216,65 @@ "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": "Alarm: will sound if reactor overheats (free placing)", - "createnuclear.ponder.reactor_t1.text_11": "Floor 5", - "createnuclear.ponder.reactor_t1.text_12": "Floor 6", - "createnuclear.ponder.reactor_t1.text_13": "Floor 7", - "createnuclear.ponder.reactor_t1.text_14": "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_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": "Input: stores one stack of rod (free placing : can replace any casing not in the edge)", - "createnuclear.ponder.reactor_t1.text_4": "Output: where the generated power is extracted (free placing)", - "createnuclear.ponder.reactor_t1.text_5": "Floor 3", - "createnuclear.ponder.reactor_t1.text_6": "Second input: needed because you will likely have one input of fuel rod and one for coolant (free placing)", - "createnuclear.ponder.reactor_t1.text_7": "Floor 4", - "createnuclear.ponder.reactor_t1.text_8": "Liquid Input: cooling fluid inlet (free placing)", - "createnuclear.ponder.reactor_t1.text_9": "Controller: brain of the reactor, and the place where the blueprint goes to start it", + "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": "Controller: brain of the reactor, and the place where the blueprint goes to start it", - "createnuclear.ponder.reactor_t2.text_11": "Alarm: will sound if reactor overheats (free placing)", - "createnuclear.ponder.reactor_t2.text_12": "Floor 6", - "createnuclear.ponder.reactor_t2.text_13": "Floor 7", - "createnuclear.ponder.reactor_t2.text_14": "Floor 8", - "createnuclear.ponder.reactor_t2.text_15": "Floor 9", - "createnuclear.ponder.reactor_t2.text_16": "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_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": "Input: stores one stack of rod (free placing : can replace any casing not in the edge)", - "createnuclear.ponder.reactor_t2.text_5": "Output: where the generated power is extracted (free placing)", - "createnuclear.ponder.reactor_t2.text_6": "Floor 4", - "createnuclear.ponder.reactor_t2.text_7": "Second input: needed because you will likely have one input of fuel rod and one for coolant (free placing)", - "createnuclear.ponder.reactor_t2.text_8": "Floor 5", - "createnuclear.ponder.reactor_t2.text_9": "Liquid Input: cooling fluid inlet (free placing)", + "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": "Liquid Input: cooling fluid inlet (free placing)", - "createnuclear.ponder.reactor_t3.text_11": "Controller: brain of the reactor, and the place where the blueprint goes to start it", - "createnuclear.ponder.reactor_t3.text_12": "Alarm: will sound if reactor overheats (free placing)", - "createnuclear.ponder.reactor_t3.text_13": "Floor 7", - "createnuclear.ponder.reactor_t3.text_14": "Floor 8", - "createnuclear.ponder.reactor_t3.text_15": "Floor 9", - "createnuclear.ponder.reactor_t3.text_16": "Floor 10", - "createnuclear.ponder.reactor_t3.text_17": "Floor 11", - "createnuclear.ponder.reactor_t3.text_18": "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_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": "Input: stores one stack of rod (free placing : can replace any casing not in the edge)", - "createnuclear.ponder.reactor_t3.text_6": "Output: where the generated power is extracted (free placing)", - "createnuclear.ponder.reactor_t3.text_7": "Floor 5", - "createnuclear.ponder.reactor_t3.text_8": "Second input: needed because you will likely have one input of fuel rod and one for coolant (free placing)", - "createnuclear.ponder.reactor_t3.text_9": "Floor 6", + "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", + "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", @@ -279,14 +284,19 @@ "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.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/casing_break": "Break Reactor Casing", "createnuclear.subtitle.reacteur/casing_fall": "Reactor Casing Fall", "createnuclear.subtitle.reacteur/casing_hit": "Hit Reactor Casing", "createnuclear.subtitle.reacteur/casing_place": "Place Reactor Casing", "createnuclear.subtitle.reacteur/casing_step": "Step on Reactor Casing", + "createnuclear.subtitle.reacteur/running": "Reactor Running", + "createnuclear.subtitle.reacteur/shut_off": "Reactor Shut Off", "createnuclear.tooltip.baseRodHeat": "Base Rod Heat: %d Q", - "createnuclear.tooltip.cloth.color": "Color of armor piece: %s", + "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 ", @@ -296,6 +306,7 @@ "createnuclear.tooltip.heatLevel.none": "None", "createnuclear.tooltip.heatLevel.safety": "Safety", "createnuclear.tooltip.heatLevel.warning": "Warning", + "createnuclear.tooltip.heatRatio": "Heat Ratio: %d", "createnuclear.tooltip.item.cooled.rod": "Cooler Rod: ", "createnuclear.tooltip.item.empty.rod": "Input Items: ", "createnuclear.tooltip.item.fuel.rod": "Fuel Rod: ", @@ -306,7 +317,7 @@ "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_protection": "Protection Iodine", + "effect.createnuclear.iodine": "Iodine", "effect.createnuclear.radiation": "Radiation", "emi.category.createnuclear.fan_enriched": "Bulk Enriching", "emi.category.createnuclear.snow_powder": "Cryogenic fan", @@ -320,6 +331,9 @@ "fluid.createnuclear.uranium": "Liquid Uranium", "gui.createnuclear.reactor_controller.title": "Reactor Controller", "gui.createnuclear.reactor_input.title": "Reactor Input Storage", + "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_cloth": "Blue Cloth", "item.createnuclear.brown_cloth": "Brown Cloth", @@ -335,7 +349,7 @@ "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.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_cloth": "Green Cloth", "item.createnuclear.lead_ingot": "Lead Ingot", @@ -360,10 +374,11 @@ "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 cooling and fuel 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_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", @@ -371,41 +386,38 @@ "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.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_cloth": "Yellow Cloth", "item.createnuclear.yellowcake": "Yellowcake", - "item.minecraft.lingering_potion.effect.potion_of_protection_iodine": "Lingering Potion of Protection Iodine", - "item.minecraft.lingering_potion.effect.potion_of_protection_iodine_augment": "Lingering Potion of Protection Iodine", + "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_protection_iodine": "Potion of Protection Iodine", - "item.minecraft.potion.effect.potion_of_protection_iodine_augment": "Potion of Protection Iodine", + "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_protection_iodine": "Splash Potion of Protection Iodine", - "item.minecraft.splash_potion.effect.potion_of_protection_iodine_augment": "Splash Potion of Protection Iodine", + "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_protection_iodine": "Arrow of Protection Iodine", - "item.minecraft.tipped_arrow.effect.potion_of_protection_iodine_augment": "Arrow of Protection Iodine", + "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/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/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/default_anti_radiation_boots.json b/src/generated/resources/assets/createnuclear/models/item/default_anti_radiation_boots.json index 77835b789..7e2cc99b4 100644 --- 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 @@ -1,3 +1,104 @@ { - "parent": "createnuclear:item/default_anti_radiation_boots/item" + "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 index 59511da87..b851ffacd 100644 --- 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 @@ -1,3 +1,104 @@ { - "parent": "createnuclear:item/default_anti_radiation_chestplate/item" + "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 index 6df967d89..53d4be45f 100644 --- 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 @@ -1,3 +1,104 @@ { - "parent": "createnuclear:item/default_anti_radiation_helmet/item" + "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 index 224fa9f70..cc553f827 100644 --- 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 @@ -1,3 +1,104 @@ { - "parent": "createnuclear:item/default_anti_radiation_leggings/item" + "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/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_liquid_input.json b/src/generated/resources/assets/createnuclear/models/item/reactor_liquid_input.json deleted file mode 100644 index 35072cc18..000000000 --- a/src/generated/resources/assets/createnuclear/models/item/reactor_liquid_input.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "createnuclear:block/reactor/liquid_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/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/sounds.json b/src/generated/resources/assets/createnuclear/sounds.json index a43d66a7b..a6d3073a6 100644 --- a/src/generated/resources/assets/createnuclear/sounds.json +++ b/src/generated/resources/assets/createnuclear/sounds.json @@ -17,6 +17,15 @@ ], "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": [ { @@ -107,6 +116,33 @@ ], "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/casing_break": { "sounds": [ { @@ -151,5 +187,23 @@ } ], "subtitle": "createnuclear.subtitle.reacteur/casing_step" + }, + "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/cryogenic_baptism.json b/src/generated/resources/data/createnuclear/advancements/cryogenic_baptism.json index 75b74fd5e..80219e67d 100644 --- a/src/generated/resources/data/createnuclear/advancements/cryogenic_baptism.json +++ b/src/generated/resources/data/createnuclear/advancements/cryogenic_baptism.json @@ -7,13 +7,13 @@ } }, "display": { - "announce_to_chat": false, + "announce_to_chat": true, "description": { "color": "#DBA213", "translate": "advancement.createnuclear.cryogenic_baptism.desc" }, - "frame": "task", - "hidden": false, + "frame": "goal", + "hidden": true, "icon": { "item": "createnuclear:nitrogen_bucket" }, diff --git a/src/generated/resources/data/createnuclear/advancements/reactor_input.json b/src/generated/resources/data/createnuclear/advancements/feeding_the_reactor.json similarity index 69% rename from src/generated/resources/data/createnuclear/advancements/reactor_input.json rename to src/generated/resources/data/createnuclear/advancements/feeding_the_reactor.json index d75676dac..524586ca2 100644 --- a/src/generated/resources/data/createnuclear/advancements/reactor_input.json +++ b/src/generated/resources/data/createnuclear/advancements/feeding_the_reactor.json @@ -6,7 +6,7 @@ "items": [ { "items": [ - "createnuclear:reactor_input" + "createnuclear:reactor_rod_input" ] } ] @@ -18,16 +18,16 @@ "announce_to_chat": false, "description": { "color": "#DBA213", - "translate": "advancement.createnuclear.reactor_input.desc" + "translate": "advancement.createnuclear.feeding_the_reactor.desc" }, "frame": "task", "hidden": false, "icon": { - "item": "createnuclear:reactor_input" + "item": "createnuclear:reactor_rod_input" }, "show_toast": true, "title": { - "translate": "advancement.createnuclear.reactor_input" + "translate": "advancement.createnuclear.feeding_the_reactor" } }, "requirements": [ diff --git a/src/generated/resources/data/createnuclear/advancements/first_nitrate.json b/src/generated/resources/data/createnuclear/advancements/first_nitrate.json deleted file mode 100644 index 0c0463383..000000000 --- a/src/generated/resources/data/createnuclear/advancements/first_nitrate.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "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.first_nitrate.desc" - }, - "frame": "task", - "hidden": false, - "icon": { - "item": "createnuclear:nitrate" - }, - "show_toast": true, - "title": { - "translate": "advancement.createnuclear.first_nitrate" - } - }, - "requirements": [ - [ - "0" - ] - ], - "sends_telemetry_event": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/first_thorium.json b/src/generated/resources/data/createnuclear/advancements/first_thorium.json deleted file mode 100644 index 8680354a0..000000000 --- a/src/generated/resources/data/createnuclear/advancements/first_thorium.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "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.first_thorium.desc" - }, - "frame": "task", - "hidden": false, - "icon": { - "item": "createnuclear:raw_thorium" - }, - "show_toast": true, - "title": { - "translate": "advancement.createnuclear.first_thorium" - } - }, - "requirements": [ - [ - "0" - ] - ], - "sends_telemetry_event": true -} \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/advancements/reactor_liquid_input.json b/src/generated/resources/data/createnuclear/advancements/fueling_the_reactor.json similarity index 63% rename from src/generated/resources/data/createnuclear/advancements/reactor_liquid_input.json rename to src/generated/resources/data/createnuclear/advancements/fueling_the_reactor.json index ef11058bd..c93fd2d31 100644 --- a/src/generated/resources/data/createnuclear/advancements/reactor_liquid_input.json +++ b/src/generated/resources/data/createnuclear/advancements/fueling_the_reactor.json @@ -1,12 +1,12 @@ { - "parent": "createnuclear:reactor_casing", + "parent": "createnuclear:feeding_the_reactor", "criteria": { "0": { "conditions": { "items": [ { "items": [ - "createnuclear:reactor_liquid_input" + "createnuclear:reactor_fluid_input" ] } ] @@ -18,16 +18,16 @@ "announce_to_chat": false, "description": { "color": "#DBA213", - "translate": "advancement.createnuclear.reactor_liquid_input.desc" + "translate": "advancement.createnuclear.fueling_the_reactor.desc" }, "frame": "task", "hidden": false, "icon": { - "item": "createnuclear:reactor_liquid_input" + "item": "createnuclear:reactor_fluid_input" }, "show_toast": true, "title": { - "translate": "advancement.createnuclear.reactor_liquid_input" + "translate": "advancement.createnuclear.fueling_the_reactor" } }, "requirements": [ 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/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/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/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/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/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/reactor_output.json b/src/generated/resources/data/createnuclear/advancements/unlimited_power.json similarity index 76% rename from src/generated/resources/data/createnuclear/advancements/reactor_output.json rename to src/generated/resources/data/createnuclear/advancements/unlimited_power.json index 54b8e4b8f..afa6ecc5e 100644 --- a/src/generated/resources/data/createnuclear/advancements/reactor_output.json +++ b/src/generated/resources/data/createnuclear/advancements/unlimited_power.json @@ -1,5 +1,5 @@ { - "parent": "createnuclear:reactor_casing", + "parent": "createnuclear:fueling_the_reactor", "criteria": { "0": { "conditions": { @@ -18,7 +18,7 @@ "announce_to_chat": false, "description": { "color": "#DBA213", - "translate": "advancement.createnuclear.reactor_output.desc" + "translate": "advancement.createnuclear.unlimited_power.desc" }, "frame": "task", "hidden": false, @@ -27,7 +27,7 @@ }, "show_toast": true, "title": { - "translate": "advancement.createnuclear.reactor_output" + "translate": "advancement.createnuclear.unlimited_power" } }, "requirements": [ diff --git a/src/generated/resources/data/createnuclear/createnuclear/fluids/type/fallback.json b/src/generated/resources/data/createnuclear/createnuclear/fluids/type/fallback.json index 4c5a3faa2..ea208e24d 100644 --- a/src/generated/resources/data/createnuclear/createnuclear/fluids/type/fallback.json +++ b/src/generated/resources/data/createnuclear/createnuclear/fluids/type/fallback.json @@ -1,5 +1,5 @@ { "efficiency": -1, - "fluids": [], + "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 index 8056badd0..62e15f99d 100644 --- a/src/generated/resources/data/createnuclear/createnuclear/fluids/type/nitrogen.json +++ b/src/generated/resources/data/createnuclear/createnuclear/fluids/type/nitrogen.json @@ -1,5 +1,5 @@ { "efficiency": 100, - "fluids": "createnuclear:nitrogen", + "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 index b8ae757a2..5a3ff5851 100644 --- a/src/generated/resources/data/createnuclear/createnuclear/fluids/type/water.json +++ b/src/generated/resources/data/createnuclear/createnuclear/fluids/type/water.json @@ -1,5 +1,5 @@ { "efficiency": 1000, - "fluids": "minecraft:water", + "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 index 4e42f40f1..57c68b48d 100644 --- a/src/generated/resources/data/createnuclear/createnuclear/rods/type/fallback.json +++ b/src/generated/resources/data/createnuclear/createnuclear/rods/type/fallback.json @@ -1,7 +1,7 @@ { "type": "NONE", "baseRodHeat": -1, - "items": [], + "item": "minecraft:air", "proximityRodHeat": -1.0, "rodTimer": -1 } \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/loot_tables/blocks/reactor_liquid_input.json b/src/generated/resources/data/createnuclear/loot_tables/blocks/reactor_fluid_input.json similarity index 71% rename from src/generated/resources/data/createnuclear/loot_tables/blocks/reactor_liquid_input.json rename to src/generated/resources/data/createnuclear/loot_tables/blocks/reactor_fluid_input.json index 59a5a712d..6fb4edd06 100644 --- a/src/generated/resources/data/createnuclear/loot_tables/blocks/reactor_liquid_input.json +++ b/src/generated/resources/data/createnuclear/loot_tables/blocks/reactor_fluid_input.json @@ -11,11 +11,11 @@ "entries": [ { "type": "minecraft:item", - "name": "createnuclear:reactor_liquid_input" + "name": "createnuclear:reactor_fluid_input" } ], "rolls": 1.0 } ], - "random_sequence": "createnuclear:blocks/reactor_liquid_input" + "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_rod_input.json similarity index 72% rename from src/generated/resources/data/createnuclear/loot_tables/blocks/reactor_input.json rename to src/generated/resources/data/createnuclear/loot_tables/blocks/reactor_rod_input.json index 12d085210..bc7116980 100644 --- a/src/generated/resources/data/createnuclear/loot_tables/blocks/reactor_input.json +++ b/src/generated/resources/data/createnuclear/loot_tables/blocks/reactor_rod_input.json @@ -11,11 +11,11 @@ "entries": [ { "type": "minecraft:item", - "name": "createnuclear:reactor_input" + "name": "createnuclear:reactor_rod_input" } ], "rolls": 1.0 } ], - "random_sequence": "createnuclear:blocks/reactor_input" + "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 index f655a6685..346c8684d 100644 --- a/src/generated/resources/data/createnuclear/loot_tables/blocks/thorium_block.json +++ b/src/generated/resources/data/createnuclear/loot_tables/blocks/thorium_block.json @@ -3,44 +3,15 @@ "pools": [ { "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], "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_block" - }, - { - "type": "minecraft:item", - "functions": [ - { - "enchantment": "minecraft:fortune", - "formula": "minecraft:ore_drops", - "function": "minecraft:apply_bonus" - }, - { - "function": "minecraft:explosion_decay" - } - ], - "name": "createnuclear:raw_uranium" - } - ] + "type": "minecraft:item", + "name": "createnuclear:thorium_block" } ], "rolls": 1.0 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/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/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/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/crushing/raw_thorium.json b/src/generated/resources/data/createnuclear/recipes/crushing/raw_thorium.json index a92abf021..618069e91 100644 --- a/src/generated/resources/data/createnuclear/recipes/crushing/raw_thorium.json +++ b/src/generated/resources/data/createnuclear/recipes/crushing/raw_thorium.json @@ -11,9 +11,8 @@ "item": "createnuclear:thorium_dust" }, { - "chance": 0.5, - "count": 8, - "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 index bb8e02cab..b786a807f 100644 --- a/src/generated/resources/data/createnuclear/recipes/crushing/raw_thorium_block.json +++ b/src/generated/resources/data/createnuclear/recipes/crushing/raw_thorium_block.json @@ -12,9 +12,9 @@ "item": "createnuclear:thorium_dust" }, { - "chance": 0.5, - "count": 72, - "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/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/item_application/reactor_input_from_hopper_and_reactor_casing.json b/src/generated/resources/data/createnuclear/recipes/deploying/reactor_rod_input_from_hopper_and_reactor_casing.json similarity index 66% rename from src/generated/resources/data/createnuclear/recipes/item_application/reactor_input_from_hopper_and_reactor_casing.json rename to src/generated/resources/data/createnuclear/recipes/deploying/reactor_rod_input_from_hopper_and_reactor_casing.json index f5690f240..e0d05ca41 100644 --- a/src/generated/resources/data/createnuclear/recipes/item_application/reactor_input_from_hopper_and_reactor_casing.json +++ b/src/generated/resources/data/createnuclear/recipes/deploying/reactor_rod_input_from_hopper_and_reactor_casing.json @@ -1,5 +1,5 @@ { - "type": "create:item_application", + "type": "create:deploying", "ingredients": [ { "item": "createnuclear:reactor_casing" @@ -10,7 +10,7 @@ ], "results": [ { - "item": "createnuclear:reactor_input" + "item": "createnuclear:reactor_rod_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/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/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/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/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/thorium_ores.json b/src/generated/resources/data/createnuclear/tags/items/thorium_ores.json deleted file mode 100644 index 6ea006dfe..000000000 --- a/src/generated/resources/data/createnuclear/tags/items/thorium_ores.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "values": [ - "createnuclear:thorium_block" - ] -} \ 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_plain.json b/src/generated/resources/data/createnuclear/worldgen/biome/irradiated_land.json similarity index 80% rename from src/generated/resources/data/createnuclear/worldgen/biome/irradiated_plain.json rename to src/generated/resources/data/createnuclear/worldgen/biome/irradiated_land.json index 7570a5c42..c69706c5f 100644 --- a/src/generated/resources/data/createnuclear/worldgen/biome/irradiated_plain.json +++ b/src/generated/resources/data/createnuclear/worldgen/biome/irradiated_land.json @@ -1,9 +1,8 @@ { - "carvers": { - "air": "minecraft:nether_cave" - }, + "carvers": {}, "downfall": 0.0, "effects": { + "ambient_sound": "createnuclear:biomes/wasteland", "fog_color": 4742718, "foliage_color": 5660222, "grass_color": 9211739, @@ -24,17 +23,7 @@ "water_color": 3887411, "water_fog_color": 658954 }, - "features": [ - [], - [], - [], - [ - "minecraft:blue_ice" - ], - [ - "minecraft:void_start_platform" - ] - ], + "features": [], "has_precipitation": false, "spawn_costs": {}, "spawners": { 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 3c272941a..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": 10, + "size": 12, "targets": [ { "state": { 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 index a0af6e82e..f0e17e287 100644 --- a/src/generated/resources/data/createnuclear/worldgen/configured_feature/thorium_ore.json +++ b/src/generated/resources/data/createnuclear/worldgen/configured_feature/thorium_ore.json @@ -2,7 +2,7 @@ "type": "minecraft:ore", "config": { "discard_chance_on_air_exposure": 0.0, - "size": 16, + "size": 12, "targets": [ { "state": { 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 index cdb4eb040..b59dbcfe9 100644 --- a/src/generated/resources/data/createnuclear/worldgen/noise_settings/irradiated_noise.json +++ b/src/generated/resources/data/createnuclear/worldgen/noise_settings/irradiated_noise.json @@ -169,7 +169,7 @@ "if_true": { "type": "minecraft:biome", "biome_is": [ - "createnuclear:irradiated_plain" + "createnuclear:irradiated_land" ] }, "then_run": { @@ -260,37 +260,19 @@ "surface_type": "floor" }, "then_run": { - "type": "minecraft:sequence", - "sequence": [ - { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:biome", - "biome_is": [ - "createnuclear:irradiated_plain" - ] - }, - "then_run": { - "type": "minecraft:block", - "result_state": { - "Name": "createnuclear:raw_lead_block" - } - } - }, - { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:biome", - "biome_is": [] - }, - "then_run": { - "type": "minecraft:block", - "result_state": { - "Name": "createnuclear:lead_ore" - } - } + "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" } - ] + } } }, { @@ -303,37 +285,19 @@ "surface_type": "floor" }, "then_run": { - "type": "minecraft:sequence", - "sequence": [ - { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:biome", - "biome_is": [ - "createnuclear:irradiated_plain" - ] - }, - "then_run": { - "type": "minecraft:block", - "result_state": { - "Name": "createnuclear:raw_lead_block" - } - } - }, - { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:biome", - "biome_is": [] - }, - "then_run": { - "type": "minecraft:block", - "result_state": { - "Name": "createnuclear:steel_block" - } - } + "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" } - ] + } } } ] 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 11ba3bd95..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 @@ -13,7 +13,7 @@ "height": { "type": "minecraft:trapezoid", "max_inclusive": { - "absolute": 112 + "absolute": 60 }, "min_inclusive": { "absolute": -16 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 7af139767..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,10 +13,10 @@ "height": { "type": "minecraft:uniform", "max_inclusive": { - "absolute": 70 + "absolute": 16 }, "min_inclusive": { - "absolute": -30 + "absolute": -63 } } }, 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 index 2b2606670..3a1cfe261 100644 --- a/src/generated/resources/data/createnuclear/worldgen/placed_feature/thorium_ore.json +++ b/src/generated/resources/data/createnuclear/worldgen/placed_feature/thorium_ore.json @@ -3,7 +3,7 @@ "placement": [ { "type": "minecraft:count", - "count": 16 + "count": 6 }, { "type": "minecraft:in_square" @@ -13,7 +13,7 @@ "height": { "type": "minecraft:trapezoid", "max_inclusive": { - "absolute": 112 + "absolute": 55 }, "min_inclusive": { "absolute": -16 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 f5af6eb0f..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": 7 + "count": 4 }, { "type": "minecraft:in_square" diff --git a/src/generated/resources/data/forge/tags/blocks/ores.json b/src/generated/resources/data/forge/tags/blocks/ores.json index ad601ebcb..c393b2056 100644 --- a/src/generated/resources/data/forge/tags/blocks/ores.json +++ b/src/generated/resources/data/forge/tags/blocks/ores.json @@ -7,7 +7,6 @@ "createnuclear:lead_ore", "createnuclear:thorium_ore", "createnuclear:nitrate_ore", - "createnuclear:deepslate_nitrate_ore", - "createnuclear:thorium_block" + "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 index 34d5e1534..c5f8a4240 100644 --- a/src/generated/resources/data/forge/tags/blocks/ores/thorium.json +++ b/src/generated/resources/data/forge/tags/blocks/ores/thorium.json @@ -1,7 +1,6 @@ { "values": [ "createnuclear:deepslate_thorium_ore", - "createnuclear:thorium_ore", - "createnuclear:thorium_block" + "createnuclear:thorium_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 ebb310b15..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 @@ -3,7 +3,6 @@ "createnuclear:uranium_ore", "createnuclear:lead_ore", "createnuclear:thorium_ore", - "createnuclear:nitrate_ore", - "createnuclear:thorium_block" + "createnuclear:nitrate_ore" ] } \ No newline at end of file diff --git a/src/generated/resources/data/createnuclear/tags/blocks/thorium_ores.json b/src/generated/resources/data/forge/tags/blocks/storage_blocks/thorium.json similarity index 100% rename from src/generated/resources/data/createnuclear/tags/blocks/thorium_ores.json rename to src/generated/resources/data/forge/tags/blocks/storage_blocks/thorium.json diff --git a/src/generated/resources/data/forge/tags/items/ores/thorium.json b/src/generated/resources/data/forge/tags/items/ores/thorium.json index 34d5e1534..c5f8a4240 100644 --- a/src/generated/resources/data/forge/tags/items/ores/thorium.json +++ b/src/generated/resources/data/forge/tags/items/ores/thorium.json @@ -1,7 +1,6 @@ { "values": [ "createnuclear:deepslate_thorium_ore", - "createnuclear:thorium_ore", - "createnuclear:thorium_block" + "createnuclear:thorium_ore" ] } \ 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 750d45c49..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,8 +4,8 @@ "createnuclear:reactor_core", "createnuclear:reactor_frame", "createnuclear:reactor_cooler", - "createnuclear:reactor_input", - "createnuclear:reactor_liquid_input", + "createnuclear:reactor_rod_input", + "createnuclear:reactor_fluid_input", "createnuclear:reactor_output", "createnuclear:reactor_controller", "createnuclear:enriching_campfire", 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 57ff4a348..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,15 +4,16 @@ "createnuclear:reactor_core", "createnuclear:reactor_frame", "createnuclear:reactor_cooler", - "createnuclear:reactor_input", - "createnuclear:reactor_liquid_input", + "createnuclear:reactor_rod_input", + "createnuclear:reactor_fluid_input", "createnuclear:reactor_output", "createnuclear:reactor_controller", "createnuclear:enriched_soul_soil", "createnuclear:deepslate_uranium_ore", "createnuclear:deepslate_thorium_ore", "createnuclear:uranium_ore", + "createnuclear:thorium_ore", "createnuclear:raw_uranium_block", - "createnuclear:thorium_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 8251ff56a..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 @@ -2,11 +2,11 @@ "values": [ "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:thorium_block" + "createnuclear:deepslate_nitrate_ore" ] } \ 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 24f6fde0a..77b34369f 100644 --- a/src/main/java/lib/multiblock/SimpleMultiBlockAislePatternBuilder.java +++ b/src/main/java/lib/multiblock/SimpleMultiBlockAislePatternBuilder.java @@ -10,7 +10,6 @@ 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; @@ -19,7 +18,6 @@ import java.util.Map; import java.util.function.Predicate; import java.util.function.Supplier; -import java.util.stream.Stream; public class SimpleMultiBlockAislePatternBuilder implements IMultiBlockPatternBuilder { public static SimpleMultiBlockAislePatternBuilder start() { @@ -72,7 +70,6 @@ public SimpleMultiBlockAislePatternBuilder block(char pSymbol, Supplier T build(IPatternBuilder builder){ var data = Util.parseBlockPattern(pattern, lookup.keySet()); var coreList = data.get('*'); - CreateNuclear.LOGGER.info("1: {}", coreList.toString()); 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)); } @@ -86,10 +83,4 @@ public BlockPos getDistanceController(char character) { var coreList = data.get(character); return coreList.get(0).pos(); } - - public Stream getDistanceControllerTest(char character) { - Map> data = Util.parseBlockPattern(pattern, lookup.keySet()); - List coreList = data.get(character); - return coreList.stream(); - } } diff --git a/src/main/java/lib/multiblock/SimpleMultiBlockPattern.java b/src/main/java/lib/multiblock/SimpleMultiBlockPattern.java index 296196011..0d8ef6aae 100644 --- a/src/main/java/lib/multiblock/SimpleMultiBlockPattern.java +++ b/src/main/java/lib/multiblock/SimpleMultiBlockPattern.java @@ -31,7 +31,7 @@ public SimpleMultiBlockPattern(List multiBlockOffsetPosList 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,7 +58,7 @@ public void construct(Level level, BlockPos blockPos, BiPredicate stateSupplier = blockProvider.get(character); if (stateSupplier != null) { var pos = blockPos.offset(multiBlockOffsetPos.pos().rotate(Rotation.NONE)); @@ -68,8 +68,4 @@ public void construct(Level level, BlockPos blockPos, BiPredicate 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 6183f7a06..000000000 --- a/src/main/java/lib/multiblock/SimpleMultiBlockPatternBuilder.java +++ /dev/null @@ -1,71 +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 net.nuclearteam.createnuclear.CreateNuclear; - -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; - -@SuppressWarnings("unused") -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('*'); - CreateNuclear.LOGGER.info("2: {}", coreList.toString()); - 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 e4570f4d6..000000000 --- a/src/main/java/lib/multiblock/impl/IBetterPattern.java +++ /dev/null @@ -1,26 +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) { - - } -} 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 84bb32856..000000000 --- a/src/main/java/lib/multiblock/manager/MultiBlockCache.java +++ /dev/null @@ -1,24 +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.Level; -import net.minecraft.world.level.block.Rotation; - -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/CNBlockEntityTypes.java b/src/main/java/net/nuclearteam/createnuclear/CNBlockEntityTypes.java index 19ed5ae31..6489ae40f 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CNBlockEntityTypes.java +++ b/src/main/java/net/nuclearteam/createnuclear/CNBlockEntityTypes.java @@ -10,7 +10,7 @@ import net.nuclearteam.createnuclear.content.multiblock.core.ReactorCoreEntity; import net.nuclearteam.createnuclear.content.multiblock.frame.ReactorFrameEntity; import net.nuclearteam.createnuclear.content.multiblock.frame.ReactorFrameRenderer; -import net.nuclearteam.createnuclear.content.multiblock.input.item.ReactorInputEntity; +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; @@ -37,14 +37,14 @@ public class CNBlockEntityTypes { .renderer(() -> ReactorFrameRenderer::new) .register(); - public static final BlockEntityEntry REACTOR_INPUT = - CreateNuclear.REGISTRATE.blockEntity("reactor_input", ReactorInputEntity::new) - .validBlocks(CNBlocks.REACTOR_INPUT) + 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_LIQUID_INPUT = - CreateNuclear.REGISTRATE.blockEntity("reactor_liquid_input", ReactorFluidInputEntity::new) - .validBlocks(CNBlocks.REACTOR_LIQUID_INPUT) + 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 = diff --git a/src/main/java/net/nuclearteam/createnuclear/CNBlocks.java b/src/main/java/net/nuclearteam/createnuclear/CNBlocks.java index 5acf90d28..02159b2d7 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CNBlocks.java +++ b/src/main/java/net/nuclearteam/createnuclear/CNBlocks.java @@ -20,9 +20,6 @@ import net.minecraft.data.recipes.RecipeCategory; import net.minecraft.data.recipes.ShapedRecipeBuilder; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.sounds.SoundEvents; -import net.minecraft.tags.BlockTags; import net.minecraft.tags.ItemTags; import net.minecraft.world.item.Items; import net.minecraft.world.item.enchantment.Enchantments; @@ -43,24 +40,19 @@ import net.nuclearteam.createnuclear.content.enriching.fire.EnrichingFireBlock; import net.minecraftforge.common.Tags; -import net.minecraftforge.common.util.ForgeSoundType; -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.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.item.ReactorInput; -import net.nuclearteam.createnuclear.content.multiblock.input.item.ReactorInputGenerator; -import net.nuclearteam.createnuclear.content.multiblock.input.fluid.ReactorLiquidInput; -import net.nuclearteam.createnuclear.content.multiblock.input.fluid.ReactorLiquidInputGenerator; +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.reinforced.ReinforcedGlassBlock; @@ -153,31 +145,31 @@ public class CNBlocks { .transform(pickaxeOnly()) .register(); - public static final BlockEntry REACTOR_INPUT = CreateNuclear.REGISTRATE - .block("reactor_input", ReactorInput::new) + 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 ReactorInputGenerator()::generate) + .blockstate(new ReactorRodInputGenerator()::generate) .item() - .transform(customItemModel("reactor", "input", "item")) + .transform(customItemModel("reactor", "rod_input", "item")) .register(); - public static final BlockEntry REACTOR_LIQUID_INPUT = - CreateNuclear.REGISTRATE.block("reactor_liquid_input", ReactorLiquidInput::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 ReactorLiquidInputGenerator()::generate) + .blockstate(new ReactorFluidInputGenerator()::generate) .item() - .transform(customItemModel("reactor", "liquid_input", "item")) + .transform(customItemModel("reactor", "fluid_input", "item")) .register(); public static final BlockEntry REACTOR_OUTPUT = @@ -188,7 +180,7 @@ 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(); @@ -214,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) @@ -381,11 +373,10 @@ public class CNBlocks { BlockTags.NEEDS_IRON_TOOL, CNTags.forgeBlockTag("ores"), CNTags.forgeBlockTag("ores_in_ground/deepslate"), - CNTags.forgeBlockTag("ores/uranium"), - CNBlockTags.URANIUM_ORES.tag + CNTags.forgeBlockTag("ores/uranium") ) .item((b, p) -> new UraniumOreItem(b, p, 3)) - .tag(CNItemTags.URANIUM_ORES.tag, CNTags.forgeItemTag("ores/uranium")) + .tag(CNTags.forgeItemTag("ores/uranium")) .build() .register(); @@ -403,11 +394,10 @@ public class CNBlocks { .tag(BlockTags.NEEDS_IRON_TOOL, CNTags.forgeBlockTag("ores"), CNTags.forgeBlockTag("ores_in_ground/deepslate"), - CNTags.forgeBlockTag("ores/lead"), - CNBlockTags.LEAD_ORES.tag) + CNTags.forgeBlockTag("ores/lead") + ) .item() - .tag(CNItemTags.LEAD_ORES.tag, - CNTags.forgeItemTag("ores/lead")) + .tag(CNTags.forgeItemTag("ores/lead")) .build() .register(); @@ -423,6 +413,7 @@ public class CNBlocks { .apply(ApplyBonusCount.addUniformBonusCount(Enchantments.BLOCK_FORTUNE, 5)) )))) .tag(BlockTags.NEEDS_DIAMOND_TOOL, + BlockTags.NEEDS_IRON_TOOL, CNTags.forgeBlockTag("ores"), CNTags.forgeBlockTag("ores_in_ground/deepslate"), CNTags.forgeBlockTag("ores/thorium") @@ -448,11 +439,10 @@ public class CNBlocks { BlockTags.NEEDS_IRON_TOOL, CNTags.forgeBlockTag("ores"), CNTags.forgeBlockTag("ores_in_ground/stone"), - CNTags.forgeBlockTag("ores/uranium"), - CNBlockTags.URANIUM_ORES.tag + CNTags.forgeBlockTag("ores/uranium") ) .item((b, p) -> new UraniumOreItem(b, p, 3)) - .tag(CNItemTags.URANIUM_ORES.tag, CNTags.forgeItemTag("ores/uranium")) + .tag(CNTags.forgeItemTag("ores/uranium")) .build() .register(); @@ -469,11 +459,10 @@ public class CNBlocks { .tag(BlockTags.NEEDS_IRON_TOOL, CNTags.forgeBlockTag("ores"), CNTags.forgeBlockTag("ores_in_ground/stone"), - CNTags.forgeBlockTag("ores/lead"), - CNBlockTags.LEAD_ORES.tag) + CNTags.forgeBlockTag("ores/lead") + ) .item() - .tag(CNItemTags.LEAD_ORES.tag, - CNTags.forgeItemTag("ores/lead")) + .tag(CNTags.forgeItemTag("ores/lead")) .build() .register(); @@ -489,7 +478,8 @@ public class CNBlocks { .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/stone"), CNTags.forgeBlockTag("ores/thorium") @@ -577,7 +567,7 @@ public class CNBlocks { CreateNuclear.REGISTRATE.block("raw_thorium_block", Block::new) .initialProperties(SharedProperties::stone) .transform(pickaxeOnly()) - .tag(CNTags.forgeBlockTag("storage_blocks/raw_thorium")) + .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")) @@ -604,20 +594,9 @@ public class CNBlocks { 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/stone"), - CNTags.forgeBlockTag("ores/thorium"), - CNBlockTags.THORIUM_ORES.tag) + .tag(CNTags.forgeBlockTag("storage_blocks/thorium")) .item() - .tag(CNItemTags.THORIUM_ORES.tag, - CNTags.forgeItemTag("ores/thorium"), - CNTags.forgeItemTag("storage_blocks/thorium")) + .tag(CNTags.forgeItemTag("storage_blocks/thorium")) .build() .register(); @@ -638,25 +617,8 @@ public class CNBlocks { .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 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/CNEffects.java b/src/main/java/net/nuclearteam/createnuclear/CNEffects.java index e17ad390b..b2d72e951 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CNEffects.java +++ b/src/main/java/net/nuclearteam/createnuclear/CNEffects.java @@ -6,13 +6,13 @@ import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; import net.nuclearteam.createnuclear.content.effects.IodineEffect; -import net.nuclearteam.createnuclear.content.effects.RadiationEffect; +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_PROTECTION = EFFECTS.register("iodine_protection", IodineEffect::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 3eb556e13..1dc3ee45d 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CNEntityType.java +++ b/src/main/java/net/nuclearteam/createnuclear/CNEntityType.java @@ -25,23 +25,6 @@ public class CNEntityType { - 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) - ) - // Utilise le renderer vide par défaut de Minecraft - .renderer(() -> NoopRenderer::new) - .register(); - public static final EntityEntry IRRADIATED_CAT = CreateNuclear.REGISTRATE .entity("irradiated_cat", IrradiatedCat::new, MobCategory.CREATURE) .loot((tb, e) -> tb.add(e, LootTable.lootTable())) @@ -72,14 +55,26 @@ 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) + 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) { diff --git a/src/main/java/net/nuclearteam/createnuclear/CNFluids.java b/src/main/java/net/nuclearteam/createnuclear/CNFluids.java index b0e32df20..abffe7d1c 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CNFluids.java +++ b/src/main/java/net/nuclearteam/createnuclear/CNFluids.java @@ -10,8 +10,6 @@ import net.minecraft.core.dispenser.DispenseItemBehavior; import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvents; -import net.minecraft.world.damagesource.DamageEffects; -import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; @@ -24,7 +22,6 @@ 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.levelgen.feature.SnowAndFreezeFeature; import net.minecraft.world.level.material.FluidState; import net.minecraftforge.common.ForgeMod; import net.minecraftforge.common.SoundActions; @@ -35,8 +32,9 @@ 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.foundation.item.radiation.RadiationBucketItem; +import net.nuclearteam.createnuclear.content.radiation.RadiationBucketItem; import org.joml.Vector3f; import net.nuclearteam.createnuclear.CNTags.CNFluidTags; @@ -45,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") @@ -98,7 +98,7 @@ public class CNFluids { .lang("Liquid Nitrogen") .tag(CNFluidTags.NITROGEN.tag) .properties(p -> p.viscosity(1000) - .density(0) + .density(1000) .canSwim(true) .sound(SoundActions.BUCKET_FILL, SoundEvents.BUCKET_FILL_AXOLOTL) .sound(SoundActions.BUCKET_EMPTY, SoundEvents.BUCKET_EMPTY_FISH) @@ -127,16 +127,16 @@ public static void handleFluidEffect(LivingEvent.LivingTickEvent event) { Level level = entity.level(); - // 1. EFFET DE L'URANIUM (Radiation) + // 1. Uranium: applies radiation contagion if (entity.isInFluidType(URANIUM.getType())) { if (entity.tickCount % 20 == 0) { - entity.addEffect(new MobEffectInstance(CNEffects.RADIATION.get(), 100, 0)); + RadiationCapability.applyContagion(entity, URANIUM_FLUID_DOSE, 100); } } - // 2. EFFET DE L'AZOTE LIQUIDE (Gel type Neige Poudreuse) + // 2. Liquid nitrogen: freezes the entity like powder snow else if (entity.isInFluidType(LIQUID_NITROGEN.getType())) { - // PROBLÈME 1 RÉSOLU : Si l'entité est en feu, on l'éteint immédiatement + // Extinguish fire immediately on contact if (entity.isOnFire()) { entity.clearFire(); } @@ -150,13 +150,13 @@ else if (entity.isInFluidType(LIQUID_NITROGEN.getType())) { int freezeSpeed = 3; if (level.isClientSide) { - // On vise maxTicks + 1 pour que la baisse de -1 du client ramène pile à maxTicks + // Target maxTicks + 1 so vanilla's client-side -1 decay settles exactly at maxTicks entity.setTicksFrozen(Math.min(maxTicks + 1, currentTicks + freezeSpeed + 1)); } else { - // On vise maxTicks + 2 pour que la baisse de -2 du serveur ramène pile à maxTicks + // Target maxTicks + 2 so vanilla's server-side -2 decay settles exactly at maxTicks entity.setTicksFrozen(Math.min(maxTicks + 2, currentTicks + freezeSpeed + 2)); - // PROBLÈME 2 RÉSOLU : On vérifie le gel APRÈS modification ou avec la compensation + // Check the freeze state after applying the compensation above if (entity.getTicksFrozen() >= maxTicks && entity.tickCount % 10 == 0) { entity.hurt(entity.damageSources().freeze(), 2.0F); } @@ -165,7 +165,7 @@ else if (entity.isInFluidType(LIQUID_NITROGEN.getType())) { } } - // 3. EFFET DU THORIUM (Brûlure) + // 3. Thorium: burns the entity like lava else if (entity.isInFluidType(THORIUM.getType())) { entity.lavaHurt(); } diff --git a/src/main/java/net/nuclearteam/createnuclear/CNItems.java b/src/main/java/net/nuclearteam/createnuclear/CNItems.java index af4ca33f6..792edaefe 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CNItems.java +++ b/src/main/java/net/nuclearteam/createnuclear/CNItems.java @@ -1,7 +1,5 @@ package net.nuclearteam.createnuclear; -import com.simibubi.create.AllTags; -import com.simibubi.create.foundation.data.AssetLookup; import com.tterrag.registrate.util.entry.ItemEntry; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; @@ -9,26 +7,22 @@ import net.minecraft.data.recipes.RecipeCategory; import net.minecraft.data.recipes.ShapedRecipeBuilder; import net.minecraft.data.recipes.ShapelessRecipeBuilder; -import net.minecraft.data.recipes.SmithingTransformRecipeBuilder; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.tags.ItemTags; 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.ItemStack; import net.minecraft.world.item.crafting.Ingredient; import net.minecraftforge.common.ForgeSpawnEggItem; +import net.nuclearteam.createnuclear.content.biome.BiomeIrradationExtractorItem; +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.foundation.item.radiation.RadiationItem; +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 java.util.function.Supplier; import net.minecraft.world.item.Items; import net.nuclearteam.createnuclear.CNTags.CNItemTags; import net.nuclearteam.createnuclear.api.ItemRodTypesValue; @@ -43,6 +37,9 @@ import java.util.Arrays; import java.util.List; +import static net.nuclearteam.createnuclear.foundation.data.CNBuilderTransformers.biomeRestoreModel; +import static net.nuclearteam.createnuclear.foundation.data.CNBuilderTransformers.coloredArmorModel; + @SuppressWarnings({"unused", "deprecation"}) public class CNItems { @@ -125,7 +122,10 @@ public class CNItems { GRAPHITE_ROD = CreateNuclear.REGISTRATE .item("graphite_rod", Item::new) .onRegister(ItemRodTypesValue.setRodTypeInfos(new RodType.Builder() - .setRodConfig() + .baseRodHeat(() -> CNConfigs.server().rods.baseValueGraphite.get()) + .proximityRodHeat(() -> CNConfigs.server().rods.graphiteProxyMalus.getF()) + .rodTimer(() -> CNConfigs.server().rods.graphiteRodLifetime.get()) + .heatRatio(() -> CNConfigs.server().rods.graphiteHeatRatio.get()) .coolerRodType())) .tag(CNTags.forgeItemTag("rods"), CNItemTags.COOLER.tag) .register(), @@ -165,7 +165,10 @@ public class CNItems { URANIUM_ROD = CreateNuclear.REGISTRATE .item("uranium_rod", p -> new RadiationItem(p, 100)) .onRegister(ItemRodTypesValue.setRodTypeInfos(new RodType.Builder() - .setRodConfig() + .baseRodHeat(() -> CNConfigs.server().rods.baseValueUranium.get()) + .proximityRodHeat(() ->(float) CNConfigs.server().rods.uraniumProxyBonus.get()) + .rodTimer(() -> CNConfigs.server().rods.uraniumRodLifetime.get()) + .heatRatio(() -> CNConfigs.server().rods.uraniumHeatRatio.get()) .fuelRodType())) .tag(CNTags.forgeItemTag("rods"), CNItemTags.FUEL.tag) .register(), @@ -209,11 +212,12 @@ public class CNItems { THORIUM_ROD = CreateNuclear.REGISTRATE .item("thorium_rod", Item::new) .onRegister(ItemRodTypesValue.setRodTypeInfos(new RodType.Builder() - .rodTimer(3600) - .baseRodHeat(16) - .proximityRodHeat(8) + .baseRodHeat(() -> CNConfigs.server().rods.baseValueThorium.get()) + .proximityRodHeat(() -> (float) CNConfigs.server().rods.thoriumProxyBonus.get()) + .rodTimer(() -> CNConfigs.server().rods.thoriumRodLifetime.get()) + .heatRatio(() -> CNConfigs.server().rods.thoriumHeatRatio.get()) .fuelRodType())) - .tag(CNTags.forgeItemTag("rods")) + .tag(CNTags.forgeItemTag("rods"), CNItemTags.FUEL.tag) .register() ; @@ -227,7 +231,7 @@ public class CNItems { ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, c.get()) .unlockedBy("has_cloth", RegistrateRecipeProvider.has(CNItemTags.CLOTH.tag)) .define('X', CNTags.forgeItemTag("ingots/lead")) - .define('Y', Ingredient.of(ItemTags.create(new ResourceLocation("forge", "ingots/brass")))) + .define('Y', CNTags.forgeItemTag("ingots/brass")) .define('Z', CNBlocks.REINFORCED_GLASS.asItem()) .pattern("YXY") .pattern("XZX") @@ -248,7 +252,7 @@ public class CNItems { } }) .lang("Anti Radiation Helmet") - .model(AssetLookup.itemModelWithPartials()) + .model(coloredArmorModel("helmet", "layer0", "particle")) .register(); public static final ItemEntry ANTI_RADIATION_CHESTPLATES = CreateNuclear.REGISTRATE @@ -261,7 +265,7 @@ public class CNItems { ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, c.get()) .unlockedBy("has_cloth", RegistrateRecipeProvider.has(CNItemTags.CLOTH.tag)) .define('X', CNTags.forgeItemTag("ingots/lead")) - .define('Y', Ingredient.of(ItemTags.create(new ResourceLocation("forge", "ingots/brass")))) + .define('Y', CNTags.forgeItemTag("ingots/brass")) .define('Z', CNItems.GRAPHITE_ROD) .pattern("Y Y") .pattern("XXX") @@ -282,7 +286,7 @@ public class CNItems { } }) .lang("Anti Radiation Chestplate") - .model(AssetLookup.itemModelWithPartials()) + .model(coloredArmorModel("chestplate", "14")) .register(); public static final ItemEntry ANTI_RADIATION_LEGGINGS = CreateNuclear.REGISTRATE @@ -295,7 +299,7 @@ public class CNItems { ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, c.get()) .unlockedBy("has_cloth", RegistrateRecipeProvider.has(CNItemTags.CLOTH.tag)) .define('X', CNTags.forgeItemTag("ingots/lead")) - .define('Y', Ingredient.of(ItemTags.create(new ResourceLocation("forge", "ingots/brass")))) + .define('Y', CNTags.forgeItemTag("ingots/brass")) .pattern("YXY") .pattern("X X") .pattern("Y Y") @@ -316,7 +320,7 @@ public class CNItems { } }) .lang("Anti Radiation Leggings") - .model(AssetLookup.itemModelWithPartials()) + .model(coloredArmorModel("leggings", "14")) .register(); public static final ItemEntry ANTI_RADIATION_BOOTS = CreateNuclear.REGISTRATE @@ -329,7 +333,7 @@ public class CNItems { ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, c.get()) .unlockedBy("has_cloth", RegistrateRecipeProvider.has(CNItemTags.CLOTH.tag)) .define('X', CNTags.forgeItemTag("ingots/lead")) - .define('Y', Ingredient.of(ItemTags.create(new ResourceLocation("forge", "ingots/brass")))) + .define('Y', CNTags.forgeItemTag("ingots/brass")) .pattern("Y Y") .pattern("X X") .showNotification(true) @@ -349,7 +353,7 @@ public class CNItems { } }) .lang("Anti Radiation Boots") - .model(AssetLookup.itemModelWithPartials()) + .model(coloredArmorModel("boots", "14")) .register(); public static final DyedItemsList CLOTHS = new DyedItemsList<>(color -> { @@ -360,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())) ) @@ -369,10 +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) @@ -397,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", BiomeIrradationExtractorItem::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 6a4b1fd7e..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.item.ReactorInputMenu; -import net.nuclearteam.createnuclear.content.multiblock.input.item.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 index 28504be3b..225109af3 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CNOpenPipeEffectHandlers.java +++ b/src/main/java/net/nuclearteam/createnuclear/CNOpenPipeEffectHandlers.java @@ -1,10 +1,10 @@ package net.nuclearteam.createnuclear; import com.simibubi.create.api.effect.OpenPipeEffectHandler; -import net.nuclearteam.createnuclear.impl.effect.RadiationEffetcHandler; +import net.nuclearteam.createnuclear.content.radiation.RadiationEffectHandler; public class CNOpenPipeEffectHandlers { public static void registerDefaults() { - OpenPipeEffectHandler.REGISTRY.register(CNFluids.URANIUM.getSource(), new RadiationEffetcHandler()); + 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 b2cec2788..4f9ecb0e9 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CNPackets.java +++ b/src/main/java/net/nuclearteam/createnuclear/CNPackets.java @@ -14,7 +14,6 @@ import net.minecraftforge.network.PacketDistributor; import net.minecraftforge.network.simple.SimpleChannel; import net.minecraftforge.network.NetworkEvent.Context; -import net.nuclearteam.createnuclear.foundation.networking.radiation.RadiationSyncPacket; import net.nuclearteam.createnuclear.content.multiblock.bluePrintItem.ReactorBluePrintItemPacket; import java.util.function.BiConsumer; @@ -23,9 +22,6 @@ public enum CNPackets { CONFIGURE_REACTOR_PATTERN(ReactorBluePrintItemPacket.class, ReactorBluePrintItemPacket::new, PLAY_TO_SERVER), - - // To client - RADIATION_SYNC(RadiationSyncPacket.class, RadiationSyncPacket::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/CNParticleTypes.java b/src/main/java/net/nuclearteam/createnuclear/CNParticleTypes.java index 344a565d5..6a6be8603 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CNParticleTypes.java +++ b/src/main/java/net/nuclearteam/createnuclear/CNParticleTypes.java @@ -2,7 +2,6 @@ import com.simibubi.create.foundation.particle.ICustomParticleData; import net.createmod.catnip.lang.Lang; -import net.minecraft.network.FriendlyByteBuf; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.event.RegisterParticleProvidersEvent; diff --git a/src/main/java/net/nuclearteam/createnuclear/CNPotions.java b/src/main/java/net/nuclearteam/createnuclear/CNPotions.java index 981ddd1f5..5b5f70913 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CNPotions.java +++ b/src/main/java/net/nuclearteam/createnuclear/CNPotions.java @@ -22,11 +22,11 @@ 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_protection_iodine", - () -> new Potion(new MobEffectInstance(CNEffects.IODINE_PROTECTION.get(), 900)) + 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_protection_iodine_augment", - () -> new Potion(new MobEffectInstance(CNEffects.IODINE_PROTECTION.get(), 1800)) + 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) { diff --git a/src/main/java/net/nuclearteam/createnuclear/CNRecipeTypes.java b/src/main/java/net/nuclearteam/createnuclear/CNRecipeTypes.java index 1e9a0550e..d84ebd2de 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CNRecipeTypes.java +++ b/src/main/java/net/nuclearteam/createnuclear/CNRecipeTypes.java @@ -21,7 +21,6 @@ import org.jetbrains.annotations.Nullable; import java.util.Optional; -import java.util.function.Predicate; import java.util.function.Supplier; @SuppressWarnings({"unused", "unchecked"}) @@ -30,10 +29,6 @@ public enum CNRecipeTypes implements IRecipeTypeInfo { 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 99b603803..602dfc49f 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CNShapes.java +++ b/src/main/java/net/nuclearteam/createnuclear/CNShapes.java @@ -16,8 +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_LIQUID_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 index c35165156..0889bc446 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CNSoundEvents.java +++ b/src/main/java/net/nuclearteam/createnuclear/CNSoundEvents.java @@ -35,7 +35,7 @@ public class CNSoundEvents { public static final Map ALL = new HashMap<>(); public static final SoundEntry - REACTOR_CASING_BREAD = create("reacteur/casing", "break") + REACTOR_CASING_BREAK = create("reacteur/casing", "break") .subtitle("Break Reactor Casing") .category(SoundSource.BLOCKS) .build(), @@ -60,22 +60,37 @@ public class CNSoundEvents { .category(SoundSource.BLOCKS) .build(), - REACTOR_ALARM = create("alarm/reactor", "alarm") - .subtitle("Reactor Alarm") + 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_2 = create("alarm/alarm") + 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(), - LARGE_NUCLEAR_EXPLOSION = create("explosion/large_nuclear_explosion") + NUCLEAR_EXPLOSION_LARGE = create("explosion/large_nuclear_explosion") .subtitle("Large Nuclear Explosion") .category(SoundSource.AMBIENT) .build(), @@ -90,6 +105,16 @@ public class CNSoundEvents { .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) @@ -116,7 +141,12 @@ public class CNSoundEvents { .build(), GEIGER_MEDIUM = create("geiger/medium") - .subtitle("GeiGer Medium") + .subtitle("Geiger Medium") + .category(SoundSource.AMBIENT) + .build(), + + BIOME_WASTELAND = create("biomes/wasteland") + .subtitle("Wasteland") .category(SoundSource.AMBIENT) .build() ; diff --git a/src/main/java/net/nuclearteam/createnuclear/CNTags.java b/src/main/java/net/nuclearteam/createnuclear/CNTags.java index 0808100fa..fd28b0c48 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CNTags.java +++ b/src/main/java/net/nuclearteam/createnuclear/CNTags.java @@ -73,9 +73,6 @@ public enum CNBlockTags { FAN_PROCESSING_CATALYSTS_SNOW_POWDER(MOD, "fan_processing_catalysts/snow_powder"), ENRICHING_FIRE_BASE_BLOCKS, ALL_CAMPFIRES(MINECRAFT, "all/campfires"), - URANIUM_ORES, - LEAD_ORES, - THORIUM_ORES ; public final TagKey tag; @@ -126,12 +123,9 @@ public enum CNItemTags { CLOTH, FUEL, COOLER, - URANIUM_ORES, - LEAD_ORES, ANTI_RADIATION_ARMOR, COMPOSTABLE(FORGE), - THORIUM_ORES, - ALL_ANTI_RADIATION_ARMORS, + ALL_ANTI_RADIATION_ARMORS ; 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 fa75a3f0d..db73cafd6 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CreateNuclear.java +++ b/src/main/java/net/nuclearteam/createnuclear/CreateNuclear.java @@ -29,7 +29,7 @@ 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.foundation.item.radiation.CNRadiationValues; +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; @@ -84,7 +84,6 @@ public static void onInitialize() { CNParticleTypes.register(modEventBus); CNParticleRegistry.DEF_REG.register(modEventBus); CNRecipeTypes.register(modEventBus); -// CNSounds.register(modEventBus); CNAttributes.register(modEventBus); GogglesItem.addIsWearingPredicate(IGoggleHelmet::isGoggleHelmet); @@ -118,5 +117,4 @@ public static void onRegister(final RegisterEvent event) { 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 c44faa1f2..53553613d 100644 --- a/src/main/java/net/nuclearteam/createnuclear/CreateNuclearClient.java +++ b/src/main/java/net/nuclearteam/createnuclear/CreateNuclearClient.java @@ -1,12 +1,20 @@ 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.BiomeIrradationExtractorItem; import net.nuclearteam.createnuclear.foundation.ponder.CreateNuclearPonderPlugin; +import net.nuclearteam.createnuclear.foundation.utility.ClothTagHelper; @SuppressWarnings("unused") public class CreateNuclearClient { @@ -19,6 +27,51 @@ public static void onCtorClient(IEventBus modEventBus, IEventBus forgeEventBus) 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(BiomeIrradationExtractorItem.TAG); + ClampedItemPropertyFunction fn = ((stack, level, entity, seed) -> { + int max = BiomeIrradationExtractorItem.getMaxCharge(); + + return (float) BiomeIrradationExtractorItem.getChargeTag(stack, 0) / max; + }); + + ItemProperties.register(CNItems.IRRADIATION_BIOME_EXTRACTOR.get(), biomeRestore, fn); } public static void setupParticles(RegisterParticleProvidersEvent registry) { diff --git a/src/main/java/net/nuclearteam/createnuclear/api/CreateNuclearRegistries.java b/src/main/java/net/nuclearteam/createnuclear/api/CreateNuclearRegistries.java index 8b2a17882..c720e43d3 100644 --- a/src/main/java/net/nuclearteam/createnuclear/api/CreateNuclearRegistries.java +++ b/src/main/java/net/nuclearteam/createnuclear/api/CreateNuclearRegistries.java @@ -11,6 +11,11 @@ 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 index 53355a4b8..cdf011092 100644 --- a/src/main/java/net/nuclearteam/createnuclear/api/ItemRodTypesValue.java +++ b/src/main/java/net/nuclearteam/createnuclear/api/ItemRodTypesValue.java @@ -3,20 +3,17 @@ 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; -import java.util.Collections; - -import net.minecraft.core.HolderSet; - 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(HolderSet.direct(Collections.emptyList()), -1, -1, -1, NONE); + 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}. @@ -39,10 +36,9 @@ public static RodType getRodType(Item item) { * @throws NullPointerException if {@code type} is null */ public static NonNullConsumer setRodTypeInfos(RodType.Builder type) { - return item -> ROD_TYPE.register(item, type.addItems(item).build()); + 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. @@ -71,7 +67,7 @@ public static NonNullConsumer setRodTypeInfos(int baseRodHeat, int proximi } return item -> { - RodType built = builder.addItems(item).build(); + 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 index b18370c53..f9bd55025 100644 --- a/src/main/java/net/nuclearteam/createnuclear/api/ReactorFluidTypesValue.java +++ b/src/main/java/net/nuclearteam/createnuclear/api/ReactorFluidTypesValue.java @@ -2,17 +2,10 @@ import com.simibubi.create.api.registry.SimpleRegistry; import com.tterrag.registrate.util.nullness.NonNullConsumer; -import net.minecraft.core.HolderSet; import net.minecraft.world.level.material.Fluid; -import net.nuclearteam.createnuclear.CreateNuclear; +import net.minecraft.world.level.material.Fluids; import net.nuclearteam.createnuclear.api.multiblock.fluid.ReactorFluidType; -import java.lang.reflect.Array; -import java.lang.reflect.Field; -import java.util.Map; -import net.minecraftforge.registries.ForgeRegistries; -import java.util.Collections; - /** * Registry-backed accessors for {@link ReactorFluidType} mappings. *

@@ -31,7 +24,7 @@ public class ReactorFluidTypesValue { * 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(HolderSet.direct(Collections.emptyList()), -1, -1); + 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}. 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 index 5c14f8d64..45a9f9bcd 100644 --- a/src/main/java/net/nuclearteam/createnuclear/api/data/recipe/SmithingClothRecipeBuilder.java +++ b/src/main/java/net/nuclearteam/createnuclear/api/data/recipe/SmithingClothRecipeBuilder.java @@ -6,7 +6,6 @@ import net.minecraft.advancements.CriterionTriggerInstance; import net.minecraft.advancements.RequirementsStrategy; import net.minecraft.advancements.critereon.RecipeUnlockedTrigger; -import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.data.recipes.FinishedRecipe; import net.minecraft.data.recipes.RecipeBuilder; import net.minecraft.data.recipes.RecipeCategory; 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 7079cd341..a0178483f 100644 --- a/src/main/java/net/nuclearteam/createnuclear/api/multiblock/MultiBlockManagerBeta.java +++ b/src/main/java/net/nuclearteam/createnuclear/api/multiblock/MultiBlockManagerBeta.java @@ -4,8 +4,6 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.Level; -import net.nuclearteam.createnuclear.CreateNuclear; -import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; import java.util.ArrayList; import java.util.List; @@ -19,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, ReactorControllerBlockEntity entity) { + public BlockPattern findStructure(Level level, BlockPos pos, IMultiblockController entity) { List directions = new ArrayList<>(); directions.add(Direction.NORTH); directions.add(Direction.WEST); @@ -30,7 +28,7 @@ public BlockPattern findStructure(Level level, BlockPos pos, ReactorControlle for (BlockPattern structure : structures) { boolean result = structure.structure().matches(level, pos, direction); if (result){ - entity.setMultiblockFacing(direction.getCounterClockWise().getName()); + entity.setMultiblockFacing(direction.getCounterClockWise()); return structure; } } 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 index 5fdcc1f01..a84782323 100644 --- a/src/main/java/net/nuclearteam/createnuclear/api/multiblock/fluid/ReactorFluidType.java +++ b/src/main/java/net/nuclearteam/createnuclear/api/multiblock/fluid/ReactorFluidType.java @@ -3,42 +3,36 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.core.Holder; -import net.minecraft.core.HolderSet; import net.minecraft.core.RegistryAccess; -import net.minecraft.core.RegistryCodecs; 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 net.nuclearteam.createnuclear.content.multiblock.fluid.CNReactorFluidTypes; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; import java.util.Optional; -import java.util.stream.Collectors; /** * Represents a reactor fluid type used by the mod's multiblock. *

- * A {@code ReactorFluidType} holds a set of fluids that identify this - * fluid type, heat-related and efficiency values, and a flag indicating - * whether those values should be read from configuration at runtime. + * A {@code ReactorFluidType} holds the single fluid that identifies this + * fluid type, along with its heat-related and efficiency values. */ -public record ReactorFluidType(HolderSet fluids, int maxHeat, int efficiency, boolean useConfig) { - public ReactorFluidType(HolderSet fluids, int maxHeat, int efficiency) { - this(fluids, maxHeat, efficiency, false); - } +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( - RegistryCodecs.homogeneousList(Registries.FLUID).fieldOf("fluids").forGetter(ReactorFluidType::fluids), + 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)); @@ -53,12 +47,14 @@ public ReactorFluidType(HolderSet fluids, int maxHeat, int efficiency) { * {@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().fluids.stream() - .anyMatch(h -> h.unwrapKey() - .map(k -> Optional.ofNullable(ForgeRegistries.FLUIDS.getKey(fluid)).map(k.location()::equals).orElse(false)) - .orElse(false))) + .filter(ref -> ref.value().fluid.unwrapKey() + .map(k -> k.location().equals(fluidKey)) + .orElse(false)) .findFirst(); } @@ -82,19 +78,20 @@ public static ReactorFluidType resolveReactorFluidType(Fluid fluid, Level world) ? fromFluid : world.registryAccess() .registryOrThrow(CreateNuclearRegistries.FLUID_TYPE) - .getHolderOrThrow(CNReactorFluidTypes.FALLBACK) + .getHolderOrThrow(CreateNuclearRegistries.FALLBACK_FLUID) .value(); }); } /** - * Returns whether this {@code ReactorFluidType} has at least one associated fluid. + * Returns whether this {@code ReactorFluidType} has an associated fluid + * (i.e. is not the empty/sentinel fluid). * - * @return {@code true} if one or more fluids are defined, {@code false} otherwise + * @return {@code true} if a real fluid is defined, {@code false} otherwise */ public boolean isNotEmptyFluid() { - return this.fluids.size() >= 1; + return this.fluid.value() != Fluids.EMPTY; } /** @@ -104,12 +101,9 @@ public boolean isNotEmptyFluid() { * resulting instance. */ public static class Builder { - private final List> fluids = new ArrayList<>(); + private Holder fluid = null; private int maxHeat = 0; private int efficiency = 0; - private boolean useConfig = false; - - private boolean fluidSet = false; private boolean maxHeatSet = false; private boolean efficiencySet = false; @@ -138,36 +132,24 @@ public Builder efficiency(int efficiency) { } /** - * Adds a fluid to this type from a {@link FluidStack}. + * 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) { - this.fluids.add(fluidStack.getFluid().builtInRegistryHolder()); - this.fluidSet = true; - return this; + return fluid(fluidStack.getFluid()); } /** - * Adds a fluid to this type directly. + * Sets the fluid identifying this type. Calling this again replaces + * the previously set fluid. * - * @param fluid the fluid to add + * @param fluid the fluid to associate with this type * @return this builder */ public Builder fluid(Fluid fluid) { - this.fluids.add(fluid.builtInRegistryHolder()); - this.fluidSet = true; - return this; - } - - /** - * Marks this type to resolve numeric values from configuration at runtime. - * - * @return this builder - */ - public Builder setRodConfig() { - this.useConfig = true; + this.fluid = fluid.builtInRegistryHolder(); return this; } @@ -179,52 +161,26 @@ public Builder setRodConfig() { */ public ReactorFluidType build() { List missing = new ArrayList<>(); - if (!fluidSet || fluids.isEmpty()) missing.add("fluids"); - - if (!this.useConfig) { - if (!maxHeatSet) missing.add("maxHeat"); - if (!efficiencySet) missing.add("efficiency"); - } + if (fluid == null) missing.add("fluid"); + if (!maxHeatSet) missing.add("maxHeat"); + if (!efficiencySet) missing.add("efficiency"); if (!missing.isEmpty()) - throw new IllegalStateException("Missing required RodType fields: " + String.join(", ", missing)); - - return new ReactorFluidType(HolderSet.direct(fluids), maxHeat, efficiency, useConfig); - } - } + throw new IllegalStateException("Missing required ReactorFluidType fields: " + String.join(", ", missing)); - @Override - public int maxHeat() { - if (!useConfig) return maxHeat; - try { - return 12; //CNConfigs.server().rods.maxHeat.get(); - } catch (IllegalStateException e) { - return maxHeat; - } - } - - @Override - public int efficiency() { - if (!useConfig) return efficiency; - try { - return 12; //CNConfigs.server().rods.maxHeat.get(); - } catch (IllegalStateException e) { - return efficiency; + return new ReactorFluidType(fluid, maxHeat, efficiency); } } @Override public @NotNull String toString() { - String fluidNames = this.fluids.stream() - .map(h -> h.unwrapKey() - .map(k -> k.location().toString()) - .orElseGet(() -> { - ResourceLocation rl = ForgeRegistries.FLUIDS.getKey(h.value()); - return rl != null ? rl.toString() : h.value().toString(); - }) - ) - .collect(Collectors.joining(", ")); - - return "ReactorFluidType{fluids=[" + fluidNames + "], maxHeat=" + maxHeat() + ", efficiency=" + efficiency() + "}"; + 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 index 57c097667..a913c742e 100644 --- a/src/main/java/net/nuclearteam/createnuclear/api/multiblock/rods/RodType.java +++ b/src/main/java/net/nuclearteam/createnuclear/api/multiblock/rods/RodType.java @@ -5,55 +5,64 @@ import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Holder; import net.minecraft.core.Holder.Reference; -import net.minecraft.core.HolderSet; import net.minecraft.core.RegistryAccess; -import net.minecraft.core.RegistryCodecs; 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.CNTags.CNItemTags; import net.nuclearteam.createnuclear.api.CreateNuclearRegistries; import net.nuclearteam.createnuclear.api.ItemRodTypesValue; -import net.nuclearteam.createnuclear.content.multiblock.rod.CNRodTypes; -import net.nuclearteam.createnuclear.infrastructure.config.CNConfigs; 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 a set of items that can represent this rod type, + * 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(HolderSet items, - int baseRodHeat, float proximityRodHeat, - int rodTimer, TypeRod type, boolean useConfig) { - - public RodType(HolderSet items, +public record RodType(Holder item, + Supplier baseRodHeat, + Supplier proximityRodHeat, + Supplier rodTimer, + Supplier heatRatio, + TypeRod type) { + + public RodType(Holder item, int baseRodHeat, float proximityRodHeat, int rodTimer, TypeRod type) { - this(items, baseRodHeat, proximityRodHeat, rodTimer, type, false); + this(item, baseRodHeat, proximityRodHeat, rodTimer, type, 1); + } + + public RodType(Holder item, + int baseRodHeat, float proximityRodHeat, + int rodTimer, TypeRod type, int heatRatio) { + this(item, () -> baseRodHeat, () -> proximityRodHeat, () -> rodTimer, () -> heatRatio, type); } /** * Serialization codec for saving/loading {@link RodType} instances. */ public static final Codec CODEC = RecordCodecBuilder.create(i -> i.group( - RegistryCodecs.homogeneousList(Registries.ITEM).fieldOf("items").forGetter(RodType::items), - Codec.INT.fieldOf("baseRodHeat").forGetter(RodType::baseRodHeat), - Codec.FLOAT.fieldOf("proximityRodHeat").forGetter(RodType::proximityRodHeat), - Codec.INT.fieldOf("rodTimer").forGetter(RodType::rodTimer), - StringRepresentable.fromEnum(TypeRod::values).fieldOf("type").forGetter(RodType::type) + 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("heatRatio", 1).forGetter(rt -> rt.heatRatio().get()) ).apply(i, RodType::new)); /** @@ -68,7 +77,7 @@ public RodType(HolderSet items, public static Optional> getTypeForItem(RegistryAccess registryAccess, Item item) { return registryAccess.lookupOrThrow(CreateNuclearRegistries.ROD_TYPE) .listElements() - .filter(ref -> ref.value().items.contains(item.builtInRegistryHolder())) + .filter(ref -> ref.value().item.equals(item.builtInRegistryHolder())) .findFirst(); } @@ -90,190 +99,216 @@ public static RodType resolveRodType(Item item, Level world) { ? fromItem : world.registryAccess() .registryOrThrow(CreateNuclearRegistries.ROD_TYPE) - .getHolderOrThrow(CNRodTypes.FALLBACK) + .getHolderOrThrow(CreateNuclearRegistries.FALLBACK_ROD) .value(); }); } /** - * Returns whether this {@code RodType} has no associated items. + * Returns whether this {@code RodType} has an associated item (i.e. is + * not the empty/sentinel item). * - * @return {@code true} if no items are defined, {@code false} otherwise + * @return {@code true} if a real item is defined, {@code false} otherwise */ public boolean isNotEmptyItem() { - return this.items.size() >= 1; + return this.item.value() != Items.AIR; } /** * Fluent builder for creating an immutable {@link RodType} instance. *

- * Use the configuration methods and call {@link #build()} to obtain the - * resulting instance. + * Every heat/timing value ({@code baseRodHeat}, {@code proximityRodHeat}, + * {@code rodTimer}, {@code heatRatio}) 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 heatRatio} 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 final List> items = new ArrayList<>(); - private int baseRodHeat = 0; - private int proximityRodHeat = 0; - private int rodTimer = 0; - private TypeRod type = TypeRod.FUEL; - private boolean useConfig = false; - - private boolean itemsSet = false; - private boolean baseRodHeatSet = false; - private boolean proximityRodHeatSet = false; - private boolean rodTimerSet = false; - private boolean typeSet = false; + private Holder item = null; + private Supplier baseRodHeat = null; + private Supplier proximityRodHeat = null; + private Supplier rodTimer = null; + private Supplier heatRatio = () -> 1; + private TypeRod type = TypeRod.NONE; /** - * Sets the base heat for the rod. + * Sets a fixed base heat value, evaluated once at build time. + * Equivalent to {@code baseRodHeat(() -> baseRodHeat)}. * - * @param baseRodHeat base heat value + * @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; - this.baseRodHeatSet = true; return this; } /** - * Sets the heat contributed by nearby rods. + * 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 proximity heat value + * @param proximityRodHeat supplier producing the proximity heat value on demand * @return this builder */ - public Builder proximityRodHeat(int proximityRodHeat) { + public Builder proximityRodHeat(Supplier proximityRodHeat) { this.proximityRodHeat = proximityRodHeat; - this.proximityRodHeatSet = true; return this; } /** - * Sets the timer (duration) for the rod's behavior. + * Sets a fixed timer (duration) for the rod's behavior, evaluated + * once at build time. Equivalent to {@code rodTimer(() -> rodTimer)}. * - * @param rodTimer duration in ticks or mod-specific units + * @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; - this.rodTimerSet = true; return this; } /** - * Sets the rod type to {@link TypeRod#COOLER}. + * Sets a fixed heat ratio, evaluated once at build time. Optional: + * defaults to a constant {@code 1} if never called. + * Equivalent to {@code heatRatio(() -> heatRatio)}. * + * @param heatRatio constant heat ratio value * @return this builder */ - public Builder coolerRodType() { - this.type = TypeRod.COOLER; - this.typeSet = true; - return this; + public Builder heatRatio(int heatRatio) { + return heatRatio(() -> heatRatio); } /** - * Sets the rod type to {@link TypeRod#FUEL}. + * Sets a dynamic heat ratio, re-evaluated every time + * {@link RodType#heatRatio()} is called. Optional: defaults to a + * constant {@code 1} if never called. * + * @param heatRatio supplier producing the heat ratio on demand * @return this builder */ - public Builder fuelRodType() { - this.type = TypeRod.FUEL; - this.typeSet = true; + public Builder heatRatio(Supplier heatRatio) { + this.heatRatio = heatRatio; return this; } /** - * Adds one or more items that represent this rod type. + * 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 items array of {@link ItemLike} elements to associate + * @param type the rod category to assign * @return this builder */ - public Builder addItems(ItemLike... items) { - for (ItemLike provider : items) - this.items.add(provider.asItem().builtInRegistryHolder()); - if (items.length > 0) this.itemsSet = true; + public Builder type(TypeRod type) { + this.type = type; return this; } - public Builder setRodConfig() { - this.useConfig = true; + /** + * 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 heatRatio} is exempt since it defaults to a constant + * {@code 1}. * - * @throws IllegalStateException if required fields are missing + * @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 (!itemsSet || items.isEmpty()) missing.add("items"); - if (!typeSet) missing.add("type"); - - if (!this.useConfig) { - if (!baseRodHeatSet) missing.add("baseRodHeat"); - if (!proximityRodHeatSet) missing.add("proximityRodHeat"); - if (!rodTimerSet) missing.add("rodTimer"); - } else { - /* Lazy config resolution: don't access CNConfigs here during registration. - * The actual values will be read at runtime via the resolved* accessors. - * Only MIXTE is considered an error for "useConfig" because there are - * no configuration defaults for the mixed type. - */ -// missing.add("Configuration defaults cannot be applied to the rod type"); - } + 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(HolderSet.direct(items), baseRodHeat, proximityRodHeat, rodTimer, type, useConfig); + return new RodType(item, baseRodHeat, proximityRodHeat, rodTimer, heatRatio, type); } } - @Override - public int baseRodHeat() { - if (!useConfig) return baseRodHeat; - try { - return switch (type) { - case FUEL -> CNConfigs.server().rods.baseValueUranium.get(); - case COOLER -> CNConfigs.server().rods.baseValueGraphite.get(); - default -> baseRodHeat; - }; - } catch (IllegalStateException e) { - return baseRodHeat; - } - } - - @Override - public float proximityRodHeat() { - if (!useConfig) return proximityRodHeat; - try { - return switch (type) { - case FUEL -> CNConfigs.server().rods.uraniumProxyBonus.get(); - case COOLER -> CNConfigs.server().rods.graphiteProxyMalus.getF(); - default -> proximityRodHeat; - }; - } catch (IllegalStateException e) { - return proximityRodHeat; - } - } - - @Override - public int rodTimer() { - if (!useConfig) return rodTimer; - try { - return switch (type) { - case FUEL -> CNConfigs.server().rods.uraniumRodLifetime.get(); - case COOLER -> CNConfigs.server().rods.graphiteRodLifetime.get(); - default -> rodTimer; - }; - } catch (IllegalStateException e) { - return rodTimer; - } - } - - public enum TypeRod implements StringRepresentable { /** * Fuel rod: generates heat via reaction. @@ -298,31 +333,36 @@ public String getSerializedName() { public static final class TypeRodPredicate { public static final Predicate IS_NOT_NULL = Objects::nonNull; - public static final Predicate IS_FUEL = s -> { - TypeRod type = ItemRodTypesValue.getRodType(s.getItem()).type; - return IS_NOT_NULL.test(s) && (s.is(CNItemTags.FUEL.tag) || type == TypeRod.FUEL); - }; + public static boolean isFuel(ItemStack stack, Level level) { + return IS_NOT_NULL.test(stack) && RodType.resolveRodType(stack.getItem(), level).type == TypeRod.FUEL; + } - public static final Predicate IS_COOLED = s -> { - TypeRod type = ItemRodTypesValue.getRodType(s.getItem()).type; - return IS_NOT_NULL.test(s) && (s.is(CNItemTags.COOLER.tag) || type == TypeRod.COOLER); - }; + public static boolean isCooled(ItemStack stack, Level level) { + return IS_NOT_NULL.test(stack) && RodType.resolveRodType(stack.getItem(), level).type == TypeRod.COOLER; + } - public static String tooltipKey(ItemStack stack) { + public static String tooltipKey(ItemStack stack, Level level) { if (!IS_NOT_NULL.test(stack)) return "unknown"; - if (IS_FUEL.test(stack)) return "fuel"; - if (IS_COOLED.test(stack)) return "cooled"; + if (isFuel(stack, level)) return "fuel"; + if (isCooled(stack, level)) return "cooled"; return "unknown"; } } @Override public String toString() { - return "RodType [items: " + this.items() + - ", baseRodHeat: " + this.baseRodHeat() + - ", proximityRodHeat: " + this.proximityRodHeat() + - ", rodTimer: " + this.rodTimer() + - ", type: " + this.type() + - ", useConfig: " + this.useConfig() + "]"; + 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() + + ", heatRatio: " + this.heatRatio().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 index bdc239489..11e1d7fbb 100644 --- a/src/main/java/net/nuclearteam/createnuclear/api/radiation/IRadiationSource.java +++ b/src/main/java/net/nuclearteam/createnuclear/api/radiation/IRadiationSource.java @@ -1,8 +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, Player player); + 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 index 5fe76f1b2..9a878a943 100644 --- a/src/main/java/net/nuclearteam/createnuclear/api/radiation/RadiationRegistry.java +++ b/src/main/java/net/nuclearteam/createnuclear/api/radiation/RadiationRegistry.java @@ -2,6 +2,7 @@ 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; @@ -43,10 +44,10 @@ public static double get(ResourceKey stack) { return 0D; } - public static double getRadiation(ItemStack stack, Player player) { + public static double getRadiation(ItemStack stack, LivingEntity entity) { return get(stack) * stack.getCount(); } - public static double getRadiation(ResourceKey biome, Player player) { + public static double getRadiation(ResourceKey biome, LivingEntity entity) { return get(biome); } @@ -78,6 +79,8 @@ public Builder value(double value) { 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); } 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 9addda1c7..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,6 +18,7 @@ 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; @@ -50,16 +51,14 @@ @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) @@ -76,21 +75,30 @@ private void loadCategories() { ; } + 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 @@ -98,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; @@ -112,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) { @@ -284,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; } } @@ -296,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/content/biome/BiomeIrradationExtractorItem.java b/src/main/java/net/nuclearteam/createnuclear/content/biome/BiomeIrradationExtractorItem.java new file mode 100644 index 000000000..480e64a15 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/biome/BiomeIrradationExtractorItem.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 BiomeIrradationExtractorItem extends Item { + public static final String TAG = "biome_restore"; + private static final int CHARGE_PER_CLICK = 1; + + public BiomeIrradationExtractorItem(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 index 357ec2b06..1ac5958bd 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/AnimalUtil.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/contraptions/irradiated/AnimalUtil.java @@ -1,83 +1,40 @@ package net.nuclearteam.createnuclear.content.contraptions.irradiated; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.sounds.SoundEvents; -import net.minecraft.world.InteractionHand; +import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionResult; -import net.minecraft.world.effect.MobEffects; -import net.minecraft.world.entity.EntityEvent; -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.crafting.Ingredient; -import net.minecraft.world.level.gameevent.GameEvent; -import net.minecraftforge.event.ForgeEventFactory; +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 void tick(LivingEntity me) { - if (!me.level().isClientSide && me.isAlive()) { - IrradiatedAnimal irradiatedAnimal = (IrradiatedAnimal) me; - - if (irradiatedAnimal.isConverting()) { - irradiatedAnimal.setConversionTime(irradiatedAnimal.getConversionTime() - irradiatedAnimal.getConversionProgress()); - - if (irradiatedAnimal.getConversionTime() <= 0 && ForgeEventFactory.canLivingConvert(me, irradiatedAnimal.getNormalVariant(), irradiatedAnimal::setConversionTime)) - irradiatedAnimal.finishConversion((ServerLevel) me.level()); - } - } + public static boolean isFood(ItemStack stack, Ingredient foodItems) { + return isFood(stack, foodItems, $ -> true); } - public static InteractionResult mobInteract(LivingEntity me, Player player, InteractionHand hand) { - ItemStack stack = player.getItemInHand(hand); - + public static boolean isFood(ItemStack stack, Ingredient foodItems, Predicate extraTest) { if (stack.is(CNItems.YELLOWCAKE.get())) { - if (me.hasEffect(MobEffects.WEAKNESS)) { - if (!player.getAbilities().instabuild) - stack.shrink(1); - - if (!me.level().isClientSide) - ((IrradiatedAnimal) me).startConverting(me.getRandom().nextInt(2401) + 3600); - - me.level().gameEvent(me, GameEvent.ENTITY_INTERACT, me.getEyePosition()); - return InteractionResult.SUCCESS; - } - - return InteractionResult.CONSUME; - } - - return InteractionResult.PASS; - } - - public static boolean handleEntityEvent(LivingEntity me, byte id) { - if (id == EntityEvent.ZOMBIE_CONVERTING) { - if (!me.isSilent()) - me.level().playLocalSound(me.position().x, me.getEyeY(), me.position().z, SoundEvents.ZOMBIE_VILLAGER_CURE, me.getSoundSource(), 1.0F + me.getRandom().nextFloat(), me.getRandom().nextFloat() * 0.7F + 0.3F, false); - return true; } - return false; - } - - public static boolean isFood(ItemStack stack, Ingredient foodItems) { - return isFood(stack, foodItems, $ -> true); + return foodItems.test(stack) || extraTest.test(stack); } - public static boolean isFood(ItemStack stack, Ingredient foodItems, Predicate extraTest) { - if (stack.is(CNItems.YELLOWCAKE.get()) && stack.hasTag() && stack.getTag().contains("Ingredient")) { - CompoundTag ingredientTag = stack.getTag().getCompound("Ingredient"); - ItemStack ingredient = ItemStack.of(ingredientTag); - - return foodItems.test(ingredient) || extraTest.test(ingredient); + /** + * 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 false; + return InteractionResult.sidedSuccess(level.isClientSide); } -} +} \ No newline at end of file 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 46a238265..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; @@ -107,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() { @@ -267,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()); - } } } @@ -315,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); @@ -393,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 4afec54a2..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 @@ -30,6 +30,7 @@ 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; @@ -42,7 +43,8 @@ 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; @@ -84,12 +86,6 @@ protected float getStandingEyeHeight(Pose pose, EntityDimensions dimensions) { return this.isBaby() ? dimensions.height * 0.85F : dimensions.height * 0.92F; } - @Override - public void tick() { - AnimalUtil.tick(this); - super.tick(); - } - public static AttributeSupplier.Builder createAttributes() { return Mob.createMobAttributes() .add(Attributes.MAX_HEALTH, 4.0) @@ -154,6 +150,7 @@ public IrradiatedChicken getBreedOffspring(ServerLevel level, AgeableMob otherPa @Override public boolean isFood(ItemStack stack) { + // Check if the stack is a valid Yellowcake or the base food return AnimalUtil.isFood(stack, FOOD_ITEMS); } @@ -162,22 +159,6 @@ public int getExperienceReward() { return this.isChickenJockey() ? 10 : super.getExperienceReward(); } - @Override - public InteractionResult mobInteract(Player pPlayer, InteractionHand pHand) { - InteractionResult returnValue = AnimalUtil.mobInteract(this, pPlayer, pHand); - - if (returnValue != InteractionResult.PASS) - return returnValue; - - return super.mobInteract(pPlayer, pHand); - } - - @Override - public void handleEntityEvent(byte pId) { - if (!AnimalUtil.handleEntityEvent(this, pId)) - super.handleEntityEvent(pId); - } - @Override public void readAdditionalSaveData(CompoundTag compound) { super.readAdditionalSaveData(compound); @@ -188,7 +169,6 @@ public void readAdditionalSaveData(CompoundTag compound) { if (compound.contains("ConversionTime", Tag.TAG_ANY_NUMERIC) && compound.getInt("ConversionTime") > -1) startConverting(compound.getInt("ConversionTime")); - } @Override 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 index 18c6b4b71..b8a6c8782 100644 --- 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 @@ -20,6 +20,8 @@ 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; @@ -39,6 +41,15 @@ protected void registerGoals() { 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); } 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 f912381db..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 @@ -50,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); diff --git a/src/main/java/net/nuclearteam/createnuclear/content/effects/VicinityEffect.java b/src/main/java/net/nuclearteam/createnuclear/content/effects/VicinityEffect.java index a1daaa892..9b5590b01 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/effects/VicinityEffect.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/effects/VicinityEffect.java @@ -4,9 +4,7 @@ import net.minecraft.world.effect.MobEffectCategory; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.Entity; -import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.LivingEntity; -import net.nuclearteam.createnuclear.CreateNuclear; import java.util.HashMap; import java.util.List; @@ -14,81 +12,53 @@ import java.util.UUID; import java.util.function.*; -public class VicinityEffect extends MobEffect { +public abstract class VicinityEffect extends MobEffect { private final UnaryOperator areaSize; private final Predicate filter; - private final Supplier[] effects; - private final Map cooldowns = new HashMap<>(); + // Stores the GameTime tick when the cooldown expires for each entity + private final Map cooldowns = new HashMap<>(); - @SafeVarargs - protected VicinityEffect(MobEffectCategory category, int color, UnaryOperator areaSize, Predicate filter, Consumer timer, Supplier... effects) { + protected VicinityEffect(MobEffectCategory category, int color, UnaryOperator areaSize, Predicate filter, Consumer timer) { super(category, color); this.areaSize = areaSize; this.filter = filter; - this.effects = effects; } @Override public void applyEffectTick(LivingEntity entity, int amplifier) { - List nearbyEntities = entity.level().getEntities(entity, entity.getBoundingBox().inflate(areaSize.apply(amplifier)), e -> e instanceof LivingEntity target && filter.test(target)); + 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); - for (Supplier effect : effects) { - int cooldownTicks = 0; - if (cooldownTicks == 0) { - nearby.addEffect(effect.get()); - cooldownTicks = 500; - } else { - cooldownTicks--; - //CreateNuclear.LOGGER.warn("Test Duree: {}, entity: {}", cooldownTicks, nearby.getUUID()); - } + // Set a 100-tick (5 seconds) cooldown before refreshing the effect again + cooldowns.put(entityUuid, currentTime + 100); } } } - private int getCooldown(LivingEntity entity) { - return cooldowns.getOrDefault(entity.getUUID(), 0); - } - - private void setCooldown(LivingEntity entity, int ticks) { - cooldowns.put(entity.getUUID(), ticks); - } + /** + * 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/effects/capability/RadiationCapability.java b/src/main/java/net/nuclearteam/createnuclear/content/effects/capability/RadiationCapability.java deleted file mode 100644 index daa138a40..000000000 --- a/src/main/java/net/nuclearteam/createnuclear/content/effects/capability/RadiationCapability.java +++ /dev/null @@ -1,181 +0,0 @@ -package net.nuclearteam.createnuclear.content.effects.capability; - -import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerPlayer; -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.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.TickEvent; -import net.minecraftforge.event.TickEvent.PlayerTickEvent; -import net.minecraftforge.network.PacketDistributor; -import net.nuclearteam.createnuclear.CNAttributes; -import net.nuclearteam.createnuclear.CNEffects; -import net.nuclearteam.createnuclear.CNPackets; -import net.nuclearteam.createnuclear.CreateNuclear; -import net.nuclearteam.createnuclear.api.radiation.IRadiationSource; -import net.nuclearteam.createnuclear.api.radiation.RadiationRegistry; -import net.nuclearteam.createnuclear.foundation.networking.radiation.RadiationSyncPacket; -import net.nuclearteam.createnuclear.content.equipment.armor.AntiRadiationArmorItem; -import static net.nuclearteam.createnuclear.content.equipment.armor.AntiRadiationArmorItem.RADIATION_VALUE; -import net.nuclearteam.createnuclear.foundation.utility.InventoryHashUtil; -import net.nuclearteam.createnuclear.infrastructure.config.CNConfigs; - -import java.util.Objects; - -public class RadiationCapability implements IRadiationCapability { - private double radiation; - private long inventoryHash; - private ResourceLocation lastBiomeLocation; - - @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; - } - - public static void attach(AttachCapabilitiesEvent event) { - if (event.getObject() instanceof Player) { - event.addCapability(CreateNuclear.asResource("irradiated_resistance"), new RadiationProvider()); - } - } - - public static void onPlayerTick(PlayerTickEvent event) { - if (event.phase != TickEvent.Phase.END) return; - - Player player = event.player; - Level level = player.level(); - - if (level.isClientSide) return; - - player.getCapability(RadiationProvider.CAP).ifPresent(cap -> { - boolean needsSync = false; - - long newHash = InventoryHashUtil.compute(player); - if (newHash != cap.getInventoryHash()) { - cap.setInventoryHash(newHash); - cap.setRadiation(Math.max(0, computeItemRadiation(player))); - needsSync = true; - } - - ResourceKey biomeKey = level.getBiome(player.blockPosition()).unwrapKey().orElse(null); - ResourceLocation biomeLoc = biomeKey != null ? biomeKey.location() : null; - if (!Objects.equals(biomeLoc, cap.getLastBiomeLocation())) { - cap.setLastBiomeLocation(biomeLoc); - needsSync = true; - } - - if (!CNConfigs.server().radiation.enabledItemRadiation.get()) return; - - double totalRaw = cap.getRadiation() + getRawBiomeRadiation(biomeKey); - double resistance = getRadiationResistance(player); - double totalRadiation = totalRaw * (1.0 - resistance); - - if (needsSync) { - CNPackets.getChannel().send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new RadiationSyncPacket(totalRadiation)); - } - - applyEffects(player, 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 getRawBiomeRadiation(ResourceKey biomeKey) { - if (biomeKey == null) return 0; - return RadiationRegistry.get(biomeKey); - } - - public static double getRadiationResistance(LivingEntity entity) { - double resistance = 0d; - - AttributeInstance attribute = entity.getAttribute(CNAttributes.IRRADIATED_RESISTANCE.get()); - - if (attribute != null) resistance += attribute.getValue(); - -// resistance += getArmorResistance(entity.getArmorSlots()); - - return Mth.clamp(resistance, 0.0, 1.0); - } - - private static double getArmorResistance(Iterable stacks) { - double resistance = 0d; - - for (ItemStack stack : stacks) { - if (stack.getItem() instanceof AntiRadiationArmorItem) { - resistance += RADIATION_VALUE; - } - } - - return resistance; - } - - private static void applyEffects(Player player, 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.amplifierLevel0.get(); - else if (radiation < CNConfigs.server().radiation.radiationLevel3.get()) amp = CNConfigs.server().radiation.amplifierLevel1.get(); - else amp = CNConfigs.server().radiation.amplifierLevel2.get(); - - MobEffectInstance current = player.getEffect(radiationEffect); - - if (current != null && current.getAmplifier() != amp) { - player.removeEffect(radiationEffect); - current = null; - } - - if (current == null || current.getDuration() <= 40) { - player.addEffect(new MobEffectInstance(CNEffects.RADIATION.get(), 100, amp, true, true)); - } - } -} 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/equipment/armor/AntiRadiationArmorClientExtensions.java b/src/main/java/net/nuclearteam/createnuclear/content/equipment/armor/AntiRadiationArmorClientExtensions.java index 1ba3fd64e..765ba8b24 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/equipment/armor/AntiRadiationArmorClientExtensions.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/equipment/armor/AntiRadiationArmorClientExtensions.java @@ -2,6 +2,8 @@ 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; @@ -15,43 +17,16 @@ public final class AntiRadiationArmorClientExtensions implements IClientItemExte @Override public @NotNull HumanoidModel getHumanoidArmorModel(LivingEntity livingEntity, ItemStack itemStack, EquipmentSlot equipmentSlot, HumanoidModel original) { if (this.model == null) { - var entityModelSet = Minecraft.getInstance().getEntityModels(); - var root = entityModelSet.bakeLayer(CNModelLayers.ANTI_IRRADIATION_ARMOR); + 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; - this.model.setAllVisible(false); -// this.model.right_leg_armor.visible = false; -// this.model.right_boot.visible = false; -// this.model.left_leg_armor.visible = false; -// this.model.left_boot.visible = false; - - switch (equipmentSlot) { - case HEAD -> { - this.model.getHead().visible = true; - this.model.hat.visible = true; -// this.model.right_boot.visible = false; -// this.model.left_boot.visible = false; - } - case CHEST -> { - this.model.body.visible = true; - this.model.rightArm.visible = true; - this.model.leftArm.visible = true; - } - default -> { - this.model.getHead().visible = false; - this.model.hat.visible = false; - this.model.body.visible = false; - this.model.rightArm.visible = false; - this.model.leftArm.visible = false; - this.model.rightLeg.visible = false; - this.model.leftLeg.visible = false; - this.model.right_leg.visible = false; - this.model.left_leg.visible = false; - } - } - 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 59e4cbe45..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 @@ -2,12 +2,7 @@ import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.Multimap; -import com.simibubi.create.AllKeys; -import net.minecraft.ChatFormatting; import net.minecraft.Util; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.chat.CommonComponents; -import net.minecraft.network.chat.Component; import net.minecraft.world.entity.*; import net.minecraft.world.entity.ai.attributes.Attribute; import net.minecraft.world.entity.ai.attributes.AttributeModifier; @@ -17,19 +12,10 @@ import net.minecraftforge.client.extensions.common.IClientItemExtensions; import net.nuclearteam.createnuclear.foundation.advancement.CNAdvancement; -import net.minecraft.Util; -import net.minecraft.network.chat.Component; -import net.minecraft.tags.TagKey; -import net.minecraft.world.entity.ai.attributes.Attribute; -import net.minecraft.world.entity.ai.attributes.AttributeModifier; -import net.minecraft.world.item.*; import net.nuclearteam.createnuclear.CNAttributes; import net.nuclearteam.createnuclear.CNItems; -import net.nuclearteam.createnuclear.content.equipment.cloth.ClothItem; -import net.nuclearteam.createnuclear.foundation.util.ClothTagHelper; -import net.nuclearteam.createnuclear.foundation.utility.CreateNuclearLang; +import net.nuclearteam.createnuclear.foundation.utility.ClothTagHelper; -import javax.annotation.Nullable; import java.util.*; import java.util.function.Consumer; @@ -59,40 +45,12 @@ private static Multimap irradiatedArmorAttribute(M return builder.build(); } - // Cette méthode indique au jeu où trouver la texture PNG de l'armure + // 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"); } - @Override - public void appendHoverText(ItemStack pStack, @Nullable Level pLevel, List tooltip, TooltipFlag pIsAdvanced) { - if (AllKeys.shiftDown()) return; - - List makeSummary = makeSummary(pStack); - if (makeSummary.isEmpty()) return; - - tooltip.add(CommonComponents.SPACE); - tooltip.addAll(makeSummary); - } - - - public List makeSummary(ItemStack item) { - if (!item.hasTag()) return Collections.emptyList(); - - CompoundTag tag = item.getTag(); - ItemStack cloth = ItemStack.of(tag.getCompound(ClothTagHelper.ITEM)); - if (!(cloth.getItem() instanceof ClothItem clothItem)) return Collections.emptyList(); - - List list = new ArrayList<>(); - CreateNuclearLang.translate("tooltip.cloth.color", clothItem.getColor().getSerializedName()) - .color(clothItem.getColor().getTextColor()) - .style(ChatFormatting.ITALIC) - .addTo(list); - - return list; - } - @Override public void initializeClient(Consumer consumer) { consumer.accept(new AntiRadiationArmorClientExtensions()); 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 index 93e06f1f9..7fa8caa82 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/equipment/armor/AntiRadiationArmorModel.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/equipment/armor/AntiRadiationArmorModel.java @@ -1,5 +1,6 @@ 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; @@ -9,18 +10,19 @@ import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; - public class AntiRadiationArmorModel extends HumanoidModel { - // This layer location should be baked with EntityRendererProvider.Context in the entity renderer and passed into this model's constructor; - public final ModelPart head; - public final ModelPart body; - public final ModelPart right_arm; - public final ModelPart left_arm; - public final ModelPart right_leg; - public final ModelPart right_boot; - public final ModelPart left_leg; - public final ModelPart left_boot; - + 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) { @@ -30,83 +32,68 @@ public AntiRadiationArmorModel(ModelPart root) { this.right_arm = root.getChild("right_arm"); this.left_arm = root.getChild("left_arm"); this.right_leg = root.getChild("right_leg"); - this.right_boot = this.right_leg.getChild("right_boot"); this.left_leg = root.getChild("left_leg"); - this.left_boot = this.left_leg.getChild("left_boot"); + 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, -8.0F, 1.0F)); + .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.875F, 0.825F, -2.65F, 8.0F, 12.0F, 5.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(-4.575F, -0.175F, -2.95F, 9.0F, 13.0F, 6.0F, new CubeDeformation(0.0F)) - .texOffs(0, 36).addBox(-3.875F, 0.825F, -2.55F, 8.0F, 12.0F, 5.0F, new CubeDeformation(0.0F)) - .texOffs(64, 0).addBox(-4.675F, -0.175F, -2.85F, 9.0F, 13.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offset(0.175F, -0.825F, 0.85F)); + 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(-2.1F, -2.5F, -2.1F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.45F)).mirror(false) - .texOffs(29, 32).mirror().addBox(-2.1F, -2.5F, -2.1F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.55F)).mirror(false), PartPose.offset(-5.8F, 4.5F, 0.8F)); + 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.9F, -2.5F, -2.1F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.4F)) - .texOffs(29, 32).addBox(-1.9F, -2.5F, -2.1F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.5F)), PartPose.offset(6.2F, 4.5F, 0.8F)); + 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.0733F, -0.3333F, -1.8667F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(45, 48).mirror().addBox(-1.9633F, -0.3333F, -2.0667F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.25F)).mirror(false), PartPose.offset(-1.6367F, 19.3333F, 0.7667F)); + 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)); - right_leg.addOrReplaceChild("right_boot", CubeListBuilder.create().texOffs(61, 39).mirror().addBox(-1.9633F, 7.6334F, -2.0667F, 4.0F, 4.0F, 4.0F, new CubeDeformation(0.25F)).mirror(false), PartPose.offset(-1.6367F, 19.3333F, 0.7667F)); + 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 left_leg = partdefinition.addOrReplaceChild("left_leg", CubeListBuilder.create().texOffs(29, 48).addBox(-1.9667F, -0.3333F, -1.8667F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)) - .texOffs(45, 48).addBox(-2.0167F, -0.3333F, -2.0667F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.25F)), PartPose.offset(2.2167F, 19.3333F, 0.7667F)); + 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)); - left_leg.addOrReplaceChild("left_boot", CubeListBuilder.create().texOffs(61, 39).addBox(-2.0167F, 7.6334F, -2.0667F, 4.0F, 4.0F, 4.0F, new CubeDeformation(0.25F)), PartPose.offset(2.2167F, 19.3333F, 0.7667F)); + 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 setAllVisible(boolean pVisible) { - super.setAllVisible(pVisible); - this.head.visible = false; - this.hat.visible = false; - this.body.visible = false; - this.right_arm.visible = false; - this.left_arm.visible = false; - this.right_leg.visible = false; - this.right_boot.visible = false; - this.left_leg.visible = false; - this.left_boot.visible = false; - } - @Override public void renderToBuffer(PoseStack poseStack, VertexConsumer vertexConsumer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { - // Copier les animations des jambes vers les boots + // Make the boots follow the (already animated) legs. this.right_boot.copyFrom(this.right_leg); this.left_boot.copyFrom(this.left_leg); - - if (this.currentSlot == EquipmentSlot.LEGS) { - this.body.visible = false; - this.right_boot.visible = false; - this.left_boot.visible = false; - } else if (this.currentSlot == EquipmentSlot.FEET) { - this.right_leg.visible = false; - this.left_leg.visible = false; - this.right_boot.visible = true; - this.left_boot.visible = true; - } - - head.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha); - body.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha); - right_arm.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha); - left_arm.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha); - right_leg.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha); - left_leg.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha); - right_boot.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha); - left_boot.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha); + + // 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); } -} \ No newline at end of file +} 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 04c8a6d2d..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 @@ -1,13 +1,9 @@ package net.nuclearteam.createnuclear.content.equipment.cloth; import com.tterrag.registrate.util.entry.ItemEntry; -import net.minecraft.core.registries.Registries; -import net.minecraft.resources.ResourceKey; import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.Item; -import net.minecraft.world.item.armortrim.TrimMaterial; import net.nuclearteam.createnuclear.CNItems; -import net.nuclearteam.createnuclear.CreateNuclear; import java.util.*; diff --git a/src/main/java/net/nuclearteam/createnuclear/content/explosion/CNAdvancedEntityModel.java b/src/main/java/net/nuclearteam/createnuclear/content/explosion/CNAdvancedEntityModel.java index 65bf20d2c..81ca034a1 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/explosion/CNAdvancedEntityModel.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/explosion/CNAdvancedEntityModel.java @@ -1,8 +1,5 @@ package net.nuclearteam.createnuclear.content.explosion; -import com.google.common.collect.Maps; -import java.util.Map; -import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -10,138 +7,26 @@ @OnlyIn(Dist.CLIENT) public abstract class CNAdvancedEntityModel extends CNBasicEntityModel { private float movementScale = 1.0F; - private final Map modelTextureMap = Maps.newHashMap(); public int texWidth = 32; public int texHeight = 32; public void updateDefaultPose() { - this.getAllParts().forEach((modelRenderer) -> modelRenderer.updateDefaultPose()); - } - - protected void setCNTextureOffset(String partName, int x, int y) { - this.modelTextureMap.put(partName, new CNTextureOffset(x, y)); - } - - public CNTextureOffset getCNTextureOffset(String partName) { - return (CNTextureOffset)this.modelTextureMap.get(partName); + this.getAllParts().forEach(CNAdvancedModelBox::updateDefaultPose); } public void resetToDefaultPose() { - this.getAllParts().forEach((modelRenderer) -> modelRenderer.resetToDefaultPose()); - } - - public void faceTarget(float yaw, float pitch, float rotationDivisor, CNAdvancedModelBox... boxes) { - float actualRotationDivisor = rotationDivisor * (float)boxes.length; - float yawAmount = yaw / (180F / (float)Math.PI) / actualRotationDivisor; - float pitchAmount = pitch / (180F / (float)Math.PI) / actualRotationDivisor; - - for(CNAdvancedModelBox box : boxes) { - box.rotateAngleY += yawAmount; - box.rotateAngleX += pitchAmount; - } - - } - - public void chainSwing(CNAdvancedModelBox[] boxes, float speed, float degree, double rootOffset, float swing, float swingAmount) { - float offset = this.calculateChainOffset(rootOffset, boxes); - - for(int index = 0; index < boxes.length; ++index) { - boxes[index].rotateAngleY += this.calculateChainRotation(speed, degree, swing, swingAmount, offset, index); - } - - } - - public void chainWave(CNAdvancedModelBox[] boxes, float speed, float degree, double rootOffset, float swing, float swingAmount) { - float offset = this.calculateChainOffset(rootOffset, boxes); - - for(int index = 0; index < boxes.length; ++index) { - boxes[index].rotateAngleX += this.calculateChainRotation(speed, degree, swing, swingAmount, offset, index); - } - - } - - public void chainFlap(CNAdvancedModelBox[] boxes, float speed, float degree, double rootOffset, float swing, float swingAmount) { - float offset = this.calculateChainOffset(rootOffset, boxes); - - for(int index = 0; index < boxes.length; ++index) { - boxes[index].rotateAngleZ += this.calculateChainRotation(speed, degree, swing, swingAmount, offset, index); - } - - } - - private float calculateChainRotation(float speed, float degree, float swing, float swingAmount, float offset, int boxIndex) { - return Mth.cos(swing * speed * this.movementScale + offset * (float)boxIndex) * swingAmount * degree * this.movementScale; - } - - private float calculateChainOffset(double rootOffset, CNAdvancedModelBox... boxes) { - return (float)(rootOffset * Math.PI / (double)(2 * boxes.length)); + this.getAllParts().forEach(CNAdvancedModelBox::resetToDefaultPose); } public float getMovementScale() { return this.movementScale; } - public void setMovementScale(float movementScale) { - this.movementScale = movementScale; - } - - public void walk(CNAdvancedModelBox box, float speed, float degree, boolean invert, float offset, float weight, float walk, float walkAmount) { - box.walk(speed, degree, invert, offset, weight, walk, walkAmount); - } - - public void flap(CNAdvancedModelBox box, float speed, float degree, boolean invert, float offset, float weight, float flap, float flapAmount) { - box.flap(speed, degree, invert, offset, weight, flap, flapAmount); - } - - public void swing(CNAdvancedModelBox box, float speed, float degree, boolean invert, float offset, float weight, float swing, float swingAmount) { - box.swing(speed, degree, invert, offset, weight, swing, swingAmount); - } - - public void bob(CNAdvancedModelBox box, float speed, float degree, boolean bounce, float f, float f1) { - box.bob(speed, degree, bounce, f, f1); - } - - public float moveBox(float speed, float degree, boolean bounce, float f, float f1) { - return bounce ? -Mth.abs(Mth.sin(f * speed) * f1 * degree) : Mth.sin(f * speed) * f1 * degree - f1 * degree; - } - public void setRotateAngle(CNAdvancedModelBox model, float x, float y, float z) { model.rotateAngleX = x; model.rotateAngleY = y; model.rotateAngleZ = z; } - public void rotate(CNModelAnimator animator, CNAdvancedModelBox model, float x, float y, float z) { - animator.rotate(model, (float)Math.toRadians((double)x), (float)Math.toRadians((double)y), (float)Math.toRadians((double)z)); - } - - public void rotateMinus(CNModelAnimator animator, CNAdvancedModelBox model, float x, float y, float z) { - animator.rotate(model, (float)Math.toRadians((double)x) - model.defaultRotationX, (float)Math.toRadians((double)y) - model.defaultRotationY, (float)Math.toRadians((double)z) - model.defaultRotationZ); - } - - public void progressRotation(CNAdvancedModelBox model, float progress, float rotX, float rotY, float rotZ, float divisor) { - model.rotateAngleX += progress * (rotX - model.defaultRotationX) / divisor; - model.rotateAngleY += progress * (rotY - model.defaultRotationY) / divisor; - model.rotateAngleZ += progress * (rotZ - model.defaultRotationZ) / divisor; - } - - public void progressRotationPrev(CNAdvancedModelBox model, float progress, float rotX, float rotY, float rotZ, float divisor) { - model.rotateAngleX += progress * rotX / divisor; - model.rotateAngleY += progress * rotY / divisor; - model.rotateAngleZ += progress * rotZ / divisor; - } - - public void progressPosition(CNAdvancedModelBox model, float progress, float x, float y, float z, float divisor) { - model.rotationPointX += progress * (x - model.defaultPositionX) / divisor; - model.rotationPointY += progress * (y - model.defaultPositionY) / divisor; - model.rotationPointZ += progress * (z - model.defaultPositionZ) / divisor; - } - - public void progressPositionPrev(CNAdvancedModelBox model, float progress, float x, float y, float z, float divisor) { - model.rotationPointX += progress * x / divisor; - model.rotationPointY += progress * y / divisor; - model.rotationPointZ += progress * z / divisor; - } - 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 index a0a6da5ec..06bf89c0c 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/explosion/CNAdvancedModelBox.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/explosion/CNAdvancedModelBox.java @@ -19,9 +19,6 @@ public class CNAdvancedModelBox extends CNBasicModelPart { public float defaultRotationX; public float defaultRotationY; public float defaultRotationZ; - public float defaultOffsetX; - public float defaultOffsetY; - public float defaultOffsetZ; public float defaultPositionX; public float defaultPositionY; public float defaultPositionZ; @@ -33,15 +30,10 @@ public class CNAdvancedModelBox extends CNBasicModelPart { public boolean scaleChildren; private CNAdvancedEntityModel model; private CNAdvancedModelBox parent; - private int displayList; - private boolean compiled; public ObjectList cubeList; public ObjectList childModels; private float textureWidth; private float textureHeight; - public float offsetX; - public float offsetY; - public float offsetZ; public String boxName; public CNAdvancedModelBox(CNAdvancedEntityModel model, String name) { @@ -59,28 +51,13 @@ public CNAdvancedModelBox(CNAdvancedEntityModel model, String name) { } public CNAdvancedModelBox(CNAdvancedEntityModel model) { - this(model, (String)null); + this(model, null); this.textureWidth = (float)model.texWidth; this.textureHeight = (float)model.texHeight; this.cubeList = new ObjectArrayList(); this.childModels = new ObjectArrayList(); } - public CNAdvancedModelBox(CNAdvancedEntityModel model, int textureOffsetX, int textureOffsetY) { - this(model); - this.textureWidth = (float)model.texWidth; - this.textureHeight = (float)model.texHeight; - this.setTextureOffset(textureOffsetX, textureOffsetY); - this.cubeList = new ObjectArrayList(); - this.childModels = new ObjectArrayList(); - } - - public CNBasicModelPart setTexSize(int p_78787_1_, int p_78787_2_) { - this.textureWidth = (float)p_78787_1_; - this.textureHeight = (float)p_78787_2_; - return this; - } - 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); @@ -113,28 +90,12 @@ private void addBox(int p_228305_1_, int p_228305_2_, float p_228305_3_, float p 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 setShouldScaleChildren(boolean scaleChildren) { - this.scaleChildren = scaleChildren; - } - public void setScale(float scaleX, float scaleY, float scaleZ) { this.scaleX = scaleX; this.scaleY = scaleY; this.scaleZ = scaleZ; } - public void setScaleX(float scaleX) { - this.scaleX = scaleX; - } - - public void setScaleY(float scaleY) { - this.scaleY = scaleY; - } - - public void setScaleZ(float scaleZ) { - this.scaleZ = scaleZ; - } - public void updateDefaultPose() { this.defaultRotationX = this.rotateAngleX; this.defaultRotationY = this.rotateAngleY; @@ -144,12 +105,6 @@ public void updateDefaultPose() { this.defaultPositionZ = this.rotationPointZ; } - public void setPos(float xIn, float yIn, float zIn) { - this.rotationPointX = xIn; - this.rotationPointY = yIn; - this.rotationPointZ = zIn; - } - public void resetToDefaultPose() { this.rotateAngleX = this.defaultRotationX; this.rotateAngleY = this.defaultRotationY; @@ -165,7 +120,6 @@ public void addChild(CNBasicModelPart child) { if (child instanceof CNAdvancedModelBox advancedChild) { advancedChild.setParent(this); } - } public CNAdvancedModelBox getParent() { @@ -176,22 +130,8 @@ public void setParent(CNAdvancedModelBox parent) { this.parent = parent; } - public void parentedPostRender(float scale) { - if (this.parent != null) { - this.parent.parentedPostRender(scale); - } - - } - - public void renderWithParents(float scale) { - if (this.parent != null) { - this.parent.renderWithParents(scale); - } - - } - public void translateAndRotate(PoseStack matrixStackIn) { - matrixStackIn.translate((double)(this.rotationPointX / 16.0F), (double)(this.rotationPointY / 16.0F), (double)(this.rotationPointZ / 16.0F)); + 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)); } @@ -260,51 +200,9 @@ public CNAdvancedEntityModel getModel() { return this.model; } - private float calculateRotation(float speed, float degree, boolean invert, float offset, float weight, float f, float f1) { - float movementScale = this.model.getMovementScale(); - float rotation = Mth.cos(f * speed * movementScale + offset) * degree * movementScale * f1 + weight * f1; - return invert ? -rotation : rotation; - } - - public void walk(float speed, float degree, boolean invert, float offset, float weight, float walk, float walkAmount) { - this.rotateAngleX += this.calculateRotation(speed, degree, invert, offset, weight, walk, walkAmount); - } - - public void flap(float speed, float degree, boolean invert, float offset, float weight, float flap, float flapAmount) { - this.rotateAngleZ += this.calculateRotation(speed, degree, invert, offset, weight, flap, flapAmount); - } - - public void swing(float speed, float degree, boolean invert, float offset, float weight, float swing, float swingAmount) { - this.rotateAngleY += this.calculateRotation(speed, degree, invert, offset, weight, swing, swingAmount); - } - - public void bob(float speed, float degree, boolean bounce, float f, float f1) { - float movementScale = this.model.getMovementScale(); - degree *= movementScale; - speed *= movementScale; - float bob = (float)(Math.sin((double)(f * speed)) * (double)f1 * (double)degree - (double)(f1 * degree)); - if (bounce) { - bob = (float)(-Math.abs(Math.sin((double)(f * speed)) * (double)f1 * (double)degree)); - } - - this.rotationPointY += bob; - } - public CNAdvancedModelBox setTextureOffset(int textureOffsetX, int textureOffsetY) { this.textureOffsetX = textureOffsetX; this.textureOffsetY = textureOffsetY; return this; } - - public void transitionTo(CNAdvancedModelBox to, float timer, float maxTime) { - this.rotateAngleX += (to.rotateAngleX - this.rotateAngleX) / maxTime * timer; - this.rotateAngleY += (to.rotateAngleY - this.rotateAngleY) / maxTime * timer; - this.rotateAngleZ += (to.rotateAngleZ - this.rotateAngleZ) / maxTime * timer; - this.rotationPointX += (to.rotationPointX - this.rotationPointX) / maxTime * timer; - this.rotationPointY += (to.rotationPointY - this.rotationPointY) / maxTime * timer; - this.rotationPointZ += (to.rotationPointZ - this.rotationPointZ) / maxTime * timer; - this.offsetX += (to.offsetX - this.offsetX) / maxTime * timer; - this.offsetY += (to.offsetY - this.offsetY) / maxTime * timer; - this.offsetZ += (to.offsetZ - this.offsetZ) / maxTime * timer; - } } \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/explosion/CNAnimation.java b/src/main/java/net/nuclearteam/createnuclear/content/explosion/CNAnimation.java deleted file mode 100644 index 6b77f4cba..000000000 --- a/src/main/java/net/nuclearteam/createnuclear/content/explosion/CNAnimation.java +++ /dev/null @@ -1,34 +0,0 @@ -package net.nuclearteam.createnuclear.content.explosion; - -public class CNAnimation { - /** @deprecated */ - @Deprecated - private int id; - private int duration; - - private CNAnimation(int duration) { - this.duration = duration; - } - - /** @deprecated */ - @Deprecated - public static CNAnimation create(int id, int duration) { - CNAnimation animation = create(duration); - animation.id = id; - return animation; - } - - public static CNAnimation create(int duration) { - return new CNAnimation(duration); - } - - /** @deprecated */ - @Deprecated - public int getID() { - return this.id; - } - - public int getDuration() { - return this.duration; - } -} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/explosion/CNIAnimatedEntity.java b/src/main/java/net/nuclearteam/createnuclear/content/explosion/CNIAnimatedEntity.java deleted file mode 100644 index 84564c797..000000000 --- a/src/main/java/net/nuclearteam/createnuclear/content/explosion/CNIAnimatedEntity.java +++ /dev/null @@ -1,16 +0,0 @@ -package net.nuclearteam.createnuclear.content.explosion; - - -public interface CNIAnimatedEntity { - CNAnimation NO_ANIMATION = CNAnimation.create(0); - - int getAnimationTick(); - - void setAnimationTick(int var1); - - CNAnimation getAnimation(); - - void setAnimation(CNAnimation var1); - - CNAnimation[] getAnimations(); -} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/explosion/CNModelAnimator.java b/src/main/java/net/nuclearteam/createnuclear/content/explosion/CNModelAnimator.java deleted file mode 100644 index 8759569f2..000000000 --- a/src/main/java/net/nuclearteam/createnuclear/content/explosion/CNModelAnimator.java +++ /dev/null @@ -1,127 +0,0 @@ -package net.nuclearteam.createnuclear.content.explosion; - -import java.util.HashMap; -import net.minecraft.client.Minecraft; -import net.minecraft.util.Mth; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -@OnlyIn(Dist.CLIENT) -public class CNModelAnimator { - private int tempTick = 0; - private int prevTempTick; - private boolean correctAnimation = false; - private CNIAnimatedEntity entity; - private HashMap CNTransformMap = new HashMap(); - private HashMap prevCNTransformMap = new HashMap(); - - public static CNModelAnimator create() { - return new CNModelAnimator(); - } - - public CNIAnimatedEntity getEntity() { - return this.entity; - } - - public void update(CNIAnimatedEntity entity) { - this.tempTick = this.prevTempTick = 0; - this.correctAnimation = false; - this.entity = entity; - this.CNTransformMap.clear(); - this.prevCNTransformMap.clear(); - } - - public boolean setAnimation(CNAnimation animation) { - this.tempTick = this.prevTempTick = 0; - this.correctAnimation = this.entity.getAnimation() == animation; - return this.correctAnimation; - } - - public void startKeyframe(int duration) { - if (this.correctAnimation) { - this.prevTempTick = this.tempTick; - this.tempTick += duration; - } - } - - public void setStaticKeyframe(int duration) { - this.startKeyframe(duration); - this.endKeyframe(true); - } - - public void resetKeyframe(int duration) { - this.startKeyframe(duration); - this.endKeyframe(); - } - - public void rotate(CNAdvancedModelBox box, float x, float y, float z) { - if (this.correctAnimation) { - this.getCNTransform(box).addRotation(x, y, z); - } - } - - public void move(CNAdvancedModelBox box, float x, float y, float z) { - if (this.correctAnimation) { - this.getCNTransform(box).addOffset(x, y, z); - } - } - - private CNTransform getCNTransform(CNAdvancedModelBox box) { - return (CNTransform)this.CNTransformMap.computeIfAbsent(box, (b) -> new CNTransform()); - } - - public void endKeyframe() { - this.endKeyframe(false); - } - - private void endKeyframe(boolean stationary) { - if (this.correctAnimation) { - int animationTick = this.entity.getAnimationTick(); - if (animationTick >= this.prevTempTick && animationTick < this.tempTick) { - if (stationary) { - for(CNAdvancedModelBox box : this.prevCNTransformMap.keySet()) { - CNTransform CNTransform = (CNTransform)this.prevCNTransformMap.get(box); - box.rotateAngleX += CNTransform.getRotationX(); - box.rotateAngleY += CNTransform.getRotationY(); - box.rotateAngleZ += CNTransform.getRotationZ(); - box.rotationPointX += CNTransform.getOffsetX(); - box.rotationPointY += CNTransform.getOffsetY(); - box.rotationPointZ += CNTransform.getOffsetZ(); - } - } else { - float frameTime = Minecraft.getInstance().isPaused() ? 0.0F : Minecraft.getInstance().getFrameTime(); - float tick = ((float)(animationTick - this.prevTempTick) + frameTime) / (float)(this.tempTick - this.prevTempTick); - float inc = Mth.sin((float)((double)tick * Math.PI / (double)2.0F)); - float dec = 1.0F - inc; - - for(CNAdvancedModelBox box : this.prevCNTransformMap.keySet()) { - CNTransform CNTransform = (CNTransform)this.prevCNTransformMap.get(box); - box.rotateAngleX += dec * CNTransform.getRotationX(); - box.rotateAngleY += dec * CNTransform.getRotationY(); - box.rotateAngleZ += dec * CNTransform.getRotationZ(); - box.rotationPointX += dec * CNTransform.getOffsetX(); - box.rotationPointY += dec * CNTransform.getOffsetY(); - box.rotationPointZ += dec * CNTransform.getOffsetZ(); - } - - for(CNAdvancedModelBox box : this.CNTransformMap.keySet()) { - CNTransform CNTransform = (CNTransform)this.CNTransformMap.get(box); - box.rotateAngleX += inc * CNTransform.getRotationX(); - box.rotateAngleY += inc * CNTransform.getRotationY(); - box.rotateAngleZ += inc * CNTransform.getRotationZ(); - box.rotationPointX += inc * CNTransform.getOffsetX(); - box.rotationPointY += inc * CNTransform.getOffsetY(); - box.rotationPointZ += inc * CNTransform.getOffsetZ(); - } - } - } - - if (!stationary) { - this.prevCNTransformMap.clear(); - this.prevCNTransformMap.putAll(this.CNTransformMap); - this.CNTransformMap.clear(); - } - - } - } -} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/explosion/CNTextureOffset.java b/src/main/java/net/nuclearteam/createnuclear/content/explosion/CNTextureOffset.java deleted file mode 100644 index cf2abe37e..000000000 --- a/src/main/java/net/nuclearteam/createnuclear/content/explosion/CNTextureOffset.java +++ /dev/null @@ -1,15 +0,0 @@ -package net.nuclearteam.createnuclear.content.explosion; - -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -@OnlyIn(Dist.CLIENT) -public class CNTextureOffset { - public final int textureOffsetX; - public final int textureOffsetY; - - public CNTextureOffset(int textureOffsetXIn, int textureOffsetYIn) { - this.textureOffsetX = textureOffsetXIn; - this.textureOffsetY = textureOffsetYIn; - } -} \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/content/explosion/CNTransform.java b/src/main/java/net/nuclearteam/createnuclear/content/explosion/CNTransform.java deleted file mode 100644 index 1d869c22e..000000000 --- a/src/main/java/net/nuclearteam/createnuclear/content/explosion/CNTransform.java +++ /dev/null @@ -1,72 +0,0 @@ -package net.nuclearteam.createnuclear.content.explosion; - -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -@OnlyIn(Dist.CLIENT) -public class CNTransform { - private float rotationX; - private float rotationY; - private float rotationZ; - private float offsetX; - private float offsetY; - private float offsetZ; - - public float getRotationX() { - return this.rotationX; - } - - public float getRotationY() { - return this.rotationY; - } - - public float getRotationZ() { - return this.rotationZ; - } - - public float getOffsetX() { - return this.offsetX; - } - - public float getOffsetY() { - return this.offsetY; - } - - public float getOffsetZ() { - return this.offsetZ; - } - - public void addRotation(float x, float y, float z) { - this.rotationX += x; - this.rotationY += y; - this.rotationZ += z; - } - - public void addOffset(float x, float y, float z) { - this.offsetX += x; - this.offsetY += y; - this.offsetZ += z; - } - - public void resetRotation() { - this.rotationX = 0.0F; - this.rotationY = 0.0F; - this.rotationZ = 0.0F; - } - - public void resetOffset() { - this.offsetX = 0.0F; - this.offsetY = 0.0F; - this.offsetZ = 0.0F; - } - - public void setRotation(float x, float y, float z) { - this.resetRotation(); - this.addRotation(x, y, z); - } - - public void setOffset(float x, float y, float z) { - this.resetOffset(); - this.addOffset(x, y, z); - } -} \ 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 index 6d98a1f69..9ce068b5e 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/explosion/NuclearExplosionEntity.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/explosion/NuclearExplosionEntity.java @@ -42,12 +42,13 @@ public class NuclearExplosionEntity extends Entity { private Explosion dummyExplosion; - // Changé en Object pour éviter le crash ClassNotFound si Alex's Caves n'est pas installé + // 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); - // On instancie la compatibilité SEULEMENT si le mod est présent + // Only instantiate the compat handler when the addon is actually loaded if (Mods.ALEXS_CAVE.isLoaded()) { this.alexscaveHandler = new AlexscaveCompat(); } @@ -112,9 +113,8 @@ public void tick() { float playerFling = entity instanceof Player ? 0.5F * flingStrength : flingStrength; if (damage > 0) { - // Gestion Raycat (Avec accolades obligatoires) + // Raycat (Alex's Caves) is immune to the explosion if (Mods.ALEXS_CAVE.isLoaded() && alexscaveHandler != null) { - // isRaycat doit retourner un boolean dans votre Compat if (((AlexscaveCompat) alexscaveHandler).isRaycat(entity)) { damage = 0; } @@ -124,9 +124,8 @@ public void tick() { damage *= 0.25F; playerFling *= 0.1F; - // Gestion Tremorzilla + // Tremorzilla (Alex's Caves) is fully immune, on top of the irradiated-immune reduction above if (Mods.ALEXS_CAVE.isLoaded() && alexscaveHandler != null) { - // isTremorzilla doit retourner un boolean dans votre Compat if (((AlexscaveCompat) alexscaveHandler).isTremorzilla(entity)) { CreateNuclear.LOGGER.warn("Entity explosion compatibility with Alex's Cave"); damage = 0; @@ -210,21 +209,24 @@ private void removeChunk(int radius) { carveBelow.set(carve.getX(), carve.getY() - 1, carve.getZ()); canSetToFire = true; - // GESTION SPAWN MOBS / compat Alex's Caves + // ALEX'S CAVES compatibility handling boolean handledByAlex = false; if (Mods.ALEXS_CAVE.isLoaded() && alexscaveHandler != null){ handledByAlex = ((AlexscaveCompat) alexscaveHandler).MobSpawn(state, level(), carve, itemDropModifier, dummyExplosion); } - // Si Alex a géré (oeuf éclot), on skip if (handledByAlex) continue; - // Nouveau : destruction standard quand Alex's Caves n'est pas présent - // On essaye d'abord d'appeler le comportement d'explosion du block, sinon fallback sur destroyBlock - try { - state.onBlockExploded(level(), carve, dummyExplosion); - } catch (Exception e) { - level().destroyBlock(carve, true); + // 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); } } } 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 fd1749183..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 @@ -22,7 +22,8 @@ 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.foundation.damageTypes.CreateNuclearDamageSources; +import net.nuclearteam.createnuclear.content.radiation.capability.RadiationCapability; +import net.nuclearteam.createnuclear.foundation.damageTypes.CNDamageSources; import javax.annotation.Nullable; import java.util.List; @@ -64,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 @@ -118,8 +121,8 @@ 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, -1, true, true)); - livingEntity.hurt(CreateNuclearDamageSources.fanRadiation(level), 1); + RadiationCapability.applyContagion(livingEntity, FAN_ENRICHING_DOSE, 10); + livingEntity.hurt(CNDamageSources.fanRadiation(level), 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 index 8f764773b..080af8299 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/logistics/BigFluidStack.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/logistics/BigFluidStack.java @@ -1,6 +1,5 @@ package net.nuclearteam.createnuclear.content.logistics; -import com.simibubi.create.content.logistics.BigItemStack; import net.nuclearteam.createnuclear.api.ReactorFluidTypesValue; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; @@ -9,9 +8,6 @@ import net.nuclearteam.createnuclear.api.multiblock.fluid.ReactorFluidType; import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; import java.util.Objects; public class BigFluidStack { @@ -46,18 +42,10 @@ public void send(FriendlyByteBuf buffer) { buffer.writeVarInt(amount); } - public boolean isInfinite() { - return amount >= INF; - } - public static BigFluidStack receive(FriendlyByteBuf buffer) { return new BigFluidStack(buffer.readFluidStack(), buffer.readVarInt()); } - public static Comparator comparator() { - return (i1, i2) -> Integer.compare(i2.amount, i1.amount); - } - @Override public boolean equals(final Object obj) { if (obj == this) @@ -82,13 +70,6 @@ public String toString() { .getString() + " x" + amount + ")"; } - public static List duplicateWrappers(List list) { - List copy = new ArrayList<>(); - for (BigFluidStack bigFluidStack : list) - copy.add(new BigFluidStack(bigFluidStack.stack, bigFluidStack.amount)); - return copy; - } - public ReactorFluidType getFluidtype(@Nullable Level level) { if (level == null) { return ReactorFluidTypesValue.getReactorFluidType(this.stack.getFluid()); 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 4196d34cb..aa5a5008c 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/CNMultiblock.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/CNMultiblock.java @@ -16,8 +16,8 @@ public class CNMultiblock { private static final Predicate blockInWorldAPredicate = state -> stateIs(CNBlocks.REACTOR_CASING.get()).test(state) || stateIs(CNBlocks.REACTOR_OUTPUT.get()).test(state) - || stateIs(CNBlocks.REACTOR_INPUT.get()).test(state) - || stateIs(CNBlocks.REACTOR_LIQUID_INPUT.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) ; 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 09add3c4e..c0c393274 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/IHeat.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/IHeat.java @@ -8,12 +8,15 @@ 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 { @@ -57,25 +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 boolean isNotDanger(int heat) { - return of(heat) != DANGER || of(heat) != NONE; + public static boolean isNotDanger(int heat, int reactorSize) { + return of(heat, reactorSize) != DANGER; } - public static LangBuilder getFormattedHeatText(int heat) { - HeatLevel heatLevel = of(heat); + 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())) @@ -93,10 +109,10 @@ 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 = TypeRodPredicate.tooltipKey(itemRod); + 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 @@ -107,8 +123,8 @@ public static LangBuilder getFormattedItemText(ItemStack itemRod, Boolean isEmpt return builder; } - public static LangBuilder getFormattedItemText(BigItemStack itemRod, Boolean isEmpty) { - return getFormattedItemText(new ItemStack(itemRod.stack.getItem(), itemRod.count), isEmpty); + 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) { diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/MultiblockHelpers.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/MultiblockHelpers.java index 36c8c2414..851292543 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/MultiblockHelpers.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/MultiblockHelpers.java @@ -1,10 +1,15 @@ 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; @@ -18,9 +23,7 @@ public class MultiblockHelpers { * invoke provided callbacks to register or remove parts. */ public static void handleOnPlace(BlockPos pos, Level level, BiConsumer register) { - handleOnPlace(pos, level, true); - - BlockPos controllerPos = pattern.findControllerPos(pos, level); + BlockPos controllerPos = pattern.findControllerPos(pos, level, true); if (controllerPos != null) { ReactorControllerBlockEntity controllerBlockEntity = (ReactorControllerBlockEntity) level.getBlockEntity(controllerPos); if (controllerBlockEntity != null) { @@ -29,18 +32,8 @@ public static void handleOnPlace(BlockPos pos, Level level, BiConsumer remover) { - handleOnPlace(pos, level, false); - - BlockPos controllerPos = pattern.findControllerPos(pos, level); + BlockPos controllerPos = pattern.findControllerPos(pos, level, false); if (controllerPos != null) { ReactorControllerBlockEntity controllerBlockEntity = (ReactorControllerBlockEntity) level.getBlockEntity(controllerPos); if (controllerBlockEntity != null) { @@ -61,4 +54,14 @@ public static ReactorControllerBlockEntity getControllerForPart(Level level, Blo 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 index 7f35d0aac..924419ce0 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/ReactorAssembler.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/ReactorAssembler.java @@ -3,13 +3,11 @@ 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.world.entity.player.Player; +import net.minecraft.core.Direction; 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.AABB; +import net.minecraft.world.level.levelgen.structure.BoundingBox; import net.nuclearteam.createnuclear.CNBlocks; import net.nuclearteam.createnuclear.CreateNuclear; import net.nuclearteam.createnuclear.api.multiblock.BlockPattern; @@ -22,6 +20,7 @@ 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 { @@ -32,15 +31,14 @@ public final class ReactorAssembler { 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; - CreateNuclear.LOGGER.warn("ReactorAssembler#assemble id: {}, size: {}, name: {}", - result.id(), result.data().getSize(), result.data().getName()); - sendMessageToPlayer(level, pos, CreateNuclearLang.translate("notification.reactor.assembled"), !entity.isAssembled()); switch (result.data()) { @@ -51,12 +49,14 @@ public static void assemble(BlockPos pos, Level level) { entity.setMultiblockSize(result.data().getSize()); entity.setAssembled(true); - entity.setMultiblockStructure(entity.getStructureBounds(pos, entity.getMultiblockSize(), entity.getMultiblockFacing())); + 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; @@ -69,14 +69,14 @@ public static void disassemble(BlockPos pos, Level level) { entity.removeIOAll(); } - public static void findAndRegisterSpecialBlocks(int[] reactorPos, ReactorControllerBlockEntity entity, Level level) { - int xMin = reactorPos[0], xMax = reactorPos[1]; - int yMin = reactorPos[2], yMax = reactorPos[3]; - int zMin = reactorPos[4], zMax = reactorPos[5]; + 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 reactorInputBlock = CNBlocks.REACTOR_INPUT.get(); - final Block reactorInputFluidBlock = CNBlocks.REACTOR_LIQUID_INPUT.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(); @@ -85,6 +85,10 @@ public static void findAndRegisterSpecialBlocks(int[] reactorPos, ReactorControl 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++) { @@ -99,12 +103,12 @@ public static void findAndRegisterSpecialBlocks(int[] reactorPos, ReactorControl if (blockState.is(reactorOutputBlock)) { entity.addOutput(mutablePos.immutable()); - } else if (blockState.is(reactorInputBlock)) { + } 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) { - fluidInput.applyReactorTierCapacity(entity.getMultiblockSize()); + fluidInputs.add(fluidInput); } } else if (blockState.is(reactorAlarmBlock)) { entity.addAlarm(mutablePos.immutable()); @@ -120,7 +124,27 @@ public static void findAndRegisterSpecialBlocks(int[] reactorPos, ReactorControl } if (frameMinY != Integer.MAX_VALUE) { - entity.setFrameColumn(frameMinY, frameMaxY); + 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)); } } @@ -131,12 +155,6 @@ private static ReactorControllerBlockEntity getBlockEntity(Level level, BlockPos return null; } - @Deprecated - private static List getPlayersInRadius(Level level, BlockPos center, double radius) { - AABB box = new AABB(center).inflate(radius); - return level.getEntitiesOfClass(Player.class, box); - } - private static void sendMessageToPlayer(Level level, BlockPos pos, LangBuilder component, boolean condition) { if (!condition) return; @@ -145,4 +163,22 @@ private static void sendMessageToPlayer(Level level, BlockPos pos, LangBuilder c 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 index 18a361bd7..a8d9eed86 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/alarm/ReactorAlarm.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/alarm/ReactorAlarm.java @@ -31,27 +31,20 @@ public ReactorAlarm(Properties props) { this.registerDefaultState(this.defaultBlockState().setValue(POWERED, false)); } - // AJOUT : Inscription au multiblock lors de la pose + // 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); } - // AJOUT : Désinscription au multiblock lors de la destruction par un joueur - @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); - MultiblockHelpers.handleRemoval(pos, level, ReactorControllerBlockEntity::removeAlarm); - } - @Override public void setPlacedBy(Level level, BlockPos pos, BlockState state, @Nullable LivingEntity pPlacer, ItemStack stack) { super.setPlacedBy(level, pos, state, pPlacer, stack); - CNAdvancementBehaviour.setPlacedBy(level, pos, pPlacer); + MultiblockHelpers.handleAdvancedPlacedBy(pos, level, pPlacer); } - // CORRECTION : Désinscription au multiblock lors du retrait (piston, explosion, etc.) + // 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())) { 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 index 9202a76a7..4e63a7554 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/alarm/ReactorAlarmEntity.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/alarm/ReactorAlarmEntity.java @@ -20,7 +20,7 @@ public class ReactorAlarmEntity extends SmartBlockEntity { public ReactorControllerBlockEntity controller = null; private CNAdvancementBehaviour advancement; - private boolean advancementAwarded = false; // Anti-spam réseau + private boolean advancementAwarded = false; // Prevents repeatedly awarding the advancement on every tick @OnlyIn(Dist.CLIENT) protected ReactorAlarmSoundInstance soundInstance; @@ -35,7 +35,7 @@ public void tick() { if (level == null || !(getBlockState().getBlock() instanceof ReactorAlarm)) return; if (level.isClientSide) { - tickAudio(); // Plus besoin de DistExecutor ici, le check de level suffit et évite le lag de thread + tickAudio(); // DistExecutor is unnecessary here; the level-side check is enough and avoids thread overhead } else { tickServer(); } @@ -54,10 +54,10 @@ protected void tickAudio() { if (soundInstance == null || soundInstance.isStopped()) { Minecraft minecraft = Minecraft.getInstance(); try { - soundInstance = new ReactorAlarmSoundInstance(level, worldPosition, CNSoundEvents.REACTOR_ALARM_2.getMainEvent()); + soundInstance = new ReactorAlarmSoundInstance(level, worldPosition, CNSoundEvents.REACTOR_ALARM_LOOP.getMainEvent()); minecraft.getSoundManager().play(soundInstance); } catch (Exception e) { - CreateNuclear.LOGGER.warn("Échec du lancement du son d'alarme: " + e.getMessage()); + CreateNuclear.LOGGER.warn("Failed to start alarm sound: " + e.getMessage()); } } } @@ -68,7 +68,7 @@ private void stopSound() { try { soundInstance.fadeOut(); } catch (Exception e) { - CreateNuclear.LOGGER.warn("Erreur lors de l'arrêt du son : " + e.getMessage()); + CreateNuclear.LOGGER.warn("Error while stopping the sound: " + e.getMessage()); } soundInstance = null; } @@ -81,12 +81,12 @@ private void tickServer() { boolean powered = state.getValue(ReactorAlarm.POWERED); if (powered) { - if (!advancementAwarded) { // On l'envoie UNE SEULE FOIS au front montant + if (!advancementAwarded) { // Award it only once, on the rising edge this.advancement.awardPlayer(CNAdvancement.SILENCE_THE_CORE); advancementAwarded = true; } } else { - advancementAwarded = false; // Reset quand l'alarme s'éteint + advancementAwarded = false; // Reset when the alarm turns off } } 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 f14e85e67..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 @@ -42,7 +42,7 @@ public void appendHoverText(ItemStack stack, @Nullable Level level, List use(Level world, Player player, InteractionHand hand) { ItemStack heldItem = player.getItemInHand(hand); - // Clic Droit Normal -> Ouvre l'interface du Blueprint (ton code d'origine) + // 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 + Clic Droit -> Envoie le lien cliquable dans le Chat ! + // Shift + right-click -> Sends a clickable link in chat! else if (player.isShiftKeyDown() && hand == InteractionHand.MAIN_HAND) { if (!world.isClientSide) { MutableComponent message = Component.translatable("item.createnuclear.reactor_blueprint.chat_info") 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 6745103a5..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.countFuelRod = this.countUraniumRod; - c.countCooledRod = 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 429fa7e9f..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") - ); - - + 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 4a2ef1456..b3862c63d 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 @@ -14,24 +14,20 @@ import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.items.SlotItemHandler; import net.nuclearteam.createnuclear.CNMenus; -import net.nuclearteam.createnuclear.CNTags; -import net.nuclearteam.createnuclear.CNTags.CNItemTags; -import net.nuclearteam.createnuclear.api.ItemRodTypesValue; import net.nuclearteam.createnuclear.api.multiblock.rods.RodType; import net.nuclearteam.createnuclear.api.multiblock.rods.RodType.TypeRod; -import net.nuclearteam.createnuclear.infrastructure.config.CNConfigs; 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 countCooledRod = 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) { @@ -64,10 +60,11 @@ protected void initAndReadInventory(ItemStack contentHolder) { } } - contentHolder.getOrCreateTag().putInt("uraniumTime", CNConfigs.server().rods.uraniumRodLifetime.get()); - contentHolder.getOrCreateTag().putInt("graphiteTime", CNConfigs.server().rods.graphiteRodLifetime.get()); - 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")); } @@ -116,6 +113,9 @@ private void addPatternSlots() { protected void saveData(ItemStack contentHolder) { countFuelRod = 0; countCooledRod = 0; + int totalHeatRatio = 0; + int totalFuelTime = 0; + int totalCoolerTime = 0; for (int i = 0; i < ghostInventory.getSlots(); i++) { ItemStack stack = ghostInventory.getStackInSlot(i); @@ -124,18 +124,31 @@ protected void saveData(ItemStack contentHolder) { continue; } - RodType typeRod = ItemRodTypesValue.getRodType(stack.getItem()); + RodType typeRod = RodType.resolveRodType(stack.getItem(), playerInventory.player.level()); - boolean isFuel = stack.is(CNItemTags.FUEL.tag) || typeRod.type() == TypeRod.FUEL; - boolean isCooler = stack.is(CNItemTags.COOLER.tag) || typeRod.type() == TypeRod.COOLER; + boolean isFuel = typeRod.type() == TypeRod.FUEL; + boolean isCooler = typeRod.type() == TypeRod.COOLER; - if (isCooler) countCooledRod++; - if (isFuel) countFuelRod++; + if (isCooler) { + countCooledRod++; + totalCoolerTime += typeRod.rodTimer().get(); + } + if (isFuel) { + countFuelRod++; + totalFuelTime += typeRod.rodTimer().get(); + } + + if (isCooler || isFuel) { + totalHeatRatio += typeRod.heatRatio().get(); + } } contentHolder.getOrCreateTag().put("pattern", ghostInventory.serializeNBT()); - contentHolder.getOrCreateTag().putInt("countGraphiteRod", countCooledRod); - contentHolder.getOrCreateTag().putInt("countUraniumRod", countFuelRod); + contentHolder.getOrCreateTag().putInt("countCoolerRod", countCooledRod); + contentHolder.getOrCreateTag().putInt("countFuelRod", countFuelRod); + contentHolder.getOrCreateTag().putInt("totalHeatRatio", totalHeatRatio); + 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++) { ItemStack stack = ghostInventory.getStackInSlot(i); @@ -144,10 +157,10 @@ protected void saveData(ItemStack contentHolder) { continue; } - RodType typeRod = ItemRodTypesValue.getRodType(stack.getItem()); + RodType typeRod = RodType.resolveRodType(stack.getItem(), playerInventory.player.level()); - boolean isFuel = stack.is(CNItemTags.FUEL.tag) || typeRod.type() == TypeRod.FUEL; - boolean isCooler = stack.is(CNItemTags.COOLER.tag) || typeRod.type() == TypeRod.COOLER; + boolean isFuel = typeRod.type() == TypeRod.FUEL; + boolean isCooler = typeRod.type() == TypeRod.COOLER; if (!(isFuel || isCooler)) { ghostInventory.setStackInSlot(i, new ItemStack(Items.GLASS_PANE)); @@ -157,27 +170,6 @@ protected void saveData(ItemStack contentHolder) { contentHolder.getOrCreateTag().put("patternAll", ghostInventory.serializeNBT()); } - protected void saveData2(ItemStack contentHolder) { - 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)) countCooledRod += 1; - if (ghostInventory.getStackInSlot(i).is(CNTags.CNItemTags.FUEL.tag)) countFuelRod += 1; - } - - contentHolder.getOrCreateTag().put("pattern", ghostInventory.serializeNBT()); - contentHolder.getOrCreateTag().putInt("countGraphiteRod", countCooledRod); - contentHolder.getOrCreateTag().putInt("countUraniumRod", countFuelRod); - - 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)); - } - - contentHolder.getOrCreateTag().put("patternAll", ghostInventory.serializeNBT()); - - } - protected int getPlayerInventoryXOffset() { return 31; } 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 2ea86266b..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 @@ -20,7 +20,8 @@ import net.minecraft.world.level.block.state.BlockState; import net.nuclearteam.createnuclear.CNBlockEntityTypes; import net.nuclearteam.createnuclear.CNBlocks; -import net.nuclearteam.createnuclear.content.multiblock.input.item.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; @@ -51,13 +52,7 @@ public void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldS @Override public void setPlacedBy(Level level, BlockPos pos, BlockState state, @Nullable LivingEntity pPlacer, ItemStack stack) { super.setPlacedBy(level, pos, state, pPlacer, stack); - CNAdvancementBehaviour.setPlacedBy(level, pos, pPlacer); - } - - @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); - pattern.findController(pos, level, false); + MultiblockHelpers.handleAdvancedPlacedBy(pos, level, pPlacer); } @Override @@ -73,7 +68,7 @@ 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; 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/ReactorControllerBlock.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/ReactorControllerBlock.java index dc0091f6c..f34804e3e 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,8 +6,10 @@ 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; @@ -25,8 +27,8 @@ import net.minecraft.world.phys.BlockHitResult; 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.FluidLockManager; import net.nuclearteam.createnuclear.content.multiblock.input.fluid.PersistentFluidLocks; import net.nuclearteam.createnuclear.foundation.advancement.CNAdvancement; import net.nuclearteam.createnuclear.foundation.advancement.CNAdvancementBehaviour; @@ -48,9 +50,9 @@ public class ReactorControllerBlock extends HorizontalDirectionalReactorBlock im public ReactorControllerBlock(Properties properties) { super(properties); this.registerDefaultState(this.stateDefinition.any() - .setValue(FACING, net.minecraft.core.Direction.NORTH) + .setValue(FACING, Direction.NORTH) .setValue(ASSEMBLED, false) - .setValue(ACTIVE, false) // Par défaut inactif + .setValue(ACTIVE, false) // Inactive by default ); } @@ -72,11 +74,11 @@ public void neighborChanged(BlockState state, Level worldIn, BlockPos pos, Block boolean isMoving) { if (worldIn.isClientSide) return; - // Un voisin direct du controller a changé. On ne désassemble PAS aveuglément : - // on ne le fait que si la structure est réellement cassée. Sinon, poser/remplacer - // un bloc adjacent au controller (frame au-dessus/en-dessous, input/alarm sur les - // côtés, cooler derrière) annulerait l'assemblage qui vient juste d'être validé. - // disassemble() vérifie findStructure et ne fait rien si la structure est complète. + // 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); } @@ -90,12 +92,11 @@ 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.PAPER)) { - withBlockEntityDo(worldIn, pos, ReactorControllerBlockEntity::logReactorConnections); + 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.getInventoryObject().getItem(0).isEmpty() && heldItem.getTag() != null){ @@ -105,22 +106,25 @@ public InteractionResult use(BlockState state, Level worldIn, BlockPos pos, Play player.setItemInHand(handIn, ItemStack.EMPTY); }); + // 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.getInventoryObject().getItem(0).isEmpty()) { withBlockEntityDo(worldIn, pos, be -> { - if (IHeat.HeatLevel.of(be.getInventoryObject().getItem(0).getOrCreateTag().getInt("heat")) == IHeat.HeatLevel.DANGER) { + 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(); // retirer le commentaire si on veux que le timer se reset quand le reacteur s'arrete - be.rotate(be.getBlockState(), be.getLevel(), 0); + //be.clearTimers(); // uncomment if the timer should reset when the reactor stops + be.getOutputManager().rotateOutputs(be.getLevel(), be.getAssembled(), 0); be.notifyUpdate(); }); + worldIn.playSound(null, pos, CNSoundEvents.REACTOR_SHUT_OFF.getMainEvent(), SoundSource.BLOCKS, 1.0f, 1.0f); state.setValue(ASSEMBLED, false); return InteractionResult.SUCCESS; @@ -140,9 +144,9 @@ public void onRemove(BlockState state, Level worldIn, BlockPos pos, BlockState n withBlockEntityDo(worldIn, pos, be -> ItemHelper.dropContents(worldIn, pos, be.getInventoryObject())); worldIn.removeBlockEntity(pos); - if (!worldIn.isClientSide && worldIn instanceof ServerLevel serverLevel) { + if (worldIn instanceof ServerLevel serverLevel) { PersistentFluidLocks.get(serverLevel).clearLock(pos); - } else FluidLockManager.clearLock(pos); + } if (!state.getValue(ASSEMBLED)) return; @@ -158,7 +162,7 @@ public void onRemove(BlockState state, Level worldIn, BlockPos pos, BlockState n @Override public void setPlacedBy(Level level, BlockPos pos, BlockState state, @Nullable LivingEntity pPlacer, ItemStack stack) { super.setPlacedBy(level, pos, state, pPlacer, stack); - CNAdvancementBehaviour.setPlacedBy(level, pos, pPlacer); + MultiblockHelpers.handleAdvancedPlacedBy(pos, level, pPlacer); if (state.getValue(ASSEMBLED)) return; ReactorAssembler.assemble(pos, level); 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 fbd75dde4..b0a26eb82 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 @@ -1,86 +1,52 @@ package net.nuclearteam.createnuclear.content.multiblock.controller; import com.simibubi.create.api.equipment.goggles.IHaveGoggleInformation; -import com.simibubi.create.content.logistics.BigItemStack; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; -import com.simibubi.create.foundation.item.TooltipHelper; -import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.foundation.utility.IInteractionChecker; -import net.minecraft.ChatFormatting; -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.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.resources.ResourceKey; import net.minecraft.server.level.ServerLevel; -import net.minecraft.util.Mth; -import net.minecraft.world.item.Item; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.GameRules; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.biome.BiomeResolver; -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.chunk.ChunkAccess; -import net.minecraft.world.level.chunk.ChunkStatus; +import net.minecraft.world.level.levelgen.structure.BoundingBox; import net.minecraft.world.level.material.Fluid; -import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.registries.ForgeRegistries; -import net.nuclearteam.createnuclear.CNBlocks; -import net.nuclearteam.createnuclear.CNEntityType; +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.CNMultiblock; -import net.nuclearteam.createnuclear.content.multiblock.alarm.ReactorAlarm; -import net.nuclearteam.createnuclear.content.multiblock.input.fluid.FluidLockManager; +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.explosion.NuclearExplosionEntity; -import net.nuclearteam.createnuclear.content.multiblock.output.ReactorOutput; -import net.nuclearteam.createnuclear.content.multiblock.output.ReactorOutputEntity; import net.nuclearteam.createnuclear.foundation.advancement.CNAdvancement; import net.nuclearteam.createnuclear.foundation.advancement.CNAdvancementBehaviour; import net.nuclearteam.createnuclear.content.multiblock.controller.consumable.ConsumptionCycleManager; -import net.nuclearteam.createnuclear.foundation.utility.NotifyUtil; -import net.nuclearteam.createnuclear.infrastructure.config.CNConfigs; -import net.nuclearteam.createnuclear.infrastructure.worldgen.biome.CNBiomes; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import net.nuclearteam.createnuclear.content.multiblock.input.fluid.PersistentFluidLocks; -import net.nuclearteam.createnuclear.content.multiblock.input.fluid.ReactorFluidInputEntity; -import net.nuclearteam.createnuclear.content.multiblock.input.fluid.VirtualReactorInputFluid; -import net.nuclearteam.createnuclear.content.multiblock.input.item.VirtualReactorInputsItem; import net.nuclearteam.createnuclear.content.multiblock.controller.manager.*; -import net.nuclearteam.createnuclear.foundation.utility.CreateNuclearLang; import net.nuclearteam.createnuclear.content.multiblock.pattern.ReactorPattern; import net.nuclearteam.createnuclear.content.multiblock.reactorLogic.HeatManager; -import net.nuclearteam.createnuclear.content.multiblock.controller.service.IHeatService; -import net.nuclearteam.createnuclear.content.multiblock.controller.service.DefaultHeatService; -import net.nuclearteam.createnuclear.content.multiblock.controller.service.IPersistenceService; -import net.nuclearteam.createnuclear.content.multiblock.controller.service.DefaultPersistenceService; - -import java.util.Map; import static net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlock.ASSEMBLED; @SuppressWarnings({ "unused" }) public class ReactorControllerBlockEntity extends SmartBlockEntity - implements IInteractionChecker, IHaveGoggleInformation { + implements IInteractionChecker, IHaveGoggleInformation, IMultiblockController { /** * The assembled state is stored in the block state * (`ReactorControllerBlock.ASSEMBLED`). @@ -89,34 +55,29 @@ public class ReactorControllerBlockEntity extends SmartBlockEntity */ private final ReactorPattern pattern = new ReactorPattern(); private final ReactorControllerInventory inventory; - private int countUraniumRod; - private int countGraphiteRod; + private int countFuelRod; + private int countCoolerRod; + private int totalHeatRatio; private int heat; - private int explosionCountdown = 0; + 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 BigItemStack bigFuelItem; - private BigItemStack bigCoolerItem; private List bigFluidStack; private int reactorSize = 0; - private String reactorFacing = "null"; + private Direction reactorFacing = null; // les pos sont [xMin, xMax, yMin, yMax, zMin, zMax] - private int[] reactorPos; - // 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 FluidStack frameFluidCache = FluidStack.EMPTY; - private float frameFluidFillRatioCache = 0f; + private BoundingBox reactorPos; + + private boolean needsToResolveEntities = false; private double fluidBuffer = 0.0; @@ -126,15 +87,20 @@ public class ReactorControllerBlockEntity extends SmartBlockEntity private final ReactorOutputManagerI outputManager; private final ReactorInputFluidManagerI inputFluidManager; private final ReactorAlarmManagerI alarmManager; + private final ReactorFrameDisplayManagerI frameDisplayManager; - // Client Display Data (Synced via NBT) - private Map clientDisplayItems = new HashMap<>(); - private List clientDisplayFluids = new ArrayList<>(); - private long clientMaxFluidCapacity = 0; + 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 @@ -163,20 +129,9 @@ public CompoundTag getConfiguredPatternTag() { return this.configuredPattern.getTag(); } - public BigItemStack getBigFuelItem() { - return this.bigFuelItem; - } - - public void setBigFuelItem(BigItemStack b) { - this.bigFuelItem = b; - } - - public BigItemStack getBigCoolerItem() { - return this.bigCoolerItem; - } - - public void setBigCoolerItem(BigItemStack b) { - this.bigCoolerItem = b; + /** @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() { @@ -187,79 +142,6 @@ public void setBigFluidStack(List b) { this.bigFluidStack = b; } - /** - * 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 {@link #clientDisplayFluids}; on the server it reads the - * aggregated {@link #bigFluidStack}. 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() { - if (level == null) return; - long now = level.getGameTime(); - if (now == frameFluidCacheTick) return; - frameFluidCacheTick = now; - - long amount = 0; - long capacity = 0; - FluidStack fluid = FluidStack.EMPTY; - for (IFluidHandler handler : inputFluidManager.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). */ - public FluidStack getDisplayedFluid() { - refreshFrameFluidCache(); - 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. - */ - public float getDisplayedFluidFillRatio() { - refreshFrameFluidCache(); - return frameFluidFillRatioCache; - } - - /** Records the lowest and highest frame block-Y of the assembled reactor. */ - public void setFrameColumn(int minY, int maxY) { - if (this.frameColumnMinY == minY && this.frameColumnMaxY == maxY) return; - this.frameColumnMinY = minY; - this.frameColumnMaxY = maxY; - notifyUpdate(); - } - - /** @return the lowest frame block-Y, or {@link Integer#MAX_VALUE} if unknown. */ - public int getFrameColumnMinY() { - return frameColumnMinY; - } - - /** @return the highest frame block-Y, or {@link Integer#MIN_VALUE} if unknown. */ - public int getFrameColumnMaxY() { - return frameColumnMaxY; - } - - public boolean hasFrameColumn() { - return frameColumnMinY != Integer.MAX_VALUE && frameColumnMaxY != Integer.MIN_VALUE - && frameColumnMaxY >= frameColumnMinY; - } - public int getMultiblockSize() { return this.reactorSize; } @@ -268,11 +150,13 @@ public void setMultiblockSize(int s) { this.reactorSize = s; } - public String getMultiblockFacing() { + @Override + public Direction getMultiblockFacing() { return this.reactorFacing; } - public void setMultiblockFacing(String f) { + @Override + public void setMultiblockFacing(Direction f) { this.reactorFacing = f; } @@ -281,11 +165,11 @@ public CNAdvancementBehaviour getAdvancement() { } /** Main constructor allowing dependency injection for testability and DIP compliance. */ - public int[] getMultiblockPos() { + public BoundingBox getMultiblockPos() { return this.reactorPos; } - public void setMultiblockStructure(int[] p) { + public void setMultiblockStructure(BoundingBox p) { this.reactorPos = p; } @@ -293,12 +177,28 @@ public void clearTimers() { this.cycleManager.clear(); } - public double getLiquidLife() { - return this.liquidLife; + public ReactorFrameDisplayManagerI getFrameDisplayManager() { + return this.frameDisplayManager; + } + + public ReactorInputFluidManagerI getInputFluidManager() { + return this.inputFluidManager; + } + + public ReactorOutputManagerI getOutputManager() { + return this.outputManager; } - public void setLiquidLife(double l) { - this.liquidLife = l; + public void setDisplayState(ReactorDisplayState state) { + this.displayState = state; + } + + public ReactorDisplayState getDisplayState() { + return this.displayState; + } + + private List allManagers() { + return List.of(inputManager, inputFluidManager, outputManager, alarmManager); } /** @@ -314,21 +214,25 @@ public ReactorControllerBlockEntity(BlockEntityType type, BlockPos pos, Block this.outputManager = new ReactorOutputManager(); this.inputFluidManager = new ReactorInputFluidManager(); this.alarmManager = new ReactorAlarmManager(); + this.frameDisplayManager = new ReactorFrameDisplayManager(); - this.bigFuelItem = new BigItemStack(ItemStack.EMPTY); - this.bigCoolerItem = new BigItemStack(ItemStack.EMPTY); 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); } @@ -341,113 +245,26 @@ public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneak return false; } - CreateLang.translate("gui.gauge.info_header") - .style(ChatFormatting.GRAY) - .forGoggles(tooltip); - IHeat.HeatLevel.getName("reactor_controller").style(ChatFormatting.GRAY).forGoggles(tooltip); - - IHeat.HeatLevel.getFormattedHeatText(patternTag.getInt("heat")).forGoggles(tooltip); - - if (clientDisplayItems.isEmpty()) { - CreateNuclearLang.builder() - .add(Component.translatable("tooltip.item.empty.rod").withStyle(ChatFormatting.GRAY)) - .add(CreateNuclearLang.number(0).style(ChatFormatting.GOLD)) - .forGoggles(tooltip); - } else { - for (Map.Entry entry : clientDisplayItems.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); - } - } - - if (clientDisplayFluids.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 { - for (BigFluidStack stack : clientDisplayFluids) { - float fillRatio = clientMaxFluidCapacity > 0 ? (float) stack.amount / clientMaxFluidCapacity : 0; - if (fillRatio >= 0.99f) - fillRatio = 1.0f; - int filledBars = (int) 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); - } - } + 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) { - super.read(compound, clientPacket); // Toujours en premier pour les coordonnées de base + 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; - if (compound.contains("frameColumnMinY")) { - this.frameColumnMinY = compound.getInt("frameColumnMinY"); - this.frameColumnMaxY = compound.getInt("frameColumnMaxY"); - } - - if (clientPacket) { - clientDisplayItems.clear(); - if (compound.contains("clientDisplayItems")) { - ListTag list = compound.getList("clientDisplayItems", - 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("Item"))); - if (item != null) { - clientDisplayItems.put(item, tag.getInt("Count")); - } - } - } - - clientDisplayFluids.clear(); - if (compound.contains("clientDisplayFluids")) { - ListTag list = compound.getList("clientDisplayFluids", - Tag.TAG_COMPOUND); - for (int i = 0; i < list.size(); i++) { - CompoundTag tag = list.getCompound(i); - FluidStack fstack = FluidStack - .loadFluidStackFromNBT(tag); - clientDisplayFluids.add(new BigFluidStack(fstack, tag.getInt("BigAmount"))); - } - } - clientMaxFluidCapacity = compound.getLong("clientMaxFluidCapacity"); - } - this.cycleManager.clear(); if (compound.contains("cycleManager")) { this.cycleManager.deserializeNBT(compound.getCompound("cycleManager")); @@ -461,33 +278,10 @@ protected void write(CompoundTag compound, boolean clientPacket) { this.outputManager.write(compound); this.inputFluidManager.write(compound); this.alarmManager.write(compound); + this.frameDisplayManager.write(compound); this.persistenceService.writeBasicState(this, compound, clientPacket); - compound.putInt("frameColumnMinY", frameColumnMinY); - compound.putInt("frameColumnMaxY", frameColumnMaxY); - - if (clientPacket) { - ListTag displayItemsTag = new ListTag(); - for (Map.Entry entry : clientDisplayItems.entrySet()) { - CompoundTag tag = new CompoundTag(); - tag.putString("Item", ForgeRegistries.ITEMS.getKey(entry.getKey()).toString()); - tag.putInt("Count", entry.getValue()); - displayItemsTag.add(tag); - } - compound.put("clientDisplayItems", displayItemsTag); - - ListTag displayFluidsTag = new ListTag(); - for (BigFluidStack stack : clientDisplayFluids) { - CompoundTag tag = new CompoundTag(); - stack.stack.writeToNBT(tag); - tag.putInt("BigAmount", stack.amount); - displayFluidsTag.add(tag); - } - compound.put("clientDisplayFluids", displayFluidsTag); - compound.putLong("clientMaxFluidCapacity", clientMaxFluidCapacity); - } - compound.put("cycleManager", cycleManager.serializeNBT()); } @@ -508,34 +302,8 @@ public void setAssembled(boolean assembled) { this.setChanged(); } - public void logReactorConnections() { - CreateNuclear.LOGGER.debug("Reactor input count: {}", this.inputManager.size()); - CreateNuclear.LOGGER.debug("Reactor output count: {}", this.outputManager.size()); - CreateNuclear.LOGGER.debug("Reactor fluid input count: {}", this.inputFluidManager.size()); - - for (BlockPos pos : this.inputManager.getBlocksPosition()) { - CreateNuclear.LOGGER.debug("Registered reactor input position: {}", pos); - } - - for (BlockPos pos : this.inputManager.getBlocksPosition(level)) { - CreateNuclear.LOGGER.debug("Valid reactor input position: {}", pos); - } - - for (BlockPos pos : this.outputManager.getBlocksPosition()) { - CreateNuclear.LOGGER.debug("Registered reactor output position: {}", pos); - } - - for (BlockPos pos : this.outputManager.getBlocksPosition(level)) { - CreateNuclear.LOGGER.debug("Valid reactor output position: {}", pos); - } - - for (BlockPos pos : this.inputFluidManager.getBlocksPosition()) { - CreateNuclear.LOGGER.debug("Registered reactor fluid input position: {}", pos); - } - - for (BlockPos pos : this.inputFluidManager.getBlocksPosition(level)) { - CreateNuclear.LOGGER.debug("Valid reactor fluid input position: {}", pos); - } + public void logReactorConnections(Player player) { + ReactorDebugDiagnostics.sendReactorConnectionsTo(player, level, inputManager, inputFluidManager, outputManager, alarmManager); } private void updateReactorStateVisibility() { @@ -546,8 +314,8 @@ private void updateReactorStateVisibility() { boolean currentActive = state.getValue(ReactorControllerBlock.ACTIVE); - // Le réacteur est "ACTIVE" (ON) seulement s'il est assemblé ET qu'il a ses ressources - boolean targetActive = isAssembled() && isReadyToRun(); + // 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); @@ -557,113 +325,67 @@ private void updateReactorStateVisibility() { @Override public void tick() { super.tick(); - if (level.isClientSide || isExploding) + 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 = IHeat.HeatLevel.of(currentHeat) == IHeat.HeatLevel.DANGER; - - activateAlarms(isDanger); + boolean isDanger = alarmCoordinator.computeDanger(currentHeat, this.getMultiblockSize()); - currentHeat = isEmptyConfiguredPattern() ? 0 : (int) this.getConfiguredPatternTag().getDouble("heat"); + alarmCoordinator.update(level, alarmManager, isDanger); - // Récupération des configs pour l'utilitaire - int configRadius = CNConfigs.server().notify.distanceOfWarning.get(); - boolean configWarnAll = CNConfigs.server().notify.warnAllPlayers.get(); + IReactorMeltdownMonitor.MeltdownState meltdownState = meltdownMonitor.tick(level, getBlockPos(), isDanger); - if (isDanger) { - explosionCountdown++; - int secondsLeft = (300 - explosionCountdown) / 20; - - // --- AFFICHAGE ALERTES ACTION BAR (TRADUITES) --- - if (secondsLeft <= 10 && secondsLeft > 0) { - boolean isWhite = (level.getGameTime() / 5) % 2 == 0; - ChatFormatting flashColor = isWhite ? ChatFormatting.WHITE : ChatFormatting.RED; - - NotifyUtil.sendActionBar(level, getBlockPos(), - CreateNuclearLang.translate("notification.reactor.meltdown_in") - .add(CreateNuclearLang.number(secondsLeft)) - .add(CreateNuclearLang.translate("generic.unit.seconds")), - flashColor, configRadius, configWarnAll); - - } else if (secondsLeft > 10 && explosionCountdown % 20 == 0) { - NotifyUtil.sendActionBar(level, getBlockPos(), - CreateNuclearLang.translate("notification.reactor.overheating"), - ChatFormatting.DARK_RED, configRadius, configWarnAll); - } - - // --- MOMENT DE L'EXPLOSION --- - if (explosionCountdown >= 300) { - NotifyUtil.sendTitle(level, getBlockPos(), - CreateNuclearLang.translate("notification.reactor.critical_failure"), - CreateNuclearLang.translate("notification.reactor.imminent_explosion"), - ChatFormatting.DARK_RED, configRadius, configWarnAll, 0, 40, 10); - - triggerNuclearExplosion(); - return; - } - } else { - // --- CŒUR STABILISÉ --- - if (explosionCountdown > 0) { - NotifyUtil.sendActionBar(level, getBlockPos(), - CreateNuclearLang.translate("notification.reactor.stabilized"), - ChatFormatting.GREEN, configRadius, configWarnAll); + if (meltdownState == IReactorMeltdownMonitor.MeltdownState.EXPLODE) { + if (level instanceof ServerLevel serverLevel) { + this.meltdownExecutor.triggerExplosion(serverLevel, getBlockPos(), reactorSize, countFuelRod); } - explosionCountdown = 0; + isExploding = true; + return; } if (!isEmptyConfiguredPattern()) { int heat = (int) this.getConfiguredPatternTag().getDouble("heat"); - countGraphiteRod = this.getConfiguredPatternTag().getInt("countGraphiteRod"); - countUraniumRod = this.getConfiguredPatternTag().getInt("countUraniumRod"); + countCoolerRod = this.getConfiguredPatternTag().getInt("countCoolerRod"); + countFuelRod = this.getConfiguredPatternTag().getInt("countFuelRod"); + totalHeatRatio = ReactorHeatUpdateCoordinator.calculateActualTotalHeatRatio(configuredPattern, displayState, level); } resolveEntitiesIfNeeded(); - if (!isAssembled()) - return; - - // Populate display fields for client sync - clientDisplayItems.clear(); - List itemHandlers = this.inputManager.getItemHandlers(level); - for (IItemHandler h : itemHandlers) { - for (int s = 0; s < h.getSlots(); s++) { - ItemStack st = h.getStackInSlot(s); - if (!st.isEmpty()) { - clientDisplayItems.put(st.getItem(), - clientDisplayItems.getOrDefault(st.getItem(), 0) + st.getCount()); - } - } - } - - clientMaxFluidCapacity = 0; - List fhandlers = this.inputFluidManager.getFuildHandlers(level); - for (IFluidHandler h : fhandlers) { - if (h.getTanks() > 0) { - clientMaxFluidCapacity += h.getTankCapacity(0); - } - } - - VirtualReactorInputsItem virtualReactorInputsItem = inputManager.getInventory(level); - VirtualReactorInputFluid virtualReactorInputFluid = inputFluidManager.getInventory(level); - clientDisplayFluids = VirtualReactorInputFluid.toBigList(virtualReactorInputFluid.fluids()); - this.bigFuelItem = virtualReactorInputsItem.getBigFuelRod(); - this.bigCoolerItem = virtualReactorInputsItem.getBigCooledRod(); - this.bigFluidStack = VirtualReactorInputFluid.toBigList(virtualReactorInputFluid.fluids()); + ReactorInputSnapshot snapshot = ReactorInputSnapshotBuilder.build(level, inputManager, inputFluidManager); + this.displayState = new ReactorDisplayState(snapshot.items(), snapshot.fluids(), snapshot.maxFluidCapacity()); + this.bigFluidStack = snapshot.fluids(); updateReactorStateVisibility(); handleAssembledState(); } - private void activateAlarms(boolean activate) { - if (alarmManager == null) - return; - for (BlockPos pos : alarmManager.getBlocksPosition(level)) { - if (level.isLoaded(pos)) { - BlockState state = level.getBlockState(pos); - if (state.getBlock() instanceof ReactorAlarm && state.getValue(ReactorAlarm.POWERED) != activate) { - level.setBlock(pos, state.setValue(ReactorAlarm.POWERED, activate), 3); - if (activate) this.advancement.awardPlayer(CNAdvancement.SILENCE_THE_CORE); - } + /** + * 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); + + if (!active) { + if (runningSound != null) { + runningSound.stopSound(); + runningSound = null; } + return; + } + + if (runningSound == null || runningSound.isStopped()) { + runningSound = new ReactorRunningSoundInstance(level, worldPosition, CNSoundEvents.REACTOR_RUNNING.getMainEvent()); + Minecraft.getInstance().getSoundManager().play(runningSound); } } @@ -677,209 +399,38 @@ private void resolveEntitiesIfNeeded() { this.setChanged(); } + /** + * 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 (!isReadyToRun()) { - updateHeatOnly(); - if (!this.outputManager.getBlocksPosition().isEmpty()) - rotate(getBlockState(), getLevel(), 0); - this.setChanged(); - this.notifyUpdate(); - return; - } - // ready to run - this.setChanged(); - this.notifyUpdate(); - BigFluidStack fluidStack = bigFluidStack.isEmpty() ? null : bigFluidStack.get(0); - heat = (int) heatService.calculateHeat(bigFuelItem, bigCoolerItem, fluidStack, countGraphiteRod, - countUraniumRod, inventory, level); - this.getConfiguredPatternTag().putDouble("heat", heat); - - if (fluidStack != null) { - if (fluidStack.amount > 1) { - double amountPerCycle = (double) 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); - - boolean extracted = inputFluidManager.extractFluids(level, toExtract); - - if (extracted) { - fluidBuffer -= toExtract; - // this.liquidLife = calculateLiquidProgress(); - } - } + if (!heatCoordinator.canRun(configuredPattern, displayState, inputFluidManager, level, isAssembled())) { + heatCoordinator.updateHeatOnly(configuredPattern, displayState, currentFluidStack(), totalHeatRatio, inventory, level, isAssembled()); + if (!outputManager.getBlocksPosition(getLevel()).isEmpty()) { + outputManager.rotateOutputs(getLevel(), getAssembled(), 0); } - } - - if (cycleManager.isEmpty() && !isEmptyConfiguredPattern()) { - cycleManager.startCycle(configuredPattern, level); - } - if (!cycleManager.isEmpty()) { - if (level.getGameTime() % 20 == 0 - && cycleManager.hasPatternChanged(configuredPattern, level)) { - cycleManager.resetCycle(configuredPattern, level, inputManager); - } - cycleManager.tick(inputManager, level); - } - if (IHeat.HeatLevel.isNotDanger(heat)) { - // normal - if (!this.outputManager.getBlocksPosition().isEmpty()) { - rotate(getBlockState(), getLevel(), heat); - } - } /* - * else { - * EventTriggerPacket packet = new EventTriggerPacket(600); - * CreateNuclear.LOGGER.warn("hum EventTriggerBlock ? {}", packet); - * CNPackets.sendToNear(level, getBlockPos(), 32, packet); - * } - */ - } - - private void triggerNuclearExplosion() { - if (isExploding) + setChanged(); + notifyUpdate(); return; - isExploding = true; - - BlockPos explosionPos = getBlockPos().above(5); - int configRadius = CNConfigs.server().notify.distanceOfWarning.get(); - boolean configWarnAll = CNConfigs.server().notify.warnAllPlayers.get(); - - if (level instanceof ServerLevel serverLevel) { - // --- MESSAGE D'EXPLOSION FINALE (TRADUIT) --- - NotifyUtil.sendTitle(level, getBlockPos(), - CreateNuclearLang.translate("notification.reactor.destroyed"), - CreateNuclearLang.translate("notification.reactor.meltdown_finished"), - ChatFormatting.DARK_RED, configRadius, configWarnAll, 10, 60, 20); - - NuclearExplosionEntity explosion = new NuclearExplosionEntity( - CNEntityType.NUCLEAR_EXPLOSION.get(), - serverLevel); - - // --- CALCUL D'EXPLOSION ÉQUILIBRÉ --- - - // 1. On définit un modificateur de structure plus progressif - // Au lieu de 1, 2, 3, on utilise un ratio basé sur la taille réelle - float structureFactor = reactorSize / 5.0F; // 5x5 -> 1.0 | 7x7 -> 1.4 | 9x9 -> 1.8 - - /* - * 2. Utilisation de la racine carrée (Mth.sqrt) - * L'uranium augmente la puissance, mais avec des rendements décroissants. - * Plus on ajoute d'uranium, plus chaque barre supplémentaire ajoute "moins" au - * rayon. - */ - float fuelImpact = Mth.sqrt(countUraniumRod) * 0.3F; - - // 3. Taille finale : Base constante + (Impact Fuel * Facteur Structure) - float size = 1.5F + (fuelImpact * structureFactor); - - size = Mth.clamp(size, 1.0F, 10.0F); - - explosion.setPos(explosionPos.getX() + 0.5D, explosionPos.getY() + 10.0D, explosionPos.getZ() - 2.0D); - explosion.setSize(size); - - // Griefing selon les gamerules - boolean griefing = serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); - explosion.setNoGriefing(!griefing); - - serverLevel.addFreshEntity(explosion); - - // On détruit le bloc après avoir envoyé les messages - level.destroyBlock(getBlockPos(), false); - - // Changement de biome vers Irradiated Plain - changeBiome(CNBiomes.Irradiated.PLAIN, (int) size * 30, explosionPos, serverLevel); } - } - public void changeBiome(ResourceKey biomeResourceKey, int radius, BlockPos center, ServerLevel serverLevel) { - Registry biomeRegistry = serverLevel.registryAccess().registryOrThrow(Registries.BIOME); - Holder targetBiomeHolder = biomeRegistry.getHolderOrThrow(biomeResourceKey); + setChanged(); + notifyUpdate(); - // Vérification rapide du centre - Holder current = serverLevel.getBiome(center); - if (current.is(biomeResourceKey)) { - return; - } + BigFluidStack fluidStack = currentFluidStack(); + heat = heatCoordinator.calculateAndWriteHeat(configuredPattern, fluidStack, totalHeatRatio, inventory, level, displayState); + fluidBuffer = fluidRateCalculator.tick(fluidStack, reactorSize, level, inputFluidManager, fluidBuffer); + cycleManager.update(configuredPattern, level, inputManager, level.getGameTime() % 20 == 0); - // Définition de la zone de recherche (Bounding Box carrée qui contient le - // cercle) - int minX = center.getX() - radius; - int maxX = center.getX() + radius; - int minZ = center.getZ() - radius; - int maxZ = center.getZ() + radius; - - double radiusSq = (double) radius * radius; - ArrayList chunks = new ArrayList<>(); - - // On parcourt les chunks impactés - 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) { - // On utilise un resolver personnalisé qui vérifie la distance - chunkAccess.fillBiomesFromNoise( - createCircularResolver(targetBiomeHolder, center, radiusSq, serverLevel), - serverLevel.getChunkSource().randomState().sampler()); - chunkAccess.setUnsaved(true); - chunks.add(chunkAccess); - } + if (IHeat.HeatLevel.isNotDanger(heat, getMultiblockSize()) && !outputManager.getBlocksPosition(level).isEmpty()) { + if (Math.abs(heat - lastAppliedOutputHeat) >= ReactorOutputManager.RPM_DIVIDER / 2) { + lastAppliedOutputHeat = heat; } - } - - // Notification aux clients - serverLevel.getChunkSource().chunkMap.resendBiomesForChunks(chunks); - } - - // Le resolver magique pour la forme circulaire - private BiomeResolver createCircularResolver(Holder targetBiome, BlockPos center, double radiusSq, - ServerLevel level) { - return (x, y, z, noise) -> { - // x, y, z ici sont en "biome coordinates" (1 unité = 4 blocs) - // On les multiplie par 4 pour revenir à une échelle de blocs - int blockX = x << 2; - int blockZ = z << 2; - - double distX = blockX - center.getX(); - double distZ = blockZ - center.getZ(); - - // Equation du cercle : x² + z² <= r² - if ((distX * distX) + (distZ * distZ) <= radiusSq) { - return targetBiome; - } - - // Si hors du cercle, on garde le biome d'origine (ou on laisse le bruit faire) - // Note : Ici on demande au niveau le biome actuel à cette position - return level.getBiome(new BlockPos(blockX, y << 2, blockZ)); - }; - } - - private boolean isReadyToRun() { - return !isEmptyConfiguredPattern() - && bigFuelItem.count > 0 - && bigCoolerItem.count > 0 - && this.inputManager.size() > 0 - && this.inputFluidManager.size() > 0; - } - - private void updateHeatOnly() { - // Guard against empty fluid list — HeatManager accepts null for empty/no-fluid - // case - BigItemStack fuel = bigFuelItem; - BigItemStack cooler = bigCoolerItem; - BigFluidStack fluid = bigFluidStack.isEmpty() ? null : bigFluidStack.get(0); - double heat = 0; - - if (!isEmptyConfiguredPattern()) { - heat = heatService.calculateHeat(fuel, cooler, fluid, countGraphiteRod, countUraniumRod, inventory, level); - this.getConfiguredPatternTag().putDouble("heat", heat); + outputManager.rotateOutputs(getLevel(), getAssembled(), lastAppliedOutputHeat); } } @@ -887,140 +438,6 @@ private boolean isEmptyConfiguredPattern() { return configuredPattern.isEmpty() || this.getConfiguredPatternTag().isEmpty(); } - private boolean updateLiquidTimers() { - liquidLife -= 1; - return liquidLife <= 0; - } - - @Deprecated - private BlockPos getBlockPosForReactor(char character) { - BlockPos pos = pattern.VerifyPattern5x5(character); - BlockPos posController = getBlockPos(); - BlockPos posInput = new BlockPos(posController.getX(), posController.getY(), posController.getZ()); - - int[][] directions = { - { 0, 0, pos.getX() }, // NORTH - { 0, 0, -pos.getX() }, // SOUTH - { -pos.getX(), 0, 0 }, // EAST - { pos.getX(), 0, 0 } // WEST - }; - - 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; - } - } - - return posInput; - } - - public void rotate(BlockState state, Level level, int rotation) { - if (this.outputManager.getBlocksPosition().isEmpty()) - return; - int remainingRotation = rotation % this.outputManager.getBlocksPosition().size(); - for (int i = 0; i < this.outputManager.getBlocksPosition().size(); i++) { - int dividedRotation = (rotation / this.outputManager.getBlocksPosition().size()) - + (i < remainingRotation ? 1 : 0); - BlockPos pos = this.outputManager.getBlocksPosition().get(i); - - if (dividedRotation > 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 = dividedRotation; - entity.heat = dividedRotation; - } else { // stopping the energy - entity.speed = 0; - entity.heat = 0; - } - entity.updateSpeed = true; - entity.setSpeedAndUpdate(dividedRotation); - entity.updateGeneratedRotation(); - - } - } else { - if (level.getBlockState(pos).getBlock() instanceof ReactorOutput block) { - ReactorOutputEntity entity = block.getBlockEntityType().getBlockEntity(level, pos); - entity.setSpeedAndUpdate(0); - entity.heat = 0; - entity.updateSpeed = true; - entity.updateGeneratedRotation(); - } - } - } - } - - @Deprecated - public int[] getStructureBounds(BlockPos startPos, int structureSize, String facing) { - int[] northOffsets5x5 = new int[] { -2, 2, -3, 3, 0, 4 }; - int[] northOffsets7x7 = new int[] { -3, 3, -4, 4, 0, 6 }; - int[] northOffsets9x9 = new int[] { -4, 4, -5, 5, 0, 8 }; - - int[] eastOffsets5x5 = new int[] { -4, 0, -3, 3, -2, 2 }; - int[] eastOffsets7x7 = new int[] { -6, 0, -4, 4, -3, 3 }; - int[] eastOffsets9x9 = new int[] { -8, 0, -5, 5, -4, 4 }; - - int[] southOffsets5x5 = new int[] { -2, 2, -3, 3, -4, 0 }; - int[] southOffsets7x7 = new int[] { -3, 3, -4, 4, -6, 0 }; - int[] southOffsets9x9 = new int[] { -4, 4, -5, 5, -8, 0 }; - - int[] westOffsets5x5 = new int[] { 0, 4, -3, 3, -2, 2 }; - int[] westOffsets7x7 = new int[] { 0, 6, -4, 4, -3, 3 }; - int[] westOffsets9x9 = new int[] { 0, 8, -5, 5, -4, 4 }; - - switch (facing) { - case "north": - switch (structureSize) { - case 5: - return applyOffset(startPos, northOffsets5x5); - case 7: - return applyOffset(startPos, northOffsets7x7); - case 9: - return applyOffset(startPos, northOffsets9x9); - } - case "east": - switch (structureSize) { - case 5: - return applyOffset(startPos, eastOffsets5x5); - case 7: - return applyOffset(startPos, eastOffsets7x7); - case 9: - return applyOffset(startPos, eastOffsets9x9); - } - case "south": - switch (structureSize) { - case 5: - return applyOffset(startPos, southOffsets5x5); - case 7: - return applyOffset(startPos, southOffsets7x7); - case 9: - return applyOffset(startPos, southOffsets9x9); - } - case "west": - switch (structureSize) { - case 5: - return applyOffset(startPos, westOffsets5x5); - case 7: - return applyOffset(startPos, westOffsets7x7); - case 9: - return applyOffset(startPos, westOffsets9x9); - } - default: - return new int[] { 0, 0, 0, 0, 0, 0 }; - } - } - - @Deprecated - private int[] applyOffset(BlockPos pos, int[] offset) { - int x = pos.getX(); - int y = pos.getY(); - int z = pos.getZ(); - - return new int[] { x + offset[0], x + offset[1], y + offset[2], y + offset[3], z + offset[4], z + offset[5] }; - } - public void addInput(BlockPos inputPos) { this.inputManager.addBlock(inputPos); this.setChanged(); @@ -1049,6 +466,10 @@ public void addInputFluid(BlockPos outputPos) { 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) { @@ -1062,75 +483,50 @@ public void removeAlarm(BlockPos alarmPos) { } public void removeIOAll() { - this.inputManager.clearInvalid(level); - this.outputManager.clearInvalid(level); - this.inputFluidManager.clearInvalid(level); - this.alarmManager.clearInvalid(level); + 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) { - // server-persistent approach (preferred): use PersistentFluidLocks when on - // server - if (level != null && !level.isClientSide && level instanceof ServerLevel serverLevel) { + // 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); } - // fallback to in-memory manager (single-server-run) - return FluidLockManager.tryLock(getBlockPos(), fluid); + return true; } /** Returns whether the given FluidStack is acceptable for this controller. */ public boolean canAcceptFluid(FluidStack stack) { if (stack == null || stack.isEmpty()) return true; - if (level != null && !level.isClientSide && level instanceof ServerLevel serverLevel) { + if (level instanceof ServerLevel serverLevel) { return PersistentFluidLocks.get(serverLevel).canAccept(getBlockPos(), stack.getFluid()); } - return FluidLockManager.canAccept(getBlockPos(), stack); + return true; } /** Force-clear the lock on this controller. */ public void clearLock() { - if (level != null && !level.isClientSide && level instanceof ServerLevel serverLevel) { + if (level instanceof ServerLevel serverLevel) { PersistentFluidLocks.get(serverLevel).clearLock(getBlockPos()); - } else { - FluidLockManager.clearLock(getBlockPos()); + setChanged(); + sendData(); } - setChanged(); - sendData(); } public void clearLockIfAllInputsEmpty() { if (level == null || level.isClientSide) return; - final int SCAN_RADIUS = CNMultiblock.REGISTRATE_MULTIBLOCK.findStructure(level, getBlockPos(), this).data() - .getSize(); // adapte selon la taille max du multiblock - BlockPos center = getBlockPos(); - boolean anyNonEmpty = false; - - for (int dx = -SCAN_RADIUS; dx <= SCAN_RADIUS && !anyNonEmpty; dx++) { - for (int dy = -SCAN_RADIUS; dy <= SCAN_RADIUS && !anyNonEmpty; dy++) { - for (int dz = -SCAN_RADIUS; dz <= SCAN_RADIUS && !anyNonEmpty; dz++) { - BlockPos p = center.offset(dx, dy, dz); - BlockEntity be = level.getBlockEntity(p); - if (!(be instanceof ReactorFluidInputEntity)) - continue; - - IFluidHandler handler = be.getCapability(ForgeCapabilities.FLUID_HANDLER).orElse(null); - if (handler == null) - continue; - - for (int t = 0; t < handler.getTanks(); t++) { - if (!handler.getFluidInTank(t).isEmpty()) { - anyNonEmpty = true; - break; - } - } - } - } - } + 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(); 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 389ab93b5..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 @@ -5,7 +5,6 @@ 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.BlockModelBuilder; import net.minecraftforge.client.model.generators.ModelFile; public class ReactorControllerGenerator extends SpecialBlockStateGen { 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/ConsumptionCycleManager.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/ConsumptionCycleManager.java index 632b22ae4..7a93ea7ef 100644 --- 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 @@ -135,4 +135,27 @@ private Map readItemIds(ItemStack pattern, Level level) { }); 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/ItemConsumable.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/consumable/ItemConsumable.java index 8e5d77748..556b554f7 100644 --- 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 @@ -21,7 +21,7 @@ public String getId() { @Override public int computeTimer(int count) { - int base = Math.max(1, rodType.rodTimer()); + int base = Math.max(1, rodType.rodTimer().get()); return Math.max(1, (int) (base / Math.max(1, count))); } 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/ReactorAlarmManager.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorAlarmManager.java index 0c8a679f2..7176af62b 100644 --- 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 @@ -6,7 +6,6 @@ import net.minecraft.nbt.Tag; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; -import net.nuclearteam.createnuclear.CNBlocks; import net.nuclearteam.createnuclear.content.multiblock.alarm.ReactorAlarmEntity; import java.util.ArrayList; @@ -45,10 +44,10 @@ public void clearInvalid(Level level) { List toRemove = new ArrayList<>(); for (BlockPos p : positions) { - if (!level.isLoaded(p)) continue; // On ne supprime pas si le chunk est juste déchargé + if (!level.isLoaded(p)) continue; // Don't remove the position if the chunk is merely unloaded BlockEntity be = level.getBlockEntity(p); - // Si le bloc n'existe plus ou n'est plus une alarme, on marque pour suppression + // Mark for removal if the block no longer exists or is no longer an alarm if (be == null || !(be instanceof ReactorAlarmEntity)) { toRemove.add(p); } @@ -62,7 +61,7 @@ public List getBlocksPosition(Level level) { List validPositions = new ArrayList<>(); for (BlockPos p : this.positions) { - // On vérifie que l'entité est bien chargée et du bon type + // Check that the block entity is loaded and of the expected type if (level.isLoaded(p) && level.getBlockEntity(p) instanceof ReactorAlarmEntity) { validPositions.add(p); } 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 index 64af42bd3..cdd538cd4 100644 --- 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 @@ -5,7 +5,8 @@ import java.util.List; public interface ReactorAlarmManagerI extends ReactorIOManager { - /** * Retourne une copie immuable des positions d'alarmes valides dans le monde actuel. + /** + * 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/ReactorInputFluidManager.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/manager/ReactorInputFluidManager.java index e36b4af63..313aa047b 100644 --- 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 @@ -11,7 +11,6 @@ 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.CreateNuclear; import net.nuclearteam.createnuclear.content.multiblock.input.fluid.VirtualReactorInputFluid; import net.nuclearteam.createnuclear.content.multiblock.input.fluid.ReactorFluidInputEntity; @@ -92,7 +91,6 @@ public List getBlocksPosition(Level level) { List positions = new ArrayList<>(); for (BlockPos p : this.getBlocksPosition()) { - CreateNuclear.LOGGER.warn("getBlocksPosition: {} {}", level.getBlockEntity(p), level.getBlockEntity(p) instanceof ReactorFluidInputEntity); if (level.getBlockEntity(p) instanceof ReactorFluidInputEntity) positions.add(p); } return List.copyOf(positions); @@ -122,11 +120,10 @@ public List getFuildHandlers(Level level) { public VirtualReactorInputFluid getInventory(Level level) { VirtualReactorInputFluid virtualReactorInputFluid = new VirtualReactorInputFluid(); List handlers = this.getFuildHandlers(level); - if (handlers.isEmpty()) return new VirtualReactorInputFluid(); + if (handlers.isEmpty()) return virtualReactorInputFluid; for (IFluidHandler h : handlers) { - int tank = h.getTanks(); - virtualReactorInputFluid.addFluid(h.getFluidInTank(tank)); + virtualReactorInputFluid.addFluid(h.getFluidInTank(0)); } return virtualReactorInputFluid; @@ -144,8 +141,7 @@ public boolean extractFluids(Level level, int fluidNeeded) { if (handlers.isEmpty()) return false; for (IFluidHandler handler : handlers) { - int tank = handler.getTanks(); - FluidStack stack = handler.getFluidInTank(tank); + FluidStack stack = handler.getFluidInTank(0); if (stack.isEmpty()) continue; int toExtract = Math.min(fluidNeeded, stack.getAmount()); if (toExtract > 1) { 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 index 7610f0da2..e809ae2df 100644 --- 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 @@ -7,12 +7,12 @@ 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 { - /** - * Interface for managing reactor input fluids. - * Implementations track input fluid sources and provide - * accessors and extraction methods for reactor consumption. - */ /** Returns an immutable copy of tracked positions. */ List getBlocksPosition(Level level); 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 index 77b688998..01a18c184 100644 --- 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 @@ -11,11 +11,10 @@ import net.minecraftforge.common.capabilities.ForgeCapabilities; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.IItemHandler; -import net.nuclearteam.createnuclear.CNTags; -import net.nuclearteam.createnuclear.CNTags.CNItemTags; +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.ReactorInputEntity; +import net.nuclearteam.createnuclear.content.multiblock.input.item.ReactorRodInputEntity; import java.util.ArrayList; import java.util.List; @@ -83,8 +82,8 @@ public VirtualReactorInputsItem getInventory(Level level) { for (int s = 0; s < slots; s++) { ItemStack st = h.getStackInSlot(s); - if (TypeRodPredicate.IS_FUEL.test(st)) totalFuel += st.getCount(); - else if (TypeRodPredicate.IS_COOLED.test(st)) totalCooler += st.getCount(); + if (TypeRodPredicate.isFuel(st, level)) totalFuel += st.getCount(); + else if (TypeRodPredicate.isCooled(st, level)) totalCooler += st.getCount(); } } @@ -107,11 +106,11 @@ public boolean extractItems(Level level, int fuelNeeded, int coolerNeeded) { if (stack.isEmpty()) continue; - if (fuelRemaining > 0 && TypeRodPredicate.IS_FUEL.test(stack)) { + 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.IS_COOLED.test(stack)) { + } else if (coolerRemaining > 0 && TypeRodPredicate.isCooled(stack, level)) { int toExtract = Math.min(coolerRemaining, stack.getCount()); handler.extractItem(s, toExtract, false); coolerRemaining -= toExtract; @@ -135,15 +134,15 @@ public boolean extractItemByName(Level level, String itemName) { ItemStack stack = handler.getStackInSlot(s); if (stack.isEmpty()) continue; - // On récupère le nom de l'item (ex: "uranium_rod") - String registryPath = net.minecraftforge.registries.ForgeRegistries.ITEMS.getKey(stack.getItem()).getPath(); + // Resolve the item's registry name (e.g. "uranium_rod") + String registryPath = ForgeRegistries.ITEMS.getKey(stack.getItem()).getPath(); - // Comparaison intelligente : on ignore la casse et les underscores (_) + // Lenient comparison: ignores case and underscores (_) if (isMatching(registryPath, itemName)) { - // On tente d'extraire 1 unité + // Attempt to extract 1 unit ItemStack extracted = handler.extractItem(s, 1, false); - // Si l'extraction a réussi, on s'arrête là et on renvoie true + // If extraction succeeded, stop here and return true if (!extracted.isEmpty()) { return true; } @@ -151,11 +150,12 @@ public boolean extractItemByName(Level level, String itemName) { } } - return false; // On n'a pas trouvé l'item demandé + return false; // The requested item was not found } /** - * Helper pour comparer "GraphiteRod" avec "graphite_rod" + * 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(); @@ -188,7 +188,7 @@ public List getBlocksPosition(Level level) { List positions = new ArrayList<>(); for (BlockPos p : this.getBlocksPosition()) { - if (level.getBlockEntity(p) instanceof ReactorInputEntity) positions.add(p); + 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 index 9e3477afd..08e81a86a 100644 --- 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 @@ -9,7 +9,7 @@ /** * Interface exposing operations specific to reactor inputs. - * Currently provides access to `IItemHandler` instances at resolved input positions. + * Currently, provides access to `IItemHandler` instances at resolved input positions. */ public interface ReactorInputManagerI extends ReactorIOManager { /** 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 index 34e9f032e..cb6616a54 100644 --- 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 @@ -5,19 +5,19 @@ 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; -import java.util.function.BiFunction; /** * Manager for a reactor's outputs (`ReactorOutput`). - * Handles serialization of output positions and distribution - * of energy via `distributeSU`. + * 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) { @@ -42,79 +42,10 @@ public void read(CompoundTag compound) { } /** - * Example usage: - * double totalSUToDistribute = this.reactorPower; // or another value depending on logic - * if (!reactorOutputEntityList.isEmpty() && totalSUToDistribute > 0) { - * double remaining = outputManager.distributeSU(totalSUToDistribute, reactorOutputEntityList, (outEntity, amount) -> { - * // Inserter: apply `amount` to the output and return the amount not accepted. - * // Here we accept everything and apply the corresponding speed (rounded) - * int speed = (int) Math.round(amount); - * try { - * outEntity.setSpeed(speed); - * outEntity.heat = speed; // adjust heat if needed - * outEntity.updateSpeed = true; - * outEntity.updateGeneratedRotation(); - * return 0.0; // all accepted - * } catch (Exception e) { - * return amount; // nothing accepted on error - * } - * }); - * // `remaining` contains the SU that couldn't be inserted — you can store or drop it - * this.reactorPower = (float) remaining; // example: keep the remainder - * } - * @param totalSU total SU to distribute - * @param level world level (may be null) - * @param inserter function that applies an amount to an output and returns not accepted amount - * @return amount of SU not inserted + * {@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}. */ - public double distributeSU(double totalSU, Level level, BiFunction inserter) { - if (totalSU <= 0 || inserter == null) return totalSU; - List validOutputs = new ArrayList<>(); - for (BlockPos p : new ArrayList<>(positions)) { - if (level == null || !level.isLoaded(p)) continue; - BlockEntity be = level.getBlockEntity(p); - if (be instanceof ReactorOutputEntity out) validOutputs.add(out); - } - if (validOutputs.isEmpty()) return totalSU; - - double remaining = totalSU; - List active = new ArrayList<>(validOutputs); - final double MIN_ACCEPTED_SU = 1e-6; - - // Distribute evenly and reallocate the remainder among outputs still able to accept - boolean progress = true; - while (remaining > MIN_ACCEPTED_SU && !active.isEmpty() && progress) { - progress = false; - double share = remaining / active.size(); - List stillActive = new ArrayList<>(); - - for (ReactorOutputEntity out : active) { - double toInsert = share; - double notAccepted; - try { - notAccepted = inserter.apply(out, toInsert); - } catch (Exception e) { - notAccepted = toInsert; - } - if (Double.isNaN(notAccepted) || notAccepted < 0) notAccepted = 0; - if (notAccepted > toInsert) notAccepted = toInsert; - double inserted = toInsert - notAccepted; - - if (inserted > MIN_ACCEPTED_SU) { - progress = true; - remaining -= inserted; - // keep this output active; it may accept more in the next round - stillActive.add(out); - } - // if inserted == 0, remove it (do not attempt to send more) - } - - active = stillActive; - } - - return remaining; - } - @Override public void clearInvalid(Level level) { List toRemove = new ArrayList<>(); @@ -129,6 +60,11 @@ public void clearInvalid(Level level) { 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<>(); @@ -138,4 +74,41 @@ public List getBlocksPosition(Level level) { } 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 index 45ef40a2f..ddc8b4b58 100644 --- 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 @@ -2,26 +2,19 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; -import net.nuclearteam.createnuclear.content.multiblock.output.ReactorOutputEntity; import java.util.List; -import java.util.function.BiFunction; /** * Interface exposing operations specific to reactor outputs. - * The main responsibility is to distribute an amount of energy (SU) - * among valid outputs and use an `inserter` to apply quantities to each - * `ReactorOutputEntity`. */ public interface ReactorOutputManagerI extends ReactorIOManager { - /** - * Distributes `totalSU` among valid outputs in `level`. - * The `inserter` receives the target entity and the proposed amount and - * must return the amount not accepted (>= 0). - * Returns the remaining amount that was not inserted. - */ - double distributeSU(double totalSU, Level level, BiFunction inserter); - /** 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 index 2ec52ed73..28498b297 100644 --- 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 @@ -1,10 +1,9 @@ package net.nuclearteam.createnuclear.content.multiblock.controller.service; -import com.simibubi.create.content.logistics.BigItemStack; 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; import net.nuclearteam.createnuclear.content.multiblock.reactorLogic.HeatManager; public class DefaultHeatService implements IHeatService { @@ -14,23 +13,13 @@ public DefaultHeatService(HeatManager impl) { this.impl = impl; } - @Override - public int getGraphiteTimer() { - return impl.getGraphiteTimer(); - } - - @Override - public int getUraniumTimer() { - return impl.getUraniumTimer(); - } - @Override public int getLiquidTimer() { return impl.getLiquidTimer(); } @Override - public double calculateHeat(BigItemStack fuel, BigItemStack cooler, BigFluidStack bigFluidStack, int graphiteCount, int uraniumCount, ReactorControllerInventory inventory, Level level) { - return impl.calculateHeat(fuel, cooler, bigFluidStack, graphiteCount, uraniumCount, inventory, level); + public double calculateHeat(BigFluidStack bigFluidStack, int totalHeatRatio, ReactorControllerInventory inventory, Level level, ReactorDisplayState displayState) { + return impl.calculateHeat(bigFluidStack, totalHeatRatio, 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 index 30a4611c7..0e0ddd074 100644 --- 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 @@ -1,41 +1,50 @@ package net.nuclearteam.createnuclear.content.multiblock.controller.service; -import com.simibubi.create.content.logistics.BigItemStack; +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(compound.getString("reactorFacing")); - owner.setMultiblockStructure(compound.getIntArray("reactorPose")); - owner.setLiquidLife(compound.getDouble("liquidLife")); + 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"))); - owner.setBigFuelItem(BigItemStack.read(compound.getCompound("bigFuel"))); - owner.setBigCoolerItem(BigItemStack.read(compound.getCompound("bigCooler"))); } @Override public void writeBasicState(ReactorControllerBlockEntity owner, CompoundTag compound, boolean clientPacket) { compound.putInt("reactorSize", owner.getMultiblockSize()); - compound.putString("reactorFacing", owner.getMultiblockFacing()); + compound.putString("reactorFacing", owner.getMultiblockFacing() != null ? owner.getMultiblockFacing().getSerializedName() : ""); if (owner.getMultiblockPos() != null) { - compound.putIntArray("reactorPose", owner.getMultiblockPos()); + 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()); - compound.put("bigFuel", owner.getBigFuelItem().write()); - compound.put("bigCooler", owner.getBigCoolerItem().write()); } } 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..c0120ab95 --- /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.distanceOfWarning.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 index e03f657ba..744786415 100644 --- 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 @@ -1,18 +1,12 @@ package net.nuclearteam.createnuclear.content.multiblock.controller.service; -import com.simibubi.create.content.logistics.BigItemStack; 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 IHeatService { - int getGraphiteTimer(); - - int getUraniumTimer(); - int getLiquidTimer(); - double calculateHeat(BigItemStack fuel, BigItemStack cooler, BigFluidStack bigFluidStack, int graphiteCount, - int uraniumCount, ReactorControllerInventory inventory, Level level); + double calculateHeat(BigFluidStack bigFluidStack, int totalHeatRatio, ReactorControllerInventory inventory, Level level, ReactorDisplayState displayState); } 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..90a3c3e18 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/IReactorHeatUpdateCoordinator.java @@ -0,0 +1,44 @@ +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; + +/** + * Centralizes the reactor's heat calculation logic and the decision of + * whether it has enough fuel to run. + */ +public interface IReactorHeatUpdateCoordinator { + + /** + * Determines whether the reactor has enough fuel (FUEL-type rods) to start, + * on top of being assembled and having a fluid input. + * + * @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. + * + * @return the calculated heat, also written to the configured pattern's tag + */ + int updateHeatOnly(ItemStack configuredPattern, ReactorDisplayState displayState, BigFluidStack fluidStack, + int totalHeatRatio, ReactorControllerInventory inventory, Level level, boolean assembled); + + /** + * Calculates the reactor's heat during normal operation and writes it to + * the configured pattern's tag. + * + * @return the calculated heat + */ + int calculateAndWriteHeat(ItemStack configuredPattern, BigFluidStack fluidStack, int totalHeatRatio, + 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..2734d264b --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/controller/service/ReactorHeatUpdateCoordinator.java @@ -0,0 +1,125 @@ +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 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; + } + + public static int calculateActualTotalHeatRatio(ItemStack configuredPattern, ReactorDisplayState displayState, Level level) { + Map patternCounts = PatternReader.readItemCounts(configuredPattern); + Map currentItems = displayState != null && displayState.items() != null + ? displayState.items() : Collections.emptyMap(); + + int totalHeatRatio = 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) { + RodType rodType = RodType.resolveRodType(item, level); + if (rodType != null && rodType.isNotEmptyItem()) { + totalHeatRatio += rodType.heatRatio().get() * countToUse; + } + } + } + return totalHeatRatio; + } + + /** 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, + int totalHeatRatio, 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, totalHeatRatio, inventory, level, displayState); + } + } + configuredPattern.getOrCreateTag().putDouble("heat", heat); + return heat; + } + + @Override + public int calculateAndWriteHeat(ItemStack configuredPattern, BigFluidStack fluidStack, int totalHeatRatio, + ReactorControllerInventory inventory, Level level, ReactorDisplayState displayState) { + int heat = (int) heatService.calculateHeat(fluidStack, totalHeatRatio, 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..43e1377ef --- /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.distanceOfWarning.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 index 44c711c3d..3cdb4cca9 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/cooler/ReactorCooler.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/cooler/ReactorCooler.java @@ -9,6 +9,7 @@ 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; @@ -30,13 +31,7 @@ public void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldS @Override public void setPlacedBy(Level level, BlockPos pos, BlockState state, @Nullable LivingEntity pPlacer, ItemStack stack) { super.setPlacedBy(level, pos, state, pPlacer, stack); - CNAdvancementBehaviour.setPlacedBy(level, pos, pPlacer); - } - - @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); - pattern.findController(pos, level, false); + MultiblockHelpers.handleAdvancedPlacedBy(pos, level, pPlacer); } @Override 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 index 5ea4727f5..1f9e6a659 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/fluid/CNReactorFluidTypes.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/fluid/CNReactorFluidTypes.java @@ -7,11 +7,10 @@ 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 { - public static final ResourceKey FALLBACK = ResourceKey.create(CreateNuclearRegistries.FLUID_TYPE, CreateNuclear.asResource("fallback")); - /** * Static registry of reactor fluid types ({@link ReactorFluidType}) for the CreateNuclear mod. * 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 df7810018..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 @@ -21,6 +21,7 @@ import net.minecraft.world.level.block.state.properties.EnumProperty; import net.minecraft.world.level.block.state.properties.Property; 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; @@ -115,21 +116,15 @@ public void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldS @Override public void setPlacedBy(Level level, BlockPos pos, BlockState state, @javax.annotation.Nullable LivingEntity pPlacer, ItemStack stack) { super.setPlacedBy(level, pos, state, pPlacer, stack); - CNAdvancementBehaviour.setPlacedBy(level, pos, pPlacer); - } - - @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); - pattern.findController(pos, level, false); + 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); - // playerDestroy n'est PAS appelé en créatif : on doit aussi réévaluer ici. - // On ne réagit qu'à une vraie suppression/remplacement du bloc (type différent), - // pas à un simple changement de la propriété PART (même bloc, via setBlock). + // 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); } 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 index 0276d5803..3353281f9 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/frame/ReactorFrameRenderer.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/frame/ReactorFrameRenderer.java @@ -7,6 +7,7 @@ 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. @@ -30,7 +31,9 @@ protected void renderSafe(ReactorFrameEntity be, float partialTicks, PoseStack m ReactorControllerBlockEntity controller = be.getControllerEntity(); if (controller == null) return; - FluidStack fluid = controller.getDisplayedFluid(); + 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 @@ -51,10 +54,10 @@ protected void renderSafe(ReactorFrameEntity be, float partialTicks, PoseStack m // 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 (controller.hasFrameColumn()) { - float ratio = controller.getDisplayedFluidFillRatio(); - double liquidBottomWorldY = controller.getFrameColumnMinY() + 4.0 / 16.0; - double liquidTopWorldY = controller.getFrameColumnMaxY() + 9.0 / 16.0; + 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 diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/FluidLockManager.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/FluidLockManager.java deleted file mode 100644 index 763b8e614..000000000 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/FluidLockManager.java +++ /dev/null @@ -1,38 +0,0 @@ -package net.nuclearteam.createnuclear.content.multiblock.input.fluid; - -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.material.Fluid; -import net.minecraftforge.fluids.FluidStack; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * In-memory manager for ephemeral fluid locks on multiblock controllers. - * This class provides simple concurrent lock semantics to ensure a controller - * accepts only a single fluid type while a lock is held. - */ -public class FluidLockManager { - private static final Map locks = new ConcurrentHashMap<>(); - - public static boolean tryLock(BlockPos controllerPos, Fluid fluid) { - if (fluid == null) return true; - // Attempt to set the lock to the specified fluid if none exists - return locks.compute(controllerPos, (k,v) -> v == null ? fluid : v) == fluid; - } - - public static boolean canAccept(BlockPos controllerPos, FluidStack stack) { - if (stack == null || stack.isEmpty()) return true; - // True if no fluid locked or the locked fluid matches the stack - Fluid locked = locks.get(controllerPos); - return locked == null || locked == stack.getFluid(); - } - - public static void clearLock(BlockPos controller) { - locks.remove(controller); - } - - public static Fluid getLockedFluid(BlockPos controller) { - return locks.get(controller); - } -} diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/PlayerInteracteReactorFluidInput.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/PlayerInteractReactorFluidInput.java similarity index 70% rename from src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/PlayerInteracteReactorFluidInput.java rename to src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/PlayerInteractReactorFluidInput.java index 1887c5e03..bcc02e744 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/PlayerInteracteReactorFluidInput.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/PlayerInteractReactorFluidInput.java @@ -25,7 +25,7 @@ import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.IFluidHandler; -public class PlayerInteracteReactorFluidInput { +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); @@ -53,23 +53,12 @@ public static InteractionResult interact(Level level, BlockPos pos, Player playe .orElse(FluidStack.EMPTY); if (exchange == FluidExchange.ITEM_TO_TANK) { - if (player.isCreative() && !onClient) { - FluidStack fluidInItem = GenericItemEmptying.emptyItem(level, stack, true).getFirst(); -// if (!fluidInItem.isEmpty() && fluidInInput instanceof ReactorLiquidInput) { -// fluidInInput.set -// } - } - Fluid fluid = fluidInInput.getFluid(); fluidState = fluid.defaultFluidState().createLegacyBlock(); soundEvent = FluidHelper.getEmptySound(fluidInInput); } if (exchange == FluidExchange.TANK_TO_ITEM) { - if ( player.isCreative() && !onClient) { - - } - Fluid fluid = prevFluidInInput.getFluid(); fluidState = fluid.defaultFluidState().createLegacyBlock(); soundEvent = FluidHelper.getFillSound(prevFluidInInput); @@ -85,28 +74,26 @@ public static InteractionResult interact(Level level, BlockPos pos, Player playe } if (!fluidInInput.isFluidStackIdentical(prevFluidInInput)) { - if (be instanceof ReactorFluidInputEntity) { - 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; - } + 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/ReactorLiquidInput.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/ReactorFluidInput.java similarity index 80% rename from src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/ReactorLiquidInput.java rename to src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/ReactorFluidInput.java index 65592e0ab..6c406f764 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/ReactorLiquidInput.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/ReactorFluidInput.java @@ -13,7 +13,6 @@ 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; @@ -25,15 +24,14 @@ 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.advancement.CNAdvancementBehaviour; import net.nuclearteam.createnuclear.foundation.block.MultiDirectionalReactorBlock; import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; -public class ReactorLiquidInput extends MultiDirectionalReactorBlock implements IWrenchable, IBE { +public class ReactorFluidInput extends MultiDirectionalReactorBlock implements IWrenchable, IBE { - public ReactorLiquidInput(Properties properties) { + public ReactorFluidInput(Properties properties) { super(properties); } @@ -46,7 +44,7 @@ public void onPlace(BlockState state, Level world, BlockPos pos, BlockState oldS @Override public void setPlacedBy(Level level, BlockPos pos, BlockState state, @Nullable LivingEntity pPlacer, ItemStack stack) { super.setPlacedBy(level, pos, state, pPlacer, stack); - CNAdvancementBehaviour.setPlacedBy(level, pos, pPlacer); + MultiblockHelpers.handleAdvancedPlacedBy(pos, level, pPlacer); } @Override @@ -73,7 +71,7 @@ public BlockState getStateForPlacement(BlockPlaceContext context) { @Override public @NotNull VoxelShape getShape(BlockState state, BlockGetter worldIn, BlockPos pos, CollisionContext context) { - return CNShapes.REACTOR_LIQUID_INPUT.get(state.getValue(FACING)); + return CNShapes.REACTOR_FLUID_INPUT.get(state.getValue(FACING)); } @Override @@ -87,13 +85,7 @@ public InteractionResult use(BlockState state, Level world, BlockPos pos, Player if (!player.isCreative()) return InteractionResult.PASS; - return PlayerInteracteReactorFluidInput.interact(world, pos, player, hand, heldItem, onClient, ray); - } - - @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); - MultiblockHelpers.handleRemoval(pos, level, ReactorControllerBlockEntity::removeInputFluid); + return PlayerInteractReactorFluidInput.interact(world, pos, player, hand, heldItem, onClient, ray); } @Override @@ -109,7 +101,7 @@ public Class getBlockEntityClass() { @Override public BlockEntityType getBlockEntityType() { - return CNBlockEntityTypes.REACTOR_LIQUID_INPUT.get(); + return CNBlockEntityTypes.REACTOR_FLUID_INPUT.get(); } @Override 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 index 3489ff815..2e275cbf8 100644 --- 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 @@ -22,13 +22,14 @@ 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 { - /** Capacité par défaut tant que l'input n'est rattaché à aucun réacteur assemblé. */ + /** Default tank capacity while this input is not attached to any assembled reactor. */ public static final int DEFAULT_CAPACITY = 16000; private final FluidTank internalTank; @@ -44,7 +45,7 @@ public ReactorFluidInputEntity(BlockEntityType type, BlockPos pos, BlockState } /** - * Capacité du tank en fonction de la taille du réacteur (tier). + * 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) { @@ -56,9 +57,15 @@ public static int getCapacityForReactorSize(int reactorSize) { }; } - /** Applique la capacité correspondant à la taille du réacteur à laquelle cet input appartient. */ - public void applyReactorTierCapacity(int reactorSize) { - int capacity = getCapacityForReactorSize(reactorSize); + /** + * 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) { @@ -137,7 +144,11 @@ public void invalidate() { @Override public @NotNull LazyOptional getCapability(Capability cap, Direction side) { if (!capability.isPresent()) refreshCapability(); - if (cap == ForgeCapabilities.FLUID_HANDLER) return capability.cast(); + if (cap == ForgeCapabilities.FLUID_HANDLER) { + if (side != null && side != getBlockState().getValue(MultiDirectionalReactorBlock.FACING)) + return LazyOptional.empty(); + return capability.cast(); + } return super.getCapability(cap, side); } @@ -177,20 +188,16 @@ public int fill(FluidStack resource, FluidAction action) { ReactorControllerBlockEntity controller = MultiblockHelpers.getControllerForPart(level, worldPosition); BlockPos controllerPos = controller != null ? controller.getBlockPos() : null; - if (controllerPos != null && level instanceof ServerLevel serverLevel) { - PersistentFluidLocks lock = PersistentFluidLocks.get(serverLevel); - if (!lock.canAccept(controllerPos, resource.getFluid())) return 0; - } else if (controllerPos != null) { - if (!FluidLockManager.canAccept(controllerPos, resource)) return 0; + // 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 ){ - if (level instanceof ServerLevel serverLevel) { - PersistentFluidLocks.get(serverLevel).tryLock(controllerPos, resource.getFluid()); - } else { - FluidLockManager.tryLock(controllerPos, resource.getFluid()); - } + if (filled > 0 && action.execute() && controllerPos != null && level instanceof ServerLevel serverLevel) { + PersistentFluidLocks.get(serverLevel).tryLock(controllerPos, resource.getFluid()); } return filled; } @@ -198,39 +205,31 @@ public int fill(FluidStack resource, FluidAction action) { @Override public @NotNull FluidStack drain(FluidStack resource, FluidAction action) { FluidStack drained = delegate.drain(resource, action); - if (!drained.isEmpty() && action.execute()) { - ReactorControllerBlockEntity controller = MultiblockHelpers.getControllerForPart(level, worldPosition); - if (controller != null) { - BlockPos controllerPos = controller.getBlockPos(); - if (delegate.getFluidInTank(0).isEmpty()) { - if (level instanceof ServerLevel serverLevel) { - PersistentFluidLocks.get(serverLevel).clearLock(controllerPos); - } else { - FluidLockManager.clearLock(controllerPos); - } - } - } - } + clearLockIfEmptied(drained, action); return drained; } @Override public @NotNull FluidStack drain(int maxDrain, FluidAction action) { FluidStack drained = delegate.drain(maxDrain, action); - if (!drained.isEmpty() && action.execute()) { - ReactorControllerBlockEntity controller = MultiblockHelpers.getControllerForPart(level, worldPosition); - if (controller != null) { - BlockPos controllerPos = controller.getBlockPos(); - if (delegate.getFluidInTank(0).isEmpty()) { - if (level instanceof ServerLevel serverLevel) { - PersistentFluidLocks.get(serverLevel).clearLock(controllerPos); - } else { - FluidLockManager.clearLock(controllerPos); - } - } - } - } + 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/ReactorLiquidInputGenerator.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/ReactorFluidInputGenerator.java similarity index 68% rename from src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/ReactorLiquidInputGenerator.java rename to src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/ReactorFluidInputGenerator.java index fa5e6e2e9..ce60aa6ab 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/ReactorLiquidInputGenerator.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/fluid/ReactorFluidInputGenerator.java @@ -8,17 +8,17 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.client.model.generators.ModelFile; -public class ReactorLiquidInputGenerator extends SpecialBlockStateGen { +public class ReactorFluidInputGenerator extends SpecialBlockStateGen { @Override protected int getXRotation(BlockState state) { - return state.getValue(ReactorLiquidInput.FACING) == Direction.DOWN ? 180 : 0; + return state.getValue(ReactorFluidInput.FACING) == Direction.DOWN ? 180 : 0; } @Override protected int getYRotation(BlockState state) { - return state.getValue(ReactorLiquidInput.FACING).getAxis().isVertical() + return state.getValue(ReactorFluidInput.FACING).getAxis().isVertical() ? 0 - : horizontalAngle(state.getValue(ReactorLiquidInput.FACING)); + : horizontalAngle(state.getValue(ReactorFluidInput.FACING)); } @Override @@ -26,7 +26,7 @@ public ModelFile getModel(DataGenContext ctx, Regist return prov .models() .getExistingFile(prov - .modLoc("block/reactor/liquid_input/liquid_input" + (state.getValue(ReactorLiquidInput.FACING).getAxis().isVertical() + .modLoc("block/reactor/fluid_input/fluid_input" + (state.getValue(ReactorFluidInput.FACING).getAxis().isVertical() ? "_vertical" : "" ))); diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorInput.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInput.java similarity index 73% rename from src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorInput.java rename to src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInput.java index c405f3f55..9392a12a7 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorInput.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInput.java @@ -16,7 +16,6 @@ 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; @@ -39,9 +38,9 @@ @ParametersAreNonnullByDefault -public class ReactorInput extends MultiDirectionalReactorBlock implements IWrenchable, IBE { +public class ReactorRodInput extends MultiDirectionalReactorBlock implements IWrenchable, IBE { - public ReactorInput(Properties properties) { + public ReactorRodInput(Properties properties) { super(properties); } @@ -63,7 +62,7 @@ public InteractionResult use(BlockState state, Level worldIn, BlockPos pos, Play if (worldIn.isClientSide()) {return InteractionResult.SUCCESS;} withBlockEntityDo(worldIn, pos, be -> NetworkHooks.openScreen((ServerPlayer) player, be, be::sendToMenu)); - return InteractionResult.PASS; + return InteractionResult.SUCCESS; } @Override @@ -75,24 +74,21 @@ public void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldS @Override public void setPlacedBy(Level level, BlockPos pos, BlockState state, @Nullable LivingEntity pPlacer, ItemStack stack) { super.setPlacedBy(level, pos, state, pPlacer, stack); - CNAdvancementBehaviour.setPlacedBy(level, pos, pPlacer); + MultiblockHelpers.handleAdvancedPlacedBy(pos, level, pPlacer); } - @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); - withBlockEntityDo(level, pos, be -> ItemHelper.dropContents(level, pos, be.inventory)); - MultiblockHelpers.handleRemoval(pos, level, ReactorControllerBlockEntity::removeInput); - } - @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); - - withBlockEntityDo(pLevel, pPos, be -> ItemHelper.dropContents(pLevel, pPos, be.inventory)); - pLevel.removeBlockEntity(pPos); - MultiblockHelpers.handleRemoval(pPos, pLevel, ReactorControllerBlockEntity::removeInput); } @Override @@ -102,16 +98,16 @@ public BlockState getStateForPlacement(BlockPlaceContext context) { } @Override public @NotNull VoxelShape getShape(BlockState state, BlockGetter worldIn, BlockPos pos, CollisionContext context) { - return CNShapes.REACTOR_INPUT.get(state.getValue(FACING)); + return CNShapes.REACTOR_ROD_INPUT.get(state.getValue(FACING)); } @Override - public Class getBlockEntityClass() { - return ReactorInputEntity.class; + public Class getBlockEntityClass() { + return ReactorRodInputEntity.class; } @Override - public BlockEntityType getBlockEntityType() { - return CNBlockEntityTypes.REACTOR_INPUT.get(); + 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/ReactorInputEntity.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInputEntity.java similarity index 78% rename from src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorInputEntity.java rename to src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInputEntity.java index adc4c96a8..6fb2089c3 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorInputEntity.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInputEntity.java @@ -6,7 +6,6 @@ import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceKey; import net.minecraft.world.MenuProvider; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; @@ -19,21 +18,22 @@ 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 ReactorInputEntity extends SmartBlockEntity implements MenuProvider { +public class ReactorRodInputEntity extends SmartBlockEntity implements MenuProvider { //protected ReactorControllerBlockEntity controller; public ReactorControllerBlock controller = null; - public ReactorInputInventory inventory; + public ReactorRodInputInventory inventory; LazyOptional inventoryProvider; - public ReactorInputEntity(BlockEntityType type, BlockPos pos, BlockState state) { + public ReactorRodInputEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); - inventory = new ReactorInputInventory(this); + inventory = new ReactorRodInputInventory(this); inventoryProvider = LazyOptional.of(() -> inventory); } @@ -41,13 +41,9 @@ public ReactorInputEntity(BlockEntityType type, BlockPos pos, BlockState stat @Override public void addBehaviours(List behaviours) { } - // Dans ta classe, j'imagine que tu as ces variables : - private BlockPos inputPos; - private ResourceKey inputLevelKey; // On stocke la clé, pas l'objet Level directement - @Override protected void write(CompoundTag tag, boolean clientPacket) { - super.write(tag, clientPacket); // Toujours appeler le super + super.write(tag, clientPacket); // Always call super first if (!clientPacket) { tag.put("Inventory", inventory.serializeNBT()); @@ -65,11 +61,6 @@ protected void read(CompoundTag tag, boolean clientPacket) { } } - public void readInventory(CompoundTag compound) { - inventory.deserializeNBT(compound); - } - - @Nullable @Override public Level getLevel() { @@ -84,7 +75,7 @@ public Component getDisplayName() { @Nullable @Override public AbstractContainerMenu createMenu(int i, Inventory inventory, Player player) { - return ReactorInputMenu.create(i, inventory, this); + return ReactorRodInputMenu.create(i, inventory, this); } @Override @@ -98,8 +89,12 @@ protected boolean isItemHandlerCap(Capability cap) { @Override public LazyOptional getCapability(Capability cap, Direction side) { - if (isItemHandlerCap(cap)) + if (isItemHandlerCap(cap)){ + if (side != null && side != getBlockState().getValue(MultiDirectionalReactorBlock.FACING)) + return LazyOptional.empty(); return inventoryProvider.cast(); + } + return super.getCapability(cap, side); } diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorInputGenerator.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInputGenerator.java similarity index 69% rename from src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorInputGenerator.java rename to src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInputGenerator.java index 9ce0fafd8..3789ac92f 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorInputGenerator.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInputGenerator.java @@ -8,17 +8,17 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.client.model.generators.ModelFile; -public class ReactorInputGenerator extends SpecialBlockStateGen { +public class ReactorRodInputGenerator extends SpecialBlockStateGen { @Override protected int getXRotation(BlockState state) { - return state.getValue(ReactorInput.FACING) == Direction.DOWN ? 180 : 0; + return state.getValue(ReactorRodInput.FACING) == Direction.DOWN ? 180 : 0; } @Override protected int getYRotation(BlockState state) { - return state.getValue(ReactorInput.FACING).getAxis().isVertical() + return state.getValue(ReactorRodInput.FACING).getAxis().isVertical() ? 0 - : horizontalAngle(state.getValue(ReactorInput.FACING)); + : horizontalAngle(state.getValue(ReactorRodInput.FACING)); } @Override @@ -26,7 +26,7 @@ public ModelFile getModel(DataGenContext ctx, Regist return prov .models() .getExistingFile(prov - .modLoc("block/reactor/input/input" + (state.getValue(ReactorInput.FACING).getAxis().isVertical() + .modLoc("block/reactor/rod_input/rod_input" + (state.getValue(ReactorRodInput.FACING).getAxis().isVertical() ? "_vertical" : "" ))); diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorInputInventory.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInputInventory.java similarity index 52% rename from src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorInputInventory.java rename to src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInputInventory.java index 1f829fd24..ecc72da36 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorInputInventory.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInputInventory.java @@ -2,17 +2,15 @@ import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; import net.minecraftforge.items.ItemStackHandler; -import net.nuclearteam.createnuclear.CNTags; -import net.nuclearteam.createnuclear.api.ItemRodTypesValue; -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 org.jetbrains.annotations.NotNull; -public class ReactorInputInventory extends ItemStackHandler { - private final ReactorInputEntity be; +public class ReactorRodInputInventory extends ItemStackHandler { + private final ReactorRodInputEntity be; - public ReactorInputInventory(ReactorInputEntity be) { + public ReactorRodInputInventory(ReactorRodInputEntity be) { super(1); this.be = be; } @@ -25,9 +23,9 @@ protected void onContentsChanged(int slot) { @Override public boolean isItemValid(int slot, @NotNull ItemStack stack) { - RodType rodType = ItemRodTypesValue.getRodType(stack.getItem()); + Level level = be.getLevel(); return switch (slot) { - case 0 -> CNTags.CNItemTags.FUEL.matches(stack) || rodType.type() == TypeRod.FUEL || CNTags.CNItemTags.COOLER.matches(stack) || rodType.type() == TypeRod.COOLER; + case 0 -> level != null && (TypeRodPredicate.isFuel(stack, level) || TypeRodPredicate.isCooled(stack, level)); default -> !super.isItemValid(slot, stack); }; } diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorInputMenu.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInputMenu.java similarity index 74% rename from src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorInputMenu.java rename to src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInputMenu.java index 97720de52..981c507d3 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorInputMenu.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInputMenu.java @@ -14,19 +14,19 @@ import net.minecraftforge.items.SlotItemHandler; import net.nuclearteam.createnuclear.CNMenus; -public class ReactorInputMenu extends MenuBase { +public class ReactorRodInputMenu extends MenuBase { - public ReactorInputMenu(MenuType type, int id, Inventory inv, FriendlyByteBuf extraData) { + public ReactorRodInputMenu(MenuType type, int id, Inventory inv, FriendlyByteBuf extraData) { super(type, id, inv, extraData); } - public ReactorInputMenu(MenuType type, int id, Inventory inv, ReactorInputEntity contentHolder) { + public ReactorRodInputMenu(MenuType type, int id, Inventory inv, ReactorRodInputEntity 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); + public static ReactorRodInputMenu create(int id, Inventory inv, ReactorRodInputEntity contentHolder) { + return new ReactorRodInputMenu(CNMenus.SLOT_ITEM_STORAGE.get(), id, inv, contentHolder); } @Override @@ -37,17 +37,17 @@ public ItemStack quickMoveStack(Player playerIn, int index) { ItemStack stackInSlot = slot.getItem(); result = stackInSlot.copy(); - int playerInventorySize = player.getInventory().items.size(); // normalement 36 + int playerInventorySize = player.getInventory().items.size(); // normally 36 int containerStart = playerInventorySize; - int containerEnd = containerStart + 1; // 1 slot de machine + int containerEnd = containerStart + 1; // 1 machine slot - // Si on a cliqué un slot de machine (après les slots joueurs) + // Clicked a machine slot (after the player slots) if (index >= containerStart && index < containerEnd) { if (!this.moveItemStackTo(stackInSlot, 0, playerInventorySize, true)) { return ItemStack.EMPTY; } } else { - // On a cliqué un slot joueur — essayer d'aller dans le container (machine) + // Clicked a player slot — try moving the stack into the machine container if (!this.moveItemStackTo(stackInSlot, containerStart, containerEnd, false)) { return ItemStack.EMPTY; } @@ -70,18 +70,18 @@ public ItemStack quickMoveStack(Player playerIn, int index) { @Override - protected ReactorInputEntity createOnClient(FriendlyByteBuf extraData) { + protected ReactorRodInputEntity 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; + if (entity instanceof ReactorRodInputEntity reactorRodInputEntity) { + reactorRodInputEntity.readClient(extraData.readNbt()); + return reactorRodInputEntity; } return null; } @Override - protected void initAndReadInventory(ReactorInputEntity contentHolder) { + protected void initAndReadInventory(ReactorRodInputEntity contentHolder) { } @@ -105,7 +105,7 @@ protected void addSlots() { } @Override - protected void saveData(ReactorInputEntity contentHolder) { + protected void saveData(ReactorRodInputEntity contentHolder) { } @Override diff --git a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorInputScreen.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInputScreen.java similarity index 86% rename from src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorInputScreen.java rename to src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInputScreen.java index 37fdd038b..5b6621d13 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorInputScreen.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/input/item/ReactorRodInputScreen.java @@ -9,11 +9,11 @@ import static com.simibubi.create.foundation.gui.AllGuiTextures.PLAYER_INVENTORY; -public class ReactorInputScreen extends AbstractSimiContainerScreen { +public class ReactorRodInputScreen extends AbstractSimiContainerScreen { protected static final CNGuiTextures background = CNGuiTextures.REACTOR_SLOT_INVENTOR; - public ReactorInputScreen(ReactorInputMenu container, Inventory inv, Component title) { + public ReactorRodInputScreen(ReactorRodInputMenu container, Inventory inv, Component title) { super(container, inv, title); } 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 index 5964ff3b3..b9807e885 100644 --- 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 @@ -9,13 +9,7 @@ public VirtualReactorInputsItem() { this(0,0); } - public BigItemStack getBigFuelRod() { - return new BigItemStack(CNItems.URANIUM_ROD.asStack(), fuel); - } - public BigItemStack getBigCooledRod() { - return new BigItemStack(CNItems.GRAPHITE_ROD.asStack(), cooler); - } @Override public @NotNull String toString() { 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 bf9ccb916..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,24 +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; @@ -29,51 +34,29 @@ import net.minecraft.world.phys.shapes.VoxelShape; import net.nuclearteam.createnuclear.*; import net.nuclearteam.createnuclear.content.multiblock.MultiblockHelpers; -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 net.nuclearteam.createnuclear.foundation.advancement.CNAdvancementBehaviour; 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 = Objects.requireNonNull(this.getBlockEntity(level, pos)).controller; - 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) { @@ -84,24 +67,17 @@ public void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldS @Override public void setPlacedBy(Level level, BlockPos pos, BlockState state, @javax.annotation.Nullable LivingEntity pPlacer, ItemStack stack) { super.setPlacedBy(level, pos, state, pPlacer, stack); - CNAdvancementBehaviour.setPlacedBy(level, pos, pPlacer); - } - - @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); - MultiblockHelpers.handleRemoval(pos, level, ReactorControllerBlockEntity::removeOutput); + 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(); 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)); } @@ -111,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: @@ -146,4 +136,28 @@ public Class getBlockEntityClass() { public BlockEntityType getBlockEntityType() { return CNBlockEntityTypes.REACTOR_OUTPUT.get(); } + + 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())); + } + } } \ 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 c359fa355..2ae418834 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 @@ -15,7 +15,6 @@ 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; @@ -32,7 +31,7 @@ public class ReactorOutputEntity extends GeneratingKineticBlockEntity { - public int speed = 1; + public int speed = 0; public float heat = 0; protected ReactorPattern pattern = new ReactorPattern(); @@ -52,11 +51,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); } @@ -82,17 +76,17 @@ public void setSpeedAndUpdate(int speed) { setChanged(); } - // Assure-toi d'avoir cette variable définie dans ta classe + // 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); - // On récupère la vitesse + // Restore the generated rotation speed generatedSpeed = compound.getFloat("generatedSpeed"); - // On récupère la position (seulement si elle existe dans le tag) + // Restore the output position, if present in the tag if (compound.contains("outputPos")) { this.outputPos = BlockPos.of(compound.getLong("outputPos")); } @@ -102,10 +96,10 @@ protected void read(CompoundTag compound, boolean clientPacket) { public void write(CompoundTag compound, boolean clientPacket) { super.write(compound, clientPacket); - // On enregistre la vitesse + // Persist the generated rotation speed compound.putFloat("generatedSpeed", generatedSpeed); - // On enregistre la position si elle n'est pas nulle + // Persist the output position, if set if (this.outputPos != null) { compound.putLong("outputPos", this.outputPos.asLong()); } @@ -187,11 +181,6 @@ public float getGeneratedSpeed() { return Mth.clamp(generatedSpeed, 0, 1500000); } - @Override - protected Block getStressConfigKey() { - return super.getStressConfigKey(); - } - class ReactorOutputValue extends ValueBoxTransform.Sided { @Override 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 index faef72fb5..97628c18d 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/pattern/ReactorPattern.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/pattern/ReactorPattern.java @@ -1,6 +1,5 @@ package net.nuclearteam.createnuclear.content.multiblock.pattern; -import lib.multiblock.SimpleMultiBlockAislePatternBuilder; import net.minecraft.core.BlockPos; import net.minecraft.core.Vec3i; import net.minecraft.world.entity.player.Player; @@ -8,21 +7,21 @@ 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.List; import java.util.function.Predicate; public class ReactorPattern { - //public BlockPos VerifyPattern(char character) {} private static final Predicate blockInWorldAPredicate = state -> stateIs(CNBlocks.REACTOR_CASING.get()).test(state) || stateIs(CNBlocks.REACTOR_OUTPUT.get()).test(state) - || stateIs(CNBlocks.REACTOR_INPUT.get()).test(state) - || stateIs(CNBlocks.REACTOR_LIQUID_INPUT.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) ; @@ -33,78 +32,22 @@ private static Predicate stateIs(Block block) { }; } - public BlockPos VerifyPattern5x5(char character) { - return SimpleMultiBlockAislePatternBuilder.start() - .aisle("OOOOO", "OAAAO", "OAAAO", "OAAAO", "OOOOO") - .aisle("OABAO", "ODDDO", "BDCDB", "ODDDO", "OABAO") - .aisle("OABAO", "ODDDO", "BDCDB", "ODDDO", "OABAO") - .aisle("OABAO", "ODDDO", "BDCDB", "ODDDO", "OA*AO") - .aisle("OABAO", "ODDDO", "BDCDB", "ODDDO", "OABAO") - .aisle("OABAO", "ODDDO", "BDCDB", "ODDDO", "OABAO") - .aisle("OOOOO", "OAAAO", "OAAAO", "OAAAO", "OOOOO") - .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())) - .getDistanceController(character); + @FunctionalInterface + private interface ControllerVisitor { + boolean visit(BlockPos controllerPos, ReactorControllerBlockEntity entity); } - public BlockPos VerifyPattern7x7(char character) { - return 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())) - .getDistanceController(character); - } - - public BlockPos VerifyPattern9x9(char character) { - return 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())) - .getDistanceController(character); - } - - public void findController(BlockPos blockPos, Level level, boolean first){ + 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())) { - if (first) { - ReactorAssembler.assemble(newBlock, level); - } else { - ReactorAssembler.disassemble(newBlock, level); + if (level.getBlockState(newBlock).is(CNBlocks.REACTOR_CONTROLLER.get()) + && level.getBlockEntity(newBlock) instanceof ReactorControllerBlockEntity entity) { + if (visitor.visit(newBlock, entity)) { + return; } } } @@ -112,31 +55,60 @@ public void findController(BlockPos blockPos, Level level, boolean first){ } } - public BlockPos findControllerPos(BlockPos blockPos, Level level){ - 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())) { - if (level.getBlockEntity(newBlock) instanceof ReactorControllerBlockEntity entity) { - if (isInReactorRange(entity.getMultiblockPos(), blockPos)) { - return newBlock; - } - } - } + 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 null; + + 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(int []reactorPos, BlockPos blockPos) { - //[xMin, xMax, yMin, yMax, zMin, zMax] - if (reactorPos == null || reactorPos.length < 6) return false; - return blockPos.getX() >= reactorPos[0] && blockPos.getX() <= reactorPos[1] - && blockPos.getY() >= reactorPos[2] && blockPos.getY() <= reactorPos[3] - && blockPos.getZ() >= reactorPos[4] && blockPos.getZ() <= reactorPos[5]; + 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/reactorLogic/DefaultHeatCalculator.java b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/DefaultHeatCalculator.java index ccea98452..d2e82c151 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/DefaultHeatCalculator.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/DefaultHeatCalculator.java @@ -1,16 +1,18 @@ package net.nuclearteam.createnuclear.content.multiblock.reactorLogic; -import com.simibubi.create.content.logistics.BigItemStack; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; import net.minecraft.world.item.ItemStack; -import net.nuclearteam.createnuclear.CNTags; -import net.nuclearteam.createnuclear.CreateNuclear; -import net.nuclearteam.createnuclear.api.ItemRodTypesValue; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.Level; import net.nuclearteam.createnuclear.api.multiblock.fluid.ReactorFluidType; 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.display.ReactorDisplayState; + +import java.util.HashMap; +import java.util.Map; public class DefaultHeatCalculator implements IHeatCalculator { private final int[][] formattedPattern = new int[][]{ @@ -27,20 +29,37 @@ public class DefaultHeatCalculator implements IHeatCalculator { private final int[][] offsets = { {1, 0}, {-1, 0}, {0, 1}, {0, -1} }; @Override - public double computeHeat(BigItemStack bigFuelItem, BigItemStack bigCoolerItem, BigFluidStack bigFluidStack, ReactorFluidType type, int countGraphiteRod, int countUraniumRod, ReactorControllerInventory inventory, double overHeat) { + public double computeHeat(BigFluidStack bigFluidStack, ReactorFluidType type, ReactorControllerInventory inventory, double overHeat, ReactorDisplayState displayState, Level level) { double heat = 0; ListTag list = inventory.getStackInSlot(0).getOrCreateTag().getCompound("pattern").getList("Items", Tag.TAG_COMPOUND); + + Map availableItems = displayState != null && displayState.items() != null + ? new HashMap<>(displayState.items()) + : new HashMap<>(); + + Map actualRods = new HashMap<>(); for (int i = 0; i < list.size(); i++) { ItemStack currentStack = ItemStack.of(list.getCompound(i)); - RodType rod = ItemRodTypesValue.getRodType(currentStack.getItem()); + Item rodItem = currentStack.getItem(); + + if (availableItems.getOrDefault(rodItem, 0) > 0) { + availableItems.put(rodItem, availableItems.get(rodItem) - 1); + actualRods.put(list.getCompound(i).getInt("Slot"), currentStack); + } + } + + for (Map.Entry entry : actualRods.entrySet()) { + int slot = entry.getKey(); + ItemStack currentStack = entry.getValue(); + RodType rod = RodType.resolveRodType(currentStack.getItem(), level); String currentRod = ""; - if (currentStack.is(CNTags.CNItemTags.FUEL.tag) || (rod.items().size() > 0 && rod.type() == RodType.TypeRod.FUEL)) { - heat += rod.baseRodHeat(); + if (rod.isNotEmptyItem() && rod.type() == RodType.TypeRod.FUEL) { + heat += rod.baseRodHeat().get(); currentRod = "fuel"; - } else if (currentStack.is(CNTags.CNItemTags.COOLER.tag) || (rod.items().size() > 0 && rod.type() == RodType.TypeRod.COOLER)) { - heat += rod.baseRodHeat(); + } else if (rod.isNotEmptyItem() && rod.type() == RodType.TypeRod.COOLER) { + heat += rod.baseRodHeat().get(); currentRod = "cooler"; } @@ -48,7 +67,7 @@ public double computeHeat(BigItemStack bigFuelItem, BigItemStack bigCoolerItem, for (int j = 0; j < formattedPattern.length; j++) { for (int k = 0; k < formattedPattern[j].length; k++) { if (formattedPattern[j][k] == 99) continue; - if (list.getCompound(i).getInt("Slot") != formattedPattern[j][k]) continue; + if (slot != formattedPattern[j][k]) continue; for (int[] offset : offsets) { int nj = j + offset[0]; @@ -56,15 +75,14 @@ public double computeHeat(BigItemStack bigFuelItem, BigItemStack bigCoolerItem, if (nj < 0 || nj >= formattedPattern.length || nk < 0 || nk >= formattedPattern[j].length) continue; int neighborSlot = formattedPattern[nj][nk]; - for (int l = 0; l < list.size(); l++) { - if (list.getCompound(l).getInt("Slot") == neighborSlot) { - if ("fuel".equals(currentRod)) { - ItemStack stack = ItemStack.of(list.getCompound(l)); - if (stack.is(CNTags.CNItemTags.FUEL.tag)) { - heat += rod.baseRodHeat(); - } else if (stack.is(CNTags.CNItemTags.COOLER.tag)) { - heat += rod.baseRodHeat() / Math.max(1, ItemRodTypesValue.getRodType(stack.getItem()).proximityRodHeat()); - } + if (actualRods.containsKey(neighborSlot)) { + if ("fuel".equals(currentRod)) { + ItemStack stack = actualRods.get(neighborSlot); + RodType neighborRod = RodType.resolveRodType(stack.getItem(), level); + if (neighborRod.isNotEmptyItem() && neighborRod.type() == RodType.TypeRod.FUEL) { + heat += rod.proximityRodHeat().get(); + } else if (neighborRod.isNotEmptyItem() && neighborRod.type() == RodType.TypeRod.COOLER) { + heat += rod.baseRodHeat().get() / neighborRod.proximityRodHeat().get(); } } } 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 index b3206f208..77bf4341a 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/DefaultOverheatController.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/DefaultOverheatController.java @@ -8,16 +8,13 @@ class DefaultOverheatController implements IOverheatController { private int overFlowLimiter = 30; private double overHeat = 0; - private final int maxUraniumPerGraphite = 3; - private final int graphiteTimer = 3600; - private final int uraniumTimer = 3600; private final int liquidTimer = 3600; @Override - public void updateState(int countGraphiteRod, int countUraniumRod, BigFluidStack bigFluidStack, ReactorFluidType type) { + public void updateState(int totalHeatRatio, BigFluidStack bigFluidStack, ReactorFluidType type) { int fluidAmount = bigFluidStack == null ? 0 : bigFluidStack.amount; int fluidEfficiency = type == null ? -1 : type.efficiency(); - if (countUraniumRod > countGraphiteRod * maxUraniumPerGraphite || fluidEfficiency == -1 || fluidAmount < fluidEfficiency) { + if (totalHeatRatio > 0 || fluidEfficiency == -1 || fluidAmount < fluidEfficiency) { overFlowHeatTimer++; if (overFlowHeatTimer >= overFlowLimiter) { overHeat += 1; @@ -35,11 +32,6 @@ public void updateState(int countGraphiteRod, int countUraniumRod, BigFluidStack @Override public double getOverHeat() { return overHeat; } - @Override - public int getGraphiteTimer() { return graphiteTimer; } - - @Override - public int getUraniumTimer() { return uraniumTimer; } @Override public int getLiquidTimer() { return liquidTimer; } 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 index 18a1a0f05..9ddccb58e 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/HeatManager.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/HeatManager.java @@ -8,6 +8,7 @@ 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.display.ReactorDisplayState; import net.nuclearteam.createnuclear.infrastructure.config.CNConfigs; /** @@ -26,17 +27,12 @@ public HeatManager() { this(new DefaultHeatCalculator(), new DefaultOverheatController()); } - public double calculateHeat(BigItemStack fuel, BigItemStack cooler, BigFluidStack bigFluidStack, int graphiteCount, int uraniumCount, ReactorControllerInventory inventory, Level level) { - if (fuel == null || cooler == null) return 0; - if (fuel.count <= 0 || cooler.count <= 0) return 0; - + public double calculateHeat(BigFluidStack bigFluidStack, int totalHeatRatio, ReactorControllerInventory inventory, Level level, ReactorDisplayState displayState) { ReactorFluidType type = bigFluidStack == null ? null : bigFluidStack.getFluidtype(level); - overheatController.updateState(graphiteCount, uraniumCount, bigFluidStack, type); + overheatController.updateState(totalHeatRatio, bigFluidStack, type); - return calculator.computeHeat(fuel, cooler, bigFluidStack, type, graphiteCount, uraniumCount, inventory, overheatController.getOverHeat()); + return calculator.computeHeat(bigFluidStack, type, inventory, overheatController.getOverHeat(), displayState, level); } - public int getGraphiteTimer() { return overheatController.getGraphiteTimer(); } - public int getUraniumTimer() { return overheatController.getUraniumTimer(); } 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 index bf20dd30c..09dbba96a 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/IHeatCalculator.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/IHeatCalculator.java @@ -1,10 +1,11 @@ package net.nuclearteam.createnuclear.content.multiblock.reactorLogic; -import com.simibubi.create.content.logistics.BigItemStack; +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(BigItemStack bigFuelItem, BigItemStack bigCoolerItem, BigFluidStack bigFluidStack, ReactorFluidType type, int countGraphiteRod, int countUraniumRod, ReactorControllerInventory inventory, double overHeat); + 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 index a2ad387b4..190cd57ae 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/IOverheatController.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/reactorLogic/IOverheatController.java @@ -4,9 +4,7 @@ import net.nuclearteam.createnuclear.content.logistics.BigFluidStack; public interface IOverheatController { - void updateState(int countGraphiteRod, int countUraniumRod, BigFluidStack bigFluidStack, ReactorFluidType type); + void updateState(int totalHeatRatio, BigFluidStack bigFluidStack, ReactorFluidType type); double getOverHeat(); - int getGraphiteTimer(); - int getUraniumTimer(); 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 e7bdd9148..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 @@ -14,6 +14,7 @@ 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; @@ -26,6 +27,6 @@ public ReinforcedGlassBlock(Properties properties) { @Override public void setPlacedBy(Level level, BlockPos pos, BlockState state, @Nullable LivingEntity pPlacer, ItemStack stack) { super.setPlacedBy(level, pos, state, pPlacer, stack); - CNAdvancementBehaviour.setPlacedBy(level, pos, pPlacer); + 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 index 475c51da2..24d56c8c3 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/multiblock/rod/CNRodTypes.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/multiblock/rod/CNRodTypes.java @@ -3,7 +3,6 @@ import net.minecraft.data.worldgen.BootstapContext; import net.minecraft.resources.ResourceKey; import net.minecraft.world.item.Items; -import net.nuclearteam.createnuclear.CNItems; import net.nuclearteam.createnuclear.CreateNuclear; import net.nuclearteam.createnuclear.api.CreateNuclearRegistries; import net.nuclearteam.createnuclear.api.multiblock.rods.RodType; @@ -11,8 +10,6 @@ import static net.nuclearteam.createnuclear.api.ItemRodTypesValue.DEFAULT_ROD_TYPE; public class CNRodTypes { - public static final ResourceKey FALLBACK = ResourceKey.create(CreateNuclearRegistries.ROD_TYPE, CreateNuclear.asResource("fallback")); - /** * Static registry of rod types ({@code RodType}) for the CreateNuclear mod. * @@ -27,7 +24,7 @@ public class CNRodTypes { * .baseRodHeat(int) * .proximityRodHeat(int) * .rodTimer(int) - * .addItems(Item) + * .item(Item) * .fuelRodType() * .build()); * } diff --git a/src/main/java/net/nuclearteam/createnuclear/content/particles/NuclearMushroomCloudParticle.java b/src/main/java/net/nuclearteam/createnuclear/content/particles/NuclearMushroomCloudParticle.java index ec879247f..69f5e677e 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/particles/NuclearMushroomCloudParticle.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/particles/NuclearMushroomCloudParticle.java @@ -78,7 +78,7 @@ public void tick() { playSound(large ? nuclear_explosions[0] : nuclear_explosions[1], lifetime - 20, lifetime, 0.2F, false); } else { CreateNuclear.LOGGER.info("EXPLOSIOOOOOON, (WITHOUT Alex's Cave)"); - playSound(large ? CNSoundEvents.LARGE_NUCLEAR_EXPLOSION.getMainEvent() : CNSoundEvents.NUCLEAR_EXPLOSION.getMainEvent(), lifetime - 20, lifetime, 0.2F, false); + playSound(large ? CNSoundEvents.NUCLEAR_EXPLOSION_LARGE.getMainEvent() : CNSoundEvents.NUCLEAR_EXPLOSION.getMainEvent(), lifetime - 20, lifetime, 0.2F, false); } } } diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/item/radiation/CNRadiationValues.java b/src/main/java/net/nuclearteam/createnuclear/content/radiation/CNRadiationValues.java similarity index 89% rename from src/main/java/net/nuclearteam/createnuclear/foundation/item/radiation/CNRadiationValues.java rename to src/main/java/net/nuclearteam/createnuclear/content/radiation/CNRadiationValues.java index 86271c3c6..1f7433abe 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/item/radiation/CNRadiationValues.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/radiation/CNRadiationValues.java @@ -1,4 +1,4 @@ -package net.nuclearteam.createnuclear.foundation.item.radiation; +package net.nuclearteam.createnuclear.content.radiation; import com.simibubi.create.AllItems; import net.nuclearteam.createnuclear.api.radiation.RadiationRegistry; 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/effects/RadiationEffect.java b/src/main/java/net/nuclearteam/createnuclear/content/radiation/RadiationEffect.java similarity index 50% rename from src/main/java/net/nuclearteam/createnuclear/content/effects/RadiationEffect.java rename to src/main/java/net/nuclearteam/createnuclear/content/radiation/RadiationEffect.java index f12bec019..56e318da2 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/effects/RadiationEffect.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/radiation/RadiationEffect.java @@ -1,26 +1,17 @@ -package net.nuclearteam.createnuclear.content.effects; +package net.nuclearteam.createnuclear.content.radiation; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.effect.MobEffectCategory; -import net.minecraft.world.effect.MobEffectInstance; -import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; import net.nuclearteam.createnuclear.CNEffects; -import net.nuclearteam.createnuclear.CNTags; -import net.nuclearteam.createnuclear.content.effects.capability.RadiationCapability; +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.CreateNuclearDamageSources; -import net.nuclearteam.createnuclear.foundation.utility.ConfigValueResolver; -import net.nuclearteam.createnuclear.infrastructure.config.CNConfigs; -import net.nuclearteam.createnuclear.infrastructure.config.CRadiation; - -import java.util.HashSet; -import java.util.Set; +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. @@ -29,29 +20,8 @@ public class RadiationEffect extends VicinityEffect { public RadiationEffect() { super(MobEffectCategory.HARMFUL, 15453236, amplifier -> 10, - e -> { - boolean isWearingAntiRadiationArmor = false; - - double resistance = RadiationCapability.getRadiationResistance(e); - if (resistance >= 1) isWearingAntiRadiationArmor = true; - - Set> target = new HashSet<>(); - - ConfigValueResolver.loadValuesInSet(CNConfigs.server().radiation.configuredLists.getEntityBlackList(), target, entity -> { - ResourceLocation location = ResourceLocation.tryParse(entity); - return BuiltInRegistries.ENTITY_TYPE.get(location); - }); - - return !e.getType().is(CNTags.CNEntityTags.IRRADIATED_IMMUNE.tag) - && !e.hasEffect(CNEffects.RADIATION.get()) - && !isWearingAntiRadiationArmor - && CNConfigs.server().radiation.enabledItemRadiation.get() - && !target.contains(e.getType()) - && !e.isSpectator() - ; - }, - timer -> {}, - () -> new MobEffectInstance(CNEffects.RADIATION.get(), 300)); // Custom color (hex value) + RadiationCapability::canBeIrradiated, + timer -> {}); // Custom color (hex value) // Reduces movement speed by 20% this.addAttributeModifier(Attributes.MOVEMENT_SPEED, @@ -79,6 +49,11 @@ 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); @@ -91,6 +66,6 @@ public void applyEffectTick(LivingEntity entity, int amplifier) { return; } - entity.hurt(CreateNuclearDamageSources.radiation(entity.level()), damage); + entity.hurt(CNDamageSources.radiation(entity.level()), damage); } } \ No newline at end of file diff --git a/src/main/java/net/nuclearteam/createnuclear/impl/effect/RadiationEffetcHandler.java b/src/main/java/net/nuclearteam/createnuclear/content/radiation/RadiationEffectHandler.java similarity index 58% rename from src/main/java/net/nuclearteam/createnuclear/impl/effect/RadiationEffetcHandler.java rename to src/main/java/net/nuclearteam/createnuclear/content/radiation/RadiationEffectHandler.java index d2539b517..8a32a83f3 100644 --- a/src/main/java/net/nuclearteam/createnuclear/impl/effect/RadiationEffetcHandler.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/radiation/RadiationEffectHandler.java @@ -1,23 +1,25 @@ -package net.nuclearteam.createnuclear.impl.effect; +package net.nuclearteam.createnuclear.content.radiation; import com.simibubi.create.api.effect.OpenPipeEffectHandler; -import net.minecraft.world.effect.MobEffectInstance; 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.CNEffects; +import net.nuclearteam.createnuclear.content.radiation.capability.RadiationCapability; import java.util.List; -public class RadiationEffetcHandler implements OpenPipeEffectHandler { +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) { - entity.addEffect(new MobEffectInstance(CNEffects.RADIATION.get(), 3, 2, false, false, false)); + 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/foundation/item/radiation/RadiationItem.java b/src/main/java/net/nuclearteam/createnuclear/content/radiation/RadiationItem.java similarity index 74% rename from src/main/java/net/nuclearteam/createnuclear/foundation/item/radiation/RadiationItem.java rename to src/main/java/net/nuclearteam/createnuclear/content/radiation/RadiationItem.java index 5b2f17fee..5e02a0fb3 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/item/radiation/RadiationItem.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/radiation/RadiationItem.java @@ -1,5 +1,6 @@ -package net.nuclearteam.createnuclear.foundation.item.radiation; +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; @@ -15,7 +16,7 @@ public RadiationItem(Item.Properties settings, double radiation) { } @Override - public double getRadiation(ItemStack stack, Player player) { + 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/effects/capability/IRadiationCapability.java b/src/main/java/net/nuclearteam/createnuclear/content/radiation/capability/IRadiationCapability.java similarity index 61% rename from src/main/java/net/nuclearteam/createnuclear/content/effects/capability/IRadiationCapability.java rename to src/main/java/net/nuclearteam/createnuclear/content/radiation/capability/IRadiationCapability.java index 552f1a066..3b1f550d2 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/effects/capability/IRadiationCapability.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/radiation/capability/IRadiationCapability.java @@ -1,8 +1,7 @@ -package net.nuclearteam.createnuclear.content.effects.capability; +package net.nuclearteam.createnuclear.content.radiation.capability; import net.minecraft.resources.ResourceLocation; - public interface IRadiationCapability { double getRadiation(); void setRadiation(double value); @@ -12,4 +11,10 @@ public interface IRadiationCapability { 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/effects/capability/RadiationProvider.java b/src/main/java/net/nuclearteam/createnuclear/content/radiation/capability/RadiationProvider.java similarity index 77% rename from src/main/java/net/nuclearteam/createnuclear/content/effects/capability/RadiationProvider.java rename to src/main/java/net/nuclearteam/createnuclear/content/radiation/capability/RadiationProvider.java index 04e86895c..a9fea11de 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/effects/capability/RadiationProvider.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/radiation/capability/RadiationProvider.java @@ -1,7 +1,8 @@ -package net.nuclearteam.createnuclear.content.effects.capability; +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; @@ -25,6 +26,9 @@ 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; } @@ -32,5 +36,8 @@ public CompoundTag serializeNBT() { 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 index 314b4a4bc..ce7934b55 100644 --- 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 @@ -1,58 +1,46 @@ 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.multiblock.MultiblockHelpers; +import net.minecraft.world.item.Item; +import net.nuclearteam.createnuclear.api.multiblock.rods.RodType; import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; -import net.nuclearteam.createnuclear.foundation.utility.CreateNuclearLang; -public class CoolerDisplaySource extends NumericSingleLineDisplaySource { +import java.util.Map; + +public class CoolerDisplaySource extends AbstractReactorStatDisplaySource { + @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 + Espace - MutableComponent label = CreateNuclearLang.translateDirect("display_source.reactor.cooler").append(" "); - - int mode = context.sourceConfig().getInt("display_mode"); - var coolerStack = controller.getBigCoolerItem(); - int cooler = (coolerStack != null) ? coolerStack.count : 0; - int maxCooler = 64; - - return label.append(switch (mode) { - case 1 -> Component.literal((cooler * 100 / maxCooler) + "%").withStyle(ChatFormatting.AQUA); - case 2 -> { - int gaugeWidth = 6; - yield drawGauge(cooler, maxCooler, ChatFormatting.AQUA, gaugeWidth); - } - default -> Component.literal(String.valueOf(cooler)).withStyle(ChatFormatting.AQUA); - }); + protected String getLabelKey() { + return "display_source.reactor.cooler"; } - private 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); + @Override + protected int getMax() { + return ReactorDisplayConstants.MAX_COOLER; } - @Override protected String getTranslationKey() { return "cooler"; } + @Override + protected ChatFormatting getColor(int value, ReactorControllerBlockEntity controller) { + return ChatFormatting.AQUA; + } @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"); + 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 boolean allowsLabeling(DisplayLinkContext context) { return true; } + @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 index cbd64c68e..56a8dc276 100644 --- 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 @@ -1,58 +1,45 @@ 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.multiblock.MultiblockHelpers; +import net.minecraft.world.item.Item; +import net.nuclearteam.createnuclear.api.multiblock.rods.RodType.TypeRodPredicate; import net.nuclearteam.createnuclear.content.multiblock.controller.ReactorControllerBlockEntity; -import net.nuclearteam.createnuclear.foundation.utility.CreateNuclearLang; -public class FuelDisplaySource extends NumericSingleLineDisplaySource { +import java.util.Map; + +public class FuelDisplaySource extends AbstractReactorStatDisplaySource { @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 + Espace - MutableComponent label = CreateNuclearLang.translateDirect("display_source.reactor.fuel").append(" "); - - int mode = context.sourceConfig().getInt("display_mode"); - var fuelStack = controller.getBigFuelItem(); - int fuel = (fuelStack != null) ? fuelStack.count : 0; - int maxFuel = 64; - - return label.append(switch (mode) { - case 1 -> Component.literal((fuel * 100 / maxFuel) + "%").withStyle(ChatFormatting.GREEN); - case 2 -> { - int gaugeWidth = 6; - yield drawGauge(fuel, maxFuel, ChatFormatting.GREEN, gaugeWidth); - } - default -> Component.literal(String.valueOf(fuel)).withStyle(ChatFormatting.GREEN); - }); + protected String getLabelKey() { + return "display_source.reactor.fuel"; } - private 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); + @Override + protected int getMax() { + return ReactorDisplayConstants.MAX_FUEL; } - @Override protected String getTranslationKey() { return "fuel"; } + @Override + protected ChatFormatting getColor(int value, ReactorControllerBlockEntity controller) { + return ChatFormatting.GREEN; + } @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"); + 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 boolean allowsLabeling(DisplayLinkContext context) { return true; } + @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 index bf704903c..98f052620 100644 --- 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 @@ -1,64 +1,34 @@ 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.network.chat.MutableComponent; -import net.minecraft.network.chat.Component; -import net.minecraft.util.Mth; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraft.ChatFormatting; 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; -public class HeatDisplaySource extends NumericSingleLineDisplaySource { +public class HeatDisplaySource extends AbstractReactorStatDisplaySource { @Override - protected MutableComponent provideLine(DisplayLinkContext context, DisplayTargetStats stats) { - ReactorControllerBlockEntity controller = MultiblockHelpers.getControllerForPart(context.level(), context.getSourcePos()); - if (controller == null || controller.isRemoved()) return ZERO.copy(); - - // Ajout du Label + Espace - MutableComponent label = CreateNuclearLang.translateDirect("display_source.reactor.heat").append(" "); - - int mode = context.sourceConfig().getInt("display_mode"); - int heat = (int) controller.getConfiguredPattern().getOrCreateTag().getDouble("heat"); - int maxHeat = 1000; - - return label.append(switch (mode) { - case 1 -> Component.literal((heat * 100 / maxHeat) + "%") - .withStyle(IHeat.HeatLevel.of(heat).getTextColor()); - - case 2 -> { - // Largeur réduite pour laisser de la place au label - int gaugeWidth = 6; - yield drawGauge(heat, maxHeat, IHeat.HeatLevel.of(heat).getTextColor(), gaugeWidth); - } - - default -> Component.literal(String.valueOf(heat)) - .append(CreateNuclearLang.translateDirect("generic.unit.heat.value")) - .withStyle(IHeat.HeatLevel.of(heat).getTextColor()); - }); + protected String getLabelKey() { + return "display_source.reactor.heat"; } - private MutableComponent drawGauge(int current, int max, net.minecraft.ChatFormatting color, int width) { - int filled = (int) (Mth.clamp((float) current / max, 0, 1) * width); - int empty = Math.max(0, width - filled); - return Component.literal("█".repeat(filled) + "▒".repeat(empty)).withStyle(color); + @Override + protected int getMax() { + return ReactorDisplayConstants.MAX_HEAT; } - @Override protected String getTranslationKey() { return "heat"; } + @Override + protected ChatFormatting getColor(int value, ReactorControllerBlockEntity controller) { + return IHeat.HeatLevel.of(value, controller.getMultiblockSize()).getTextColor(); + } @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"); + protected int computeValue(ReactorControllerBlockEntity controller, DisplayLinkContext context) { + return (int) controller.getConfiguredPattern().getOrCreateTag().getDouble("heat"); } - @Override protected boolean allowsLabeling(DisplayLinkContext context) { return true; } + @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 index a65b1afd3..6acaab848 100644 --- 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 @@ -10,50 +10,42 @@ 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; -public class LiquidLevelDisplaySource extends NumericSingleLineDisplaySource { +import java.util.List; +public class LiquidLevelDisplaySource extends AbstractReactorStatDisplaySource { @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("display_source.reactor.fluid").append(" "); - - int mode = context.sourceConfig().getInt("display_mode"); - var fluidList = controller.getBigFluidStack(); - int fluid = (fluidList != null && !fluidList.isEmpty()) ? (int) fluidList.get(0).amount : 0; - int maxFluid = 16000; - - return label.append(switch (mode) { - case 1 -> Component.literal((fluid * 100 / maxFluid) + "%").withStyle(ChatFormatting.BLUE); - case 2 -> { - int gaugeWidth = 6; - yield drawGauge(fluid, maxFluid, ChatFormatting.BLUE, gaugeWidth); - } - default -> Component.literal(String.valueOf(fluid)) - .append(CreateNuclearLang.translateDirect("generic.unit.fluid.value")) - .withStyle(ChatFormatting.BLUE); - }); + protected String getLabelKey() { + return "display_source.reactor.fluid"; } - private 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); + @Override + protected int getMax() { + return ReactorDisplayConstants.MAX_FLUID; + } + + @Override + protected ChatFormatting getColor(int value, ReactorControllerBlockEntity controller) { + return ChatFormatting.BLUE; } - @Override protected String getTranslationKey() { return "liquid_level"; } + @Override + protected int computeValue(ReactorControllerBlockEntity controller, DisplayLinkContext context) { + List fluidList = controller.getBigFluidStack(); + return (fluidList != null && !fluidList.isEmpty()) ? fluidList.get(0).amount : 0; + } @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"); + protected MutableComponent getUnitSuffix() { + return CreateNuclearLang.translateDirect("generic.unit.fluid.value"); } - @Override protected boolean allowsLabeling(DisplayLinkContext context) { return true; } + @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 index a8e11e879..53bbfca1a 100644 --- 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 @@ -20,7 +20,7 @@ protected MutableComponent provideLine(DisplayLinkContext context, DisplayTarget ReactorControllerBlockEntity controller = MultiblockHelpers.getControllerForPart(context.level(), context.getSourcePos()); if (controller == null || controller.isRemoved()) return ZERO.copy(); - // Label + Espace + // Label + trailing space MutableComponent label = CreateNuclearLang.translateDirect("display_source.reactor.size").append(" "); int mode = context.sourceConfig().getInt("display_mode"); @@ -30,7 +30,7 @@ protected MutableComponent provideLine(DisplayLinkContext context, DisplayTarget return label.append(switch (mode) { case 1 -> Component.literal((tier * 100 / 3) + "%").withStyle(ChatFormatting.BLUE); case 2 -> { - // Jauge courte de 3 segments représentant les Tiers + // Short 3-segment gauge representing the tier yield Component.literal("█".repeat(tier) + "▒".repeat(3 - tier)).withStyle(ChatFormatting.BLUE); } default -> { 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 index f11f31124..57e2e4a0e 100644 --- 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 @@ -1,6 +1,7 @@ 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; @@ -15,30 +16,50 @@ import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; -import net.minecraft.util.Mth; +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; -import joptsimple.internal.Strings; +/** + * 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; @@ -46,25 +67,26 @@ public List provideText(DisplayLinkContext context, DisplayTar int gaugeWidth = (stats.maxColumns() >= 80) ? 10 : 6; - List> components = getComponents(context, false, gaugeWidth).toList(); - - // Sécurité : Si le contrôleur est absent, on affiche juste le message d'erreur (index 0) - if (components.size() < 6) { - return List.of(components.get(0).stream().reduce(MutableComponent::append).orElse(EMPTY_LINE)); + 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 -> { - return list.stream().reduce(MutableComponent::append).orElse(EMPTY_LINE); - }); + 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 -> { - return list.stream().reduce(MutableComponent::append).orElse(EMPTY_LINE); - }).toList(); + 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) { @@ -73,24 +95,28 @@ public List> provideFlapDisplayText(DisplayLinkContext co } int gaugeWidth = 6; - List> components = getComponents(context, true, gaugeWidth).toList(); + Optional summary = getReactorSummary(context, gaugeWidth); - // --- FIX DU CRASH --- - // On vérifie que le contrôleur est bien présent (liste complète de 6 éléments) - // avant de tenter le calcul de largeur sur l'index 2. - if (components.size() < 6) { - return components; + if (summary.isEmpty()) { + return notEnoughSpaceFlap; } - if (stats.maxColumns() * FlapDisplaySection.MONOSPACE < 6 * FlapDisplaySection.MONOSPACE + components.get(2) - .get(1).getString().length() * FlapDisplaySection.WIDE_MONOSPACE) { + 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 components; + 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) { @@ -112,24 +138,38 @@ public void loadFlapDisplayLayout(DisplayLinkContext context, FlapDisplayBlockEn layout.configure(layoutKey, List.of(label, symbols)); } - private Stream> getComponents(DisplayLinkContext context, boolean forFlapDisplay, int gaugeWidth) { + /** + * 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()); - // Sécurité Triple-Check : null, removed ou non assemblé if (controller == null || controller.isRemoved()) { - return Stream.of(List.of(CreateNuclearLang.translateDirect("display_source.reactor.no_controller"))); + return Optional.empty(); } int mode = context.sourceConfig().getInt("display_mode"); int heat = (int) controller.getConfiguredPattern().getOrCreateTag().getDouble("heat"); - var fuelStack = controller.getBigFuelItem(); - int fuel = (fuelStack != null) ? fuelStack.count : 0; - var coolerStack = controller.getBigCoolerItem(); - int cooler = (coolerStack != null) ? coolerStack.count : 0; + 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(); - var fluidList = controller.getBigFluidStack(); - int fluid = (fluidList != null && !fluidList.isEmpty() && fluidList.get(0) != null) ? (int) fluidList.get(0).amount : 0; + 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(" "); @@ -139,20 +179,20 @@ private Stream> getComponents(DisplayLinkContext context, MutableComponent lFluid = padLabel("fluid", lw).append(" "); MutableComponent lHeat = padLabel("heat", lw).append(" "); - return Stream.of( - List.of(lStatus, controller.isAssembled() ? + 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)), - List.of(lSize, formatSize(size)), - List.of(lFuel, formatValue(fuel, 64, mode, false, ChatFormatting.GREEN, gaugeWidth)), - List.of(lCooler, formatValue(cooler, 64, mode, false, ChatFormatting.AQUA, gaugeWidth)), - List.of(lFluid, formatFluid(fluid, 16000, mode, ChatFormatting.BLUE, gaugeWidth)), - List.of(lHeat, formatValue(heat, 1000, mode, true, IHeat.HeatLevel.of(heat).getTextColor(), gaugeWidth)) - ); + 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(Strings.repeat(' ', lw - labelWidthOf(key))).append(labelOf(key)); + return Component.literal(" ".repeat(lw - labelWidthOf(key))).append(labelOf(key)); } private MutableComponent formatSize(int size) { @@ -161,22 +201,17 @@ private MutableComponent formatSize(int size) { } private MutableComponent formatFluid(int current, int max, int mode, ChatFormatting color, int width) { - if (mode == 0 || mode == 3) return drawGauge(current, max, color, 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 drawGauge(current, max, color, 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 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); - } - private int labelWidth() { return Stream.of("status", "size", "fuel", "cooler", "fluid", "heat").mapToInt(this::labelWidthOf).max().orElse(0); } @@ -197,5 +232,8 @@ public void initConfigurationWidgets(DisplayLinkContext context, ModularGuiLineB .forOptions(CreateNuclearLang.translatedOptions("display_source.reactor.mode", "normal", "value", "percent", "gauge")), "display_mode"); } - @Override protected String getTranslationKey() { return "reactor_summary"; } + @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 index 6af2206d0..20cd0258e 100644 --- a/src/main/java/net/nuclearteam/createnuclear/content/uraniumOre/UraniumOreItem.java +++ b/src/main/java/net/nuclearteam/createnuclear/content/uraniumOre/UraniumOreItem.java @@ -1,5 +1,6 @@ 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; @@ -15,7 +16,7 @@ public UraniumOreItem(Block block, Properties properties, double radiation) { } @Override - public double getRadiation(ItemStack stack, Player player) { + 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 161ea81c4..3c76031e3 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/advancement/CNAdvancement.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/advancement/CNAdvancement.java @@ -65,20 +65,6 @@ public class CNAdvancement implements DataProvider { .after(ROOT) ), - FIRST_THORIUM = create("first_thorium", b -> b.icon(CNItems.RAW_THORIUM.asItem()) - .title("First Thorium") - .description("Drop a raw thorium for the first time") - .whenIconCollected() - .after(ROOT) - ), - - FIRST_NITRATE = create("first_nitrate", b -> b.icon(CNItems.NITRATE.asItem()) - .title("First Nitrate") - .description("Drop Nitrate for the first time") - .whenIconCollected() - .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") @@ -200,9 +186,10 @@ public class CNAdvancement implements DataProvider { ), CRYOGENIC_BAPTISM = create("cryogenic_baptism", b -> b.icon(CNFluids.LIQUID_NITROGEN.getBucket().get()) - .title("I can't feel my feet anymore") + .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) @@ -304,21 +291,21 @@ public class CNAdvancement implements DataProvider { T1_REACTOR = create("t1", b -> b.icon(CNBlocks.REACTOR_CONTROLLER.asItem()) .title("Reactor Controller T1") - .description("Build and start a tier 1 nuclear reactor") + .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 and start a tier 2 nuclear reactor") + .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 and start a tier 3 nuclear reactor") + .description("Build a tier 3 Nuclear Reactor") .special(EXPERT) .after(T2_REACTOR) ), @@ -330,46 +317,49 @@ public class CNAdvancement implements DataProvider { .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") + 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_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) + 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_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) + 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_LIQUID_INPUT = create("reactor_liquid_input", b -> b.icon(CNBlocks.REACTOR_LIQUID_INPUT) - .title("Liquid Fuel") - .description("Craft a reactor liquid input to feed liquid coolant into your reactor") + 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_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) + 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_CORE) .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) + + 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_COOLER) .whenIconCollected() - ); + ) + + ; private final PackOutput output; diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/advancement/CNAdvancementBehaviour.java b/src/main/java/net/nuclearteam/createnuclear/foundation/advancement/CNAdvancementBehaviour.java index e7b1a4f9b..9abf48ef4 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/advancement/CNAdvancementBehaviour.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/advancement/CNAdvancementBehaviour.java @@ -103,7 +103,7 @@ private Player getPlayer() { } private void award(CreateNuclearAdvancement advancement, Player player) { - if (advancements.contains(advancement)) advancement.awardTo(player); + if (!advancement.isAlreadyAwardedTo(player)) advancement.awardTo(player); removeAwarded(); } 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 6643a481e..83fcc72c8 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/advancement/CreateNuclearAdvancement.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/advancement/CreateNuclearAdvancement.java @@ -23,7 +23,7 @@ @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)"; diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/damageTypes/CreateNuclearDamageSources.java b/src/main/java/net/nuclearteam/createnuclear/foundation/damageTypes/CreateNuclearDamageSources.java deleted file mode 100644 index c053c074c..000000000 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/damageTypes/CreateNuclearDamageSources.java +++ /dev/null @@ -1,37 +0,0 @@ -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 CreateNuclearDamageSources { - 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); - } -} 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..d54fcaaec --- /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.BiomeIrradationExtractorItem; + +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(BiomeIrradationExtractorItem.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/radiation/ClientRadiationData.java b/src/main/java/net/nuclearteam/createnuclear/foundation/data/radiation/ClientRadiationData.java deleted file mode 100644 index 6cdaed1a9..000000000 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/data/radiation/ClientRadiationData.java +++ /dev/null @@ -1,7 +0,0 @@ -package net.nuclearteam.createnuclear.foundation.data.radiation; - -public record ClientRadiationData(double radiation) { - public ClientRadiationData() { - this(0); - } -} 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 7b5ad12a9..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 @@ -32,11 +32,11 @@ public class CNCrushingRecipeGen extends CrushingRecipeGen { 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) ), @@ -48,32 +48,32 @@ public class CNCrushingRecipeGen extends CrushingRecipeGen { RAW_THORIUM_BLOCK = create(() -> CNBlocks.RAW_THORIUM_BLOCK, b -> b .duration(250) .output(1, CNItems.THORIUM_DUST, 9) - .output(0.5f, CNItems.THORIUM_DUST, 72) + .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.5f, CNItems.THORIUM_DUST, 8) + .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(.6f, CNItems.NITRATE, 1) - .output(.4f, CNItems.LEAD_NUGGET, 1) + .output(0.6f, CNItems.NITRATE, 1) + .output(0.4f, CNItems.LEAD_NUGGET, 1) ) ; 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/CNItemApplicationRecipeGen.java b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNItemApplicationRecipeGen.java index 7e2b20142..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; @@ -21,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 238e2edd5..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 @@ -47,7 +47,7 @@ public class CNMechanicalCraftingRecipeGen extends MechanicalCraftingRecipeGen { .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") @@ -56,46 +56,59 @@ 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_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") + ); public CNMechanicalCraftingRecipeGen(PackOutput output) { 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 b3a045723..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 @@ -4,7 +4,6 @@ import com.simibubi.create.content.processing.recipe.HeatCondition; import net.minecraft.data.PackOutput; import net.minecraft.world.item.Items; -import net.minecraft.world.level.material.Fluids; import net.minecraftforge.common.Tags; import net.nuclearteam.createnuclear.CNFluids; import net.nuclearteam.createnuclear.CNItems; 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 00adfe31e..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 @@ -38,7 +38,7 @@ public static void registerAll(DataGenerator gen, PackOutput 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/CNStandardRecipeGen.java b/src/main/java/net/nuclearteam/createnuclear/foundation/data/recipe/CNStandardRecipeGen.java index 429ade32e..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 @@ -70,8 +70,8 @@ public class CNStandardRecipeGen extends BaseRecipeProvider { 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), NITROGEN_CONCENTRATE = blastFurnaceRecipe(CNItems.NITROGEN_CONCENTRATE::get, CNItems.NITRATE::get, "_for_nitrogen_concentrate", 1) @@ -223,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)); @@ -348,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())); @@ -387,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/ClientEvents.java b/src/main/java/net/nuclearteam/createnuclear/foundation/events/ClientEvents.java similarity index 58% rename from src/main/java/net/nuclearteam/createnuclear/ClientEvents.java rename to src/main/java/net/nuclearteam/createnuclear/foundation/events/ClientEvents.java index 3b0859828..e9df5892e 100644 --- a/src/main/java/net/nuclearteam/createnuclear/ClientEvents.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/events/ClientEvents.java @@ -1,65 +1,67 @@ -package net.nuclearteam.createnuclear; +package net.nuclearteam.createnuclear.foundation.events; import net.minecraft.client.Minecraft; -import net.minecraft.util.Mth; 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.nuclearteam.createnuclear.foundation.mixin.CameraAccessor; +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 { /** - * GESTION DU TICK (LOGIQUE) - * Ce code s'exécute 20 fois par seconde pour faire descendre les compteurs. + * 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) { - // On enregistre l'ancienne valeur pour l'interpolation fluide (Flash) + // Store the previous value for smooth interpolation of the flash CNClientProxy.prevNukeFlashAmount = CNClientProxy.nukeFlashAmount; - // Gestion du décompte de l'obscurité du ciel + // Count down the sky-darkening timer if (CNClientProxy.renderNukeSkyDarkFor > 0) { CNClientProxy.renderNukeSkyDarkFor--; } - // Gestion de la puissance du Flash blanc + // 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) { - // Le flash s'estompe progressivement CNClientProxy.nukeFlashAmount = Math.max(CNClientProxy.nukeFlashAmount - 0.05F, 0F); } } } /** - * GESTION DU SCREEN SHAKE (TREMBLEMENT DE CAMÉRA) - * Ce code fait vibrer la vue du joueur pendant l'explosion. + * 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(); - // On définit la puissance du tremblement. - // Si le ciel est sombre (nuke active), on fait trembler à 1.5F. + // 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) { - // On génère des offsets aléatoires pour la vibration + // Generate random offsets for the shake, once per tick if (CNClientProxy.lastTremorTick != player.tickCount) { RandomSource rng = player.level().random; CNClientProxy.randomTremorOffsets[0] = rng.nextFloat(); @@ -68,10 +70,10 @@ public static void computeCameraAngles(ViewportEvent.ComputeCameraAngles event) CNClientProxy.lastTremorTick = player.tickCount; } - // Intensité basée sur les réglages d'accessibilité de Minecraft + // Scale by Minecraft's screen-effect accessibility setting double intensity = tremorAmount * Minecraft.getInstance().options.screenEffectScale().get(); - // On déplace physiquement la caméra + // Physically offset the camera ((CameraAccessor) event.getCamera()).callMove( CNClientProxy.randomTremorOffsets[0] * 0.2F * intensity, CNClientProxy.randomTremorOffsets[1] * 0.2F * intensity, @@ -80,4 +82,23 @@ public static void computeCameraAngles(ViewportEvent.ComputeCameraAngles event) } } } + + @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 002f5c72e..000000000 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/events/CommentEventClients.java +++ /dev/null @@ -1,23 +0,0 @@ -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.client.event.EntityRenderersEvent; -import net.minecraftforge.event.entity.player.ItemTooltipEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod.EventBusSubscriber; -import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus; -import net.minecraftforge.registries.ForgeRegistries; -import net.nuclearteam.createnuclear.CNEntityType; -import net.nuclearteam.createnuclear.CreateNuclear; -import net.nuclearteam.createnuclear.foundation.item.RodsStats; - -@EventBusSubscriber(bus = Bus.MOD, value = Dist.CLIENT) -public class CommentEventClients { - - - -} 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 88af630cc..3bcbe1fb1 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/events/CommentEvents.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/events/CommentEvents.java @@ -2,15 +2,14 @@ import net.minecraft.world.entity.*; import net.minecraftforge.event.AttachCapabilitiesEvent; -import net.minecraftforge.event.TickEvent.PlayerTickEvent; import net.minecraftforge.event.TickEvent.Phase; import net.minecraftforge.event.TickEvent.ServerTickEvent; import net.minecraftforge.event.entity.EntityAttributeModificationEvent; -import net.minecraftforge.event.entity.living.*; +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.effects.capability.RadiationCapability; +import net.nuclearteam.createnuclear.content.radiation.capability.RadiationCapability; @Mod.EventBusSubscriber public class CommentEvents { @@ -25,15 +24,17 @@ public static void attachCapabilities(AttachCapabilitiesEvent event) { } @SubscribeEvent - public static void onPlayerTick(PlayerTickEvent event) { - RadiationCapability.onPlayerTick(event); + 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) { - event.add(EntityType.PLAYER, CNAttributes.IRRADIATED_RESISTANCE.get()); + 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 index 3f1c6056e..b2b2c9d9c 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/events/RodsTooltipHandler.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/events/RodsTooltipHandler.java @@ -23,6 +23,10 @@ public static void onItemTooltip(ItemTooltipEvent event) { 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); 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 80bb32645..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 @@ -25,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 @@ -64,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/RodsStats.java b/src/main/java/net/nuclearteam/createnuclear/foundation/item/RodsStats.java index 439fede57..8b1f6f854 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/item/RodsStats.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/item/RodsStats.java @@ -44,13 +44,16 @@ private static List getRodTypeStats(Item item, Player player) { .addTo(components); CreateNuclearLang.builder() - .add(CreateNuclearLang.translate("tooltip.baseRodHeat", rodType.baseRodHeat())) + .add(CreateNuclearLang.translate("tooltip.baseRodHeat", rodType.baseRodHeat().get())) .addTo(components); CreateNuclearLang.builder() - .add(CreateNuclearLang.translate("tooltip.proximityRodHeat", rodType.proximityRodHeat())) + .add(CreateNuclearLang.translate("tooltip.proximityRodHeat", rodType.proximityRodHeat().get())) .addTo(components); CreateNuclearLang.builder() - .add(CreateNuclearLang.translate("tooltip.rodTimer", rodType.rodTimer())) + .add(CreateNuclearLang.translate("tooltip.rodTimer", rodType.rodTimer().get())) + .addTo(components); + CreateNuclearLang.builder() + .add(CreateNuclearLang.translate("tooltip.heatRatio", rodType.heatRatio().get())) .addTo(components); CreateNuclearLang.builder() .add(CreateNuclearLang.translate("tooltip.typeRod", rodType.type().name())) diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/item/radiation/RadiationBucketItem.java b/src/main/java/net/nuclearteam/createnuclear/foundation/item/radiation/RadiationBucketItem.java deleted file mode 100644 index 13127ed8e..000000000 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/item/radiation/RadiationBucketItem.java +++ /dev/null @@ -1,23 +0,0 @@ -package net.nuclearteam.createnuclear.foundation.item.radiation; - -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.nuclearteam.createnuclear.api.radiation.IRadiationSource; - -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; - } - - @Override - public double getRadiation(ItemStack stack, Player player) { - return this.radiation; - } -} diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/SmithingTransformRecipeMixin.java b/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/SmithingTransformRecipeMixin.java index 0557ad31c..52aa15a15 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/SmithingTransformRecipeMixin.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/SmithingTransformRecipeMixin.java @@ -1,15 +1,11 @@ package net.nuclearteam.createnuclear.foundation.mixin; import net.minecraft.core.RegistryAccess; -import net.minecraft.nbt.CompoundTag; import net.minecraft.world.Container; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.SmithingRecipe; import net.minecraft.world.item.crafting.SmithingTransformRecipe; import net.nuclearteam.createnuclear.CNTags; -import net.nuclearteam.createnuclear.CreateNuclear; -import net.nuclearteam.createnuclear.content.equipment.cloth.ClothItem; -import net.nuclearteam.createnuclear.foundation.util.ClothTagHelper; +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; diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/CameraAccessor.java b/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/client/CameraAccessor.java similarity index 66% rename from src/main/java/net/nuclearteam/createnuclear/foundation/mixin/CameraAccessor.java rename to src/main/java/net/nuclearteam/createnuclear/foundation/mixin/client/CameraAccessor.java index fddb0e38e..20f459f9c 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/CameraAccessor.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/client/CameraAccessor.java @@ -1,4 +1,4 @@ -package net.nuclearteam.createnuclear.foundation.mixin; // Ton package mixin +package net.nuclearteam.createnuclear.foundation.mixin.client; import net.minecraft.client.Camera; import org.spongepowered.asm.mixin.Mixin; @@ -6,7 +6,7 @@ @Mixin(Camera.class) public interface CameraAccessor { - // L'invoker permet de "débloquer" l'accès à la méthode move + // 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/GameRendererMixin.java b/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/client/GameRendererMixin.java similarity index 79% rename from src/main/java/net/nuclearteam/createnuclear/foundation/mixin/GameRendererMixin.java rename to src/main/java/net/nuclearteam/createnuclear/foundation/mixin/client/GameRendererMixin.java index 0cb336185..cd8619ab5 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/GameRendererMixin.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/client/GameRendererMixin.java @@ -1,4 +1,4 @@ -package net.nuclearteam.createnuclear.foundation.mixin; +package net.nuclearteam.createnuclear.foundation.mixin.client; import net.minecraft.client.renderer.GameRenderer; import net.nuclearteam.createnuclear.CNClientProxy; @@ -14,19 +14,19 @@ public abstract class GameRendererMixin { @Shadow private float darkenWorldAmount; - // Cette partie gère l'assombrissement du ciel/monde lors de l'explosion + // 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) { + public void CN$tick(CallbackInfo ci) { if (CNClientProxy.renderNukeSkyDarkFor > 0 && darkenWorldAmount < 1.0F) { darkenWorldAmount = Math.min(darkenWorldAmount + 0.3F, 1.0F); } } - // Cette partie appelle le rendu du flash blanc (preScreenRender) + // Triggers the white flash render (preScreenRender) @Inject( method = {"Lnet/minecraft/client/renderer/GameRenderer;render(FJZ)V"}, remap = true, @@ -36,7 +36,7 @@ public void cn_tick(CallbackInfo ci) { shift = At.Shift.AFTER ) ) - public void cn_render(float partialTick, long nanos, boolean idk, CallbackInfo ci) { + 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/RadiationHeartMixin.java b/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/client/RadiationHeartMixin.java similarity index 72% rename from src/main/java/net/nuclearteam/createnuclear/foundation/mixin/RadiationHeartMixin.java rename to src/main/java/net/nuclearteam/createnuclear/foundation/mixin/client/RadiationHeartMixin.java index 3ee3afcba..8e53aaf61 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/RadiationHeartMixin.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/mixin/client/RadiationHeartMixin.java @@ -1,4 +1,4 @@ -package net.nuclearteam.createnuclear.foundation.mixin; +package net.nuclearteam.createnuclear.foundation.mixin.client; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Gui; @@ -10,26 +10,26 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyArg; -// On cible Gui.class car c'est là que se trouve renderHeart +// 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("minecraft", "textures/gui/icons.png"); + private static final ResourceLocation VANILLA_ICONS = new ResourceLocation("textures/gui/icons.png"); @ModifyArg( - method = "renderHeart", // La méthode singulière qui dessine VRAIMENT le coeur + 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 createnuclear$changeHeartTexture(ResourceLocation originalTexture) { + private ResourceLocation CN$changeHeartTexture(ResourceLocation originalTexture) { if (originalTexture.equals(VANILLA_ICONS)) { Player player = Minecraft.getInstance().player; - // Si le joueur est irradié, on balance votre image ! + // Swap to the radiation heart texture while the player has the radiation effect if (player != null && player.hasEffect(CNEffects.RADIATION.get())) { return RADIATION_ICONS; } diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/networking/radiation/RadiationSyncPacket.java b/src/main/java/net/nuclearteam/createnuclear/foundation/networking/radiation/RadiationSyncPacket.java deleted file mode 100644 index a45d73237..000000000 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/networking/radiation/RadiationSyncPacket.java +++ /dev/null @@ -1,29 +0,0 @@ -package net.nuclearteam.createnuclear.foundation.networking.radiation; - -import com.simibubi.create.foundation.networking.SimplePacketBase; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.network.NetworkEvent; -import net.nuclearteam.createnuclear.foundation.data.radiation.ClientRadiationData; - -public class RadiationSyncPacket extends SimplePacketBase { - private final double radiation; - - public RadiationSyncPacket(double radiation) { - this.radiation = radiation; - } - - public RadiationSyncPacket(FriendlyByteBuf buffer) { - this(buffer.readDouble()); - } - - @Override - public void write(FriendlyByteBuf buffer) { - buffer.writeDouble(radiation); - } - - @Override - public boolean handle(NetworkEvent.Context context) { - context.enqueueWork(() -> new ClientRadiationData(radiation)); - return true; - } -} 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 09369e3d5..d3a0f787a 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/ponder/CNPonderIndex.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/ponder/CNPonderIndex.java @@ -19,11 +19,13 @@ public static void register(PonderSceneRegistrationHelper help HELPER.forComponents(CNBlocks.REACTOR_CONTROLLER) .addStoryBoard("reactor/reactor_t1_ponder", CNPonderReactorScenes::t1) .addStoryBoard("reactor/reactor_t2_ponder", CNPonderReactorScenes::t2) - .addStoryBoard("reactor/reactor_t3_ponder", CNPonderReactorScenes::t3); + .addStoryBoard("reactor/reactor_t3_ponder", CNPonderReactorScenes::t3) + .addStoryBoard("reactor/reactor_t1_ponder", CNPonderReactorScenes::ioPlacement); HELPER.forComponents(CNItems.REACTOR_BLUEPRINT) .addStoryBoard("reactor/reactor_t1_ponder", CNPonderReactorScenes::t1) .addStoryBoard("reactor/reactor_t2_ponder", CNPonderReactorScenes::t2) - .addStoryBoard("reactor/reactor_t3_ponder", CNPonderReactorScenes::t3); + .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/util/ClothTagHelper.java b/src/main/java/net/nuclearteam/createnuclear/foundation/utility/ClothTagHelper.java similarity index 96% rename from src/main/java/net/nuclearteam/createnuclear/foundation/util/ClothTagHelper.java rename to src/main/java/net/nuclearteam/createnuclear/foundation/utility/ClothTagHelper.java index 4644a38cf..298d60943 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/util/ClothTagHelper.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/utility/ClothTagHelper.java @@ -1,4 +1,4 @@ -package net.nuclearteam.createnuclear.foundation.util; +package net.nuclearteam.createnuclear.foundation.utility; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/utility/InventoryHashUtil.java b/src/main/java/net/nuclearteam/createnuclear/foundation/utility/InventoryHashUtil.java index 521745f62..1863a8e65 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/utility/InventoryHashUtil.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/utility/InventoryHashUtil.java @@ -17,8 +17,9 @@ *

Implementation details: * - Empty stacks contribute {@code 0}. * - Each non-empty stack contributes a value computed from the numeric item id, - * stack count, optional damage value (for damageable items), and the NBT tag's - * {@code hashCode()} when present. + * 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()}).

* @@ -45,7 +46,7 @@ public class InventoryHashUtil { * 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, damage, tag.hashCode()). It is + * and basic stack properties (count, tag.hashCode()). It is * intentionally simple and optimized for speed rather than * cryptographic strength. */ @@ -73,7 +74,7 @@ public static long compute(Player player) { * *

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

+ * 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} @@ -87,10 +88,6 @@ private static long stackHash(ItemStack stack) { long h = Item.getId(stack.getItem()); h = 31 * h + stack.getCount(); - if (stack.isDamageableItem()) { - h = 31 * h + stack.getDamageValue(); - } - if (stack.hasTag()) { h = 31 * h + stack.getTag().hashCode(); } diff --git a/src/main/java/net/nuclearteam/createnuclear/foundation/utility/Maths.java b/src/main/java/net/nuclearteam/createnuclear/foundation/utility/Maths.java index e3a672e79..293ba522b 100644 --- a/src/main/java/net/nuclearteam/createnuclear/foundation/utility/Maths.java +++ b/src/main/java/net/nuclearteam/createnuclear/foundation/utility/Maths.java @@ -24,7 +24,6 @@ import net.minecraft.world.phys.shapes.BooleanOp; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; -import net.nuclearteam.createnuclear.content.explosion.CNAnimation; public class Maths { public static final Direction[] HORIZONTAL_DIRECTIONS; @@ -40,16 +39,6 @@ public static float smin(float a, float b, float k) { return Math.min(a, b) - h * h * k * 0.25F; } - public static float cullAnimationTick(int tick, float amplitude, CNAnimation animation, float partialTick, int startOffset) { - return cullAnimationTick(tick, amplitude, animation, partialTick, startOffset, animation.getDuration() - startOffset); - } - - public static float cullAnimationTick(int tick, float amplitude, CNAnimation animation, float partialTick, int startOffset, int endAt) { - float i = Mth.clamp((float)tick + partialTick - (float)startOffset, 0.0F, (float)endAt); - float f = (float)Math.sin((double)(i / (float)endAt) * Math.PI) * amplitude; - return smin(f, 1.0F, 0.1F); - } - public static float sampleNoise2D(int x, int z, float simplexSampleRate) { return (float) SimplexNoise.noise((double)(((float)x + simplexSampleRate) / simplexSampleRate), (double)(((float)z + simplexSampleRate) / simplexSampleRate)); } 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..4f0ea062f --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/gametest/DefaultHeatCalculatorGameTest.java @@ -0,0 +1,164 @@ +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.baseValueGraphite.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); + + double heat = CALCULATOR.computeHeat(null, null, inventory, /*overHeat*/ 0.0, displayState, helper.getLevel()); + + helper.assertTrue(Math.abs(heat - baseRodHeat) < DELTA, + "a cooler contributes its own baseRodHeat exactly like a fuel rod would, when isolated: expected " + + baseRodHeat + ", got " + heat); + helper.succeed(); + } + + // ================================================================ + // 3. fuel/cooler mix adjacency: documents the fuel<->cooler asymmetry (AUDIT_ACTUEL.md §2.2) + // ================================================================ + + /** + * 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 that only + * ever originate from a FUEL rod's own neighbor scan (a cooler's scan never contributes, + * even though its neighbor is a fuel rod): + *

    + *
  • 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) -> + B.baseRodHeat() / C.proximityRodHeat()
  • + *
  • C's scan (cooler) -> nothing at all, regardless of its fuel neighbor B
  • + *
+ */ + @GameTest(template = STRUCTURE) + public static void fuelCoolerMix_onlyFuelScansContributeProximityHeat_coolerAdjacencyIsAsymmetric(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.baseValueUranium.get(); + float uraniumProxy = CNConfigs.server().rods.uraniumProxyBonus.get(); + int thoriumBase = CNConfigs.server().rods.baseValueThorium.get(); + float thoriumProxy = CNConfigs.server().rods.thoriumProxyBonus.get(); + int graphiteBase = CNConfigs.server().rods.baseValueGraphite.get(); + float graphiteProxy = CNConfigs.server().rods.graphiteProxyMalus.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); + // B's scan: cooler neighbor C -> division (fuel.base / cooler.proximity) + // C's scan contributes 0: a cooler never examines its own neighbors + + helper.assertTrue(Math.abs(heat - expected) < DELTA, + "cooler-side proximity must not contribute anything, even though C is adjacent to fuel rod B: expected " + + expected + ", 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..b645f3b09 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/gametest/ReactorInputFluidManagerGameTest.java @@ -0,0 +1,494 @@ +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" assert the documented/intended behavior of + * extractFluids and are EXPECTED TO FAIL against the current implementation + * (AUDIT_ACTUEL.md, ReactorInputFluidManager.java:137-155). They act as regression + * markers for the future fix. Tests named "*_currentBehavior"/"*_characterization" + * assert what the code does today and should keep passing until that fix lands. + */ +@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(); + } + + /** + * Characterizes the CURRENT (buggy) behavior: "if (toExtract > 1)" silently ignores + * a request for exactly 1 unit. This test PASSES today. + */ + @GameTest(template = STRUCTURE) + public static void extractFluids_needOfOne_isSilentlyIgnored_currentBehavior(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, "current implementation ignores single-unit extraction requests"); + helper.assertTrue(tankAmount(helper, rel) == 5, "tank should be untouched: the toExtract>1 guard blocks the drain"); + helper.succeed(); + } + + /** + * Asserts the intended contract: a request for exactly 1 unit with stock available + * should succeed. FAILS TODAY against ReactorInputFluidManager.java:147 + * ("if (toExtract > 1)") — acts as a regression marker for the fix. + */ + @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(); + } + + /** + * Characterizes the CURRENT (buggy) over-extraction: fluidNeeded is never + * decremented between handlers, so both handlers get drained in full. + * This test PASSES today. + */ + @GameTest(template = STRUCTURE) + public static void extractFluids_twoHandlers_currentBuggyBehavior_characterization(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); + + helper.assertTrue(tankAmount(helper, rel1) == 0, "handler1 fully drained"); + helper.assertTrue(tankAmount(helper, rel2) == 0, + "handler2 is ALSO fully drained: over-extraction bug removes 20 units for a request of 10"); + helper.succeed(); + } + + /** + * Asserts the intended contract: extracting 10 units from a 20-unit pool spread + * across two handlers should leave 10 total remaining. FAILS TODAY against + * ReactorInputFluidManager.java:137-155 (fluidNeeded never decremented) — this is + * the flagship regression marker for the ticket's main bug. + */ + @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(); + } + + /** + * Documents a related contract mismatch found while designing this suite (not the + * ticket's main bug): the Javadoc promises "true if the full amount was extracted", + * but the implementation returns true after any partial extraction. This test + * asserts the CURRENT behavior and passes today; it is not a fix marker. + */ + @GameTest(template = STRUCTURE) + public static void extractFluids_returnsTrueEvenWhenNotFullyExtracted_javadocMismatch(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/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/CNCClient.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNCClient.java index fd764d949..71693c21b 100644 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNCClient.java +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNCClient.java @@ -6,7 +6,7 @@ public class CNCClient extends ConfigBase { public final ConfigBool nuclearBombFlash = b(true, "nuclearBombFlash", Comments.nuclearBombFlash); - public ConfigBool screenShaking = b(true, "nuclearBombFlash", Comments.screenShaking);; + public ConfigBool screenShaking = b(true, "screenShaking", Comments.screenShaking); @Override public String getName() { return "Client"; } 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 22279fa65..a5ea68a47 100644 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNCCommon.java +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNCCommon.java @@ -13,6 +13,5 @@ public String getName() { private static class Comments { static String worldGen = "Modify CreateNuclear's impact on your terrain"; - static String explode = "Modify the parameters of the explosion"; } } 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 36bfbebd6..93e1d1bda 100644 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNCServer.java +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CNCServer.java @@ -4,9 +4,11 @@ public class CNCServer extends ConfigBase { public final CRods rods = nested(0, CRods::new, Comments.rods); -// public final CExplode explode = nested(0, CExplode::new, Comments.explode); public final CNotify notify = nested(0, CNotify::new,Comments.ratio); 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"; @@ -14,8 +16,9 @@ public String getName() { private static class Comments { static String rods = "Modify the duration and configuration of rods."; - static String explode = "[WIP] Modify the parameters of the explosion"; static String radiation = "Enable or disable radiation effects emitted by mod items. "; static String ratio = "Ratio"; + static String reactorHeat = "Heat thresholds for different reactor sizes"; + static String biomeRestore = ""; } } diff --git a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CRadiation.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CRadiation.java index 6ce22d818..bd252ad4c 100644 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CRadiation.java +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CRadiation.java @@ -73,8 +73,6 @@ public void registerAll(ForgeConfigSpec.Builder builder) { ), obj -> obj instanceof String ); - - builder.pop(); } @Override 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 8de36b967..78791658c 100644 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CRods.java +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/config/CRods.java @@ -11,11 +11,18 @@ public class CRods extends ConfigBase { public final ConfigInt uraniumRodLifetime = i(3600, 100, 5000, "Uranium rod lifetime (in ticks)", Comments.uraniumRodLifetime, Comments.hintTick); public final ConfigInt uraniumProxyBonus = i(32, -70, 70, "Heat bonus from nearby uranium rods", Comments.warning, Comments.uraniumProximityBonus); public final ConfigInt baseValueUranium = i(64, -70, 70, "Base heat value for uranium rods", 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 (cooling) rod lifetime (in ticks)", Comments.graphiteRodLifetime, Comments.hintTick); - public final ConfigFloat graphiteProxyMalus = f((float) -1/4, -70, 70, "Heat penalty from nearby graphite rods", Comments.warning, Comments.graphiteProximityMalus); + // 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 graphiteProxyMalus = f(-4, -70, 70, "Heat penalty from nearby graphite rods", Comments.warning, Comments.graphiteProximityMalus); public final ConfigInt baseValueGraphite = i(-32, -50, 50, "Base heat value for graphite rods", Comments.warning, Comments.graphiteBaseValue); + public final ConfigInt graphiteHeatRatio = i(-6, -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() { @@ -33,10 +40,16 @@ private static class Comments { static String uraniumRodLifetime = "Lifetime of uranium rods in the reactor"; static String uraniumProximityBonus = "Bonus heat 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 the reactor"; static String graphiteProximityMalus = "Penalty to heat 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"; } } 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 39a350836..90cf0d31f 100644 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/data/CreateNuclearDatagen.java +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/data/CreateNuclearDatagen.java @@ -15,7 +15,6 @@ 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; @@ -39,10 +38,8 @@ public static void gatherData(GatherDataEvent event) { 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()) { }*/ @@ -62,6 +59,7 @@ 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/ponder/scenes/CNPonderReactorScenes.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/ponder/scenes/CNPonderReactorScenes.java index 2c4e861b8..f5e43efac 100644 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/ponder/scenes/CNPonderReactorScenes.java +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/ponder/scenes/CNPonderReactorScenes.java @@ -6,6 +6,8 @@ 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; @@ -22,29 +24,37 @@ public class CNPonderReactorScenes { private static final int S_T3 = 9; private static final int H_T3 = 11; - private static final int PEDESTAL_Y = 0; // couche de piedestal (snow/concrete) + 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; } - /** * Conteneur simple pour stocker toutes les positions d'intérêt d'un multiblock. * Les BlockPos ici doivent être EN COORDONNÉES SCÈNE (0..plate-1 pour X/Z, 1..H pour Y). */ - private static class Positions { - final BlockPos controller, input1, input2, liquidInput, alarm, output; - Positions(BlockPos controller, BlockPos input1, BlockPos input2, BlockPos liquidInput, BlockPos alarm, BlockPos output) { - this.controller = controller; - this.input1 = input1; - this.input2 = input2; - this.liquidInput = liquidInput; - this.alarm = alarm; - this.output = output; + /** + * 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}; } } - /** * Map statique – remplis/ajuste les coordonnées ici pour chaque taille (multiblockSize). * Exemple : clef = 5 pour S_T1 (5x5), 7 pour S_T2, 9 pour S_T3. * * Règle : x/z en 0..plate-1, y en 1..H ; adapte ces valeurs exactement comme dans ton NBT. */ + /** 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 { - // Exemple pour T1 (multiblockSize = 5) - // plate = 5 + 4 = 9 => x/z valides : 0..8 ; multiblock intérieur : 2..6 + // 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 @@ -54,7 +64,7 @@ private static class Positions { new BlockPos(5, 2, 6) // output )); - // Exemple pour T2 (multiblockSize = 7) + // Example for T2 (multiblockSize = 7) STATIC_POS.put(7, new Positions( new BlockPos(5, 5, 8), // controller new BlockPos(3, 3, 8), // input1 @@ -64,7 +74,7 @@ private static class Positions { new BlockPos(7, 3, 8) // output )); - // Exemple pour T3 (multiblockSize = 9) + // Example for T3 (multiblockSize = 9) STATIC_POS.put(9, new Positions( new BlockPos(6, 6, 10), // controller new BlockPos(5, 4, 10), // input1 @@ -75,12 +85,31 @@ private static class Positions { )); } - /** * Retourne les positions statiques pour la taille donnée. * Si aucune entrée statique n'existe, retourne des positions calculées "raisonnables". */ + /** + * 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 : calcul simple centré (si tu veux éviter un NPE) + // fallback: simple centered calculation (avoids an NPE) int plate = plateSizeFor(multiblockSize); int offset = MARGIN; int cx = offset + (multiblockSize / 2); @@ -88,82 +117,65 @@ private static Positions positionsFor(int multiblockSize, int height) { 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 devant + 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 derrière + 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 à droite + 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); - BlockPos controller = pos.controller; - BlockPos output = pos.output; - BlockPos input1 = pos.input1; - BlockPos input2 = pos.input2; - BlockPos liquidInput = pos.liquidInput; - BlockPos alarm = pos.alarm; + 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(8) + scene.overlay().showText(bySections ? 25 : 8) .text("Floor " + y) .attachKeyFrame() .placeNearTarget(); - for (int x = 0; x < plate; x++) { - for (int z = 0; z < plate; z++) { - scene.world().showSection(util.select().position(x, y, z), Direction.NORTH); - scene.idle(4); - - if (x == input1.getX() && y == input1.getY() && z == input1.getZ()) { - scene.overlay().showText(90) - .text("Input: stores one stack of rod (free placing : can replace any casing not in the edge)") - .pointAt(util.vector().blockSurface(input1, Direction.UP)) - .attachKeyFrame() - .placeNearTarget(); - scene.idle(80); - } - if (x == input2.getX() && y == input2.getY() && z == input2.getZ()) { - scene.overlay().showText(110) - .text("Second input: needed because you will likely have one input " + - "of fuel rod and one for coolant (free placing)") - .pointAt(util.vector().blockSurface(input2, Direction.UP)) - .attachKeyFrame() - .placeNearTarget(); - scene.idle(80); - } - if (x == liquidInput.getX() && y == liquidInput.getY() && z == liquidInput.getZ()) { - scene.overlay().showText(90) - .text("Liquid Input: cooling fluid inlet (free placing)") - .pointAt(util.vector().blockSurface(liquidInput, Direction.UP)) - .attachKeyFrame() - .placeNearTarget(); - scene.idle(80); - } - if (x == alarm.getX() && y == alarm.getY() && z == alarm.getZ()) { - scene.overlay().showText(90) - .text("Alarm: will sound if reactor overheats (free placing)") - .pointAt(util.vector().blockSurface(alarm, Direction.UP)) - .attachKeyFrame() - .placeNearTarget(); - scene.idle(80); - } - if (x == output.getX() && y == output.getY() && z == output.getZ()) { - scene.overlay().showText(90) - .text("Output: where the generated power is extracted (free placing)") - .pointAt(util.vector().blockSurface(output, Direction.UP)) - .attachKeyFrame() - .placeNearTarget(); - scene.idle(80); + 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); } - if (x == controller.getX() && y == controller.getY() && z == controller.getZ()) { - scene.overlay().showText(110) - .text("Controller: brain of the reactor, and the place where the blueprint goes to start it") - .pointAt(util.vector().blockSurface(controller, Direction.DOWN)) - .attachKeyFrame() - .placeNearTarget(); - scene.idle(80); + } + } 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); + } } } } @@ -173,16 +185,33 @@ private static void showReactorStructure(SceneBuilder scene, SceneBuildingUtil u 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(controller, Direction.EAST); + 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(controller, s -> s.setValue(ReactorControllerBlock.ASSEMBLED, true), true); + 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, H = H_T1; + int S = S_T1; int plate = plateSizeFor(S); scene.title("reactor_t1","Reactor T1"); scene.configureBasePlate(0, 0, plate); @@ -190,11 +219,11 @@ public static void t1(SceneBuilder scene, SceneBuildingUtil util) { scene.showBasePlate(); scene.rotateCameraY(180); scene.scaleSceneView(0.55f); - showReactorStructure(scene, util, S, H, plate); + showReactorStructure(scene, util, S, H_T1, plate, true); } public static void t2(SceneBuilder scene, SceneBuildingUtil util) { - int S = S_T2, H = H_T2; + int S = S_T2; int plate = plateSizeFor(S); scene.title("reactor_t2","Reactor T2"); scene.configureBasePlate(0, 0, plate); @@ -202,11 +231,11 @@ public static void t2(SceneBuilder scene, SceneBuildingUtil util) { scene.showBasePlate(); scene.rotateCameraY(180); scene.scaleSceneView(0.45f); - showReactorStructure(scene, util, S, H, plate); + showReactorStructure(scene, util, S, H_T2, plate, true); } public static void t3(SceneBuilder scene, SceneBuildingUtil util) { - int S = S_T3, H = H_T3; + int S = S_T3; int plate = plateSizeFor(S); scene.title("reactor_t3","Reactor T3"); scene.configureBasePlate(0, 0, plate); @@ -214,6 +243,106 @@ public static void t3(SceneBuilder scene, SceneBuildingUtil util) { scene.showBasePlate(); scene.rotateCameraY(180); scene.scaleSceneView(0.35f); - showReactorStructure(scene, util, S, H, plate); + // 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); } -} \ No newline at end of file +} 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 67e509be8..cdee138f3 100644 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/CNConfiguredFeatures.java +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/CNConfiguredFeatures.java @@ -34,29 +34,29 @@ 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, 10)); + register(ctx, LEAD_ORE, Feature.ORE, new OreConfiguration(leadTargetStates, 12)); List thoriumTargetStates = List.of( OreConfiguration.target(stoneOreReplaceable, CNBlocks.THORIUM_ORE.getDefaultState()), - OreConfiguration.target(deepslateOreReplaceables, CNBlocks.DEEPSLATE_THORIUM_ORE.getDefaultState()) + OreConfiguration.target(deepslateOreReplaceable, CNBlocks.DEEPSLATE_THORIUM_ORE.getDefaultState()) ); - register(ctx, THORIUM_ORE, Feature.ORE, new OreConfiguration(thoriumTargetStates, 16)); + register(ctx, THORIUM_ORE, Feature.ORE, new OreConfiguration(thoriumTargetStates, 12)); List nitrateTargetStates = List.of( OreConfiguration.target(stoneOreReplaceable, CNBlocks.NITRATE_ORE.getDefaultState()), - OreConfiguration.target(deepslateOreReplaceables, CNBlocks.DEEPSLATE_NITRATE_ORE.getDefaultState()) + OreConfiguration.target(deepslateOreReplaceable, CNBlocks.DEEPSLATE_NITRATE_ORE.getDefaultState()) ); register(ctx, NITRATE_ORE, Feature.ORE, new OreConfiguration(nitrateTargetStates, 10)); 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 85c73ce7b..3a0e2221c 100644 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/CNPlacedFeatures.java +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/CNPlacedFeatures.java @@ -35,11 +35,11 @@ public static void bootstrap(BootstapContext ctx) { Holder> nitrateOre = featureLookup.getOrThrow(CNConfiguredFeatures.NITRATE_ORE); Holder> striatedOresOverworld = featureLookup.getOrThrow(CNConfiguredFeatures.STRIATED_ORES_OVERWORLD); - register(ctx, URANIUM_ORE, uraniumOre, placementOres(CountPlacement.of(7), -63, 16)); - register(ctx, LEAD_ORE, leadOre, placementOres(CountPlacement.of(10), -16, 112)); - register(ctx, THORIUM_ORE, thoriumOre, placementOres(CountPlacement.of(16), -16, 112)); + 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(18), -30, 70)); + register(ctx, STRIATED_ORES_OVERWORLD, striatedOresOverworld, placement(RarityFilter.onAverageOnceEvery(64), -63, 16)); } 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..4dde73a15 --- /dev/null +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/BiomeIrradiationService.java @@ -0,0 +1,118 @@ +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.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.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 index e20dbd6be..ead5d6659 100644 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/CNBiomes.java +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/CNBiomes.java @@ -4,6 +4,7 @@ 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; @@ -12,17 +13,17 @@ public class CNBiomes { public static final class Irradiated { - public static final ResourceKey PLAIN = key("irradiated_plain"); + 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); - - context.register(Irradiated.PLAIN, IrradiatedBiomes.createPlain(featureLookup, carverLookup)); + 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)); } -} \ No newline at end of file +} 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 index 1528bd148..f5a6fe1c6 100644 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/CNDensityFunctions.java +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/CNDensityFunctions.java @@ -6,13 +6,10 @@ 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.NoiseRouterData; import net.minecraft.world.level.levelgen.synth.BlendedNoise; import net.nuclearteam.createnuclear.CreateNuclear; public class CNDensityFunctions { - public static final ResourceKey NOODLES = createKey("caves/noodles"); - public static final class Irradiated { public static final ResourceKey EROSION = createKey("irradiated/erosion"); public static final ResourceKey FINAL_DENSITY = createKey("irradiated/final_density"); @@ -23,12 +20,6 @@ private static ResourceKey createKey(String id) { } public static void bootstrapRegistries(BootstapContext context) { - var vanillaRegistry = context.lookup(Registries.DENSITY_FUNCTION); - var noiseRegistry = context.lookup(Registries.NOISE); -// DensityFunction shiftX = getFunction(vanillaRegistry, NoiseRouterData.SHIFT_X); -// DensityFunction shiftZ = getFunction(vanillaRegistry, NoiseRouterData.SHIFT_Z); -// DensityFunction y = getFunction(vanillaRegistry, NoiseRouterData.Y); - context.register(Irradiated.EROSION, DensityFunctions.add( DensityFunctions.yClampedGradient(0, 90, 1, -1), BlendedNoise.createUnseeded(0.25, 0.375, 80.0, 160.0, 8.0) 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 index a5245463d..775908820 100644 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/CNNoiseData.java +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/CNNoiseData.java @@ -8,17 +8,13 @@ public class CNNoiseData { public static final ResourceKey EROSION = createKey("irradiated/erosion"); - public static final ResourceKey BASALT_MARE = createKey("irradiated/basalt_mare"); - public static final ResourceKey BASALT_MARE_HEIGHT = createKey("irradiated/basalt_mare_height"); private static ResourceKey createKey(String id) { return ResourceKey.create(Registries.NOISE, CreateNuclear.asResource(id)); } public static void bootstrapRegistries(BootstapContext context) { -// register(context, EROSION, -11, 1, 1, 0, 1, 1); -// register(context, BASALT_MARE, 5, 0, 0.1, 0.2, 0.1, 0, 0, 0, 0); -// register(context, BASALT_MARE_HEIGHT, -12, 0.3); + register(context, EROSION, -9, 1.0, 1.0, 0.0, 1.0, 1.0); } private static void register( 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 index 52e6d466f..2c8c02c89 100644 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/CNNoiseGeneratorSettings.java +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/CNNoiseGeneratorSettings.java @@ -11,7 +11,6 @@ import net.nuclearteam.createnuclear.CNBlocks; import net.nuclearteam.createnuclear.CreateNuclear; import net.nuclearteam.createnuclear.infrastructure.worldgen.biome.surfacerule.IrradiatedSurfaceRules; -import net.nuclearteam.createnuclear.infrastructure.worldgen.biome.surfacerule.IrradiatedSurfaceRules2; import org.jetbrains.annotations.NotNull; public class CNNoiseGeneratorSettings { @@ -26,7 +25,7 @@ public static void bootstrapRegistries(BootstapContext c CNBlocks.STEEL_BLOCK.get().defaultBlockState(), Blocks.AIR.defaultBlockState(), CNNoiseGeneratorSettings.irradiated(densityLookup, noiseLookup), - IrradiatedSurfaceRules2.DEFAULT_RULE, + IrradiatedSurfaceRules.DEFAULT_RULE, new OverworldBiomeBuilder().spawnTarget(), 32, false, 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 index 9972b06c8..4a3a99ec9 100644 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/IrradiatedBiomes.java +++ b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/IrradiatedBiomes.java @@ -1,66 +1,48 @@ package net.nuclearteam.createnuclear.infrastructure.worldgen.biome; import net.minecraft.core.HolderGetter; +import net.minecraft.core.registries.Registries; import net.minecraft.data.worldgen.Carvers; import net.minecraft.data.worldgen.placement.MiscOverworldPlacements; -import net.minecraft.world.entity.MobCategory; +import net.minecraft.resources.ResourceKey; +import net.minecraft.sounds.SoundEvent; import net.minecraft.world.level.biome.*; import net.minecraft.world.level.levelgen.GenerationStep; import net.minecraft.world.level.levelgen.carver.ConfiguredWorldCarver; import net.minecraft.world.level.levelgen.placement.PlacedFeature; -import net.nuclearteam.createnuclear.CNEntityType; +import net.nuclearteam.createnuclear.CNSoundEvents; import net.nuclearteam.createnuclear.content.particles.IrradiatedParticlesData; public class IrradiatedBiomes { - public static Biome createPlain(HolderGetter featureLookup, HolderGetter> carverLookup) { - return IrradiatedBiomes.irradiated(featureLookup, carverLookup, new BiomeGenerationSettings.Builder(featureLookup, carverLookup)); + public static Biome createPlain(HolderGetter featureLookup, HolderGetter> carverLookup, HolderGetter soundLookup) { + return IrradiatedBiomes.irradiated(featureLookup, carverLookup, soundLookup, new BiomeGenerationSettings.Builder(featureLookup, carverLookup)); } - public static void monsters(MobSpawnSettings.Builder builder, int zombieWeight, int zombieVillagerWeight, int skeletonWeight) { - - // builder.addSpawn(MobCategory.MONSTER, new MobSpawnSettings.SpawnerData(CNEntityType.IRRADIATED_CAT.get(), 100, 2, 4)); - // builder.addSpawn(MobCategory.MONSTER, new MobSpawnSettings.SpawnerData(CNEntityType.IRRADIATED_CHICKEN.get(), 100, 1, 4)); - // builder.addSpawn(MobCategory.MONSTER, new MobSpawnSettings.SpawnerData(CNEntityType.IRRADIATED_WOLF.get(), 100, 2, 4)); - } - - - - public static void addDefaultIrradiatedOres(BiomeGenerationSettings.Builder builder) { - builder.addFeature(GenerationStep.Decoration.UNDERGROUND_STRUCTURES, MiscOverworldPlacements.BLUE_ICE); - builder.addCarver(GenerationStep.Carving.AIR, Carvers.NETHER_CAVE); - } - - public static void addDefaultSoftDisks(BiomeGenerationSettings.Builder builder) { - builder.addFeature(GenerationStep.Decoration.SURFACE_STRUCTURES, MiscOverworldPlacements.VOID_START_PLATFORM); - } - - public static Biome irradiated(HolderGetter featureGetter, HolderGetter> carverGetter, BiomeGenerationSettings.Builder generation) { + 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 - // Eau : Verte croupie - .waterColor(0x3B5133) - .waterFogColor(0x0A0E0A) - - // BROUILLARD : Vert radioactif maladif (plus vif pour être visible) - .fogColor(0x485E3E) + // Water: murky green + .waterColor(0x3B5133) + .waterFogColor(0x0A0E0A) - // CIEL : Gris-vert délavé (permet de voir le soleil/lune et le cycle jour/nuit) - .skyColor(0x324132) + // Fog: sickly radioactive green (kept bright so it stays visible) + .fogColor(0x485E3E) - // HERBE : Jaune "soufre" / Brûlée - .grassColorOverride(0x8C8F5B) + // Sky: washed-out grey-green (still lets the sun/moon and day-night cycle show through) + .skyColor(0x324132) - // FEUILLES : Olive desséché - .foliageColorOverride(0x565E3E) + // Grass: sulfur yellow / scorched + .grassColorOverride(0x8C8F5B) - .ambientParticle(new AmbientParticleSettings(new IrradiatedParticlesData(), 0.025F)) - .ambientMoodSound(AmbientMoodSettings.LEGACY_CAVE_SETTINGS); + // Foliage: withered olive + .foliageColorOverride(0x565E3E) - IrradiatedBiomes.addDefaultIrradiatedOres(generation); - IrradiatedBiomes.addDefaultSoftDisks(generation); - IrradiatedBiomes.monsters(spawnBuilder, 95, 5, 100); + .ambientParticle(new AmbientParticleSettings(new IrradiatedParticlesData(), 0.025F)) + .ambientMoodSound(AmbientMoodSettings.LEGACY_CAVE_SETTINGS) + .ambientLoopSound(soundLookup.getOrThrow(ResourceKey.create(Registries.SOUND_EVENT, CNSoundEvents.BIOME_WASTELAND.getId()))) + ; return new Biome.BiomeBuilder() .mobSpawnSettings(spawnBuilder.build()) 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 index 25ba3b0ae..033b5dabc 100644 --- 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 @@ -19,7 +19,7 @@ public KeyDispatchDataCodec codec() { @Override public SurfaceRules.Condition apply(SurfaceRules.Context context) { - return null; + return new Predicate(context); } private class Predicate extends SurfaceRules.LazyYCondition { 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 index 19a78bfbc..a12cb4852 100644 --- 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 @@ -1,30 +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 SurfaceRules.RuleSource BEDROCK = block(Blocks.BEDROCK); - public static final SurfaceRules.RuleSource HARD_ROCK = block(CNBlocks.ENRICHED_SOUL_SOIL.get()); + private static final ConditionSource IS_IRRADIATED_PLAIN = biome(CNBiomes.Irradiated.PLAIN); - public static final SurfaceRules.RuleSource IRRADIATED = createDefaultRule(); + 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()); - public static @NotNull SurfaceRules.RuleSource createDefaultRule() { + 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), - HARD_ROCK - ), - SurfaceRules.ifTrue(SurfaceRules.verticalGradient("bedrock_floor", VerticalAnchor.bottom(), VerticalAnchor.aboveBottom(5)), BEDROCK) + 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 SurfaceRules.RuleSource block(@NotNull Block block) { + 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/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/surfacerule/IrradiatedSurfaceRules2.java b/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/surfacerule/IrradiatedSurfaceRules2.java deleted file mode 100644 index 538dc3d11..000000000 --- a/src/main/java/net/nuclearteam/createnuclear/infrastructure/worldgen/biome/surfacerule/IrradiatedSurfaceRules2.java +++ /dev/null @@ -1,90 +0,0 @@ -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 IrradiatedSurfaceRules2 { - private static final ConditionSource IS_IRRADIATED_PLAIN = biome(CNBiomes.Irradiated.PLAIN); - private static final ConditionSource IS_HIGHLANDS = biome(); - - 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 MOON_DIRT = block(CNBlocks.STEEL_BLOCK.get()); - private static final RuleSource LEAD_ROCK = block(CNBlocks.LEAD_BLOCK.get()); - private static final RuleSource LEAD_TURF = block(CNBlocks.LEAD_ORE.get()); - private static final RuleSource RAW_LEAD_BASALT = block(CNBlocks.RAW_LEAD_BLOCK.get()); - private static final RuleSource DEBUG_STATE = block(CNBlocks.REACTOR_CASING.get()); - - private static final RuleSource SECONDARY_MATERIAL = SurfaceRules.sequence( - SurfaceRules.ifTrue(IS_IRRADIATED_PLAIN, RAW_LEAD_BASALT), - SurfaceRules.ifTrue(IS_HIGHLANDS, MOON_DIRT) - ); - private static final RuleSource SURFACE_MATERIAL = SurfaceRules.sequence( - SurfaceRules.ifTrue(IS_IRRADIATED_PLAIN, RAW_LEAD_BASALT), - SurfaceRules.ifTrue(IS_HIGHLANDS, LEAD_TURF) - ); - private static final RuleSource SURFACE_GENERATION = SurfaceRules.sequence( - SurfaceRules.ifTrue(SurfaceRules.ON_FLOOR, SURFACE_MATERIAL), - SurfaceRules.ifTrue(SurfaceRules.UNDER_FLOOR, SECONDARY_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_TURF - ), - SurfaceRules.ifTrue( - SurfaceRules.noiseCondition(CNNoiseData.EROSION, 0.039, 0.0545), - LEAD_ROCK - ), - SurfaceRules.ifTrue( - SurfaceRules.noiseCondition(CNNoiseData.EROSION, 0.0545, 0.069), - RAW_LEAD_BASALT - ) - ) - ), - - 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/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 8b659cd73..6a27be52a 100644 --- a/src/main/resources/assets/createnuclear/lang/default/interface.json +++ b/src/main/resources/assets/createnuclear/lang/default/interface.json @@ -1,6 +1,7 @@ { "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", 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 40d1bb18e..af7439ee8 100644 --- a/src/main/resources/assets/createnuclear/lang/default/potion.json +++ b/src/main/resources/assets/createnuclear/lang/default/potion.json @@ -17,15 +17,15 @@ "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", - "effect.createnuclear.iodine_protection": "Protection Iodine", + "effect.createnuclear.iodine": "Iodine", - "item.minecraft.potion.effect.potion_of_protection_iodine": "Potion of Protection Iodine", - "item.minecraft.splash_potion.effect.potion_of_protection_iodine": "Splash Potion of Protection Iodine", - "item.minecraft.lingering_potion.effect.potion_of_protection_iodine": "Lingering Potion of Protection Iodine", - "item.minecraft.tipped_arrow.effect.potion_of_protection_iodine": "Arrow of Protection 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_protection_iodine_augment": "Potion of Protection Iodine", - "item.minecraft.splash_potion.effect.potion_of_protection_iodine_augment": "Splash Potion of Protection Iodine", - "item.minecraft.lingering_potion.effect.potion_of_protection_iodine_augment": "Lingering Potion of Protection Iodine", - "item.minecraft.tipped_arrow.effect.potion_of_protection_iodine_augment": "Arrow of Protection 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 d86cf9c6c..1aaa260f9 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,12 +33,14 @@ "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 cooling and fuel 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.", @@ -45,13 +51,15 @@ "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.heatRatio": "Heat Ratio: %d", "createnuclear.tooltip.typeRod": "Rod Type: %s", - "createnuclear.tooltip.cloth.color": "Color of armor piece: %s", "tag.item.c.coal_dusts": "Coal Dusts", @@ -68,8 +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 cf6826744..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", 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 5272affa5..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é", 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/liquid_input/liquid_input.json b/src/main/resources/assets/createnuclear/models/block/reactor/fluid_input/fluid_input.json similarity index 97% rename from src/main/resources/assets/createnuclear/models/block/reactor/liquid_input/liquid_input.json rename to src/main/resources/assets/createnuclear/models/block/reactor/fluid_input/fluid_input.json index 0abd04013..91e7ce7d6 100644 --- a/src/main/resources/assets/createnuclear/models/block/reactor/liquid_input/liquid_input.json +++ b/src/main/resources/assets/createnuclear/models/block/reactor/fluid_input/fluid_input.json @@ -3,7 +3,7 @@ "parent": "block/block", "textures": { "0": "createnuclear:block/reactor/casing/reactor_casing", - "1": "createnuclear:block/reactor/liquid_input/input", + "1": "createnuclear:block/reactor/fluid_input/fluid_input", "2": "createnuclear:block/reactor/casing/reactor_casing", "particle": "createnuclear:block/reactor/casing/reactor_casing" }, diff --git a/src/main/resources/assets/createnuclear/models/block/reactor/input/input_vertical.json b/src/main/resources/assets/createnuclear/models/block/reactor/fluid_input/fluid_input_vertical.json similarity index 98% rename from src/main/resources/assets/createnuclear/models/block/reactor/input/input_vertical.json rename to src/main/resources/assets/createnuclear/models/block/reactor/fluid_input/fluid_input_vertical.json index 378d4c7c9..bdb0efb7a 100644 --- a/src/main/resources/assets/createnuclear/models/block/reactor/input/input_vertical.json +++ b/src/main/resources/assets/createnuclear/models/block/reactor/fluid_input/fluid_input_vertical.json @@ -2,10 +2,10 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "0": "createnuclear:block/reactor/input/input", + "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/input/input" + "particle": "createnuclear:block/reactor/rod_input/rod_input" }, "elements": [ { diff --git a/src/main/resources/assets/createnuclear/models/block/reactor/liquid_input/item.json b/src/main/resources/assets/createnuclear/models/block/reactor/fluid_input/item.json similarity index 97% rename from src/main/resources/assets/createnuclear/models/block/reactor/liquid_input/item.json rename to src/main/resources/assets/createnuclear/models/block/reactor/fluid_input/item.json index 8e3661916..67a5e7968 100644 --- a/src/main/resources/assets/createnuclear/models/block/reactor/liquid_input/item.json +++ b/src/main/resources/assets/createnuclear/models/block/reactor/fluid_input/item.json @@ -3,7 +3,7 @@ "parent": "block/block", "textures": { "0": "createnuclear:block/reactor/casing/reactor_casing", - "1": "createnuclear:block/reactor/liquid_input/input", + "1": "createnuclear:block/reactor/fluid_input/fluid_input", "2": "createnuclear:block/reactor/casing/reactor_casing", "particle": "createnuclear:block/reactor/casing/reactor_casing" }, diff --git a/src/main/resources/assets/createnuclear/models/block/reactor/input/item.json b/src/main/resources/assets/createnuclear/models/block/reactor/rod_input/item.json similarity index 97% rename from src/main/resources/assets/createnuclear/models/block/reactor/input/item.json rename to src/main/resources/assets/createnuclear/models/block/reactor/rod_input/item.json index 59b71e8eb..44a5bfd39 100644 --- a/src/main/resources/assets/createnuclear/models/block/reactor/input/item.json +++ b/src/main/resources/assets/createnuclear/models/block/reactor/rod_input/item.json @@ -3,7 +3,7 @@ "parent": "block/block", "textures": { "0": "createnuclear:block/reactor/casing/reactor_casing", - "1": "createnuclear:block/reactor/input/input", + "1": "createnuclear:block/reactor/rod_input/rod_input", "2": "createnuclear:block/reactor/casing/reactor_casing", "particle": "createnuclear:block/reactor/casing/reactor_casing" }, diff --git a/src/main/resources/assets/createnuclear/models/block/reactor/input/input.json b/src/main/resources/assets/createnuclear/models/block/reactor/rod_input/rod_input.json similarity index 98% rename from src/main/resources/assets/createnuclear/models/block/reactor/input/input.json rename to src/main/resources/assets/createnuclear/models/block/reactor/rod_input/rod_input.json index f376046ae..e51c47749 100644 --- a/src/main/resources/assets/createnuclear/models/block/reactor/input/input.json +++ b/src/main/resources/assets/createnuclear/models/block/reactor/rod_input/rod_input.json @@ -3,7 +3,7 @@ "parent": "block/block", "textures": { "0": "createnuclear:block/reactor/casing/reactor_casing", - "1": "createnuclear:block/reactor/input/input", + "1": "createnuclear:block/reactor/rod_input/rod_input", "2": "createnuclear:block/reactor/casing/reactor_casing", "particle": "createnuclear:block/reactor/casing/reactor_casing" }, diff --git a/src/main/resources/assets/createnuclear/models/block/reactor/liquid_input/liquid_input_vertical.json b/src/main/resources/assets/createnuclear/models/block/reactor/rod_input/rod_input_vertical.json similarity index 98% rename from src/main/resources/assets/createnuclear/models/block/reactor/liquid_input/liquid_input_vertical.json rename to src/main/resources/assets/createnuclear/models/block/reactor/rod_input/rod_input_vertical.json index 911c11046..754f8f595 100644 --- a/src/main/resources/assets/createnuclear/models/block/reactor/liquid_input/liquid_input_vertical.json +++ b/src/main/resources/assets/createnuclear/models/block/reactor/rod_input/rod_input_vertical.json @@ -2,10 +2,10 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "0": "createnuclear:block/reactor/liquid_input/input", + "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/input/input" + "particle": "createnuclear:block/reactor/rod_input/rod_input" }, "elements": [ { 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 index 9e793c16b..1e2ba9844 100644 --- 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 @@ -36,9 +36,8 @@ ], "display": { "thirdperson_righthand": { - "rotation": [95, 0, 0], - "translation": [0, 0.5, 2.75], - "scale": [0.5, 0.5, 0.5] + "translation": [0, 3, 1], + "scale": [0.55, 0.55, 0.55] }, "thirdperson_lefthand": { "rotation": [95, 0, 0], @@ -46,27 +45,29 @@ "scale": [0.5, 0.5, 0.5] }, "firstperson_righthand": { - "rotation": [-180, 32.75, 180], + "rotation": [-180, 32.75, -180], "translation": [0, 3.5, 0], "scale": [0.5, 0.5, 0.5] }, "firstperson_lefthand": { - "rotation": [-180, 32.75, 180], + "rotation": [-180, 32.75, -180], "translation": [0, 3.5, 0], "scale": [0.5, 0.5, 0.5] }, "ground": { - "rotation": [85.82, -0.73, 3.41], - "translation": [0, -0.75, 0], + "translation": [0, 2.25, 0], "scale": [0.5, 0.5, 0.5] }, "gui": { - "rotation": [-146, 45, 180], - "scale": [0.5, 0.5, 0.5] + "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": [ 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 index e11f9627b..9fe686707 100644 --- 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 @@ -120,9 +120,8 @@ ], "display": { "thirdperson_righthand": { - "rotation": [95.07, -88.51, 4.51], - "translation": [0.5, -2, -1.75], - "scale": [0.5, 0.5, 0.5] + "translation": [0, 3, 1], + "scale": [0.55, 0.55, 0.55] }, "thirdperson_lefthand": { "rotation": [95.07, -88.51, 4.51], @@ -136,12 +135,12 @@ "scale": [0.5, 0.5, 0.5] }, "ground": { - "rotation": [90, 0, 0], - "translation": [0, -0.25, 0], + "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": { 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 index 2eaf62e52..730206825 100644 --- 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 @@ -1,11 +1,11 @@ { "format_version": "1.21.11", "credit": "Made with Blockbench", - "texture_size": [96, 96], "parent": "block/block", + "texture_size": [96, 96], "textures": { - "layer0": "createnuclear:item/default_anti_radiation_suit", - "particle": "createnuclear:item/default_anti_radiation_suit" + "particle": "createnuclear:item/default_anti_radiation_suit", + "layer0": "createnuclear:item/default_anti_radiation_suit" }, "elements": [ { @@ -39,32 +39,40 @@ ], "display": { "thirdperson_righthand": { - "rotation": [-87, 0, 0], - "translation": [0, -2.45, 0], - "scale": [0.5, 0.5, 0.5] + "translation": [0, 3, 1], + "scale": [0.55, 0.55, 0.55] }, "thirdperson_lefthand": { - "rotation": [-87, 0, 0], - "translation": [0, -2.45, 0], - "scale": [0.5, 0.5, 0.5] + "translation": [0, 3, 1], + "scale": [0.55, 0.55, 0.55] }, "firstperson_righthand": { - "rotation": [-90, 0, 0], - "translation": [0, 4, 0], - "scale": [0.5, 0.5, 0.5] + "rotation": [0, -90, 25], + "translation": [1.13, 3.2, 1.13], + "scale": [0.68, 0.68, 0.68] }, "firstperson_lefthand": { - "rotation": [-90, 0, 0], - "translation": [0, 4, 0], - "scale": [0.5, 0.5, 0.5] + "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.25, 0.25, 0.25] + "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": [ 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 index bf99f1da5..a60dc9d49 100644 --- 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 @@ -64,33 +64,41 @@ ], "display": { "thirdperson_righthand": { - "rotation": [1.5, 0, 0], - "translation": [0.25, -0.5, -1], - "scale": [0.5, 0.5, 0.5] + "translation": [0, 3, 1], + "scale": [0.55, 0.55, 0.55] }, "thirdperson_lefthand": { - "rotation": [1.5, 0, 0], - "translation": [0.25, -0.5, -1], - "scale": [0.5, 0.5, 0.5] + "translation": [0, 3, 1], + "scale": [0.55, 0.55, 0.55] }, "firstperson_righthand": { - "scale": [0.5, 0.5, 0.5] + "rotation": [0, -90, 25], + "translation": [1.13, 3.2, 1.13], + "scale": [0.68, 0.68, 0.68] }, "firstperson_lefthand": { - "scale": [0.5, 0.5, 0.5] + "rotation": [0, -90, 25], + "translation": [1.13, 3.2, 1.13], + "scale": [0.68, 0.68, 0.68] }, "ground": { - "rotation": [90, 0, 0] + "translation": [0, 2, 0], + "scale": [0.5, 0.5, 0.5] }, "gui": { "rotation": [-151.96, 54.21, 174.44], - "scale": [0.5, 0.5, 0.5] + "translation": [-0.75, 1.75, 0], + "scale": [0.8, 0.8, 0.8] }, "head": { - "translation": [0, -29.5, -2.5] + "rotation": [0, -180, 0], + "translation": [0, 13, 7] }, "fixed": { - "scale": [0.5, 0.5, 0.5] + "rotation": [0, -180, 0] + }, + "on_shelf": { + "rotation": [0, -180, 0] } }, "groups": [ 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 index 213467878..44cd6ae65 100644 Binary files a/src/main/resources/assets/createnuclear/ponder/reactor/reactor_t1_ponder.nbt 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 index cb7dd20c3..d3b8229d2 100644 Binary files a/src/main/resources/assets/createnuclear/ponder/reactor/reactor_t2_ponder.nbt 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 index 9cd1fbd7a..9676d99e7 100644 Binary files a/src/main/resources/assets/createnuclear/ponder/reactor/reactor_t3_ponder.nbt 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/biomes/wasteland.ogg b/src/main/resources/assets/createnuclear/sounds/biomes/wasteland.ogg new file mode 100644 index 000000000..a8b5bfb86 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/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/textures/block/reactor/casing/reactor_casing_connected.png b/src/main/resources/assets/createnuclear/textures/block/reactor/casing/reactor_casing_connected.png index 5f6f8ba13..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/liquid_input/input.png b/src/main/resources/assets/createnuclear/textures/block/reactor/fluid_input/fluid_input.png similarity index 100% rename from src/main/resources/assets/createnuclear/textures/block/reactor/liquid_input/input.png rename to src/main/resources/assets/createnuclear/textures/block/reactor/fluid_input/fluid_input.png 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/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/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/boots/black_anti_radiation_boots.png b/src/main/resources/assets/createnuclear/textures/item/armors/boots/black_anti_radiation_boots.png deleted file mode 100644 index 98a0676a2..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/boots/black_anti_radiation_boots.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/boots/blue_anti_radiation_boots.png b/src/main/resources/assets/createnuclear/textures/item/armors/boots/blue_anti_radiation_boots.png deleted file mode 100644 index 5aa8e9707..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/boots/blue_anti_radiation_boots.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/boots/brown_anti_radiation_boots.png b/src/main/resources/assets/createnuclear/textures/item/armors/boots/brown_anti_radiation_boots.png deleted file mode 100644 index f809bf5f9..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/boots/brown_anti_radiation_boots.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/boots/cyan_anti_radiation_boots.png b/src/main/resources/assets/createnuclear/textures/item/armors/boots/cyan_anti_radiation_boots.png deleted file mode 100644 index 0e93c48dd..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/boots/cyan_anti_radiation_boots.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/boots/gray_anti_radiation_boots.png b/src/main/resources/assets/createnuclear/textures/item/armors/boots/gray_anti_radiation_boots.png deleted file mode 100644 index 0cbaa9ec2..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/boots/gray_anti_radiation_boots.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/boots/green_anti_radiation_boots.png b/src/main/resources/assets/createnuclear/textures/item/armors/boots/green_anti_radiation_boots.png deleted file mode 100644 index 69cc070bb..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/boots/green_anti_radiation_boots.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/boots/light_blue_anti_radiation_boots.png b/src/main/resources/assets/createnuclear/textures/item/armors/boots/light_blue_anti_radiation_boots.png deleted file mode 100644 index 1b9a7c1c8..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/boots/light_blue_anti_radiation_boots.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/boots/light_gray_anti_radiation_boots.png b/src/main/resources/assets/createnuclear/textures/item/armors/boots/light_gray_anti_radiation_boots.png deleted file mode 100644 index c42680931..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/boots/light_gray_anti_radiation_boots.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/boots/lime_anti_radiation_boots.png b/src/main/resources/assets/createnuclear/textures/item/armors/boots/lime_anti_radiation_boots.png deleted file mode 100644 index 28333da4b..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/boots/lime_anti_radiation_boots.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/boots/magenta_anti_radiation_boots.png b/src/main/resources/assets/createnuclear/textures/item/armors/boots/magenta_anti_radiation_boots.png deleted file mode 100644 index 79eccd875..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/boots/magenta_anti_radiation_boots.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/boots/orange_anti_radiation_boots.png b/src/main/resources/assets/createnuclear/textures/item/armors/boots/orange_anti_radiation_boots.png deleted file mode 100644 index a75498231..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/boots/orange_anti_radiation_boots.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/boots/pink_anti_radiation_boots.png b/src/main/resources/assets/createnuclear/textures/item/armors/boots/pink_anti_radiation_boots.png deleted file mode 100644 index 26955cd54..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/boots/pink_anti_radiation_boots.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/boots/purple_anti_radiation_boots.png b/src/main/resources/assets/createnuclear/textures/item/armors/boots/purple_anti_radiation_boots.png deleted file mode 100644 index cb9f6ae84..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/boots/purple_anti_radiation_boots.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/boots/red_anti_radiation_boots.png b/src/main/resources/assets/createnuclear/textures/item/armors/boots/red_anti_radiation_boots.png deleted file mode 100644 index baadfee21..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/boots/red_anti_radiation_boots.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/boots/white_anti_radiation_boots.png b/src/main/resources/assets/createnuclear/textures/item/armors/boots/white_anti_radiation_boots.png deleted file mode 100644 index 952835723..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/boots/white_anti_radiation_boots.png and /dev/null differ diff --git a/src/main/resources/assets/createnuclear/textures/item/armors/boots/yellow_anti_radiation_boots.png b/src/main/resources/assets/createnuclear/textures/item/armors/boots/yellow_anti_radiation_boots.png deleted file mode 100644 index 518fb040a..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/armors/boots/yellow_anti_radiation_boots.png and /dev/null 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/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/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/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/default_anti_radiation_suit.png b/src/main/resources/assets/createnuclear/textures/item/default_anti_radiation_suit.png deleted file mode 100644 index df8abdb3d..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/item/default_anti_radiation_suit.png and /dev/null 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/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/mob_effect/iodine_protection.png b/src/main/resources/assets/createnuclear/textures/mob_effect/iodine_protection.png deleted file mode 100644 index 8df238019..000000000 Binary files a/src/main/resources/assets/createnuclear/textures/mob_effect/iodine_protection.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 index df8abdb3d..b8a89e193 100644 Binary files a/src/main/resources/assets/createnuclear/textures/models/armor/default_anti_radiation_suit.png and b/src/main/resources/assets/createnuclear/textures/models/armor/default_anti_radiation_suit.png differ diff --git a/src/main/resources/createnuclear.forge.mixins.json b/src/main/resources/createnuclear.forge.mixins.json index b87e40998..e90be855b 100644 --- a/src/main/resources/createnuclear.forge.mixins.json +++ b/src/main/resources/createnuclear.forge.mixins.json @@ -6,13 +6,12 @@ "refmap": "createnuclear.refmap.json", "mixins": [ "BaseFireBlockMixin", - "RadiationHeartMixin", - "GameRendererMixin", - "CameraAccessor", "SmithingTransformRecipeMixin" ], - "accessWidener": "createnuclear.accesswidener", "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/water.png b/water.png deleted file mode 100644 index 577f3a5a7..000000000 Binary files a/water.png and /dev/null differ