diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3bb9fcf28..0595d1f16 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -63,7 +63,7 @@ jobs: github-generate-changelog: true github-tag: "${{ steps.toml_properties.outputs.value }}-${{ steps.gradle_properties.outputs.mod_version }}" - files: ./build/libs/!(*-@(dev|sources|dev-slim)).jar + files: ./build/libs/!(*-@(dev|sources|dev-slim|slim)).jar name: "Cosmic Core ${{ steps.gradle_properties.outputs.mod_version }}" version: ${{ steps.gradle_properties.outputs.mod_version }} version-type: ${{ inputs.version_type }} diff --git a/.gitignore b/.gitignore index c8fb1522c..bb1db2d90 100644 --- a/.gitignore +++ b/.gitignore @@ -36,3 +36,7 @@ runs/ # forge generated resources cache /src/generated/resources/.cache/ +# Agenic Support Tools - Debug Only +/.claude/ +# Personal Notes I Keep in my Local +/docs/ diff --git a/changelog.md b/changelog.md index 4637eeae3..af3fa89ac 100644 --- a/changelog.md +++ b/changelog.md @@ -1,6 +1,6 @@ # Cosmic Core 0.8.9 # DO NOT MANUALLY UPDATE COSMIC CORE FOR FRONTIERS **I WILL NOT WORK** - Sterilizier Hatch Now Accepts any FluidStack and Consumes #/recipe or #/tick - Titan Reactor - New Infinity Textures (Basic) \ No newline at end of file +Bees, oh so many bees +module hatch updates +uhhhh, yeah. \ No newline at end of file diff --git a/dependencies.gradle b/dependencies.gradle index df6646bf5..6b6d331e4 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -2,12 +2,24 @@ dependencies { compileOnly(libs.jetbrains.annotations) modRuntimeOnly("curse.maven:worldedit-225608:4586218") //Worldedit bc i'm lazy ty - modRuntimeOnly("curse.maven:effortless-building-302113:4979089") //EB bc i'm lazy ty + modRuntimeOnly("curse.maven:effortless-building-302113:6330928") //EB bc i'm lazy ty + modRuntimeOnly("curse.maven:tmrv-1194921:6856065") //EB bc i'm lazy ty + + //IDK if we need this fully yet... + modImplementation('com.github.thedarkcolour:ModKit:0302f9aa42') + modImplementation('curse.maven:tmrv-1194921:7259315') + modImplementation("curse.maven:travel-anchors-413234:4683662") + modImplementation("curse.maven:libx-412525:4947474") //Botania // implementation(forge.botania) + //Tinkers + modImplementation(forge.tconstruct) + modImplementation(forge.mantle) + + // LDLib modImplementation(forge.ldlib) @@ -36,7 +48,7 @@ dependencies { // Recipe Viewers modCompileOnly(forge.bundles.jei) - modCompileOnly(forge.emi) + modImplementation(forge.emi) // WAILA-likes modImplementation(forge.jade) @@ -72,8 +84,8 @@ dependencies { modImplementation(forge.bloodMagic) // Create - modCompileOnly(forge.create) - modCompileOnly(forge.flywheel) + modImplementation(forge.create) + modImplementation(forge.flywheel) modImplementation(forge.geckoLib) // Thin air @@ -108,11 +120,14 @@ dependencies { modImplementation(forge.smartBrainLib) // Runtime Recipe Viewers - uncomment whichever one you want to use // modRuntimeOnly(forge.emi) -// modRuntimeOnly(forge.jei.forge.impl) - //Modern Fix + + //Modern FixG modImplementation(forge.modernFix) // Embers modImplementation(forge.embers) + modImplementation(forge.forestry) + modImplementation(forge.gendustry) + api(forge.gendustry) } \ No newline at end of file diff --git a/dev/emi/emi/runtime/EmiFavorite.class b/dev/emi/emi/runtime/EmiFavorite.class new file mode 100644 index 000000000..c883e0fe7 Binary files /dev/null and b/dev/emi/emi/runtime/EmiFavorite.class differ diff --git a/docs/CARGO_MOTHS.md b/docs/CARGO_MOTHS.md new file mode 100644 index 000000000..fd6552b22 --- /dev/null +++ b/docs/CARGO_MOTHS.md @@ -0,0 +1,226 @@ +# Cargo Moths System + +## Current Status: **IN PROGRESS** + +Last updated: Debug output removed, core functionality working. + +--- + +## 1. Overview + +The Cargo Moths system provides local (same-dimension) item and fluid transport using a whimsical moth-based logistics network. Unlike the cross-dimensional linking system, Cargo Moths are designed for short-range automation within a single dimension. + +### Design Philosophy +- **No power required** - Moths work for free! +- **Scalable capacity** - Add more moth homes to increase throughput +- **Tiered progression** - Different beehive types provide different speeds/capacities +- **Feeding bonuses** - Optional honey/oil feeding for multipliers + +--- + +## 2. What's Implemented + +### 2.1 Core Components + +| Component | File | Status | +|-----------|------|--------| +| `MothCargoStation` | `common/machine/multiblock/multi/MothCargoStation.java` | ✅ Complete | +| `MothCargoStationMachine` | `common/machine/multiblock/multi/logic/MothCargoStationMachine.java` | ✅ Complete | +| `MothCargoDropOff` | `common/machine/multiblock/multi/MothCargoDropOff.java` | ✅ Complete | +| `MothCargoDropOffMachine` | `common/machine/multiblock/multi/logic/MothCargoDropOffMachine.java` | ✅ Complete | +| `LinkedWorkableMultiblockMachine` | `api/machine/multiblock/LinkedWorkableMultiblockMachine.java` | ✅ Complete | + +### 2.2 Feature Checklist + +- [x] Multiblock structure definitions +- [x] Datastick-based linking (reuses cross-dimensional linking infrastructure) +- [x] Same-dimension restriction +- [x] Item transfer from Station to Drop Off +- [x] Fluid transfer from Station to Drop Off +- [x] Tiered moth homes (Forestry beehives) +- [x] Cycle time based on moth tier +- [x] Capacity based on moth count × tier multiplier +- [x] Distribution modes (DIRECT, FILL_FIRST, ROUND_ROBIN) +- [x] GUI display (moth homes, cycle time, capacity, linked drop-offs) +- [x] Screwdriver to cycle distribution mode +- [ ] Feeding bonuses (honey/oil multipliers) + +--- + +## 3. Multiblock Structures + +### 3.1 Moth Cargo Station (Sender) + +Tower structure: 3×3 footprint, 6 blocks tall + +``` +Layer 0 (bottom): Layer 1-4: Layer 5 (top): +C C C C M C C C C +C C C C M C C C C +C Q C C M C C C C +``` + +Where: +- `C` = Steel Solid Casing (or input/output buses/hatches, maintenance hatch) +- `M` = Moth Home (Forestry beehive) OR Steel Solid Casing +- `Q` = Controller + +**Moth homes only go in the center column** (up to 4 can be placed). + +Allowed hatches: +- 1 Maintenance Hatch (required) +- Up to 4 Item Input Buses +- Up to 4 Item Output Buses +- Up to 4 Fluid Input Hatches +- Up to 4 Fluid Output Hatches + +### 3.2 Moth Cargo Drop Off (Receiver) + +Simple 3×3×2 structure: + +``` +Layer 0 (bottom): Layer 1 (top): +C C C C C C +C Q C C C C +C C C C C C +``` + +Where: +- `C` = Steel Solid Casing (or output buses/hatches, maintenance hatch) +- `Q` = Controller + +Allowed hatches: +- 1 Maintenance Hatch (required) +- Up to 4 Item Output Buses +- Up to 4 Fluid Output Hatches + +--- + +## 4. Moth Home Tiers + +Moth homes use Forestry beehive blocks: + +| Tier | Block | Cycle Time | Moths per Home | +|------|-------|------------|----------------| +| T1 | `forestry:beehive_forest` | 60s | 1 | +| T2 | `forestry:beehive_lush` | 30s | 2 | +| T3 | `forestry:beehive_desert` | 15s | 4 | +| T4 | `forestry:beehive_end` | 5s | 8 | + +**All moth homes must be the same tier.** Mixed tiers will trigger a warning. + +### Capacity Calculation + +``` +Items per cycle = Total Moths × 64 × Feeding Multiplier +Fluids per cycle = Total Moths × 1000mB × Feeding Multiplier +Total Moths = Moth Home Count × Moths per Home (by tier) +``` + +Example: 4× T3 beehives = 4 × 4 = 16 moths = 1024 items per cycle (every 15s) + +--- + +## 5. Distribution Modes + +Cycle through modes with screwdriver on the controller. + +| Mode | Behavior | +|------|----------| +| `DIRECT` | Ships to first linked drop-off only (1:1) | +| `FILL_FIRST` | Fills each drop-off in order until full, then moves to next | +| `ROUND_ROBIN` | Distributes evenly across all linked drop-offs | + +--- + +## 6. Feeding Bonuses (TODO) + +Planned multipliers for feeding moths: + +| Feed Item | Multiplier | +|-----------|------------| +| Regular Honey | 2× | +| Lofty Honey | 4× | +| Pale Oil | 8× | + +Feed is consumed per cycle from the Station's input bus. + +--- + +## 7. GUI Information + +The Station GUI displays: +- Moth Homes count and tier +- Total Moths +- Cycle Time (seconds) +- Distribution Mode +- Linked Drop-Offs count +- Capacity per cycle (items and fluids) + +The Drop Off GUI displays: +- Structure status +- Number of stations linked to it + +--- + +## 8. Linking + +Uses the same datastick-based linking as the cross-dimensional system: + +1. Shift+right-click the Moth Cargo Station with a datastick to copy link data +2. Right-click a Moth Cargo Drop Off to establish the link + +**Restrictions:** +- Same dimension only (moths can't fly between dimensions!) +- Station can link to up to 16 Drop Offs (1:N) +- Drop Off can receive from up to 16 Stations (N:1) + +--- + +## 9. How It Works + +1. Every tick, the Station checks if enough time has passed since the last cycle +2. When cycle time is reached: + - Get all linked, formed Drop Offs + - Calculate item/fluid capacity based on moths and feeding multiplier + - Extract items from Station's input buses (using internal methods to bypass IO checks) + - Insert items into Drop Off's output buses (using internal methods to bypass IO checks) + - Same process for fluids + - Consume feeding materials (TODO) + +The internal extraction/insertion methods bypass GTCEu's IO direction checks, which is the same pattern used by DroneStationMachine. + +--- + +## 10. File Structure + +``` +src/main/java/com/ghostipedia/cosmiccore/ +├── api/machine/multiblock/ +│ └── LinkedWorkableMultiblockMachine.java # Base class (no power requirement) +└── common/machine/multiblock/multi/ + ├── MothCargoStation.java # Station multiblock definition + ├── MothCargoDropOff.java # Drop Off multiblock definition + └── logic/ + ├── MothCargoStationMachine.java # Station logic (shipping cycles) + └── MothCargoDropOffMachine.java # Drop Off logic (receives items) +``` + +--- + +## 11. Known Limitations + +1. **Forestry dependency** - Falls back to vanilla beehive if Forestry not loaded +2. **No visual feedback** - No moth entity/particle flying between stations +3. **No feeding implementation** - Multiplier is always 1× currently +4. **No chunk loading** - Both Station and Drop Off must be loaded + +--- + +## 12. Future Work + +- [ ] Implement feeding bonuses (honey/oil consumption and multipliers) +- [ ] Add moth particle effects during transfers +- [ ] Consider cross-dimension variant (interdimensional moths?) +- [ ] Add JEI/EMI integration showing capacity calculations +- [ ] Custom textures/models for the multiblocks diff --git a/docs/CROSS_DIMENSIONAL_LINKING.md b/docs/CROSS_DIMENSIONAL_LINKING.md new file mode 100644 index 000000000..56f3cdbc2 --- /dev/null +++ b/docs/CROSS_DIMENSIONAL_LINKING.md @@ -0,0 +1,318 @@ +# Cross-Dimensional Multiblock Linking System + +## Current Status: **IMPLEMENTED & TESTED** + +Last updated: Session implementing partner query utilities and recipe conditions. + +--- + +## 1. Overview + +This system enables multiblock machines to communicate across dimensions using GTCEu's datastick as the linking mechanism. Links are persisted in SavedData and support role-based access control. + +### Use Cases +- **Star Ladder**: Manufacturing chains spanning multiple dimensions +- **Cross-dimensional recipes**: "Recipe requires partner in Sun Orbit with Solar Plasma" +- **Remote resource access**: Query partner's inventory/fluids/energy +- **Dimension-gated progression**: Certain recipes only available when linked to specific dimensions + +--- + +## 2. What's Implemented + +### 2.1 Core Infrastructure + +| Component | File | Status | +|-----------|------|--------| +| `ILinkedMultiblock` | `api/capability/ILinkedMultiblock.java` | ✅ Complete | +| `LinkEntry` | `api/data/savedData/LinkEntry.java` | ✅ Complete | +| `LinkedMultiblockSavedData` | `api/data/savedData/LinkedMultiblockSavedData.java` | ✅ Complete | +| `LinkedMultiblockHelper` | `common/machine/multiblock/LinkedMultiblockHelper.java` | ✅ Complete | +| `LinkedWorkableElectricMultiblockMachine` | `api/machine/multiblock/LinkedWorkableElectricMultiblockMachine.java` | ✅ Complete | + +### 2.2 Test Multiblock + +| Component | File | Status | +|-----------|------|--------| +| `LinkTestStation` | `common/machine/multiblock/multi/LinkTestStation.java` | ✅ Complete | +| `LinkTestStationMachine` | `common/machine/multiblock/multi/logic/LinkTestStationMachine.java` | ✅ Complete | + +### 2.3 Recipe Conditions + +| Condition | File | Description | +|-----------|------|-------------| +| `LinkedPartnerCondition` | `common/recipe/condition/LinkedPartnerCondition.java` | Requires N linked partners, optionally formed/working | +| `LinkedPartnerDimensionCondition` | `common/recipe/condition/LinkedPartnerDimensionCondition.java` | Requires partner in specific dimension | +| `LinkedPartnerDimensionItemCondition` | `common/recipe/condition/LinkedPartnerDimensionItemCondition.java` | Requires partner in dimension with specific item | +| `LinkedPartnerDimensionFluidCondition` | `common/recipe/condition/LinkedPartnerDimensionFluidCondition.java` | Requires partner in dimension with specific fluid | + +### 2.4 Partner Query Utilities + +Methods in `LinkedMultiblockHelper`: +- `queryPartner()` - Generic query with chunk loading +- `getPartnerItemHandlers()` / `getPartnerFluidHandlers()` / `getPartnerEnergyHandlers()` +- `partnerHasItem()` / `partnerHasFluid()` +- `getPartnerEnergyStored()` +- `isPartnerFormed()` / `isPartnerWorking()` + +Convenience methods in `LinkedWorkableElectricMultiblockMachine`: +- `partnerHasItem()` / `partnerHasFluid()` / `getPartnerEnergyStored()` +- `isPartnerFormed()` / `isPartnerWorking()` +- `anyPartnerHasItem()` / `anyPartnerHasFluid()` / `anyPartnerWorking()` +- `countFormedPartners()` + +--- + +## 3. How to Use + +### 3.1 Linking Machines + +1. **Copy link data**: Shift+right-click a linkable multiblock with a datastick +2. **Paste/establish link**: Right-click another linkable multiblock with the datastick +3. The system validates ownership, roles, and compatibility before establishing the link + +### 3.2 Creating a Linkable Multiblock + +Extend `LinkedWorkableElectricMultiblockMachine`: + +```java +public class MyLinkedMachine extends LinkedWorkableElectricMultiblockMachine { + + public MyLinkedMachine(IMachineBlockEntity holder, Object... args) { + super(holder, args); + } + + @Override + public LinkRole getLinkRole() { + return LinkRole.PEER; // or CONTROLLER, REMOTE + } + + @Override + public int getMaxPartners() { + return 4; // default + } + + @Override + public boolean canLinkTo(GlobalPos partner, ILinkedMultiblock partnerMachine) { + // Custom validation (e.g., only link to specific machine types) + return true; + } + + @Override + public void onLinkEstablished(GlobalPos partner) { + super.onLinkEstablished(partner); + // React to new link + } + + @Override + public void onLinkBroken(GlobalPos partner) { + super.onLinkBroken(partner); + // Cleanup when link breaks + } +} +``` + +### 3.3 Using Recipe Conditions + +```java +// Requires at least 1 linked partner +.addCondition(new LinkedPartnerCondition(1)) + +// Requires 2 partners, at least 1 formed +.addCondition(new LinkedPartnerCondition(2, true, false)) + +// Requires partner in specific dimension +.addCondition(new LinkedPartnerDimensionCondition("frontiers:sun_orbit")) + +// Requires partner in dimension with specific item +.addCondition(new LinkedPartnerDimensionItemCondition("frontiers:sun_orbit", Items.BUCKET, 1)) + +// Requires partner in dimension with specific fluid (1000mB) +.addCondition(new LinkedPartnerDimensionFluidCondition("frontiers:sun_orbit", SolarPlasma.getFluid(), 1000)) +``` + +### 3.4 Querying Partner Resources + +From within a `LinkedWorkableElectricMultiblockMachine`: + +```java +// Check if any partner has a specific item +if (anyPartnerHasItem(stack -> stack.is(Items.DIAMOND))) { + // ... +} + +// Check specific partner +for (GlobalPos partner : getLinkedPartners()) { + if (partnerHasFluid(partner, fluid -> fluid.getFluid().is(Fluids.LAVA))) { + // Partner has lava + } + + long energy = getPartnerEnergyStored(partner); + boolean working = isPartnerWorking(partner); +} + +// Custom queries +String partnerName = queryPartner(partner, machine -> + machine.getDefinition().getName()); +``` + +--- + +## 4. Link Roles + +### Role Types + +| Role | Can Query Partners | Can Be Queried | +|------|-------------------|----------------| +| `PEER` | ✅ | ✅ | +| `CONTROLLER` | ✅ | ❌ | +| `REMOTE` | ❌ | ✅ | + +### Role Negotiation + +When two machines link, their declared roles are negotiated: + +| A's Role | B's Role | Result | A's Effective | B's Effective | +|----------|----------|--------|---------------|---------------| +| PEER | PEER | ✅ Valid | PEER | PEER | +| PEER | CONTROLLER | ✅ Valid | REMOTE | CONTROLLER | +| PEER | REMOTE | ✅ Valid | CONTROLLER | REMOTE | +| CONTROLLER | REMOTE | ✅ Valid | CONTROLLER | REMOTE | +| CONTROLLER | CONTROLLER | ❌ Reject | - | - | +| REMOTE | REMOTE | ❌ Reject | - | - | + +--- + +## 5. Test Recipes + +The Link Test Station includes these recipes for testing: + +| Recipe | Input | Output | Condition | +|--------|-------|--------|-----------| +| `link_test_basic` | 1x Iron Ingot | 9x Iron Nugget | None | +| `link_test_linked` | 1x Gold Ingot | 1x Diamond | 1 linked partner | +| `link_test_formed_partner` | 1x Emerald | 1x Nether Star | 1 formed partner | +| `link_test_moon_partner` | 4x Lapis | 1x Ender Pearl | Partner in `ad_astra:moon` | +| `link_test_overworld_partner` | 4x Redstone | 4x Glowstone | Partner in `minecraft:overworld` | +| `link_test_dimension_item` | 8x Coal | 1x Diamond | Partner in Overworld with Diamond | +| `link_test_dimension_fluid` | 1x Sponge | 1x Wet Sponge | Partner in Overworld with Water | + +--- + +## 6. Translation Keys + +```properties +# Link operations +cosmiccore.datastick.link_copied=Link: %s +cosmiccore.link.copied=Link data copied from %s +cosmiccore.link.established=Link established: %s ↔ %s + +# Errors +cosmiccore.link.not_ready=Machine not ready for linking +cosmiccore.link.invalid_data=Invalid link data on datastick +cosmiccore.link.cannot_self_link=Cannot link a machine to itself +cosmiccore.link.partner_not_loaded=Partner machine must be loaded to establish link +cosmiccore.link.partner_missing=Partner machine no longer exists +cosmiccore.link.not_linkable=Target machine does not support linking +cosmiccore.link.different_owner=Cannot link machines owned by different teams +cosmiccore.link.incompatible_roles=Incompatible link roles: %s cannot link to %s +cosmiccore.link.limit_reached_self=This machine has reached its link limit +cosmiccore.link.limit_reached_partner=Partner machine has reached its link limit +cosmiccore.link.incompatible_self=This machine cannot link to that type +cosmiccore.link.incompatible_partner=Partner machine cannot link to this type +cosmiccore.link.already_linked=These machines are already linked + +# Recipe conditions +cosmiccore.recipe.condition.linked_partner.tooltip=Requires %s linked partner(s) +cosmiccore.recipe.condition.linked_partner.formed=Requires %s linked partner(s) with valid structure +cosmiccore.recipe.condition.linked_partner.working=Requires %s linked partner(s) actively working +cosmiccore.recipe.condition.linked_partner_dimension.tooltip=Requires linked partner in %s +cosmiccore.recipe.condition.linked_partner_dimension_item.tooltip=Requires %sx %s in partner in %s +cosmiccore.recipe.condition.linked_partner_dimension_fluid.tooltip=Requires %smB %s in partner in %s +``` + +--- + +## 7. File Structure + +``` +src/main/java/com/ghostipedia/cosmiccore/ +├── api/ +│ ├── capability/ +│ │ └── ILinkedMultiblock.java # Interface for linkable machines +│ ├── data/savedData/ +│ │ ├── LinkEntry.java # Single link record +│ │ └── LinkedMultiblockSavedData.java # Persistence layer +│ └── machine/multiblock/ +│ └── LinkedWorkableElectricMultiblockMachine.java # Base class +├── common/ +│ ├── machine/multiblock/ +│ │ ├── LinkedMultiblockHelper.java # Utilities, chunk loading, queries +│ │ └── multi/ +│ │ ├── LinkTestStation.java # Test multiblock registration +│ │ └── logic/ +│ │ └── LinkTestStationMachine.java # Test multiblock logic +│ └── recipe/condition/ +│ ├── CosmicConditions.java # Condition registration +│ ├── LinkedPartnerCondition.java +│ ├── LinkedPartnerDimensionCondition.java +│ ├── LinkedPartnerDimensionItemCondition.java +│ └── LinkedPartnerDimensionFluidCondition.java +└── gtbridge/ + ├── CosmicRecipeTypes.java # LINK_TEST_RECIPES type + └── CosmicCoreRecipes.java # Test recipes +``` + +--- + +## 8. Security Notes + +1. **Ownership is always verified at runtime** - Never trust datastick NBT for ownership +2. **Partner must be loaded for link validation** - Prevents linking to arbitrary positions +3. **Role negotiation prevents privilege escalation** - CONTROLLER+CONTROLLER rejected +4. **Chunk loading is capped** - MAX_FORCED_CHUNKS_PER_MACHINE = 4 + +--- + +## 9. Known Limitations + +1. **Partner must be loaded to establish link** - No config option for force-load during linking yet +2. **No GUI for link management** - Links can only be viewed via machine display text +3. **No visual feedback** - No particles/beams between linked machines +4. **No admin commands** - No way to inspect/remove links via commands + +--- + +## 10. Future Work + +### Phase 2: Recipe Integration +- [ ] Cross-dimensional ingredient consumption (consume from partner's inputs) +- [ ] Cross-dimensional output insertion (insert into partner's outputs) +- [ ] Recipe modifier based on partner state + +### Phase 3: Quality of Life +- [ ] Config option for force-load during linking +- [ ] Link management GUI +- [ ] Visual feedback (particles, beams) +- [ ] Admin commands (`/cosmiccore link list/remove/info`) + +### Phase 4: Advanced Features +- [ ] Energy/fluid transfer between linked machines +- [ ] Item teleportation through links +- [ ] Wireless redstone/data through links + +--- + +## 11. Testing Checklist + +- [x] Basic linking between two machines (same dimension) +- [x] Cross-dimensional linking (Overworld ↔ Moon) +- [x] Link persistence across server restart +- [x] Link broken when machine destroyed +- [x] Role negotiation (PEER+PEER, PEER+CONTROLLER, etc.) +- [x] Partner limit enforcement +- [x] Recipe condition: LinkedPartnerCondition +- [x] Recipe condition: LinkedPartnerDimensionCondition +- [x] Recipe condition: LinkedPartnerDimensionItemCondition +- [x] Recipe condition: LinkedPartnerDimensionFluidCondition +- [x] Partner query utilities (items, fluids, energy, formed, working) diff --git a/gradle.properties b/gradle.properties index b363b4383..b0a25f6b9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ org.gradle.caching = true # Mod Properties mod_id = cosmiccore mod_name = Cosmic Core -mod_version = 0.9.1 +mod_version = 0.11.5 mod_description = The Core of Cosmic Frontiers! mod_authors = Ghostipedia mod_license = Code : LGPL-3.0 , Assets: Refer to Github. diff --git a/gradle/forge.versions.toml b/gradle/forge.versions.toml index 5355f1a32..5ef51fee8 100644 --- a/gradle/forge.versions.toml +++ b/gradle/forge.versions.toml @@ -1,30 +1,30 @@ [versions] ldlib = "1.0.40.b" -gtceu = "7.2.0-SNAPSHOT" +gtceu = "7.5.0-SNAPSHOT" registrate = "MC1.20-1.3.11" configuration = "3.1.0-forge" mixinExtras = "0.2.0" -jei = "15.20.0.105" -emi = "1.1.13+1.20.1" -ae2 = "15.4.7-cosmolite.12" +jei = "15.20.0.115" +emi = "1.1.22+1.20.1" +ae2 = "15.4.10-cosmolite.26" expandedAE = "1.2.0-cosmolite.6" guideme = "20.1.11" kubejs = "2001.6.5-build.16" rhino = "2001.2.3-build.10" architectury = "9.2.14" -patchouli = "1.20.1-81-FORGE" +patchouli = "1.20.1-84-FORGE" curios = "5.9.0+1.20.1" ftblibrary = "2001.2.4" ftbteams = "2001.3.0" -adAstra = "1.15.18" +adAstra = "1.15.20" botarium = "2.3.3" resourcefullLib = "2.1.23" resourcefullConfig = "2.1.2" yabn = "1.0.3" byteCodecs = "1.0.2" geckoLib = "4.7" -flywheel = "0.6.10-7" +flywheel = "1.0.5" apotheosis = "1.20.1-7.4.2" placebo = "1.20.1-8.6.2" apotheoticAttributes = "1.20.1-1.3.5" @@ -32,18 +32,21 @@ occultism = "1.140.2" modonomicon = "1.77.5" jcpp = "1.4.14" # required by occulus apparently + ## modrinth maven ## jade = "11.12.3+forge" bloodMagic = "1.20.1-3.3.3-45" embeddium = "0.3.31+mc1.20.1" oculus = "1.20.1-1.7.0" +forestry = "2.5.0" +gendustry = "1.0.3" ## cursemaven ## ftblibrary-cm = "5567591" ftbteams-cm = "6130786" modernAe2Additions = "5826205" legendarySurvivalOverhaul = "6954536" -create = "6641603" +create = "7178761" newThinAir = "4848005" puzzlesLib = "4924184" smartBrainLib = "5654964" @@ -51,13 +54,19 @@ modernFix = "6025611" botania = "6366547" ae2wtlib = "5217955" clothConfig = "5729105" +tconstruct = "1.20.1-3.9.2.37" +mantle = "1.20.1-1.11.44" embers = "6953702" +tconstruct = "1.20.1-3.9.2.37" +mantle = "1.20.1-1.11.44" malum = "1.20.1-1.6.7.1" lodestone = "1.20.1-1.6.4.1.256" [libraries] +tconstruct = { module = "slimeknights.tconstruct:TConstruct", version.ref = "tconstruct" } +mantle = { module = "slimeknights.mantle:Mantle", version.ref = "mantle" } ldlib = { module = "com.lowdragmc.ldlib:ldlib-forge-1.20.1", version.ref = "ldlib" } gtceu = { module = "com.gregtechceu.gtceu:gtceu-1.20.1", version.ref = "gtceu" } @@ -88,7 +97,7 @@ adAstra = { module = "earth.terrarium.adastra:ad_astra-forge-1 ftblibrary = { module = "dev.ftb.mods:ftb-library-forge", version.ref = "ftblibrary" } ftbteams = { module = "dev.ftb.mods:ftb-teams-forge", version.ref = "ftbteams" } geckoLib = { module = "software.bernie.geckolib:geckolib-forge-1.20.1", version.ref = "geckoLib" } -flywheel = { module = "com.jozufozu.flywheel:flywheel-forge-1.20.1", version.ref = "flywheel" } +flywheel = { module = "dev.engine-room.flywheel:flywheel-forge-1.20.1", version.ref = "flywheel" } apotheosis = { module = "dev.shadowsoffire:Apotheosis", version.ref = "apotheosis" } placebo = { module = "dev.shadowsoffire:Placebo", version.ref = "placebo" } @@ -105,6 +114,9 @@ jade = { module = "maven.modrinth:jade", version.ref = "jad bloodMagic = { module = "maven.modrinth:blood-magic", version.ref = "bloodMagic" } embeddium = { module = "maven.modrinth:embeddium", version.ref = "embeddium" } oculus = { module = "maven.modrinth:oculus", version.ref = "oculus" } +forestry = { module = "maven.modrinth:forestry-community-edition", version.ref = "forestry" } +gendustry = { module = "maven.modrinth:gendustry-community-edition", version.ref = "gendustry" } + ## cursemaven ## ftblibrary-cm = { module = "curse.maven:ftb-library-forge-404465", version.ref = "ftblibrary-cm" } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 18d569832..851f1428a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,11 +1,11 @@ [versions] minecraft = "1.20.1" -forge = "47.3.0" -minecraftForge = "1.20.1-47.3.22" +forge = "47.4.0" +minecraftForge = "1.20.1-47.4.0" parchment = "2023.09.03" shadow = "8.3.5" spotless = "7.0.2" -modDevGradle = "2.0.96" # TODO: Update to stable MDG when https://github.com/neoforged/ModDevGradle/issues/227 is fixed +modDevGradle = "2.0.96" lombok = "8.11" jetbrains-annotations = "26.0.1" mixin = "0.8.7" diff --git a/gradle/scripts/repositories.gradle b/gradle/scripts/repositories.gradle index 00ac2cdc6..319a32808 100644 --- a/gradle/scripts/repositories.gradle +++ b/gradle/scripts/repositories.gradle @@ -49,7 +49,11 @@ repositories { includeGroup "dev.latvian.apps" } } - + maven { + name = 'ModKit' + url 'https://jitpack.io' + content { includeGroup 'com.github.thedarkcolour' } + } maven { // saps.dev Maven (KubeJS and Rhino) url 'https://jitpack.io' content { @@ -60,11 +64,14 @@ repositories { url = "https://maven.tterrag.com/" content { // need to be specific here due to version overlaps - includeGroup("com.jozufozu.flywheel") includeGroup("com.tterrag.registrate") includeGroup("com.simibubi.create") } } + maven { + name "createmod maven" + url "https://maven.createmod.net/" + } maven { // Patchouli, JEI name = "BlameJared" url = "https://maven.blamejared.com/" @@ -98,6 +105,10 @@ repositories { includeGroup "com.klikli_dev" } } + maven { + name 'DVS1 Maven FS' + url 'https://dvs1.progwml6.com/files/maven' + } maven { name = 'GeckoLib' url 'https://dl.cloudsmith.io/public/geckolib3/geckolib/maven/' @@ -107,7 +118,7 @@ repositories { } } exclusiveContent { // Configuration - forRepository { maven { url = "https://api.repsy.io/mvn/toma/public" } } + forRepository { maven { url = "https://repo.repsy.io/mvn/toma/public" } } filter { includeGroup("dev.toma.configuration")} } } diff --git a/src/generated/resources/assets/cosmiccore/blockstates/arcane_crucible.json b/src/generated/resources/assets/cosmiccore/blockstates/arcane_crucible.json new file mode 100644 index 000000000..565561ca4 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/arcane_crucible.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/arcane_crucible", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/arcane_crucible", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/arcane_crucible", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/arcane_crucible", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/arcane_crucible" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/arcane_crucible" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/arcane_crucible" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/arcane_crucible" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/arcane_crucible", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/arcane_crucible", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/arcane_crucible", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/arcane_crucible", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/arcane_crucible", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/arcane_crucible", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/arcane_crucible", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/arcane_crucible", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/atomic_reconstructor.json b/src/generated/resources/assets/cosmiccore/blockstates/atomic_reconstructor.json new file mode 100644 index 000000000..c8b790ab2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/atomic_reconstructor.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/atomic_reconstructor", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/atomic_reconstructor", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/atomic_reconstructor", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/atomic_reconstructor", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/atomic_reconstructor" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/atomic_reconstructor" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/atomic_reconstructor" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/atomic_reconstructor" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/atomic_reconstructor", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/atomic_reconstructor", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/atomic_reconstructor", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/atomic_reconstructor", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/atomic_reconstructor", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/atomic_reconstructor", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/atomic_reconstructor", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/atomic_reconstructor", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/bee_holder.json b/src/generated/resources/assets/cosmiccore/blockstates/bee_holder.json new file mode 100644 index 000000000..0915aad07 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/bee_holder.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/bee_holder", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/bee_holder" + }, + "facing=south": { + "model": "cosmiccore:block/machine/bee_holder", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/bee_holder", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/bolted_heavy_frame_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/bolted_heavy_frame_casing.json new file mode 100644 index 000000000..2a597d807 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/bolted_heavy_frame_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/bolted_heavy_frame_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/cinder_hearth.json b/src/generated/resources/assets/cosmiccore/blockstates/cinder_hearth.json new file mode 100644 index 000000000..05fc1d363 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/cinder_hearth.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/cinder_hearth", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/cinder_hearth", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/cinder_hearth", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/cinder_hearth", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/cinder_hearth" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/cinder_hearth" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/cinder_hearth" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/cinder_hearth" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/cinder_hearth", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/cinder_hearth", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/cinder_hearth", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/cinder_hearth", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/cinder_hearth", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/cinder_hearth", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/cinder_hearth", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/cinder_hearth", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/cosmic_me_assemblyline_bus.json b/src/generated/resources/assets/cosmiccore/blockstates/cosmic_me_assemblyline_bus.json new file mode 100644 index 000000000..eedcc6fcf --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/cosmic_me_assemblyline_bus.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/cosmic_me_assemblyline_bus", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/cosmic_me_assemblyline_bus", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/cosmic_me_assemblyline_bus" + }, + "facing=south": { + "model": "cosmiccore:block/machine/cosmic_me_assemblyline_bus", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/cosmic_me_assemblyline_bus", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/cosmic_me_assemblyline_bus", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/cosmic_me_assemblyline_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/cosmic_me_assemblyline_hatch.json new file mode 100644 index 000000000..62c8e87a8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/cosmic_me_assemblyline_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/cosmic_me_assemblyline_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/cosmic_me_assemblyline_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/cosmic_me_assemblyline_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/cosmic_me_assemblyline_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/cosmic_me_assemblyline_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/cosmic_me_assemblyline_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/ember_tester.json b/src/generated/resources/assets/cosmiccore/blockstates/dawn_forge.json similarity index 58% rename from src/generated/resources/assets/cosmiccore/blockstates/ember_tester.json rename to src/generated/resources/assets/cosmiccore/blockstates/dawn_forge.json index 1cd46d933..b3bad3e78 100644 --- a/src/generated/resources/assets/cosmiccore/blockstates/ember_tester.json +++ b/src/generated/resources/assets/cosmiccore/blockstates/dawn_forge.json @@ -2,74 +2,74 @@ "variants": { "facing=east,upwards_facing=east": { "gtceu:z": 270, - "model": "cosmiccore:block/machine/ember_tester", + "model": "cosmiccore:block/machine/dawn_forge", "y": 90 }, "facing=east,upwards_facing=north": { - "model": "cosmiccore:block/machine/ember_tester", + "model": "cosmiccore:block/machine/dawn_forge", "y": 90 }, "facing=east,upwards_facing=south": { "gtceu:z": 180, - "model": "cosmiccore:block/machine/ember_tester", + "model": "cosmiccore:block/machine/dawn_forge", "y": 90 }, "facing=east,upwards_facing=west": { "gtceu:z": 90, - "model": "cosmiccore:block/machine/ember_tester", + "model": "cosmiccore:block/machine/dawn_forge", "y": 90 }, "facing=north,upwards_facing=east": { "gtceu:z": 270, - "model": "cosmiccore:block/machine/ember_tester" + "model": "cosmiccore:block/machine/dawn_forge" }, "facing=north,upwards_facing=north": { - "model": "cosmiccore:block/machine/ember_tester" + "model": "cosmiccore:block/machine/dawn_forge" }, "facing=north,upwards_facing=south": { "gtceu:z": 180, - "model": "cosmiccore:block/machine/ember_tester" + "model": "cosmiccore:block/machine/dawn_forge" }, "facing=north,upwards_facing=west": { "gtceu:z": 90, - "model": "cosmiccore:block/machine/ember_tester" + "model": "cosmiccore:block/machine/dawn_forge" }, "facing=south,upwards_facing=east": { "gtceu:z": 270, - "model": "cosmiccore:block/machine/ember_tester", + "model": "cosmiccore:block/machine/dawn_forge", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "cosmiccore:block/machine/ember_tester", + "model": "cosmiccore:block/machine/dawn_forge", "y": 180 }, "facing=south,upwards_facing=south": { "gtceu:z": 180, - "model": "cosmiccore:block/machine/ember_tester", + "model": "cosmiccore:block/machine/dawn_forge", "y": 180 }, "facing=south,upwards_facing=west": { "gtceu:z": 90, - "model": "cosmiccore:block/machine/ember_tester", + "model": "cosmiccore:block/machine/dawn_forge", "y": 180 }, "facing=west,upwards_facing=east": { "gtceu:z": 270, - "model": "cosmiccore:block/machine/ember_tester", + "model": "cosmiccore:block/machine/dawn_forge", "y": 270 }, "facing=west,upwards_facing=north": { - "model": "cosmiccore:block/machine/ember_tester", + "model": "cosmiccore:block/machine/dawn_forge", "y": 270 }, "facing=west,upwards_facing=south": { "gtceu:z": 180, - "model": "cosmiccore:block/machine/ember_tester", + "model": "cosmiccore:block/machine/dawn_forge", "y": 270 }, "facing=west,upwards_facing=west": { "gtceu:z": 90, - "model": "cosmiccore:block/machine/ember_tester", + "model": "cosmiccore:block/machine/dawn_forge", "y": 270 } } diff --git a/src/generated/resources/assets/cosmiccore/blockstates/dawnforge_eclipsed.json b/src/generated/resources/assets/cosmiccore/blockstates/dawnforge_eclipsed.json new file mode 100644 index 000000000..8efc4f2bc --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/dawnforge_eclipsed.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/dawnforge_eclipsed", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/dawnforge_eclipsed", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/dawnforge_eclipsed", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/dawnforge_eclipsed", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/dawnforge_eclipsed" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/dawnforge_eclipsed" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/dawnforge_eclipsed" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/dawnforge_eclipsed" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/dawnforge_eclipsed", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/dawnforge_eclipsed", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/dawnforge_eclipsed", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/dawnforge_eclipsed", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/dawnforge_eclipsed", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/dawnforge_eclipsed", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/dawnforge_eclipsed", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/dawnforge_eclipsed", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/diving_bell.json b/src/generated/resources/assets/cosmiccore/blockstates/diving_bell.json new file mode 100644 index 000000000..e3a97a861 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/diving_bell.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/diving_bell", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/diving_bell", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/diving_bell", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/diving_bell", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/diving_bell" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/diving_bell" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/diving_bell" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/diving_bell" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/diving_bell", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/diving_bell", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/diving_bell", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/diving_bell", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/diving_bell", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/diving_bell", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/diving_bell", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/diving_bell", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/diving_bell_escape_pad.json b/src/generated/resources/assets/cosmiccore/blockstates/diving_bell_escape_pad.json new file mode 100644 index 000000000..170a0143e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/diving_bell_escape_pad.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/diving_bell_escape_pad" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/dreamers_basin.json b/src/generated/resources/assets/cosmiccore/blockstates/dreamers_basin.json new file mode 100644 index 000000000..110393924 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/dreamers_basin.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/dreamers_basin", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/dreamers_basin", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/dreamers_basin", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/dreamers_basin", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/dreamers_basin" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/dreamers_basin" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/dreamers_basin" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/dreamers_basin" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/dreamers_basin", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/dreamers_basin", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/dreamers_basin", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/dreamers_basin", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/dreamers_basin", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/dreamers_basin", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/dreamers_basin", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/dreamers_basin", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/ethersteel_plated_ash_tiles.json b/src/generated/resources/assets/cosmiccore/blockstates/ethersteel_plated_ash_tiles.json new file mode 100644 index 000000000..acb7930f7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/ethersteel_plated_ash_tiles.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/ethersteel_plated_ash_tiles" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/ev_biolab.json b/src/generated/resources/assets/cosmiccore/blockstates/ev_biolab.json new file mode 100644 index 000000000..a53d03de7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/ev_biolab.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/ev_biolab", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/ev_biolab" + }, + "facing=south": { + "model": "cosmiccore:block/machine/ev_biolab", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/ev_biolab", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/ev_calx_reactor.json b/src/generated/resources/assets/cosmiccore/blockstates/ev_calx_reactor.json new file mode 100644 index 000000000..8ee8e3c31 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/ev_calx_reactor.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/ev_calx_reactor", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/ev_calx_reactor" + }, + "facing=south": { + "model": "cosmiccore:block/machine/ev_calx_reactor", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/ev_calx_reactor", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/ev_electric_apiary.json b/src/generated/resources/assets/cosmiccore/blockstates/ev_electric_apiary.json new file mode 100644 index 000000000..c072f4ffe --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/ev_electric_apiary.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/ev_electric_apiary", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/ev_electric_apiary" + }, + "facing=south": { + "model": "cosmiccore:block/machine/ev_electric_apiary", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/ev_electric_apiary", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/ev_ember_emitter.json b/src/generated/resources/assets/cosmiccore/blockstates/ev_ember_emitter.json new file mode 100644 index 000000000..261eed71a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/ev_ember_emitter.json @@ -0,0 +1,836 @@ +{ + "variants": { + "back=false,facing=down,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 180 + }, + "back=false,facing=east,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=north,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90 + }, + "back=false,facing=south,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=up,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter" + }, + "back=false,facing=west,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=down,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 180 + }, + "back=true,facing=east,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=north,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90 + }, + "back=true,facing=south,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=up,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter" + }, + "back=true,facing=west,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_emitter", + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/ev_ember_input_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/ev_ember_input_hatch.json new file mode 100644 index 000000000..0229d55f2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/ev_ember_input_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/ev_ember_input_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/ev_ember_input_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/ev_ember_input_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/ev_ember_input_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/ev_ember_input_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/ev_ember_input_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/ev_ember_output_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/ev_ember_output_hatch.json new file mode 100644 index 000000000..88360b27b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/ev_ember_output_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/ev_ember_output_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/ev_ember_output_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/ev_ember_output_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/ev_ember_output_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/ev_ember_output_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/ev_ember_output_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/ev_ember_receptor.json b/src/generated/resources/assets/cosmiccore/blockstates/ev_ember_receptor.json new file mode 100644 index 000000000..98650a996 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/ev_ember_receptor.json @@ -0,0 +1,56 @@ +{ + "variants": { + "facing=down,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_receptor", + "x": 180 + }, + "facing=down,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_receptor", + "x": 180 + }, + "facing=east,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_receptor", + "x": 90, + "y": 90 + }, + "facing=east,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_receptor", + "x": 90, + "y": 90 + }, + "facing=north,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_receptor", + "x": 90 + }, + "facing=north,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_receptor", + "x": 90 + }, + "facing=south,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_receptor", + "x": 90, + "y": 180 + }, + "facing=south,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_receptor", + "x": 90, + "y": 180 + }, + "facing=up,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_receptor" + }, + "facing=up,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_receptor" + }, + "facing=west,waterlogged=false": { + "model": "cosmiccore:block/ev_ember_receptor", + "x": 90, + "y": 270 + }, + "facing=west,waterlogged=true": { + "model": "cosmiccore:block/ev_ember_receptor", + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/ev_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/blockstates/ev_mana_leaching_tub.json new file mode 100644 index 000000000..12f68263f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/ev_mana_leaching_tub.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/ev_mana_leaching_tub", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/ev_mana_leaching_tub" + }, + "facing=south": { + "model": "cosmiccore:block/machine/ev_mana_leaching_tub", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/ev_mana_leaching_tub", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/ev_roaster.json b/src/generated/resources/assets/cosmiccore/blockstates/ev_roaster.json new file mode 100644 index 000000000..3727c252f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/ev_roaster.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/ev_roaster", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/ev_roaster" + }, + "facing=south": { + "model": "cosmiccore:block/machine/ev_roaster", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/ev_roaster", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/ev_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/blockstates/ev_thermomagnitizer.json new file mode 100644 index 000000000..90f832565 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/ev_thermomagnitizer.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/ev_thermomagnitizer", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/ev_thermomagnitizer" + }, + "facing=south": { + "model": "cosmiccore:block/machine/ev_thermomagnitizer", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/ev_thermomagnitizer", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/ev_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/blockstates/ev_vacuum_bubbler.json new file mode 100644 index 000000000..2eb146872 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/ev_vacuum_bubbler.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/ev_vacuum_bubbler", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/ev_vacuum_bubbler" + }, + "facing=south": { + "model": "cosmiccore:block/machine/ev_vacuum_bubbler", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/ev_vacuum_bubbler", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/honey_alveary.json b/src/generated/resources/assets/cosmiccore/blockstates/honey_alveary.json new file mode 100644 index 000000000..420f4f977 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/honey_alveary.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/honey_alveary", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/honey_alveary", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/honey_alveary", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/honey_alveary", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/honey_alveary" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/honey_alveary" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/honey_alveary" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/honey_alveary" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/honey_alveary", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/honey_alveary", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/honey_alveary", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/honey_alveary", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/honey_alveary", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/honey_alveary", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/honey_alveary", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/honey_alveary", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/hv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/blockstates/hv_calx_reactor.json new file mode 100644 index 000000000..e34820f3c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/hv_calx_reactor.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/hv_calx_reactor", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/hv_calx_reactor" + }, + "facing=south": { + "model": "cosmiccore:block/machine/hv_calx_reactor", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/hv_calx_reactor", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/hv_electric_apiary.json b/src/generated/resources/assets/cosmiccore/blockstates/hv_electric_apiary.json new file mode 100644 index 000000000..c81d1bd9d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/hv_electric_apiary.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/hv_electric_apiary", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/hv_electric_apiary" + }, + "facing=south": { + "model": "cosmiccore:block/machine/hv_electric_apiary", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/hv_electric_apiary", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/hv_ember_emitter.json b/src/generated/resources/assets/cosmiccore/blockstates/hv_ember_emitter.json new file mode 100644 index 000000000..483ebfe62 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/hv_ember_emitter.json @@ -0,0 +1,836 @@ +{ + "variants": { + "back=false,facing=down,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 180 + }, + "back=false,facing=east,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=north,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90 + }, + "back=false,facing=south,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=up,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter" + }, + "back=false,facing=west,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=down,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 180 + }, + "back=true,facing=east,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=north,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90 + }, + "back=true,facing=south,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=up,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter" + }, + "back=true,facing=west,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_emitter", + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/hv_ember_input_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/hv_ember_input_hatch.json new file mode 100644 index 000000000..c01b72ab6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/hv_ember_input_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/hv_ember_input_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/hv_ember_input_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/hv_ember_input_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/hv_ember_input_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/hv_ember_input_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/hv_ember_input_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/hv_ember_output_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/hv_ember_output_hatch.json new file mode 100644 index 000000000..76660b22a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/hv_ember_output_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/hv_ember_output_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/hv_ember_output_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/hv_ember_output_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/hv_ember_output_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/hv_ember_output_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/hv_ember_output_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/hv_ember_receptor.json b/src/generated/resources/assets/cosmiccore/blockstates/hv_ember_receptor.json new file mode 100644 index 000000000..b4ecceaee --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/hv_ember_receptor.json @@ -0,0 +1,56 @@ +{ + "variants": { + "facing=down,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_receptor", + "x": 180 + }, + "facing=down,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_receptor", + "x": 180 + }, + "facing=east,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_receptor", + "x": 90, + "y": 90 + }, + "facing=east,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_receptor", + "x": 90, + "y": 90 + }, + "facing=north,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_receptor", + "x": 90 + }, + "facing=north,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_receptor", + "x": 90 + }, + "facing=south,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_receptor", + "x": 90, + "y": 180 + }, + "facing=south,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_receptor", + "x": 90, + "y": 180 + }, + "facing=up,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_receptor" + }, + "facing=up,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_receptor" + }, + "facing=west,waterlogged=false": { + "model": "cosmiccore:block/hv_ember_receptor", + "x": 90, + "y": 270 + }, + "facing=west,waterlogged=true": { + "model": "cosmiccore:block/hv_ember_receptor", + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/hv_energy_output_hatch_16a.json b/src/generated/resources/assets/cosmiccore/blockstates/hv_energy_output_hatch_16a.json new file mode 100644 index 000000000..c0dcded7c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/hv_energy_output_hatch_16a.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/hv_energy_output_hatch_16a", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/hv_energy_output_hatch_16a", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/hv_energy_output_hatch_16a" + }, + "facing=south": { + "model": "cosmiccore:block/machine/hv_energy_output_hatch_16a", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/hv_energy_output_hatch_16a", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/hv_energy_output_hatch_16a", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/hv_energy_output_hatch_4a.json b/src/generated/resources/assets/cosmiccore/blockstates/hv_energy_output_hatch_4a.json new file mode 100644 index 000000000..d03c45171 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/hv_energy_output_hatch_4a.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/hv_energy_output_hatch_4a", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/hv_energy_output_hatch_4a", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/hv_energy_output_hatch_4a" + }, + "facing=south": { + "model": "cosmiccore:block/machine/hv_energy_output_hatch_4a", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/hv_energy_output_hatch_4a", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/hv_energy_output_hatch_4a", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/hv_input_hatch_4x.json b/src/generated/resources/assets/cosmiccore/blockstates/hv_input_hatch_4x.json new file mode 100644 index 000000000..ffe61dbb1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/hv_input_hatch_4x.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/hv_input_hatch_4x", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/hv_input_hatch_4x", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/hv_input_hatch_4x" + }, + "facing=south": { + "model": "cosmiccore:block/machine/hv_input_hatch_4x", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/hv_input_hatch_4x", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/hv_input_hatch_4x", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/hv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/blockstates/hv_mana_leaching_tub.json new file mode 100644 index 000000000..6751a47fa --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/hv_mana_leaching_tub.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/hv_mana_leaching_tub", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/hv_mana_leaching_tub" + }, + "facing=south": { + "model": "cosmiccore:block/machine/hv_mana_leaching_tub", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/hv_mana_leaching_tub", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/hv_output_hatch_4x.json b/src/generated/resources/assets/cosmiccore/blockstates/hv_output_hatch_4x.json new file mode 100644 index 000000000..b35637871 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/hv_output_hatch_4x.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/hv_output_hatch_4x", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/hv_output_hatch_4x", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/hv_output_hatch_4x" + }, + "facing=south": { + "model": "cosmiccore:block/machine/hv_output_hatch_4x", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/hv_output_hatch_4x", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/hv_output_hatch_4x", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/hv_roaster.json b/src/generated/resources/assets/cosmiccore/blockstates/hv_roaster.json new file mode 100644 index 000000000..669e1cb9b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/hv_roaster.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/hv_roaster", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/hv_roaster" + }, + "facing=south": { + "model": "cosmiccore:block/machine/hv_roaster", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/hv_roaster", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/hv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/blockstates/hv_thermomagnitizer.json new file mode 100644 index 000000000..b5b6ab40b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/hv_thermomagnitizer.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/hv_thermomagnitizer", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/hv_thermomagnitizer" + }, + "facing=south": { + "model": "cosmiccore:block/machine/hv_thermomagnitizer", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/hv_thermomagnitizer", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/hv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/blockstates/hv_vacuum_bubbler.json new file mode 100644 index 000000000..49924d42c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/hv_vacuum_bubbler.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/hv_vacuum_bubbler", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/hv_vacuum_bubbler" + }, + "facing=south": { + "model": "cosmiccore:block/machine/hv_vacuum_bubbler", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/hv_vacuum_bubbler", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/iron_plated_deepslate_tile.json b/src/generated/resources/assets/cosmiccore/blockstates/iron_plated_deepslate_tile.json new file mode 100644 index 000000000..991a81be5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/iron_plated_deepslate_tile.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/iron_plated_deepslate_tile" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/iron_plated_deepslate_tile_slab.json b/src/generated/resources/assets/cosmiccore/blockstates/iron_plated_deepslate_tile_slab.json new file mode 100644 index 000000000..93a0ae9d9 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/iron_plated_deepslate_tile_slab.json @@ -0,0 +1,13 @@ +{ + "variants": { + "type=bottom": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_slab" + }, + "type=double": { + "model": "cosmiccore:block/iron_plated_deepslate_tile" + }, + "type=top": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_slab_top" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/iron_plated_deepslate_tile_stairs.json b/src/generated/resources/assets/cosmiccore/blockstates/iron_plated_deepslate_tile_stairs.json new file mode 100644 index 000000000..3758cf60c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/iron_plated_deepslate_tile_stairs.json @@ -0,0 +1,209 @@ +{ + "variants": { + "facing=east,half=bottom,shape=inner_left": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_inner", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=inner_right": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_inner" + }, + "facing=east,half=bottom,shape=outer_left": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_outer", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=outer_right": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_outer" + }, + "facing=east,half=bottom,shape=straight": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs" + }, + "facing=east,half=top,shape=inner_left": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_inner", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=inner_right": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=outer_left": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_outer", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=outer_right": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=straight": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs", + "uvlock": true, + "x": 180 + }, + "facing=north,half=bottom,shape=inner_left": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_inner", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=inner_right": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_inner", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=outer_left": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_outer", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=outer_right": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_outer", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=straight": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs", + "uvlock": true, + "y": 270 + }, + "facing=north,half=top,shape=inner_left": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=inner_right": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_inner", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=outer_left": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=outer_right": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_outer", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=straight": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=south,half=bottom,shape=inner_left": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_inner" + }, + "facing=south,half=bottom,shape=inner_right": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_inner", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=outer_left": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_outer" + }, + "facing=south,half=bottom,shape=outer_right": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_outer", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=straight": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs", + "uvlock": true, + "y": 90 + }, + "facing=south,half=top,shape=inner_left": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=inner_right": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=outer_left": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=outer_right": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=straight": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_left": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_inner", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_right": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_inner", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=outer_left": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_outer", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=outer_right": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_outer", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=straight": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs", + "uvlock": true, + "y": 180 + }, + "facing=west,half=top,shape=inner_left": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=inner_right": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=outer_left": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=outer_right": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=straight": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs", + "uvlock": true, + "x": 180, + "y": 180 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/iv_biolab.json b/src/generated/resources/assets/cosmiccore/blockstates/iv_biolab.json new file mode 100644 index 000000000..b88d32ea5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/iv_biolab.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/iv_biolab", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/iv_biolab" + }, + "facing=south": { + "model": "cosmiccore:block/machine/iv_biolab", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/iv_biolab", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/iv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/blockstates/iv_calx_reactor.json new file mode 100644 index 000000000..a111913fb --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/iv_calx_reactor.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/iv_calx_reactor", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/iv_calx_reactor" + }, + "facing=south": { + "model": "cosmiccore:block/machine/iv_calx_reactor", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/iv_calx_reactor", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/iv_electric_apiary.json b/src/generated/resources/assets/cosmiccore/blockstates/iv_electric_apiary.json new file mode 100644 index 000000000..b830b89df --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/iv_electric_apiary.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/iv_electric_apiary", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/iv_electric_apiary" + }, + "facing=south": { + "model": "cosmiccore:block/machine/iv_electric_apiary", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/iv_electric_apiary", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/iv_ember_emitter.json b/src/generated/resources/assets/cosmiccore/blockstates/iv_ember_emitter.json new file mode 100644 index 000000000..bbc93de47 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/iv_ember_emitter.json @@ -0,0 +1,836 @@ +{ + "variants": { + "back=false,facing=down,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 180 + }, + "back=false,facing=east,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=north,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90 + }, + "back=false,facing=south,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=up,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter" + }, + "back=false,facing=west,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=down,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 180 + }, + "back=true,facing=east,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=north,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90 + }, + "back=true,facing=south,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=up,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter" + }, + "back=true,facing=west,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_emitter", + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/iv_ember_receptor.json b/src/generated/resources/assets/cosmiccore/blockstates/iv_ember_receptor.json new file mode 100644 index 000000000..861e53242 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/iv_ember_receptor.json @@ -0,0 +1,56 @@ +{ + "variants": { + "facing=down,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_receptor", + "x": 180 + }, + "facing=down,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_receptor", + "x": 180 + }, + "facing=east,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_receptor", + "x": 90, + "y": 90 + }, + "facing=east,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_receptor", + "x": 90, + "y": 90 + }, + "facing=north,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_receptor", + "x": 90 + }, + "facing=north,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_receptor", + "x": 90 + }, + "facing=south,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_receptor", + "x": 90, + "y": 180 + }, + "facing=south,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_receptor", + "x": 90, + "y": 180 + }, + "facing=up,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_receptor" + }, + "facing=up,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_receptor" + }, + "facing=west,waterlogged=false": { + "model": "cosmiccore:block/iv_ember_receptor", + "x": 90, + "y": 270 + }, + "facing=west,waterlogged=true": { + "model": "cosmiccore:block/iv_ember_receptor", + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/iv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/blockstates/iv_mana_leaching_tub.json new file mode 100644 index 000000000..9dd9b09e8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/iv_mana_leaching_tub.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/iv_mana_leaching_tub", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/iv_mana_leaching_tub" + }, + "facing=south": { + "model": "cosmiccore:block/machine/iv_mana_leaching_tub", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/iv_mana_leaching_tub", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/iv_roaster.json b/src/generated/resources/assets/cosmiccore/blockstates/iv_roaster.json new file mode 100644 index 000000000..55cfcd8e3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/iv_roaster.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/iv_roaster", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/iv_roaster" + }, + "facing=south": { + "model": "cosmiccore:block/machine/iv_roaster", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/iv_roaster", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/iv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/blockstates/iv_thermomagnitizer.json new file mode 100644 index 000000000..d51be7b1c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/iv_thermomagnitizer.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/iv_thermomagnitizer", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/iv_thermomagnitizer" + }, + "facing=south": { + "model": "cosmiccore:block/machine/iv_thermomagnitizer", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/iv_thermomagnitizer", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/iv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/blockstates/iv_vacuum_bubbler.json new file mode 100644 index 000000000..73e9ed73d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/iv_vacuum_bubbler.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/iv_vacuum_bubbler", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/iv_vacuum_bubbler" + }, + "facing=south": { + "model": "cosmiccore:block/machine/iv_vacuum_bubbler", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/iv_vacuum_bubbler", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/large_roaster.json b/src/generated/resources/assets/cosmiccore/blockstates/large_roaster.json new file mode 100644 index 000000000..1b5f5842a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/large_roaster.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/large_roaster", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/large_roaster", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/large_roaster", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/large_roaster", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/large_roaster" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/large_roaster" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/large_roaster" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/large_roaster" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/large_roaster", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/large_roaster", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/large_roaster", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/large_roaster", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/large_roaster", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/large_roaster", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/large_roaster", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/large_roaster", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/larva.json b/src/generated/resources/assets/cosmiccore/blockstates/larva.json new file mode 100644 index 000000000..771285d84 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/larva.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/larva", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/larva", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/larva", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/larva", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/larva" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/larva" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/larva" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/larva" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/larva", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/larva", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/larva", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/larva", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/larva", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/larva", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/larva", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/larva", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/light_dawnstone_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/light_dawnstone_casing.json new file mode 100644 index 000000000..d70ef361c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/light_dawnstone_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/light_dawnstone_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/link_test_station.json b/src/generated/resources/assets/cosmiccore/blockstates/link_test_station.json new file mode 100644 index 000000000..28b9191d6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/link_test_station.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/link_test_station", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/link_test_station", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/link_test_station", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/link_test_station", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/link_test_station" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/link_test_station" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/link_test_station" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/link_test_station" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/link_test_station", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/link_test_station", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/link_test_station", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/link_test_station", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/link_test_station", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/link_test_station", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/link_test_station", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/link_test_station", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/livingrock_tiles.json b/src/generated/resources/assets/cosmiccore/blockstates/livingrock_tiles.json new file mode 100644 index 000000000..38656521b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/livingrock_tiles.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/livingrock_tiles" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/luv_biolab.json b/src/generated/resources/assets/cosmiccore/blockstates/luv_biolab.json new file mode 100644 index 000000000..37a625c56 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/luv_biolab.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/luv_biolab", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/luv_biolab" + }, + "facing=south": { + "model": "cosmiccore:block/machine/luv_biolab", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/luv_biolab", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/luv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/blockstates/luv_calx_reactor.json new file mode 100644 index 000000000..ec87e2d9b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/luv_calx_reactor.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/luv_calx_reactor", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/luv_calx_reactor" + }, + "facing=south": { + "model": "cosmiccore:block/machine/luv_calx_reactor", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/luv_calx_reactor", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/luv_electric_apiary.json b/src/generated/resources/assets/cosmiccore/blockstates/luv_electric_apiary.json new file mode 100644 index 000000000..3bcdc472d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/luv_electric_apiary.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/luv_electric_apiary", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/luv_electric_apiary" + }, + "facing=south": { + "model": "cosmiccore:block/machine/luv_electric_apiary", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/luv_electric_apiary", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/luv_ember_emitter.json b/src/generated/resources/assets/cosmiccore/blockstates/luv_ember_emitter.json new file mode 100644 index 000000000..7d45c7204 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/luv_ember_emitter.json @@ -0,0 +1,836 @@ +{ + "variants": { + "back=false,facing=down,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 180 + }, + "back=false,facing=east,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=north,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90 + }, + "back=false,facing=south,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=up,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter" + }, + "back=false,facing=west,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=down,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 180 + }, + "back=true,facing=east,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=north,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90 + }, + "back=true,facing=south,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=up,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter" + }, + "back=true,facing=west,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_emitter", + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/luv_ember_receptor.json b/src/generated/resources/assets/cosmiccore/blockstates/luv_ember_receptor.json new file mode 100644 index 000000000..e93b807f9 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/luv_ember_receptor.json @@ -0,0 +1,56 @@ +{ + "variants": { + "facing=down,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_receptor", + "x": 180 + }, + "facing=down,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_receptor", + "x": 180 + }, + "facing=east,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_receptor", + "x": 90, + "y": 90 + }, + "facing=east,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_receptor", + "x": 90, + "y": 90 + }, + "facing=north,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_receptor", + "x": 90 + }, + "facing=north,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_receptor", + "x": 90 + }, + "facing=south,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_receptor", + "x": 90, + "y": 180 + }, + "facing=south,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_receptor", + "x": 90, + "y": 180 + }, + "facing=up,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_receptor" + }, + "facing=up,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_receptor" + }, + "facing=west,waterlogged=false": { + "model": "cosmiccore:block/luv_ember_receptor", + "x": 90, + "y": 270 + }, + "facing=west,waterlogged=true": { + "model": "cosmiccore:block/luv_ember_receptor", + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/luv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/blockstates/luv_mana_leaching_tub.json new file mode 100644 index 000000000..c2b9c7918 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/luv_mana_leaching_tub.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/luv_mana_leaching_tub", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/luv_mana_leaching_tub" + }, + "facing=south": { + "model": "cosmiccore:block/machine/luv_mana_leaching_tub", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/luv_mana_leaching_tub", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/luv_roaster.json b/src/generated/resources/assets/cosmiccore/blockstates/luv_roaster.json new file mode 100644 index 000000000..fadcee439 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/luv_roaster.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/luv_roaster", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/luv_roaster" + }, + "facing=south": { + "model": "cosmiccore:block/machine/luv_roaster", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/luv_roaster", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/luv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/blockstates/luv_thermomagnitizer.json new file mode 100644 index 000000000..370c6b5d6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/luv_thermomagnitizer.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/luv_thermomagnitizer", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/luv_thermomagnitizer" + }, + "facing=south": { + "model": "cosmiccore:block/machine/luv_thermomagnitizer", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/luv_thermomagnitizer", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/luv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/blockstates/luv_vacuum_bubbler.json new file mode 100644 index 000000000..69b7917e5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/luv_vacuum_bubbler.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/luv_vacuum_bubbler", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/luv_vacuum_bubbler" + }, + "facing=south": { + "model": "cosmiccore:block/machine/luv_vacuum_bubbler", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/luv_vacuum_bubbler", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/lv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/blockstates/lv_calx_reactor.json new file mode 100644 index 000000000..ce453f291 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/lv_calx_reactor.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/lv_calx_reactor", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/lv_calx_reactor" + }, + "facing=south": { + "model": "cosmiccore:block/machine/lv_calx_reactor", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/lv_calx_reactor", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/lv_electric_apiary.json b/src/generated/resources/assets/cosmiccore/blockstates/lv_electric_apiary.json new file mode 100644 index 000000000..f9ed6ec9e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/lv_electric_apiary.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/lv_electric_apiary", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/lv_electric_apiary" + }, + "facing=south": { + "model": "cosmiccore:block/machine/lv_electric_apiary", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/lv_electric_apiary", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/lv_ember_emitter.json b/src/generated/resources/assets/cosmiccore/blockstates/lv_ember_emitter.json new file mode 100644 index 000000000..c8ee4f01d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/lv_ember_emitter.json @@ -0,0 +1,836 @@ +{ + "variants": { + "back=false,facing=down,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 180 + }, + "back=false,facing=east,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=north,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90 + }, + "back=false,facing=south,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=up,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter" + }, + "back=false,facing=west,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=down,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 180 + }, + "back=true,facing=east,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=north,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90 + }, + "back=true,facing=south,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=up,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter" + }, + "back=true,facing=west,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_emitter", + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/lv_ember_input_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/lv_ember_input_hatch.json new file mode 100644 index 000000000..ed94438d1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/lv_ember_input_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/lv_ember_input_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/lv_ember_input_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/lv_ember_input_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/lv_ember_input_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/lv_ember_input_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/lv_ember_input_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/lv_ember_output_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/lv_ember_output_hatch.json new file mode 100644 index 000000000..e8fec1901 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/lv_ember_output_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/lv_ember_output_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/lv_ember_output_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/lv_ember_output_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/lv_ember_output_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/lv_ember_output_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/lv_ember_output_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/lv_ember_receptor.json b/src/generated/resources/assets/cosmiccore/blockstates/lv_ember_receptor.json new file mode 100644 index 000000000..29bd1b50c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/lv_ember_receptor.json @@ -0,0 +1,56 @@ +{ + "variants": { + "facing=down,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_receptor", + "x": 180 + }, + "facing=down,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_receptor", + "x": 180 + }, + "facing=east,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_receptor", + "x": 90, + "y": 90 + }, + "facing=east,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_receptor", + "x": 90, + "y": 90 + }, + "facing=north,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_receptor", + "x": 90 + }, + "facing=north,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_receptor", + "x": 90 + }, + "facing=south,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_receptor", + "x": 90, + "y": 180 + }, + "facing=south,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_receptor", + "x": 90, + "y": 180 + }, + "facing=up,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_receptor" + }, + "facing=up,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_receptor" + }, + "facing=west,waterlogged=false": { + "model": "cosmiccore:block/lv_ember_receptor", + "x": 90, + "y": 270 + }, + "facing=west,waterlogged=true": { + "model": "cosmiccore:block/lv_ember_receptor", + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/lv_energy_output_hatch_16a.json b/src/generated/resources/assets/cosmiccore/blockstates/lv_energy_output_hatch_16a.json new file mode 100644 index 000000000..8f971d2f3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/lv_energy_output_hatch_16a.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/lv_energy_output_hatch_16a", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/lv_energy_output_hatch_16a", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/lv_energy_output_hatch_16a" + }, + "facing=south": { + "model": "cosmiccore:block/machine/lv_energy_output_hatch_16a", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/lv_energy_output_hatch_16a", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/lv_energy_output_hatch_16a", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/lv_energy_output_hatch_4a.json b/src/generated/resources/assets/cosmiccore/blockstates/lv_energy_output_hatch_4a.json new file mode 100644 index 000000000..8fcc8bdb1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/lv_energy_output_hatch_4a.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/lv_energy_output_hatch_4a", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/lv_energy_output_hatch_4a", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/lv_energy_output_hatch_4a" + }, + "facing=south": { + "model": "cosmiccore:block/machine/lv_energy_output_hatch_4a", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/lv_energy_output_hatch_4a", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/lv_energy_output_hatch_4a", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/lv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/blockstates/lv_mana_leaching_tub.json new file mode 100644 index 000000000..cc9ab8f0a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/lv_mana_leaching_tub.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/lv_mana_leaching_tub", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/lv_mana_leaching_tub" + }, + "facing=south": { + "model": "cosmiccore:block/machine/lv_mana_leaching_tub", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/lv_mana_leaching_tub", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/lv_roaster.json b/src/generated/resources/assets/cosmiccore/blockstates/lv_roaster.json new file mode 100644 index 000000000..e33b7fd05 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/lv_roaster.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/lv_roaster", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/lv_roaster" + }, + "facing=south": { + "model": "cosmiccore:block/machine/lv_roaster", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/lv_roaster", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/lv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/blockstates/lv_thermomagnitizer.json new file mode 100644 index 000000000..3fb48ff88 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/lv_thermomagnitizer.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/lv_thermomagnitizer", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/lv_thermomagnitizer" + }, + "facing=south": { + "model": "cosmiccore:block/machine/lv_thermomagnitizer", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/lv_thermomagnitizer", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/lv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/blockstates/lv_vacuum_bubbler.json new file mode 100644 index 000000000..f5ecc2044 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/lv_vacuum_bubbler.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/lv_vacuum_bubbler", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/lv_vacuum_bubbler" + }, + "facing=south": { + "model": "cosmiccore:block/machine/lv_vacuum_bubbler", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/lv_vacuum_bubbler", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/mana_etching_factory.json b/src/generated/resources/assets/cosmiccore/blockstates/mana_etching_factory.json new file mode 100644 index 000000000..e4ab496a4 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/mana_etching_factory.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/mana_etching_factory", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/mana_etching_factory", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/mana_etching_factory", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/mana_etching_factory", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/mana_etching_factory" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/mana_etching_factory" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/mana_etching_factory" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/mana_etching_factory" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/mana_etching_factory", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/mana_etching_factory", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/mana_etching_factory", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/mana_etching_factory", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/mana_etching_factory", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/mana_etching_factory", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/mana_etching_factory", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/mana_etching_factory", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/max_ember_emitter.json b/src/generated/resources/assets/cosmiccore/blockstates/max_ember_emitter.json new file mode 100644 index 000000000..8bb9db247 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/max_ember_emitter.json @@ -0,0 +1,836 @@ +{ + "variants": { + "back=false,facing=down,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 180 + }, + "back=false,facing=east,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=north,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90 + }, + "back=false,facing=south,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=up,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter" + }, + "back=false,facing=west,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=down,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 180 + }, + "back=true,facing=east,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=north,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90 + }, + "back=true,facing=south,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=up,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter" + }, + "back=true,facing=west,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/max_ember_emitter", + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/max_ember_receptor.json b/src/generated/resources/assets/cosmiccore/blockstates/max_ember_receptor.json new file mode 100644 index 000000000..db099e1e5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/max_ember_receptor.json @@ -0,0 +1,56 @@ +{ + "variants": { + "facing=down,waterlogged=false": { + "model": "cosmiccore:block/max_ember_receptor", + "x": 180 + }, + "facing=down,waterlogged=true": { + "model": "cosmiccore:block/max_ember_receptor", + "x": 180 + }, + "facing=east,waterlogged=false": { + "model": "cosmiccore:block/max_ember_receptor", + "x": 90, + "y": 90 + }, + "facing=east,waterlogged=true": { + "model": "cosmiccore:block/max_ember_receptor", + "x": 90, + "y": 90 + }, + "facing=north,waterlogged=false": { + "model": "cosmiccore:block/max_ember_receptor", + "x": 90 + }, + "facing=north,waterlogged=true": { + "model": "cosmiccore:block/max_ember_receptor", + "x": 90 + }, + "facing=south,waterlogged=false": { + "model": "cosmiccore:block/max_ember_receptor", + "x": 90, + "y": 180 + }, + "facing=south,waterlogged=true": { + "model": "cosmiccore:block/max_ember_receptor", + "x": 90, + "y": 180 + }, + "facing=up,waterlogged=false": { + "model": "cosmiccore:block/max_ember_receptor" + }, + "facing=up,waterlogged=true": { + "model": "cosmiccore:block/max_ember_receptor" + }, + "facing=west,waterlogged=false": { + "model": "cosmiccore:block/max_ember_receptor", + "x": 90, + "y": 270 + }, + "facing=west,waterlogged=true": { + "model": "cosmiccore:block/max_ember_receptor", + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/moth_cargo_drop_off.json b/src/generated/resources/assets/cosmiccore/blockstates/moth_cargo_drop_off.json new file mode 100644 index 000000000..1a24e6cfc --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/moth_cargo_drop_off.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/moth_cargo_drop_off", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/moth_cargo_drop_off", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/moth_cargo_drop_off", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/moth_cargo_drop_off", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/moth_cargo_drop_off" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/moth_cargo_drop_off" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/moth_cargo_drop_off" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/moth_cargo_drop_off" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/moth_cargo_drop_off", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/moth_cargo_drop_off", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/moth_cargo_drop_off", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/moth_cargo_drop_off", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/moth_cargo_drop_off", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/moth_cargo_drop_off", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/moth_cargo_drop_off", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/moth_cargo_drop_off", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/moth_cargo_station.json b/src/generated/resources/assets/cosmiccore/blockstates/moth_cargo_station.json new file mode 100644 index 000000000..a668efed5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/moth_cargo_station.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/moth_cargo_station", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/moth_cargo_station", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/moth_cargo_station", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/moth_cargo_station", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/moth_cargo_station" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/moth_cargo_station" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/moth_cargo_station" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/moth_cargo_station" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/moth_cargo_station", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/moth_cargo_station", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/moth_cargo_station", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/moth_cargo_station", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/moth_cargo_station", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/moth_cargo_station", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/moth_cargo_station", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/moth_cargo_station", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/moth_home_t1.json b/src/generated/resources/assets/cosmiccore/blockstates/moth_home_t1.json new file mode 100644 index 000000000..f6eefc61b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/moth_home_t1.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/moth_home_t1" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/moth_home_t2.json b/src/generated/resources/assets/cosmiccore/blockstates/moth_home_t2.json new file mode 100644 index 000000000..03256da3d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/moth_home_t2.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/moth_home_t2" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/moth_home_t3.json b/src/generated/resources/assets/cosmiccore/blockstates/moth_home_t3.json new file mode 100644 index 000000000..d9c0370ce --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/moth_home_t3.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/moth_home_t3" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/moth_home_t4.json b/src/generated/resources/assets/cosmiccore/blockstates/moth_home_t4.json new file mode 100644 index 000000000..00287d320 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/moth_home_t4.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/moth_home_t4" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/moth_station_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/moth_station_casing.json new file mode 100644 index 000000000..4ae453039 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/moth_station_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/moth_station_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/mv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/blockstates/mv_calx_reactor.json new file mode 100644 index 000000000..c1a57ed6a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/mv_calx_reactor.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/mv_calx_reactor", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/mv_calx_reactor" + }, + "facing=south": { + "model": "cosmiccore:block/machine/mv_calx_reactor", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/mv_calx_reactor", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/mv_electric_apiary.json b/src/generated/resources/assets/cosmiccore/blockstates/mv_electric_apiary.json new file mode 100644 index 000000000..cc8811c85 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/mv_electric_apiary.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/mv_electric_apiary", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/mv_electric_apiary" + }, + "facing=south": { + "model": "cosmiccore:block/machine/mv_electric_apiary", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/mv_electric_apiary", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/mv_ember_emitter.json b/src/generated/resources/assets/cosmiccore/blockstates/mv_ember_emitter.json new file mode 100644 index 000000000..4fa916516 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/mv_ember_emitter.json @@ -0,0 +1,836 @@ +{ + "variants": { + "back=false,facing=down,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 180 + }, + "back=false,facing=east,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=north,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90 + }, + "back=false,facing=south,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=up,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter" + }, + "back=false,facing=west,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=down,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 180 + }, + "back=true,facing=east,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=north,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90 + }, + "back=true,facing=south,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=up,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter" + }, + "back=true,facing=west,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_emitter", + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/mv_ember_input_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/mv_ember_input_hatch.json new file mode 100644 index 000000000..fadc477a7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/mv_ember_input_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/mv_ember_input_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/mv_ember_input_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/mv_ember_input_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/mv_ember_input_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/mv_ember_input_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/mv_ember_input_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/mv_ember_output_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/mv_ember_output_hatch.json new file mode 100644 index 000000000..472fb34a0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/mv_ember_output_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/mv_ember_output_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/mv_ember_output_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/mv_ember_output_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/mv_ember_output_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/mv_ember_output_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/mv_ember_output_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/mv_ember_receptor.json b/src/generated/resources/assets/cosmiccore/blockstates/mv_ember_receptor.json new file mode 100644 index 000000000..f497de26c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/mv_ember_receptor.json @@ -0,0 +1,56 @@ +{ + "variants": { + "facing=down,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_receptor", + "x": 180 + }, + "facing=down,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_receptor", + "x": 180 + }, + "facing=east,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_receptor", + "x": 90, + "y": 90 + }, + "facing=east,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_receptor", + "x": 90, + "y": 90 + }, + "facing=north,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_receptor", + "x": 90 + }, + "facing=north,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_receptor", + "x": 90 + }, + "facing=south,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_receptor", + "x": 90, + "y": 180 + }, + "facing=south,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_receptor", + "x": 90, + "y": 180 + }, + "facing=up,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_receptor" + }, + "facing=up,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_receptor" + }, + "facing=west,waterlogged=false": { + "model": "cosmiccore:block/mv_ember_receptor", + "x": 90, + "y": 270 + }, + "facing=west,waterlogged=true": { + "model": "cosmiccore:block/mv_ember_receptor", + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/mv_energy_output_hatch_16a.json b/src/generated/resources/assets/cosmiccore/blockstates/mv_energy_output_hatch_16a.json new file mode 100644 index 000000000..693a8c1af --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/mv_energy_output_hatch_16a.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/mv_energy_output_hatch_16a", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/mv_energy_output_hatch_16a", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/mv_energy_output_hatch_16a" + }, + "facing=south": { + "model": "cosmiccore:block/machine/mv_energy_output_hatch_16a", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/mv_energy_output_hatch_16a", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/mv_energy_output_hatch_16a", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/mv_energy_output_hatch_4a.json b/src/generated/resources/assets/cosmiccore/blockstates/mv_energy_output_hatch_4a.json new file mode 100644 index 000000000..8689197eb --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/mv_energy_output_hatch_4a.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/mv_energy_output_hatch_4a", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/mv_energy_output_hatch_4a", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/mv_energy_output_hatch_4a" + }, + "facing=south": { + "model": "cosmiccore:block/machine/mv_energy_output_hatch_4a", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/mv_energy_output_hatch_4a", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/mv_energy_output_hatch_4a", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/mv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/blockstates/mv_mana_leaching_tub.json new file mode 100644 index 000000000..8c0583065 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/mv_mana_leaching_tub.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/mv_mana_leaching_tub", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/mv_mana_leaching_tub" + }, + "facing=south": { + "model": "cosmiccore:block/machine/mv_mana_leaching_tub", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/mv_mana_leaching_tub", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/mv_roaster.json b/src/generated/resources/assets/cosmiccore/blockstates/mv_roaster.json new file mode 100644 index 000000000..397c2fef6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/mv_roaster.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/mv_roaster", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/mv_roaster" + }, + "facing=south": { + "model": "cosmiccore:block/machine/mv_roaster", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/mv_roaster", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/mv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/blockstates/mv_thermomagnitizer.json new file mode 100644 index 000000000..4e160bd93 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/mv_thermomagnitizer.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/mv_thermomagnitizer", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/mv_thermomagnitizer" + }, + "facing=south": { + "model": "cosmiccore:block/machine/mv_thermomagnitizer", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/mv_thermomagnitizer", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/mv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/blockstates/mv_vacuum_bubbler.json new file mode 100644 index 000000000..329939eeb --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/mv_vacuum_bubbler.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/mv_vacuum_bubbler", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/mv_vacuum_bubbler" + }, + "facing=south": { + "model": "cosmiccore:block/machine/mv_vacuum_bubbler", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/mv_vacuum_bubbler", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/opv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/blockstates/opv_calx_reactor.json new file mode 100644 index 000000000..b54f03bf6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/opv_calx_reactor.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/opv_calx_reactor", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/opv_calx_reactor" + }, + "facing=south": { + "model": "cosmiccore:block/machine/opv_calx_reactor", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/opv_calx_reactor", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/opv_ember_emitter.json b/src/generated/resources/assets/cosmiccore/blockstates/opv_ember_emitter.json new file mode 100644 index 000000000..80922b1ed --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/opv_ember_emitter.json @@ -0,0 +1,836 @@ +{ + "variants": { + "back=false,facing=down,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 180 + }, + "back=false,facing=east,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=north,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90 + }, + "back=false,facing=south,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=up,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter" + }, + "back=false,facing=west,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=down,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 180 + }, + "back=true,facing=east,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=north,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90 + }, + "back=true,facing=south,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=up,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter" + }, + "back=true,facing=west,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_emitter", + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/opv_ember_receptor.json b/src/generated/resources/assets/cosmiccore/blockstates/opv_ember_receptor.json new file mode 100644 index 000000000..5979ed0c0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/opv_ember_receptor.json @@ -0,0 +1,56 @@ +{ + "variants": { + "facing=down,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_receptor", + "x": 180 + }, + "facing=down,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_receptor", + "x": 180 + }, + "facing=east,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_receptor", + "x": 90, + "y": 90 + }, + "facing=east,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_receptor", + "x": 90, + "y": 90 + }, + "facing=north,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_receptor", + "x": 90 + }, + "facing=north,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_receptor", + "x": 90 + }, + "facing=south,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_receptor", + "x": 90, + "y": 180 + }, + "facing=south,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_receptor", + "x": 90, + "y": 180 + }, + "facing=up,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_receptor" + }, + "facing=up,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_receptor" + }, + "facing=west,waterlogged=false": { + "model": "cosmiccore:block/opv_ember_receptor", + "x": 90, + "y": 270 + }, + "facing=west,waterlogged=true": { + "model": "cosmiccore:block/opv_ember_receptor", + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/opv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/blockstates/opv_mana_leaching_tub.json new file mode 100644 index 000000000..bebe5e7c9 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/opv_mana_leaching_tub.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/opv_mana_leaching_tub", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/opv_mana_leaching_tub" + }, + "facing=south": { + "model": "cosmiccore:block/machine/opv_mana_leaching_tub", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/opv_mana_leaching_tub", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/opv_roaster.json b/src/generated/resources/assets/cosmiccore/blockstates/opv_roaster.json new file mode 100644 index 000000000..c534a9594 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/opv_roaster.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/opv_roaster", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/opv_roaster" + }, + "facing=south": { + "model": "cosmiccore:block/machine/opv_roaster", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/opv_roaster", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/opv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/blockstates/opv_thermomagnitizer.json new file mode 100644 index 000000000..d61027d24 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/opv_thermomagnitizer.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/opv_thermomagnitizer", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/opv_thermomagnitizer" + }, + "facing=south": { + "model": "cosmiccore:block/machine/opv_thermomagnitizer", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/opv_thermomagnitizer", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/opv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/blockstates/opv_vacuum_bubbler.json new file mode 100644 index 000000000..41a89eeda --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/opv_vacuum_bubbler.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/opv_vacuum_bubbler", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/opv_vacuum_bubbler" + }, + "facing=south": { + "model": "cosmiccore:block/machine/opv_vacuum_bubbler", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/opv_vacuum_bubbler", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/pyrothermic_refinery.json b/src/generated/resources/assets/cosmiccore/blockstates/pyrothermic_refinery.json new file mode 100644 index 000000000..83d779b2f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/pyrothermic_refinery.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/pyrothermic_refinery", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/pyrothermic_refinery", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/pyrothermic_refinery", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/pyrothermic_refinery", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/pyrothermic_refinery" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/pyrothermic_refinery" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/pyrothermic_refinery" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/pyrothermic_refinery" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/pyrothermic_refinery", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/pyrothermic_refinery", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/pyrothermic_refinery", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/pyrothermic_refinery", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/pyrothermic_refinery", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/pyrothermic_refinery", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/pyrothermic_refinery", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/pyrothermic_refinery", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/reinforced_dawnstone_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/reinforced_dawnstone_casing.json new file mode 100644 index 000000000..108ececb7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/reinforced_dawnstone_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/reinforced_dawnstone_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/rigid_high_speed_steel_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/rigid_high_speed_steel_casing.json new file mode 100644 index 000000000..16e48d603 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/rigid_high_speed_steel_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/rigid_high_speed_steel_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/rust_stained_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/rust_stained_casing.json new file mode 100644 index 000000000..3d54a4983 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/rust_stained_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/rust_stained_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/rust_weave_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/rust_weave_casing.json new file mode 100644 index 000000000..b02aa8f43 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/rust_weave_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/rust_weave_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/somarust_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/somarust_casing.json new file mode 100644 index 000000000..fe9be6560 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/somarust_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/somarust_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/soul_muted_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/soul_muted_casing.json new file mode 100644 index 000000000..6b3ea6fec --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/soul_muted_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/soul_muted_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/soul_stained_steel_aluminium_plated_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/soul_stained_steel_aluminium_plated_casing.json new file mode 100644 index 000000000..8c73cd505 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/soul_stained_steel_aluminium_plated_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/soul_stained_steel_aluminium_plated_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/star_ballast.json b/src/generated/resources/assets/cosmiccore/blockstates/star_ballast.json deleted file mode 100644 index f676d0f13..000000000 --- a/src/generated/resources/assets/cosmiccore/blockstates/star_ballast.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "variants": { - "facing=down,upwards_facing=east": { - "gtceu:z": 90, - "model": "cosmiccore:block/machine/star_ballast", - "x": 90 - }, - "facing=down,upwards_facing=north": { - "model": "cosmiccore:block/machine/star_ballast", - "x": 90 - }, - "facing=down,upwards_facing=south": { - "gtceu:z": 180, - "model": "cosmiccore:block/machine/star_ballast", - "x": 90 - }, - "facing=down,upwards_facing=west": { - "gtceu:z": 270, - "model": "cosmiccore:block/machine/star_ballast", - "x": 90 - }, - "facing=up,upwards_facing=east": { - "gtceu:z": 90, - "model": "cosmiccore:block/machine/star_ballast", - "x": 270 - }, - "facing=up,upwards_facing=north": { - "gtceu:z": 180, - "model": "cosmiccore:block/machine/star_ballast", - "x": 270 - }, - "facing=up,upwards_facing=south": { - "model": "cosmiccore:block/machine/star_ballast", - "x": 270 - }, - "facing=up,upwards_facing=west": { - "gtceu:z": 270, - "model": "cosmiccore:block/machine/star_ballast", - "x": 270 - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/star_ladder_research_hub.json b/src/generated/resources/assets/cosmiccore/blockstates/star_ladder_research_hub.json new file mode 100644 index 000000000..60017ecf2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/star_ladder_research_hub.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/star_ladder_research_hub", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/star_ladder_research_hub" + }, + "facing=south": { + "model": "cosmiccore:block/machine/star_ladder_research_hub", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/star_ladder_research_hub", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/steam_ember_emitter.json b/src/generated/resources/assets/cosmiccore/blockstates/steam_ember_emitter.json new file mode 100644 index 000000000..86a7dbc3f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/steam_ember_emitter.json @@ -0,0 +1,836 @@ +{ + "variants": { + "back=false,facing=down,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 180 + }, + "back=false,facing=east,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=north,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90 + }, + "back=false,facing=south,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=up,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter" + }, + "back=false,facing=west,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=down,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 180 + }, + "back=true,facing=east,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=north,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90 + }, + "back=true,facing=south,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=up,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter" + }, + "back=true,facing=west,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_emitter", + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/steam_ember_receptor.json b/src/generated/resources/assets/cosmiccore/blockstates/steam_ember_receptor.json new file mode 100644 index 000000000..4057a68c2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/steam_ember_receptor.json @@ -0,0 +1,56 @@ +{ + "variants": { + "facing=down,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_receptor", + "x": 180 + }, + "facing=down,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_receptor", + "x": 180 + }, + "facing=east,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_receptor", + "x": 90, + "y": 90 + }, + "facing=east,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_receptor", + "x": 90, + "y": 90 + }, + "facing=north,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_receptor", + "x": 90 + }, + "facing=north,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_receptor", + "x": 90 + }, + "facing=south,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_receptor", + "x": 90, + "y": 180 + }, + "facing=south,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_receptor", + "x": 90, + "y": 180 + }, + "facing=up,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_receptor" + }, + "facing=up,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_receptor" + }, + "facing=west,waterlogged=false": { + "model": "cosmiccore:block/steam_ember_receptor", + "x": 90, + "y": 270 + }, + "facing=west,waterlogged=true": { + "model": "cosmiccore:block/steam_ember_receptor", + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/zpm_name.json b/src/generated/resources/assets/cosmiccore/blockstates/steam_large_turbine.json similarity index 55% rename from src/generated/resources/assets/cosmiccore/blockstates/zpm_name.json rename to src/generated/resources/assets/cosmiccore/blockstates/steam_large_turbine.json index b4e6b6f0c..ea679faaa 100644 --- a/src/generated/resources/assets/cosmiccore/blockstates/zpm_name.json +++ b/src/generated/resources/assets/cosmiccore/blockstates/steam_large_turbine.json @@ -2,112 +2,112 @@ "variants": { "facing=down,upwards_facing=east": { "gtceu:z": 90, - "model": "cosmiccore:block/machine/zpm_name", + "model": "cosmiccore:block/machine/steam_large_turbine", "x": 90 }, "facing=down,upwards_facing=north": { - "model": "cosmiccore:block/machine/zpm_name", + "model": "cosmiccore:block/machine/steam_large_turbine", "x": 90 }, "facing=down,upwards_facing=south": { "gtceu:z": 180, - "model": "cosmiccore:block/machine/zpm_name", + "model": "cosmiccore:block/machine/steam_large_turbine", "x": 90 }, "facing=down,upwards_facing=west": { "gtceu:z": 270, - "model": "cosmiccore:block/machine/zpm_name", + "model": "cosmiccore:block/machine/steam_large_turbine", "x": 90 }, "facing=east,upwards_facing=east": { "gtceu:z": 270, - "model": "cosmiccore:block/machine/zpm_name", + "model": "cosmiccore:block/machine/steam_large_turbine", "y": 90 }, "facing=east,upwards_facing=north": { - "model": "cosmiccore:block/machine/zpm_name", + "model": "cosmiccore:block/machine/steam_large_turbine", "y": 90 }, "facing=east,upwards_facing=south": { "gtceu:z": 180, - "model": "cosmiccore:block/machine/zpm_name", + "model": "cosmiccore:block/machine/steam_large_turbine", "y": 90 }, "facing=east,upwards_facing=west": { "gtceu:z": 90, - "model": "cosmiccore:block/machine/zpm_name", + "model": "cosmiccore:block/machine/steam_large_turbine", "y": 90 }, "facing=north,upwards_facing=east": { "gtceu:z": 270, - "model": "cosmiccore:block/machine/zpm_name" + "model": "cosmiccore:block/machine/steam_large_turbine" }, "facing=north,upwards_facing=north": { - "model": "cosmiccore:block/machine/zpm_name" + "model": "cosmiccore:block/machine/steam_large_turbine" }, "facing=north,upwards_facing=south": { "gtceu:z": 180, - "model": "cosmiccore:block/machine/zpm_name" + "model": "cosmiccore:block/machine/steam_large_turbine" }, "facing=north,upwards_facing=west": { "gtceu:z": 90, - "model": "cosmiccore:block/machine/zpm_name" + "model": "cosmiccore:block/machine/steam_large_turbine" }, "facing=south,upwards_facing=east": { "gtceu:z": 270, - "model": "cosmiccore:block/machine/zpm_name", + "model": "cosmiccore:block/machine/steam_large_turbine", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "cosmiccore:block/machine/zpm_name", + "model": "cosmiccore:block/machine/steam_large_turbine", "y": 180 }, "facing=south,upwards_facing=south": { "gtceu:z": 180, - "model": "cosmiccore:block/machine/zpm_name", + "model": "cosmiccore:block/machine/steam_large_turbine", "y": 180 }, "facing=south,upwards_facing=west": { "gtceu:z": 90, - "model": "cosmiccore:block/machine/zpm_name", + "model": "cosmiccore:block/machine/steam_large_turbine", "y": 180 }, "facing=up,upwards_facing=east": { "gtceu:z": 90, - "model": "cosmiccore:block/machine/zpm_name", + "model": "cosmiccore:block/machine/steam_large_turbine", "x": 270 }, "facing=up,upwards_facing=north": { "gtceu:z": 180, - "model": "cosmiccore:block/machine/zpm_name", + "model": "cosmiccore:block/machine/steam_large_turbine", "x": 270 }, "facing=up,upwards_facing=south": { - "model": "cosmiccore:block/machine/zpm_name", + "model": "cosmiccore:block/machine/steam_large_turbine", "x": 270 }, "facing=up,upwards_facing=west": { "gtceu:z": 270, - "model": "cosmiccore:block/machine/zpm_name", + "model": "cosmiccore:block/machine/steam_large_turbine", "x": 270 }, "facing=west,upwards_facing=east": { "gtceu:z": 270, - "model": "cosmiccore:block/machine/zpm_name", + "model": "cosmiccore:block/machine/steam_large_turbine", "y": 270 }, "facing=west,upwards_facing=north": { - "model": "cosmiccore:block/machine/zpm_name", + "model": "cosmiccore:block/machine/steam_large_turbine", "y": 270 }, "facing=west,upwards_facing=south": { "gtceu:z": 180, - "model": "cosmiccore:block/machine/zpm_name", + "model": "cosmiccore:block/machine/steam_large_turbine", "y": 270 }, "facing=west,upwards_facing=west": { "gtceu:z": 90, - "model": "cosmiccore:block/machine/zpm_name", + "model": "cosmiccore:block/machine/steam_large_turbine", "y": 270 } } diff --git a/src/generated/resources/assets/cosmiccore/blockstates/steel_rose_lantern.json b/src/generated/resources/assets/cosmiccore/blockstates/steel_rose_lantern.json new file mode 100644 index 000000000..b47786df8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/steel_rose_lantern.json @@ -0,0 +1,16 @@ +{ + "variants": { + "hanging=false,waterlogged=false": { + "model": "cosmiccore:block/steel_rose_lantern" + }, + "hanging=false,waterlogged=true": { + "model": "cosmiccore:block/steel_rose_lantern" + }, + "hanging=true,waterlogged=false": { + "model": "cosmiccore:block/steel_rose_lantern_hanging" + }, + "hanging=true,waterlogged=true": { + "model": "cosmiccore:block/steel_rose_lantern_hanging" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/steel_rose_light.json b/src/generated/resources/assets/cosmiccore/blockstates/steel_rose_light.json new file mode 100644 index 000000000..2803e2a6f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/steel_rose_light.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/steel_rose_light" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/steel_rose_light_slab.json b/src/generated/resources/assets/cosmiccore/blockstates/steel_rose_light_slab.json new file mode 100644 index 000000000..f9390eb4b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/steel_rose_light_slab.json @@ -0,0 +1,13 @@ +{ + "variants": { + "type=bottom": { + "model": "cosmiccore:block/steel_rose_light_slab" + }, + "type=double": { + "model": "cosmiccore:block/steel_rose_light" + }, + "type=top": { + "model": "cosmiccore:block/steel_rose_light_slab_top" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/steel_rose_light_stairs.json b/src/generated/resources/assets/cosmiccore/blockstates/steel_rose_light_stairs.json new file mode 100644 index 000000000..8c25009dc --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/steel_rose_light_stairs.json @@ -0,0 +1,209 @@ +{ + "variants": { + "facing=east,half=bottom,shape=inner_left": { + "model": "cosmiccore:block/steel_rose_light_stairs_inner", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=inner_right": { + "model": "cosmiccore:block/steel_rose_light_stairs_inner" + }, + "facing=east,half=bottom,shape=outer_left": { + "model": "cosmiccore:block/steel_rose_light_stairs_outer", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=outer_right": { + "model": "cosmiccore:block/steel_rose_light_stairs_outer" + }, + "facing=east,half=bottom,shape=straight": { + "model": "cosmiccore:block/steel_rose_light_stairs" + }, + "facing=east,half=top,shape=inner_left": { + "model": "cosmiccore:block/steel_rose_light_stairs_inner", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=inner_right": { + "model": "cosmiccore:block/steel_rose_light_stairs_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=outer_left": { + "model": "cosmiccore:block/steel_rose_light_stairs_outer", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=outer_right": { + "model": "cosmiccore:block/steel_rose_light_stairs_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=straight": { + "model": "cosmiccore:block/steel_rose_light_stairs", + "uvlock": true, + "x": 180 + }, + "facing=north,half=bottom,shape=inner_left": { + "model": "cosmiccore:block/steel_rose_light_stairs_inner", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=inner_right": { + "model": "cosmiccore:block/steel_rose_light_stairs_inner", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=outer_left": { + "model": "cosmiccore:block/steel_rose_light_stairs_outer", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=outer_right": { + "model": "cosmiccore:block/steel_rose_light_stairs_outer", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=straight": { + "model": "cosmiccore:block/steel_rose_light_stairs", + "uvlock": true, + "y": 270 + }, + "facing=north,half=top,shape=inner_left": { + "model": "cosmiccore:block/steel_rose_light_stairs_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=inner_right": { + "model": "cosmiccore:block/steel_rose_light_stairs_inner", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=outer_left": { + "model": "cosmiccore:block/steel_rose_light_stairs_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=outer_right": { + "model": "cosmiccore:block/steel_rose_light_stairs_outer", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=straight": { + "model": "cosmiccore:block/steel_rose_light_stairs", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=south,half=bottom,shape=inner_left": { + "model": "cosmiccore:block/steel_rose_light_stairs_inner" + }, + "facing=south,half=bottom,shape=inner_right": { + "model": "cosmiccore:block/steel_rose_light_stairs_inner", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=outer_left": { + "model": "cosmiccore:block/steel_rose_light_stairs_outer" + }, + "facing=south,half=bottom,shape=outer_right": { + "model": "cosmiccore:block/steel_rose_light_stairs_outer", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=straight": { + "model": "cosmiccore:block/steel_rose_light_stairs", + "uvlock": true, + "y": 90 + }, + "facing=south,half=top,shape=inner_left": { + "model": "cosmiccore:block/steel_rose_light_stairs_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=inner_right": { + "model": "cosmiccore:block/steel_rose_light_stairs_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=outer_left": { + "model": "cosmiccore:block/steel_rose_light_stairs_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=outer_right": { + "model": "cosmiccore:block/steel_rose_light_stairs_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=straight": { + "model": "cosmiccore:block/steel_rose_light_stairs", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_left": { + "model": "cosmiccore:block/steel_rose_light_stairs_inner", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_right": { + "model": "cosmiccore:block/steel_rose_light_stairs_inner", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=outer_left": { + "model": "cosmiccore:block/steel_rose_light_stairs_outer", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=outer_right": { + "model": "cosmiccore:block/steel_rose_light_stairs_outer", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=straight": { + "model": "cosmiccore:block/steel_rose_light_stairs", + "uvlock": true, + "y": 180 + }, + "facing=west,half=top,shape=inner_left": { + "model": "cosmiccore:block/steel_rose_light_stairs_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=inner_right": { + "model": "cosmiccore:block/steel_rose_light_stairs_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=outer_left": { + "model": "cosmiccore:block/steel_rose_light_stairs_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=outer_right": { + "model": "cosmiccore:block/steel_rose_light_stairs_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=straight": { + "model": "cosmiccore:block/steel_rose_light_stairs", + "uvlock": true, + "x": 180, + "y": 180 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/stellar_smelting_module.json b/src/generated/resources/assets/cosmiccore/blockstates/stellar_smelting_module.json new file mode 100644 index 000000000..6b8b9375d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/stellar_smelting_module.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/stellar_smelting_module", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/stellar_smelting_module", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/stellar_smelting_module", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/stellar_smelting_module", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/stellar_smelting_module" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/stellar_smelting_module" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/stellar_smelting_module" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/stellar_smelting_module" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/stellar_smelting_module", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/stellar_smelting_module", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/stellar_smelting_module", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/stellar_smelting_module", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/stellar_smelting_module", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/stellar_smelting_module", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/stellar_smelting_module", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/stellar_smelting_module", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/superheavy_steel_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/superheavy_steel_casing.json new file mode 100644 index 000000000..89b79ccf1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/superheavy_steel_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/superheavy_steel_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uev_calx_reactor.json b/src/generated/resources/assets/cosmiccore/blockstates/uev_calx_reactor.json new file mode 100644 index 000000000..5817c4746 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uev_calx_reactor.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uev_calx_reactor", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uev_calx_reactor" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uev_calx_reactor", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uev_calx_reactor", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uev_ember_emitter.json b/src/generated/resources/assets/cosmiccore/blockstates/uev_ember_emitter.json new file mode 100644 index 000000000..82ae9015b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uev_ember_emitter.json @@ -0,0 +1,836 @@ +{ + "variants": { + "back=false,facing=down,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 180 + }, + "back=false,facing=east,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=north,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90 + }, + "back=false,facing=south,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=up,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter" + }, + "back=false,facing=west,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=down,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 180 + }, + "back=true,facing=east,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=north,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90 + }, + "back=true,facing=south,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=up,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter" + }, + "back=true,facing=west,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_emitter", + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uev_ember_receptor.json b/src/generated/resources/assets/cosmiccore/blockstates/uev_ember_receptor.json new file mode 100644 index 000000000..0f16c9321 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uev_ember_receptor.json @@ -0,0 +1,56 @@ +{ + "variants": { + "facing=down,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_receptor", + "x": 180 + }, + "facing=down,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_receptor", + "x": 180 + }, + "facing=east,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_receptor", + "x": 90, + "y": 90 + }, + "facing=east,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_receptor", + "x": 90, + "y": 90 + }, + "facing=north,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_receptor", + "x": 90 + }, + "facing=north,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_receptor", + "x": 90 + }, + "facing=south,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_receptor", + "x": 90, + "y": 180 + }, + "facing=south,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_receptor", + "x": 90, + "y": 180 + }, + "facing=up,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_receptor" + }, + "facing=up,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_receptor" + }, + "facing=west,waterlogged=false": { + "model": "cosmiccore:block/uev_ember_receptor", + "x": 90, + "y": 270 + }, + "facing=west,waterlogged=true": { + "model": "cosmiccore:block/uev_ember_receptor", + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uev_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/blockstates/uev_mana_leaching_tub.json new file mode 100644 index 000000000..d53f17281 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uev_mana_leaching_tub.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uev_mana_leaching_tub", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uev_mana_leaching_tub" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uev_mana_leaching_tub", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uev_mana_leaching_tub", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uev_module_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uev_module_hatch.json new file mode 100644 index 000000000..cd3ea8fc0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uev_module_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uev_module_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uev_module_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uev_module_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uev_module_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uev_module_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uev_module_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uev_roaster.json b/src/generated/resources/assets/cosmiccore/blockstates/uev_roaster.json new file mode 100644 index 000000000..50a33f074 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uev_roaster.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uev_roaster", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uev_roaster" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uev_roaster", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uev_roaster", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uev_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/blockstates/uev_thermomagnitizer.json new file mode 100644 index 000000000..2f2c8bb55 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uev_thermomagnitizer.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uev_thermomagnitizer", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uev_thermomagnitizer" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uev_thermomagnitizer", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uev_thermomagnitizer", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uev_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/blockstates/uev_vacuum_bubbler.json new file mode 100644 index 000000000..d2ba6acdd --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uev_vacuum_bubbler.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uev_vacuum_bubbler", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uev_vacuum_bubbler" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uev_vacuum_bubbler", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uev_vacuum_bubbler", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uhv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/blockstates/uhv_calx_reactor.json new file mode 100644 index 000000000..a537010c1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uhv_calx_reactor.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uhv_calx_reactor", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uhv_calx_reactor" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uhv_calx_reactor", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uhv_calx_reactor", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uhv_ember_emitter.json b/src/generated/resources/assets/cosmiccore/blockstates/uhv_ember_emitter.json new file mode 100644 index 000000000..d7c59e9d2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uhv_ember_emitter.json @@ -0,0 +1,836 @@ +{ + "variants": { + "back=false,facing=down,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 180 + }, + "back=false,facing=east,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=north,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90 + }, + "back=false,facing=south,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=up,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter" + }, + "back=false,facing=west,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=down,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 180 + }, + "back=true,facing=east,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=north,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90 + }, + "back=true,facing=south,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=up,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter" + }, + "back=true,facing=west,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_emitter", + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uhv_ember_receptor.json b/src/generated/resources/assets/cosmiccore/blockstates/uhv_ember_receptor.json new file mode 100644 index 000000000..54d0bdd1c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uhv_ember_receptor.json @@ -0,0 +1,56 @@ +{ + "variants": { + "facing=down,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_receptor", + "x": 180 + }, + "facing=down,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_receptor", + "x": 180 + }, + "facing=east,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_receptor", + "x": 90, + "y": 90 + }, + "facing=east,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_receptor", + "x": 90, + "y": 90 + }, + "facing=north,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_receptor", + "x": 90 + }, + "facing=north,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_receptor", + "x": 90 + }, + "facing=south,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_receptor", + "x": 90, + "y": 180 + }, + "facing=south,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_receptor", + "x": 90, + "y": 180 + }, + "facing=up,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_receptor" + }, + "facing=up,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_receptor" + }, + "facing=west,waterlogged=false": { + "model": "cosmiccore:block/uhv_ember_receptor", + "x": 90, + "y": 270 + }, + "facing=west,waterlogged=true": { + "model": "cosmiccore:block/uhv_ember_receptor", + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uhv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/blockstates/uhv_mana_leaching_tub.json new file mode 100644 index 000000000..dece13565 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uhv_mana_leaching_tub.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uhv_mana_leaching_tub", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uhv_mana_leaching_tub" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uhv_mana_leaching_tub", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uhv_mana_leaching_tub", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uhv_module_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uhv_module_hatch.json new file mode 100644 index 000000000..8782f1469 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uhv_module_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uhv_module_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uhv_module_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uhv_module_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uhv_module_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uhv_module_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uhv_module_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uhv_name.json b/src/generated/resources/assets/cosmiccore/blockstates/uhv_name.json deleted file mode 100644 index c52cd0ba7..000000000 --- a/src/generated/resources/assets/cosmiccore/blockstates/uhv_name.json +++ /dev/null @@ -1,114 +0,0 @@ -{ - "variants": { - "facing=down,upwards_facing=east": { - "gtceu:z": 90, - "model": "cosmiccore:block/machine/uhv_name", - "x": 90 - }, - "facing=down,upwards_facing=north": { - "model": "cosmiccore:block/machine/uhv_name", - "x": 90 - }, - "facing=down,upwards_facing=south": { - "gtceu:z": 180, - "model": "cosmiccore:block/machine/uhv_name", - "x": 90 - }, - "facing=down,upwards_facing=west": { - "gtceu:z": 270, - "model": "cosmiccore:block/machine/uhv_name", - "x": 90 - }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, - "model": "cosmiccore:block/machine/uhv_name", - "y": 90 - }, - "facing=east,upwards_facing=north": { - "model": "cosmiccore:block/machine/uhv_name", - "y": 90 - }, - "facing=east,upwards_facing=south": { - "gtceu:z": 180, - "model": "cosmiccore:block/machine/uhv_name", - "y": 90 - }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, - "model": "cosmiccore:block/machine/uhv_name", - "y": 90 - }, - "facing=north,upwards_facing=east": { - "gtceu:z": 270, - "model": "cosmiccore:block/machine/uhv_name" - }, - "facing=north,upwards_facing=north": { - "model": "cosmiccore:block/machine/uhv_name" - }, - "facing=north,upwards_facing=south": { - "gtceu:z": 180, - "model": "cosmiccore:block/machine/uhv_name" - }, - "facing=north,upwards_facing=west": { - "gtceu:z": 90, - "model": "cosmiccore:block/machine/uhv_name" - }, - "facing=south,upwards_facing=east": { - "gtceu:z": 270, - "model": "cosmiccore:block/machine/uhv_name", - "y": 180 - }, - "facing=south,upwards_facing=north": { - "model": "cosmiccore:block/machine/uhv_name", - "y": 180 - }, - "facing=south,upwards_facing=south": { - "gtceu:z": 180, - "model": "cosmiccore:block/machine/uhv_name", - "y": 180 - }, - "facing=south,upwards_facing=west": { - "gtceu:z": 90, - "model": "cosmiccore:block/machine/uhv_name", - "y": 180 - }, - "facing=up,upwards_facing=east": { - "gtceu:z": 90, - "model": "cosmiccore:block/machine/uhv_name", - "x": 270 - }, - "facing=up,upwards_facing=north": { - "gtceu:z": 180, - "model": "cosmiccore:block/machine/uhv_name", - "x": 270 - }, - "facing=up,upwards_facing=south": { - "model": "cosmiccore:block/machine/uhv_name", - "x": 270 - }, - "facing=up,upwards_facing=west": { - "gtceu:z": 270, - "model": "cosmiccore:block/machine/uhv_name", - "x": 270 - }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, - "model": "cosmiccore:block/machine/uhv_name", - "y": 270 - }, - "facing=west,upwards_facing=north": { - "model": "cosmiccore:block/machine/uhv_name", - "y": 270 - }, - "facing=west,upwards_facing=south": { - "gtceu:z": 180, - "model": "cosmiccore:block/machine/uhv_name", - "y": 270 - }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, - "model": "cosmiccore:block/machine/uhv_name", - "y": 270 - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uhv_roaster.json b/src/generated/resources/assets/cosmiccore/blockstates/uhv_roaster.json new file mode 100644 index 000000000..569ecd297 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uhv_roaster.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uhv_roaster", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uhv_roaster" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uhv_roaster", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uhv_roaster", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uhv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/blockstates/uhv_thermomagnitizer.json new file mode 100644 index 000000000..da5e26f11 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uhv_thermomagnitizer.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uhv_thermomagnitizer", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uhv_thermomagnitizer" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uhv_thermomagnitizer", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uhv_thermomagnitizer", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uhv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/blockstates/uhv_vacuum_bubbler.json new file mode 100644 index 000000000..e7b7bc45a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uhv_vacuum_bubbler.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uhv_vacuum_bubbler", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uhv_vacuum_bubbler" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uhv_vacuum_bubbler", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uhv_vacuum_bubbler", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uiv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/blockstates/uiv_calx_reactor.json new file mode 100644 index 000000000..2a344a8d8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uiv_calx_reactor.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uiv_calx_reactor", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uiv_calx_reactor" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uiv_calx_reactor", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uiv_calx_reactor", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uiv_ember_emitter.json b/src/generated/resources/assets/cosmiccore/blockstates/uiv_ember_emitter.json new file mode 100644 index 000000000..7a18dc955 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uiv_ember_emitter.json @@ -0,0 +1,836 @@ +{ + "variants": { + "back=false,facing=down,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 180 + }, + "back=false,facing=east,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=north,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90 + }, + "back=false,facing=south,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=up,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter" + }, + "back=false,facing=west,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=down,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 180 + }, + "back=true,facing=east,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=north,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90 + }, + "back=true,facing=south,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=up,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter" + }, + "back=true,facing=west,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_emitter", + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uiv_ember_receptor.json b/src/generated/resources/assets/cosmiccore/blockstates/uiv_ember_receptor.json new file mode 100644 index 000000000..64b0f9b25 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uiv_ember_receptor.json @@ -0,0 +1,56 @@ +{ + "variants": { + "facing=down,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_receptor", + "x": 180 + }, + "facing=down,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_receptor", + "x": 180 + }, + "facing=east,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_receptor", + "x": 90, + "y": 90 + }, + "facing=east,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_receptor", + "x": 90, + "y": 90 + }, + "facing=north,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_receptor", + "x": 90 + }, + "facing=north,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_receptor", + "x": 90 + }, + "facing=south,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_receptor", + "x": 90, + "y": 180 + }, + "facing=south,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_receptor", + "x": 90, + "y": 180 + }, + "facing=up,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_receptor" + }, + "facing=up,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_receptor" + }, + "facing=west,waterlogged=false": { + "model": "cosmiccore:block/uiv_ember_receptor", + "x": 90, + "y": 270 + }, + "facing=west,waterlogged=true": { + "model": "cosmiccore:block/uiv_ember_receptor", + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uiv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/blockstates/uiv_mana_leaching_tub.json new file mode 100644 index 000000000..7fbcaad35 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uiv_mana_leaching_tub.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uiv_mana_leaching_tub", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uiv_mana_leaching_tub" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uiv_mana_leaching_tub", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uiv_mana_leaching_tub", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uiv_roaster.json b/src/generated/resources/assets/cosmiccore/blockstates/uiv_roaster.json new file mode 100644 index 000000000..b13f7a5e3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uiv_roaster.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uiv_roaster", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uiv_roaster" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uiv_roaster", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uiv_roaster", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uiv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/blockstates/uiv_thermomagnitizer.json new file mode 100644 index 000000000..58b91b72c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uiv_thermomagnitizer.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uiv_thermomagnitizer", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uiv_thermomagnitizer" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uiv_thermomagnitizer", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uiv_thermomagnitizer", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uiv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/blockstates/uiv_vacuum_bubbler.json new file mode 100644 index 000000000..ee15ef2b2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uiv_vacuum_bubbler.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uiv_vacuum_bubbler", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uiv_vacuum_bubbler" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uiv_vacuum_bubbler", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uiv_vacuum_bubbler", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/ulv_energy_output_hatch_16a.json b/src/generated/resources/assets/cosmiccore/blockstates/ulv_energy_output_hatch_16a.json new file mode 100644 index 000000000..dbb62c88a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/ulv_energy_output_hatch_16a.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/ulv_energy_output_hatch_16a", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/ulv_energy_output_hatch_16a", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/ulv_energy_output_hatch_16a" + }, + "facing=south": { + "model": "cosmiccore:block/machine/ulv_energy_output_hatch_16a", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/ulv_energy_output_hatch_16a", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/ulv_energy_output_hatch_16a", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/ulv_energy_output_hatch_4a.json b/src/generated/resources/assets/cosmiccore/blockstates/ulv_energy_output_hatch_4a.json new file mode 100644 index 000000000..398d8c649 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/ulv_energy_output_hatch_4a.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/ulv_energy_output_hatch_4a", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/ulv_energy_output_hatch_4a", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/ulv_energy_output_hatch_4a" + }, + "facing=south": { + "model": "cosmiccore:block/machine/ulv_energy_output_hatch_4a", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/ulv_energy_output_hatch_4a", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/ulv_energy_output_hatch_4a", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uv_biolab.json b/src/generated/resources/assets/cosmiccore/blockstates/uv_biolab.json new file mode 100644 index 000000000..2afb93926 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uv_biolab.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uv_biolab", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uv_biolab" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uv_biolab", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uv_biolab", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/blockstates/uv_calx_reactor.json new file mode 100644 index 000000000..61a696e5c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uv_calx_reactor.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uv_calx_reactor", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uv_calx_reactor" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uv_calx_reactor", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uv_calx_reactor", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uv_ember_emitter.json b/src/generated/resources/assets/cosmiccore/blockstates/uv_ember_emitter.json new file mode 100644 index 000000000..6ade9a926 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uv_ember_emitter.json @@ -0,0 +1,836 @@ +{ + "variants": { + "back=false,facing=down,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 180 + }, + "back=false,facing=east,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=north,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90 + }, + "back=false,facing=south,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=up,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter" + }, + "back=false,facing=west,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=down,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 180 + }, + "back=true,facing=east,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=north,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90 + }, + "back=true,facing=south,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=up,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter" + }, + "back=true,facing=west,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_emitter", + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uv_ember_receptor.json b/src/generated/resources/assets/cosmiccore/blockstates/uv_ember_receptor.json new file mode 100644 index 000000000..d1a2495ed --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uv_ember_receptor.json @@ -0,0 +1,56 @@ +{ + "variants": { + "facing=down,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_receptor", + "x": 180 + }, + "facing=down,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_receptor", + "x": 180 + }, + "facing=east,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_receptor", + "x": 90, + "y": 90 + }, + "facing=east,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_receptor", + "x": 90, + "y": 90 + }, + "facing=north,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_receptor", + "x": 90 + }, + "facing=north,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_receptor", + "x": 90 + }, + "facing=south,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_receptor", + "x": 90, + "y": 180 + }, + "facing=south,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_receptor", + "x": 90, + "y": 180 + }, + "facing=up,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_receptor" + }, + "facing=up,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_receptor" + }, + "facing=west,waterlogged=false": { + "model": "cosmiccore:block/uv_ember_receptor", + "x": 90, + "y": 270 + }, + "facing=west,waterlogged=true": { + "model": "cosmiccore:block/uv_ember_receptor", + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/blockstates/uv_mana_leaching_tub.json new file mode 100644 index 000000000..d1cc22aac --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uv_mana_leaching_tub.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uv_mana_leaching_tub", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uv_mana_leaching_tub" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uv_mana_leaching_tub", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uv_mana_leaching_tub", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uv_module_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uv_module_hatch.json new file mode 100644 index 000000000..a5960afc3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uv_module_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uv_module_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uv_module_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uv_module_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uv_module_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uv_module_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uv_module_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uv_name.json b/src/generated/resources/assets/cosmiccore/blockstates/uv_name.json deleted file mode 100644 index bed546310..000000000 --- a/src/generated/resources/assets/cosmiccore/blockstates/uv_name.json +++ /dev/null @@ -1,114 +0,0 @@ -{ - "variants": { - "facing=down,upwards_facing=east": { - "gtceu:z": 90, - "model": "cosmiccore:block/machine/uv_name", - "x": 90 - }, - "facing=down,upwards_facing=north": { - "model": "cosmiccore:block/machine/uv_name", - "x": 90 - }, - "facing=down,upwards_facing=south": { - "gtceu:z": 180, - "model": "cosmiccore:block/machine/uv_name", - "x": 90 - }, - "facing=down,upwards_facing=west": { - "gtceu:z": 270, - "model": "cosmiccore:block/machine/uv_name", - "x": 90 - }, - "facing=east,upwards_facing=east": { - "gtceu:z": 270, - "model": "cosmiccore:block/machine/uv_name", - "y": 90 - }, - "facing=east,upwards_facing=north": { - "model": "cosmiccore:block/machine/uv_name", - "y": 90 - }, - "facing=east,upwards_facing=south": { - "gtceu:z": 180, - "model": "cosmiccore:block/machine/uv_name", - "y": 90 - }, - "facing=east,upwards_facing=west": { - "gtceu:z": 90, - "model": "cosmiccore:block/machine/uv_name", - "y": 90 - }, - "facing=north,upwards_facing=east": { - "gtceu:z": 270, - "model": "cosmiccore:block/machine/uv_name" - }, - "facing=north,upwards_facing=north": { - "model": "cosmiccore:block/machine/uv_name" - }, - "facing=north,upwards_facing=south": { - "gtceu:z": 180, - "model": "cosmiccore:block/machine/uv_name" - }, - "facing=north,upwards_facing=west": { - "gtceu:z": 90, - "model": "cosmiccore:block/machine/uv_name" - }, - "facing=south,upwards_facing=east": { - "gtceu:z": 270, - "model": "cosmiccore:block/machine/uv_name", - "y": 180 - }, - "facing=south,upwards_facing=north": { - "model": "cosmiccore:block/machine/uv_name", - "y": 180 - }, - "facing=south,upwards_facing=south": { - "gtceu:z": 180, - "model": "cosmiccore:block/machine/uv_name", - "y": 180 - }, - "facing=south,upwards_facing=west": { - "gtceu:z": 90, - "model": "cosmiccore:block/machine/uv_name", - "y": 180 - }, - "facing=up,upwards_facing=east": { - "gtceu:z": 90, - "model": "cosmiccore:block/machine/uv_name", - "x": 270 - }, - "facing=up,upwards_facing=north": { - "gtceu:z": 180, - "model": "cosmiccore:block/machine/uv_name", - "x": 270 - }, - "facing=up,upwards_facing=south": { - "model": "cosmiccore:block/machine/uv_name", - "x": 270 - }, - "facing=up,upwards_facing=west": { - "gtceu:z": 270, - "model": "cosmiccore:block/machine/uv_name", - "x": 270 - }, - "facing=west,upwards_facing=east": { - "gtceu:z": 270, - "model": "cosmiccore:block/machine/uv_name", - "y": 270 - }, - "facing=west,upwards_facing=north": { - "model": "cosmiccore:block/machine/uv_name", - "y": 270 - }, - "facing=west,upwards_facing=south": { - "gtceu:z": 180, - "model": "cosmiccore:block/machine/uv_name", - "y": 270 - }, - "facing=west,upwards_facing=west": { - "gtceu:z": 90, - "model": "cosmiccore:block/machine/uv_name", - "y": 270 - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uv_roaster.json b/src/generated/resources/assets/cosmiccore/blockstates/uv_roaster.json new file mode 100644 index 000000000..abc2e8c24 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uv_roaster.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uv_roaster", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uv_roaster" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uv_roaster", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uv_roaster", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/blockstates/uv_thermomagnitizer.json new file mode 100644 index 000000000..bc05e1190 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uv_thermomagnitizer.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uv_thermomagnitizer", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uv_thermomagnitizer" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uv_thermomagnitizer", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uv_thermomagnitizer", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/blockstates/uv_vacuum_bubbler.json new file mode 100644 index 000000000..81c2b66ab --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uv_vacuum_bubbler.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uv_vacuum_bubbler", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uv_vacuum_bubbler" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uv_vacuum_bubbler", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uv_vacuum_bubbler", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uxv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/blockstates/uxv_calx_reactor.json new file mode 100644 index 000000000..7e32799e7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uxv_calx_reactor.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uxv_calx_reactor", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uxv_calx_reactor" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uxv_calx_reactor", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uxv_calx_reactor", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uxv_ember_emitter.json b/src/generated/resources/assets/cosmiccore/blockstates/uxv_ember_emitter.json new file mode 100644 index 000000000..7c9d32fde --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uxv_ember_emitter.json @@ -0,0 +1,836 @@ +{ + "variants": { + "back=false,facing=down,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 180 + }, + "back=false,facing=east,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=north,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90 + }, + "back=false,facing=south,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=up,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter" + }, + "back=false,facing=west,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=down,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 180 + }, + "back=true,facing=east,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=north,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90 + }, + "back=true,facing=south,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=up,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter" + }, + "back=true,facing=west,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_emitter", + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uxv_ember_receptor.json b/src/generated/resources/assets/cosmiccore/blockstates/uxv_ember_receptor.json new file mode 100644 index 000000000..5e32cc9de --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uxv_ember_receptor.json @@ -0,0 +1,56 @@ +{ + "variants": { + "facing=down,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_receptor", + "x": 180 + }, + "facing=down,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_receptor", + "x": 180 + }, + "facing=east,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_receptor", + "x": 90, + "y": 90 + }, + "facing=east,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_receptor", + "x": 90, + "y": 90 + }, + "facing=north,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_receptor", + "x": 90 + }, + "facing=north,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_receptor", + "x": 90 + }, + "facing=south,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_receptor", + "x": 90, + "y": 180 + }, + "facing=south,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_receptor", + "x": 90, + "y": 180 + }, + "facing=up,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_receptor" + }, + "facing=up,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_receptor" + }, + "facing=west,waterlogged=false": { + "model": "cosmiccore:block/uxv_ember_receptor", + "x": 90, + "y": 270 + }, + "facing=west,waterlogged=true": { + "model": "cosmiccore:block/uxv_ember_receptor", + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uxv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/blockstates/uxv_mana_leaching_tub.json new file mode 100644 index 000000000..ac4c9d9c1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uxv_mana_leaching_tub.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uxv_mana_leaching_tub", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uxv_mana_leaching_tub" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uxv_mana_leaching_tub", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uxv_mana_leaching_tub", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uxv_roaster.json b/src/generated/resources/assets/cosmiccore/blockstates/uxv_roaster.json new file mode 100644 index 000000000..0c277af54 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uxv_roaster.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uxv_roaster", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uxv_roaster" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uxv_roaster", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uxv_roaster", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uxv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/blockstates/uxv_thermomagnitizer.json new file mode 100644 index 000000000..6124138e9 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uxv_thermomagnitizer.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uxv_thermomagnitizer", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uxv_thermomagnitizer" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uxv_thermomagnitizer", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uxv_thermomagnitizer", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uxv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/blockstates/uxv_vacuum_bubbler.json new file mode 100644 index 000000000..30f87aa2d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uxv_vacuum_bubbler.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uxv_vacuum_bubbler", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uxv_vacuum_bubbler" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uxv_vacuum_bubbler", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uxv_vacuum_bubbler", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/vile_fission.json b/src/generated/resources/assets/cosmiccore/blockstates/vile_fission.json new file mode 100644 index 000000000..54332d52b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/vile_fission.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/vile_fission", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/vile_fission", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/vile_fission", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/vile_fission", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/vile_fission" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/vile_fission" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/vile_fission" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/vile_fission" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/vile_fission", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/vile_fission", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/vile_fission", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/vile_fission", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/vile_fission", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/vile_fission", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/vile_fission", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/vile_fission", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/void_salt_fissiom.json b/src/generated/resources/assets/cosmiccore/blockstates/void_salt_fissiom.json new file mode 100644 index 000000000..783f8b4e0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/void_salt_fissiom.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/void_salt_fissiom", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/void_salt_fissiom", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/void_salt_fissiom", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/void_salt_fissiom", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/void_salt_fissiom" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/void_salt_fissiom" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/void_salt_fissiom" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/void_salt_fissiom" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/void_salt_fissiom", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/void_salt_fissiom", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/void_salt_fissiom", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/void_salt_fissiom", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/void_salt_fissiom", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/void_salt_fissiom", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/void_salt_fissiom", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/void_salt_fissiom", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/wasp.json b/src/generated/resources/assets/cosmiccore/blockstates/wasp.json new file mode 100644 index 000000000..c675a880f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/wasp.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/wasp", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/wasp", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/wasp", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/wasp", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/wasp" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/wasp" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/wasp" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/wasp" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/wasp", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/wasp", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/wasp", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/wasp", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/wasp", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/wasp", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/wasp", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/wasp", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/zpm_biolab.json b/src/generated/resources/assets/cosmiccore/blockstates/zpm_biolab.json new file mode 100644 index 000000000..6c43ded4e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/zpm_biolab.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/zpm_biolab", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/zpm_biolab" + }, + "facing=south": { + "model": "cosmiccore:block/machine/zpm_biolab", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/zpm_biolab", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/zpm_calx_reactor.json b/src/generated/resources/assets/cosmiccore/blockstates/zpm_calx_reactor.json new file mode 100644 index 000000000..dd55ba439 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/zpm_calx_reactor.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/zpm_calx_reactor", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/zpm_calx_reactor" + }, + "facing=south": { + "model": "cosmiccore:block/machine/zpm_calx_reactor", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/zpm_calx_reactor", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/zpm_ember_emitter.json b/src/generated/resources/assets/cosmiccore/blockstates/zpm_ember_emitter.json new file mode 100644 index 000000000..6fb2f7c6a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/zpm_ember_emitter.json @@ -0,0 +1,836 @@ +{ + "variants": { + "back=false,facing=down,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 180 + }, + "back=false,facing=down,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 180 + }, + "back=false,facing=east,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=east,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 90 + }, + "back=false,facing=north,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90 + }, + "back=false,facing=north,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90 + }, + "back=false,facing=south,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=south,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 180 + }, + "back=false,facing=up,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter" + }, + "back=false,facing=up,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter" + }, + "back=false,facing=up,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter" + }, + "back=false,facing=up,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter" + }, + "back=false,facing=up,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter" + }, + "back=false,facing=west,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 270 + }, + "back=false,facing=west,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=down,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 180 + }, + "back=true,facing=down,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 180 + }, + "back=true,facing=east,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=east,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 90 + }, + "back=true,facing=north,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90 + }, + "back=true,facing=north,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90 + }, + "back=true,facing=south,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=south,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 180 + }, + "back=true,facing=up,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter" + }, + "back=true,facing=up,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter" + }, + "back=true,facing=up,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter" + }, + "back=true,facing=up,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter" + }, + "back=true,facing=up,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter" + }, + "back=true,facing=west,front=false,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=false,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=false,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=false,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=false,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=true,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 270 + }, + "back=true,facing=west,front=true,left=true,right=true,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_emitter", + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/zpm_ember_receptor.json b/src/generated/resources/assets/cosmiccore/blockstates/zpm_ember_receptor.json new file mode 100644 index 000000000..5a2fa69ff --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/zpm_ember_receptor.json @@ -0,0 +1,56 @@ +{ + "variants": { + "facing=down,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_receptor", + "x": 180 + }, + "facing=down,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_receptor", + "x": 180 + }, + "facing=east,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_receptor", + "x": 90, + "y": 90 + }, + "facing=east,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_receptor", + "x": 90, + "y": 90 + }, + "facing=north,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_receptor", + "x": 90 + }, + "facing=north,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_receptor", + "x": 90 + }, + "facing=south,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_receptor", + "x": 90, + "y": 180 + }, + "facing=south,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_receptor", + "x": 90, + "y": 180 + }, + "facing=up,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_receptor" + }, + "facing=up,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_receptor" + }, + "facing=west,waterlogged=false": { + "model": "cosmiccore:block/zpm_ember_receptor", + "x": 90, + "y": 270 + }, + "facing=west,waterlogged=true": { + "model": "cosmiccore:block/zpm_ember_receptor", + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/zpm_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/blockstates/zpm_mana_leaching_tub.json new file mode 100644 index 000000000..cd236b7d3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/zpm_mana_leaching_tub.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/zpm_mana_leaching_tub", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/zpm_mana_leaching_tub" + }, + "facing=south": { + "model": "cosmiccore:block/machine/zpm_mana_leaching_tub", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/zpm_mana_leaching_tub", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/zpm_roaster.json b/src/generated/resources/assets/cosmiccore/blockstates/zpm_roaster.json new file mode 100644 index 000000000..10c4fd6a1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/zpm_roaster.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/zpm_roaster", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/zpm_roaster" + }, + "facing=south": { + "model": "cosmiccore:block/machine/zpm_roaster", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/zpm_roaster", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/zpm_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/blockstates/zpm_thermomagnitizer.json new file mode 100644 index 000000000..d8071a772 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/zpm_thermomagnitizer.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/zpm_thermomagnitizer", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/zpm_thermomagnitizer" + }, + "facing=south": { + "model": "cosmiccore:block/machine/zpm_thermomagnitizer", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/zpm_thermomagnitizer", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/zpm_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/blockstates/zpm_vacuum_bubbler.json new file mode 100644 index 000000000..5c4e2fa10 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/zpm_vacuum_bubbler.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/zpm_vacuum_bubbler", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/zpm_vacuum_bubbler" + }, + "facing=south": { + "model": "cosmiccore:block/machine/zpm_vacuum_bubbler", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/zpm_vacuum_bubbler", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/lang/en_ud.json b/src/generated/resources/assets/cosmiccore/lang/en_ud.json index 56751d5b7..894d4f048 100644 --- a/src/generated/resources/assets/cosmiccore/lang/en_ud.json +++ b/src/generated/resources/assets/cosmiccore/lang/en_ud.json @@ -1,18 +1,62 @@ { + "allele.forestry.bee_species.cosmiccore.bee_abrasive": "ǝʌısɐɹqⱯ", + "allele.forestry.bee_species.cosmiccore.bee_absent": "ʇuǝsqⱯ", + "allele.forestry.bee_species.cosmiccore.bee_ambrosic": "ɔısoɹqɯⱯ", + "allele.forestry.bee_species.cosmiccore.bee_architect": "ʇɔǝʇıɥɔɹⱯ", + "allele.forestry.bee_species.cosmiccore.bee_argon": "uobɹⱯ ʎʇɟoꞀ", + "allele.forestry.bee_species.cosmiccore.bee_ashen": "uǝɥsⱯ", + "allele.forestry.bee_species.cosmiccore.bee_biohazard": "pɹɐzɐɥoıᗺ", + "allele.forestry.bee_species.cosmiccore.bee_citrus_polymer": "ɹǝɯʎןoԀ snɹʇıƆ", + "allele.forestry.bee_species.cosmiccore.bee_cobbled": "pǝןqqoƆ", + "allele.forestry.bee_species.cosmiccore.bee_constructive": "ǝʌıʇɔnɹʇsuoƆ", + "allele.forestry.bee_species.cosmiccore.bee_cosmos": "soɯsoƆ", + "allele.forestry.bee_species.cosmiccore.bee_energized": "pǝzıbɹǝuƎ", + "allele.forestry.bee_species.cosmiccore.bee_exhaustive": "ǝʌıʇsnɐɥxƎ", + "allele.forestry.bee_species.cosmiccore.bee_fate": "ǝʇɐℲ", + "allele.forestry.bee_species.cosmiccore.bee_fracking": "buıʞɔɐɹℲ", + "allele.forestry.bee_species.cosmiccore.bee_grand_garden": "uǝpɹɐ⅁ puɐɹ⅁", + "allele.forestry.bee_species.cosmiccore.bee_hadal": "ןɐpɐH", + "allele.forestry.bee_species.cosmiccore.bee_hellsmith": "ɥʇıɯsןןǝH", + "allele.forestry.bee_species.cosmiccore.bee_hydraulic": "ɔıןnɐɹpʎH", + "allele.forestry.bee_species.cosmiccore.bee_hydrogen": "uǝboɹpʎH ʎʇɟoꞀ", + "allele.forestry.bee_species.cosmiccore.bee_illusive": "ǝʌısnןןI", + "allele.forestry.bee_species.cosmiccore.bee_inquisitive": "ǝʌıʇısınbuI", + "allele.forestry.bee_species.cosmiccore.bee_lunar": "ɹɐunꞀ", + "allele.forestry.bee_species.cosmiccore.bee_nitrogen": "uǝboɹʇıN ʎʇɟoꞀ", + "allele.forestry.bee_species.cosmiccore.bee_oxygen": "uǝbʎxO ʎʇɟoꞀ", + "allele.forestry.bee_species.cosmiccore.bee_pale": "ǝןɐԀ", + "allele.forestry.bee_species.cosmiccore.bee_prismatic": "ɔıʇɐɯsıɹԀ", + "allele.forestry.bee_species.cosmiccore.bee_pyrolytic": "ɔıʇʎןoɹʎԀ", + "allele.forestry.bee_species.cosmiccore.bee_radoxia": "ɐıxopɐᴚ", + "allele.forestry.bee_species.cosmiccore.bee_rose_polymer": "ɹǝɯʎןoԀ ǝsoᴚ", + "allele.forestry.bee_species.cosmiccore.bee_runic": "ɔıunᴚ", + "allele.forestry.bee_species.cosmiccore.bee_shaman": "uɐɯɐɥS", + "allele.forestry.bee_species.cosmiccore.bee_slick": "ʞɔıןS", + "allele.forestry.bee_species.cosmiccore.bee_solar": "ɹɐןoS", + "allele.forestry.bee_species.cosmiccore.bee_soul": "ןnoS", + "allele.forestry.bee_species.cosmiccore.bee_virtue": "ǝnʇɹıΛ", + "allele.forestry.bee_species.cosmiccore.bee_waxy_polymer": "ɹǝɯʎןoԀ ʎxɐM", "behavior.wireless_data.owner.network": "ɹ§ :ɹǝuʍO ʞɹoʍʇǝNƐ§", "behavior.wireless_data.owner.player": "ɹ§ :ǝɯɐN ɹǝʎɐןԀƐ§", "behavior.wireless_data.owner.team": "ɹ§ :ǝɯɐN ɯɐǝ⟘Ɛ§", "block.cosmiccore.alternator_flux_coiling": "buıןıoƆ xnןℲ ɹoʇɐuɹǝʇןⱯ", + "block.cosmiccore.arcane_crucible": "ǝןqıɔnɹƆ ǝuɐɔɹⱯ", "block.cosmiccore.arcane_distillery": "ʎɹǝןןıʇsıᗡ ǝuɐɔɹⱯ9§", "block.cosmiccore.atmo_pump": "uoɥdıS ɔıɹǝɥdsoɯʇⱯ9§", + "block.cosmiccore.atomic_reconstructor": "ɹoʇɔnɹʇsuoɔǝᴚ ɔıɯoʇⱯ ʇןoqpɐᴚ9§", + "block.cosmiccore.bee_holder": "ɹǝpןoH ǝǝᗺ", "block.cosmiccore.bichromal_nevramite_casing": "buısɐƆ ǝʇıɯɐɹʌǝN ןɐɯoɹɥɔıᗺ", "block.cosmiccore.biovat": "ʇɐʌoıᗺ", + "block.cosmiccore.bolted_heavy_frame_casing": "buısɐƆ ǝɯɐɹℲ ʎʌɐǝH pǝʇןoᗺ", "block.cosmiccore.botanical_simulation_complex": "xǝןdɯoƆ uoıʇɐןnɯıS ןɐɔıuɐʇoᗺɐ§", "block.cosmiccore.capacitor_array": "ʎɐɹɹⱯ ɹoʇıɔɐdɐƆ", "block.cosmiccore.causal_fabric_coil_block": "ʞɔoןᗺ ןıoƆ ɔıɹqɐℲ ןɐsnɐƆ", "block.cosmiccore.chromatic_distillation_plant": "ʇuɐןԀ uoıʇɐןןıʇsıᗡ ɔıʇɐɯoɹɥƆ", "block.cosmiccore.chromatic_flotation_plant": "ʇuɐןԀ uoıʇɐʇoןℲ ɔıʇɐɯoɹɥƆ", + "block.cosmiccore.cinder_hearth": "ɥʇɹɐǝH ɹǝpuıƆ", "block.cosmiccore.component_assembly_line": "ǝuıꞀ ʎןqɯǝssⱯ ʇuǝuodɯoƆɐ§", + "block.cosmiccore.cosmic_me_assemblyline_bus": "snᗺ ǝuıꞀ ʎןqɯǝssⱯ ƎW", + "block.cosmiccore.cosmic_me_assemblyline_hatch": "ɥɔʇɐH ǝuıꞀ ʎןqɯǝssⱯ ƎW", "block.cosmiccore.creative_thermal": "ןɐɯɹǝɥ⟘ ǝʌıʇɐǝɹƆ", "block.cosmiccore.crop_holder": "ɹǝpןoH doɹƆ", "block.cosmiccore.cryogenic_casing": "buısɐƆ ɔıuǝboʎɹƆ", @@ -20,13 +64,29 @@ "block.cosmiccore.cyclozine_chemically_repelling_casing": "buısɐƆ buıןןǝdǝᴚ ʎןןɐɔıɯǝɥƆ ǝuızoןɔʎƆ", "block.cosmiccore.cyclozine_chemically_repelling_pipe": "ǝdıԀ buıןןǝdǝᴚ ʎןןɐɔıɯǝɥƆ ǝuızoןɔʎƆ", "block.cosmiccore.cyclozine_high_rigidity_casing": "buısɐƆ ʎʇıpıbıᴚ ɥbıH ǝuızoןɔʎƆ", + "block.cosmiccore.dawn_forge": "ǝbɹoℲ uʍɐᗡ", + "block.cosmiccore.dawnforge_eclipsed": "]pǝsdıןɔƎ[ ǝbɹoɟuʍɐᗡ", "block.cosmiccore.dimensional_energy_capacitor": "uoıʇɐʇsqnS ɹǝʍoԀ", "block.cosmiccore.dimensional_energy_interface": "ǝɔɐɟɹǝʇuI ןɐuoısuǝɯıᗡ uoıʇɐʇsqnS ɹǝʍoԀ", + "block.cosmiccore.diving_bell": "ןןǝᗺ buıʌıᗡ", + "block.cosmiccore.diving_bell_escape_pad": "pɐԀ ǝdɐɔsƎ ןןǝᗺ buıʌıᗡ", + "block.cosmiccore.dreamers_basin": "uısɐᗺ s,ɹǝɯɐǝɹᗡ", "block.cosmiccore.drone_maintenance_interface": "ǝɔɐɟɹǝʇuI ǝɔuɐuǝʇuıɐW ǝuoɹᗡ", "block.cosmiccore.drone_station": "uoıʇɐʇS ǝuoɹᗡ", "block.cosmiccore.drygmy_grove": "ǝʌoɹ⅁ ʎɯbʎɹᗡ", "block.cosmiccore.dyson_solar_cell": "ןןǝƆ ɹɐןoS uosʎᗡ", - "block.cosmiccore.ember_tester": "ɹǝʇsǝ⟘ ɹǝqɯƎ", + "block.cosmiccore.ethersteel_plated_ash_tiles": "sǝןı⟘ ɥsⱯ pǝʇɐןԀ ןǝǝʇsɹǝɥʇƎ", + "block.cosmiccore.ev_biolab": "ɹ§III qɐꞀ oıᗺ pǝɔuɐʌpⱯϛ§", + "block.cosmiccore.ev_calx_reactor": "ɹoʇɔɐǝᴚ xןɐƆ ʌƎ", + "block.cosmiccore.ev_electric_apiary": "ʎɹɐıdⱯ uoıʇɔnpoɹԀ ןɐıɹʇsnpuI ΛƎ", + "block.cosmiccore.ev_ember_emitter": "ɹǝʇʇıɯƎ ɹǝqɯƎ ΛƎ", + "block.cosmiccore.ev_ember_input_hatch": "ɥɔʇɐH ʇnduI ɹǝqɯƎ ΛƎϛ§", + "block.cosmiccore.ev_ember_output_hatch": "ɥɔʇɐH ʇndʇnO ɹǝqɯƎ ΛƎϛ§", + "block.cosmiccore.ev_ember_receptor": "ɹoʇdǝɔǝᴚ ɹǝqɯƎ ΛƎ", + "block.cosmiccore.ev_mana_leaching_tub": "qn⟘ buıɥɔɐǝꞀ ɐuɐW ʌƎ", + "block.cosmiccore.ev_roaster": "ɹǝʇsɐoᴚ ʌƎ", + "block.cosmiccore.ev_thermomagnitizer": "ɹǝzıʇıubɐɯoɯɹǝɥ⟘ ʌƎ", + "block.cosmiccore.ev_vacuum_bubbler": "ɹǝןqqnᗺ ɯnnɔɐΛ ʌƎ", "block.cosmiccore.ev_wireless_charger": "ɹǝbɹɐɥƆ ssǝןǝɹıM ΛƎ", "block.cosmiccore.extreme_combustion_engine_cc": "ɔƆ ǝuıbuƎ uoıʇsnqɯoƆ ǝɯǝɹʇxƎ", "block.cosmiccore.fulgorinth_prime_casing": "buısɐƆ ǝɯıɹԀ ɥʇuıɹobןnℲ", @@ -44,31 +104,63 @@ "block.cosmiccore.high_tolerance_rhenium_casing": "buısɐƆ ɯnıuǝɥᴚ ǝɔuɐɹǝןo⟘ ɥbıH", "block.cosmiccore.highly_conductive_fission_casing": "buısɐƆ uoıssıℲ ǝʌıʇɔnpuoƆ ʎןɥbıH", "block.cosmiccore.highly_flexible_reinforced_trinavine_casing": "buısɐƆ ǝuıʌɐuıɹ⟘ pǝɔɹoɟuıǝᴚ ǝןqıxǝןℲ ʎןɥbıH", + "block.cosmiccore.honey_alveary": "]ʎƎNOH[ pɹɐʎ uoıʇɔɐɹʇxƎ ɹɐʇɔǝN pǝzıɯıʇdO ɹǝdʎHǝ§", "block.cosmiccore.hp_steam_bender": "ɹǝpuǝᗺ ɯɐǝʇS ǝɹnssǝɹԀ ɥbıH", "block.cosmiccore.hp_steam_wiremill": "ןןıɯǝɹıM ɯɐǝʇS ǝɹnssǝɹԀ ɥbıH", "block.cosmiccore.hpca_indicator": "ɹoʇɐɔıpuI ⱯƆԀH", "block.cosmiccore.huge_sterilization_hatch": "ɥɔʇɐH uoıʇɐzןıɹǝʇS", + "block.cosmiccore.hv_calx_reactor": "ɹoʇɔɐǝᴚ xןɐƆ ʌH", + "block.cosmiccore.hv_electric_apiary": "ʎɹɐıdⱯ uoıʇɔnpoɹԀ ןɐıɹʇsnpuI ΛH", + "block.cosmiccore.hv_ember_emitter": "ɹǝʇʇıɯƎ ɹǝqɯƎ ΛH", + "block.cosmiccore.hv_ember_input_hatch": "ɥɔʇɐH ʇnduI ɹǝqɯƎ ΛH9§", + "block.cosmiccore.hv_ember_output_hatch": "ɥɔʇɐH ʇndʇnO ɹǝqɯƎ ΛH9§", + "block.cosmiccore.hv_ember_receptor": "ɹoʇdǝɔǝᴚ ɹǝqɯƎ ΛH", + "block.cosmiccore.hv_energy_output_hatch_16a": "ɥɔʇɐH oɯɐuʎᗡ Ɐ9Ɩ ΛH9§", + "block.cosmiccore.hv_energy_output_hatch_4a": "ɥɔʇɐH oɯɐuʎᗡ Ɐㄣ ΛH9§", + "block.cosmiccore.hv_input_hatch_4x": "ɥɔʇɐH ʇnduI ǝןdnɹpɐnὉ ΛH9§", + "block.cosmiccore.hv_mana_leaching_tub": "qn⟘ buıɥɔɐǝꞀ ɐuɐW ʌH", + "block.cosmiccore.hv_output_hatch_4x": "ɥɔʇɐH ʇndʇnO ǝןdnɹpɐnὉ ΛH9§", + "block.cosmiccore.hv_roaster": "ɹǝʇsɐoᴚ ʌH", + "block.cosmiccore.hv_thermomagnitizer": "ɹǝzıʇıubɐɯoɯɹǝɥ⟘ ʌH", + "block.cosmiccore.hv_vacuum_bubbler": "ɹǝןqqnᗺ ɯnnɔɐΛ ʌH", "block.cosmiccore.hv_wireless_charger": "ɹǝbɹɐɥƆ ssǝןǝɹıM ΛH", "block.cosmiccore.industrial_chemical_vat": "ʇɐΛ ןɐɔıɯǝɥƆ ןɐıɹʇsnpuI", "block.cosmiccore.industrial_primitive_blast_furnace": "ǝɔɐuɹnℲ ʇsɐןᗺ ǝʌıʇıɯıɹԀ ןɐıɹʇsnpuI", + "block.cosmiccore.iron_plated_deepslate_tile": "ǝןı⟘ ǝʇɐןsdǝǝᗡ pǝʇɐןԀ uoɹI", + "block.cosmiccore.iron_plated_deepslate_tile_slab": "qɐןS ǝןı⟘ ǝʇɐןsdǝǝᗡ pǝʇɐןԀ uoɹI", + "block.cosmiccore.iron_plated_deepslate_tile_stairs": "sɹıɐʇS ǝןı⟘ ǝʇɐןsdǝǝᗡ pǝʇɐןԀ uoɹI", "block.cosmiccore.iv_16a_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM Ɐ9Ɩ ΛI6§", "block.cosmiccore.iv_16a_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM Ɐ9Ɩ ΛI6§", "block.cosmiccore.iv_4a_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM Ɐㄣ ΛI6§", "block.cosmiccore.iv_4a_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM Ɐㄣ ΛI6§", + "block.cosmiccore.iv_biolab": "ɹ§ qɐꞀ oıᗺ ǝʇıןƎ6§", + "block.cosmiccore.iv_calx_reactor": "ɹoʇɔɐǝᴚ xןɐƆ ʌI", + "block.cosmiccore.iv_electric_apiary": "ʎɹɐıdⱯ uoıʇɔnpoɹԀ ןɐıɹʇsnpuI ΛI", + "block.cosmiccore.iv_ember_emitter": "ɹǝʇʇıɯƎ ɹǝqɯƎ ΛI", "block.cosmiccore.iv_ember_input_hatch": "ɥɔʇɐH ʇnduI ɹǝqɯƎ ΛI6§", "block.cosmiccore.iv_ember_output_hatch": "ɥɔʇɐH ʇndʇnO ɹǝqɯƎ ΛI6§", + "block.cosmiccore.iv_ember_receptor": "ɹoʇdǝɔǝᴚ ɹǝqɯƎ ΛI", + "block.cosmiccore.iv_mana_leaching_tub": "qn⟘ buıɥɔɐǝꞀ ɐuɐW ʌI", "block.cosmiccore.iv_naquahine_mini_reactor": "ɹ§ ɹoʇɐɹǝuǝ⅁ ɹoʇɔɐǝᴚ ıuıW ǝuıɥɐnbɐN ǝʇıןƎ6§", + "block.cosmiccore.iv_roaster": "ɹǝʇsɐoᴚ ʌI", "block.cosmiccore.iv_soul_input_hatch": "ɥɔʇɐH ʇnduI ןnoS ΛI6§", "block.cosmiccore.iv_soul_output_hatch": "ɥɔʇɐH ʇndʇnO ןnoS ΛI6§", "block.cosmiccore.iv_thermia_export_hatch": "ɥɔʇɐH ʇɹodxƎ ɐıɯɹǝɥ⟘ ʌI", "block.cosmiccore.iv_thermia_import_hatch": "ɥɔʇɐH ʇɹodɯI ɐıɯɹǝɥ⟘ ʌI", + "block.cosmiccore.iv_thermomagnitizer": "ɹǝzıʇıubɐɯoɯɹǝɥ⟘ ʌI", + "block.cosmiccore.iv_vacuum_bubbler": "ɹǝןqqnᗺ ɯnnɔɐΛ ʌI", "block.cosmiccore.iv_wireless_charger": "ɹǝbɹɐɥƆ ssǝןǝɹıM ΛI", "block.cosmiccore.iv_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM ΛI6§", "block.cosmiccore.iv_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM ΛI6§", "block.cosmiccore.large_combustion_engine_cc": "ɔƆ ǝuıbuƎ uoıʇsnqɯoƆ ǝbɹɐꞀ", "block.cosmiccore.large_laminator": "ɹoʇɐuıɯɐꞀ ǝbɹɐꞀƖ§", + "block.cosmiccore.large_roaster": "ɹǝʇsɐoᴚ ǝbɹɐꞀɔ§", "block.cosmiccore.large_spooling_machine": "ǝuıɥɔɐW buıןoodS ǝbɹɐꞀ", + "block.cosmiccore.larva": "]ⱯΛᴚⱯꞀ[ ʎןqɯǝssⱯ buınןɐΛ puɐ uoıʇɐɯɐןɔǝᴚ pıoɹǝʇsⱯ ɔıʇsıboꞀ", + "block.cosmiccore.light_dawnstone_casing": "buısɐƆ ǝuoʇsuʍɐᗡ ʇɥbıꞀ", + "block.cosmiccore.link_test_station": "uoıʇɐʇS ʇsǝ⟘ ʞuıꞀ", "block.cosmiccore.living_igniclad_coil_block": "ʞɔoןᗺ ןıoƆ pɐןɔıubI buıʌıꞀ", + "block.cosmiccore.livingrock_tiles": "sǝןı⟘ ʞɔoɹbuıʌıꞀ", "block.cosmiccore.lp_steam_bender": "⟘SIXƎ ⟘ON Oᗡ I", "block.cosmiccore.lp_steam_wiremill": "⟘SIXƎ ⟘ON Oᗡ I", "block.cosmiccore.ludicrious_intake": "ǝʞɐʇuI snoıɹɔıpnꞀ", @@ -78,20 +170,63 @@ "block.cosmiccore.luv_16a_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM Ɐ9Ɩ ΛnꞀp§", "block.cosmiccore.luv_4a_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM Ɐㄣ ΛnꞀp§", "block.cosmiccore.luv_4a_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM Ɐㄣ ΛnꞀp§", + "block.cosmiccore.luv_biolab": "ɹ§II qɐꞀ oıᗺ ǝʇıןƎp§", + "block.cosmiccore.luv_calx_reactor": "ɹoʇɔɐǝᴚ xןɐƆ ʌnꞀ", + "block.cosmiccore.luv_electric_apiary": "ʎɹɐıdⱯ uoıʇɔnpoɹԀ ןɐıɹʇsnpuI ΛnꞀ", + "block.cosmiccore.luv_ember_emitter": "ɹǝʇʇıɯƎ ɹǝqɯƎ ΛnꞀ", "block.cosmiccore.luv_ember_input_hatch": "ɥɔʇɐH ʇnduI ɹǝqɯƎ ΛnꞀp§", "block.cosmiccore.luv_ember_output_hatch": "ɥɔʇɐH ʇndʇnO ɹǝqɯƎ ΛnꞀp§", + "block.cosmiccore.luv_ember_receptor": "ɹoʇdǝɔǝᴚ ɹǝqɯƎ ΛnꞀ", + "block.cosmiccore.luv_mana_leaching_tub": "qn⟘ buıɥɔɐǝꞀ ɐuɐW ʌnꞀ", "block.cosmiccore.luv_naquahine_mini_reactor": "ɹ§II ɹoʇɐɹǝuǝ⅁ ɹoʇɔɐǝᴚ ıuıW ǝuıɥɐnbɐN ǝʇıןƎp§", + "block.cosmiccore.luv_roaster": "ɹǝʇsɐoᴚ ʌnꞀ", "block.cosmiccore.luv_soul_input_hatch": "ɥɔʇɐH ʇnduI ןnoS ΛnꞀp§", "block.cosmiccore.luv_soul_output_hatch": "ɥɔʇɐH ʇndʇnO ןnoS ΛnꞀp§", "block.cosmiccore.luv_thermia_export_hatch": "ɥɔʇɐH ʇɹodxƎ ɐıɯɹǝɥ⟘ ʌnꞀ", "block.cosmiccore.luv_thermia_import_hatch": "ɥɔʇɐH ʇɹodɯI ɐıɯɹǝɥ⟘ ʌnꞀ", + "block.cosmiccore.luv_thermomagnitizer": "ɹǝzıʇıubɐɯoɯɹǝɥ⟘ ʌnꞀ", + "block.cosmiccore.luv_vacuum_bubbler": "ɹǝןqqnᗺ ɯnnɔɐΛ ʌnꞀ", "block.cosmiccore.luv_wireless_charger": "ɹǝbɹɐɥƆ ssǝןǝɹıM ΛnꞀ", "block.cosmiccore.luv_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM ΛnꞀp§", "block.cosmiccore.luv_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM ΛnꞀp§", + "block.cosmiccore.lv_calx_reactor": "ɹoʇɔɐǝᴚ xןɐƆ ʌꞀ", + "block.cosmiccore.lv_electric_apiary": "ʎɹɐıdⱯ uoıʇɔnpoɹԀ ןɐıɹʇsnpuI ΛꞀ", + "block.cosmiccore.lv_ember_emitter": "ɹǝʇʇıɯƎ ɹǝqɯƎ ΛꞀ", + "block.cosmiccore.lv_ember_input_hatch": "ɥɔʇɐH ʇnduI ɹǝqɯƎ ΛꞀㄥ§", + "block.cosmiccore.lv_ember_output_hatch": "ɥɔʇɐH ʇndʇnO ɹǝqɯƎ ΛꞀㄥ§", + "block.cosmiccore.lv_ember_receptor": "ɹoʇdǝɔǝᴚ ɹǝqɯƎ ΛꞀ", + "block.cosmiccore.lv_energy_output_hatch_16a": "ɥɔʇɐH oɯɐuʎᗡ Ɐ9Ɩ ΛꞀㄥ§", + "block.cosmiccore.lv_energy_output_hatch_4a": "ɥɔʇɐH oɯɐuʎᗡ Ɐㄣ ΛꞀㄥ§", + "block.cosmiccore.lv_mana_leaching_tub": "qn⟘ buıɥɔɐǝꞀ ɐuɐW ʌꞀ", + "block.cosmiccore.lv_roaster": "ɹǝʇsɐoᴚ ʌꞀ", + "block.cosmiccore.lv_thermomagnitizer": "ɹǝzıʇıubɐɯoɯɹǝɥ⟘ ʌꞀ", + "block.cosmiccore.lv_vacuum_bubbler": "ɹǝןqqnᗺ ɯnnɔɐΛ ʌꞀ", "block.cosmiccore.machine_casing_gearbox_naquadria": "ɐıɹpɐnbɐN xoqɹɐǝ⅁ buısɐƆ ǝuıɥɔɐW", "block.cosmiccore.machine_casing_gearbox_pthanterum": "ɯnɹǝʇuɐɥʇԀ xoqɹɐǝ⅁ buısɐƆ ǝuıɥɔɐW", + "block.cosmiccore.mana_etching_factory": "ʎɹoʇɔɐℲ buıɥɔʇƎ ɐuɐW", "block.cosmiccore.mantle_bore": "ǝɹoᗺ ǝןʇuɐW", + "block.cosmiccore.max_ember_emitter": "ɹǝʇʇıɯƎ ɹǝqɯƎ XⱯW", + "block.cosmiccore.max_ember_receptor": "ɹoʇdǝɔǝᴚ ɹǝqɯƎ XⱯW", + "block.cosmiccore.moth_cargo_drop_off": "ɟɟO doɹᗡ obɹɐƆ ɥʇoW", + "block.cosmiccore.moth_cargo_station": "uoıʇɐʇS obɹɐƆ ɥʇoW", + "block.cosmiccore.moth_home_t1": ")Ɩ⟘( ǝɯoH ɥʇoW", + "block.cosmiccore.moth_home_t2": ")ᄅ⟘( ǝɯoH ɥʇoW", + "block.cosmiccore.moth_home_t3": ")Ɛ⟘( ǝɯoH ɥʇoW", + "block.cosmiccore.moth_home_t4": ")ㄣ⟘( ǝɯoH ɥʇoW", + "block.cosmiccore.moth_station_casing": "buısɐƆ uoıʇɐʇS ɥʇoW", "block.cosmiccore.multi_purpose_interstellar_grade_casing": "buısɐƆ ǝpɐɹ⅁ ɹɐןןǝʇsɹǝʇuI ǝsodɹnԀ ıʇןnW", + "block.cosmiccore.mv_calx_reactor": "ɹoʇɔɐǝᴚ xןɐƆ ʌW", + "block.cosmiccore.mv_electric_apiary": "ʎɹɐıdⱯ uoıʇɔnpoɹԀ ןɐıɹʇsnpuI ΛW", + "block.cosmiccore.mv_ember_emitter": "ɹǝʇʇıɯƎ ɹǝqɯƎ ΛW", + "block.cosmiccore.mv_ember_input_hatch": "ɥɔʇɐH ʇnduI ɹǝqɯƎ ΛWq§", + "block.cosmiccore.mv_ember_output_hatch": "ɥɔʇɐH ʇndʇnO ɹǝqɯƎ ΛWq§", + "block.cosmiccore.mv_ember_receptor": "ɹoʇdǝɔǝᴚ ɹǝqɯƎ ΛW", + "block.cosmiccore.mv_energy_output_hatch_16a": "ɥɔʇɐH oɯɐuʎᗡ Ɐ9Ɩ ΛWq§", + "block.cosmiccore.mv_energy_output_hatch_4a": "ɥɔʇɐH oɯɐuʎᗡ Ɐㄣ ΛWq§", + "block.cosmiccore.mv_mana_leaching_tub": "qn⟘ buıɥɔɐǝꞀ ɐuɐW ʌW", + "block.cosmiccore.mv_roaster": "ɹǝʇsɐoᴚ ʌW", + "block.cosmiccore.mv_thermomagnitizer": "ɹǝzıʇıubɐɯoɯɹǝɥ⟘ ʌW", + "block.cosmiccore.mv_vacuum_bubbler": "ɹǝןqqnᗺ ɯnnɔɐΛ ʌW", "block.cosmiccore.naquadah_pressure_resistant_casing": "buısɐƆ ʇuɐʇsısǝᴚ ǝɹnssǝɹԀ ɥɐpɐnbɐN", "block.cosmiccore.naquadric_superalloy_coil_block": "ʞɔoןᗺ ןıoƆ ʎoןןɐɹǝdnS ɔıɹpɐnbɐN", "block.cosmiccore.naquahine_pressure_reactor": "ɹoʇɔɐǝᴚ ǝɹnssǝɹԀ ǝuıɥɐnbɐN", @@ -100,12 +235,19 @@ "block.cosmiccore.opv_16a_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM Ɐ9Ɩ ΛdOן§6§", "block.cosmiccore.opv_4a_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM Ɐㄣ ΛdOן§6§", "block.cosmiccore.opv_4a_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM Ɐㄣ ΛdOן§6§", + "block.cosmiccore.opv_calx_reactor": "ɹoʇɔɐǝᴚ xןɐƆ ʌdO", + "block.cosmiccore.opv_ember_emitter": "ɹǝʇʇıɯƎ ɹǝqɯƎ ΛԀO", "block.cosmiccore.opv_ember_input_hatch": "ɥɔʇɐH ʇnduI ɹǝqɯƎ ΛdOן§6§", "block.cosmiccore.opv_ember_output_hatch": "ɥɔʇɐH ʇndʇnO ɹǝqɯƎ ΛdOן§6§", + "block.cosmiccore.opv_ember_receptor": "ɹoʇdǝɔǝᴚ ɹǝqɯƎ ΛԀO", + "block.cosmiccore.opv_mana_leaching_tub": "qn⟘ buıɥɔɐǝꞀ ɐuɐW ʌdO", + "block.cosmiccore.opv_roaster": "ɹǝʇsɐoᴚ ʌdO", "block.cosmiccore.opv_soul_input_hatch": "ɥɔʇɐH ʇnduI ןnoS ΛdOן§6§", "block.cosmiccore.opv_soul_output_hatch": "ɥɔʇɐH ʇndʇnO ןnoS ΛdOן§6§", "block.cosmiccore.opv_thermia_export_hatch": "ɥɔʇɐH ʇɹodxƎ ɐıɯɹǝɥ⟘ ʌdO", "block.cosmiccore.opv_thermia_import_hatch": "ɥɔʇɐH ʇɹodɯI ɐıɯɹǝɥ⟘ ʌdO", + "block.cosmiccore.opv_thermomagnitizer": "ɹǝzıʇıubɐɯoɯɹǝɥ⟘ ʌdO", + "block.cosmiccore.opv_vacuum_bubbler": "ɹǝןqqnᗺ ɯnnɔɐΛ ʌdO", "block.cosmiccore.opv_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM ΛdOן§6§", "block.cosmiccore.opv_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM ΛdOן§6§", "block.cosmiccore.orbital_tempering_forge": "ǝbɹoℲ buıɹǝdɯǝ⟘ ןɐʇıqɹO", @@ -120,42 +262,67 @@ "block.cosmiccore.programable_matter_coil_block": "ʞɔoןᗺ ןıoƆ ɹǝʇʇɐW ǝןqɐɯɐɹboɹԀ", "block.cosmiccore.psionic_galvorn_coil_block": "ʞɔoןᗺ ןıoƆ uɹoʌןɐ⅁ ɔıuoısԀ", "block.cosmiccore.pthanterum_wave_breakers": "sɹǝʞɐǝɹᗺ ǝʌɐM ɯnɹǝʇuɐɥʇԀ", + "block.cosmiccore.pyrothermic_refinery": "ʎɹǝuıɟǝᴚ ɔıɯɹǝɥʇoɹʎԀ", "block.cosmiccore.radioactive_filter_casing": "buısɐƆ ɹǝʇןıℲ ǝʌıʇɔɐoıpɐᴚ", "block.cosmiccore.reflective_starmetal_casing": "buısɐƆ ןɐʇǝɯɹɐʇS ǝʌıʇɔǝןɟǝᴚ", + "block.cosmiccore.reinforced_dawnstone_casing": "buısɐƆ ǝuoʇsuʍɐᗡ pǝɔɹoɟuıǝᴚ", "block.cosmiccore.reinforced_naquadria_casing": "buısɐƆ ɐıɹpɐnbɐN pǝɔɹoɟuıǝᴚ", "block.cosmiccore.reinforced_trinavine_coil_block": "ʞɔoןᗺ ןıoƆ ǝuıʌɐuıɹ⟘ pǝɔɹoɟuıǝᴚ", "block.cosmiccore.resonant_virtue_meld_coil_block": "ʞɔoןᗺ ןıoƆ pןǝW ǝnʇɹıΛ ʇuɐuosǝᴚ", "block.cosmiccore.resonantly_tuned_virtue_meld_casing": "buısɐƆ pןǝW ǝnʇɹıΛ pǝun⟘ ʎןʇuɐuosǝᴚ", + "block.cosmiccore.rigid_high_speed_steel_casing": "buısɐƆ ןǝǝʇS pǝǝdS ɥbıH pıbıᴚ", "block.cosmiccore.royal_ichorium_casing": "buısɐƆ ɯnıɹoɥɔI ןɐʎoᴚ", + "block.cosmiccore.rust_stained_casing": "buısɐƆ pǝuıɐʇS ʇsnᴚ", + "block.cosmiccore.rust_weave_casing": "buısɐƆ ǝʌɐǝM ʇsnᴚ", "block.cosmiccore.self_healing_pthanterum_casing": "buısɐƆ ɯnɹǝʇuɐɥʇԀ buıןɐǝH ɟןǝS", "block.cosmiccore.sensor_hatch": "ɥɔʇɐH ɹosuǝS", "block.cosmiccore.shimmering_neutronium_coil_block": "ʞɔoןᗺ ןıoƆ ɯnıuoɹʇnǝN buıɹǝɯɯıɥS", + "block.cosmiccore.somarust_casing": "buısɐƆ ʇsnɹɐɯoS", + "block.cosmiccore.soul_muted_casing": "buısɐƆ pǝʇnW ןnoS", + "block.cosmiccore.soul_stained_steel_aluminium_plated_casing": "buısɐƆ pǝʇɐןԀ ɯnıuıɯnןⱯ ןǝǝʇS pǝuıɐʇS ןnoS", "block.cosmiccore.spirit_crucible": "ǝןqıɔnɹƆ ʇıɹıdS", - "block.cosmiccore.star_ballast": "ʇsɐןןɐᗺ ɹɐʇS", "block.cosmiccore.star_ladder": "ɹǝppɐꞀ ɹɐʇS", + "block.cosmiccore.star_ladder_research_hub": "qnH ɥɔɹɐǝsǝᴚ ɹǝppɐꞀ ɹɐʇS", "block.cosmiccore.steam_caster": "ɹǝʇsɐƆ ɯɐǝʇS", + "block.cosmiccore.steam_ember_emitter": "ɹǝʇʇıɯƎ ɹǝqɯƎ ɯɐǝʇS", + "block.cosmiccore.steam_ember_receptor": "ɹoʇdǝɔǝᴚ ɹǝqɯƎ ɯɐǝʇS", "block.cosmiccore.steam_fluid_input_hatch": ")ɯɐǝʇS( ɥɔʇɐH ʇnduI pınןℲ", "block.cosmiccore.steam_fluid_output_hatch": ")ɯɐǝʇS( ɥɔʇɐH ʇndʇnO pınןℲ", + "block.cosmiccore.steam_large_turbine": "ǝuıqɹn⟘ ǝbɹɐꞀ ɯɐǝʇS", "block.cosmiccore.steam_mixing_vessel": "ןǝssǝΛ buıxıW ɯɐǝʇS", "block.cosmiccore.steel_plated_bronze_casing": "buısɐƆ ǝzuoɹᗺ pǝʇɐןԀ ןǝǝʇS", + "block.cosmiccore.steel_rose_lantern": "uɹǝʇuɐꞀ ǝsoᴚ ןǝǝʇS", + "block.cosmiccore.steel_rose_light": "ʇɥbıꞀ ǝsoᴚ ןǝǝʇS", + "block.cosmiccore.steel_rose_light_slab": "qɐןS ʇɥbıꞀ ǝsoᴚ ןǝǝʇS", + "block.cosmiccore.steel_rose_light_stairs": "sɹıɐʇS ʇɥbıꞀ ǝsoᴚ ןǝǝʇS", "block.cosmiccore.stellar_iris": "sıɹI ɹɐןןǝʇS", "block.cosmiccore.stellar_neutronium_grade_magnet": "ʇǝubɐW ǝpɐɹ⅁ ɯnıuoɹʇnǝN ɹɐןןǝʇS", + "block.cosmiccore.stellar_smelting_module": "Ǝ⅁ᴚOℲ ᗡNⱯᴚ⅁ : xǝןdɯoƆ uoıʇıubI", "block.cosmiccore.sterilization_hatch": "ɥɔʇɐH uoıʇɐzןıɹǝʇS", "block.cosmiccore.submerged_welder": "ɹǝpןǝM pǝbɹǝɯqnSƐ§", "block.cosmiccore.suffering_chamber": "ɹǝqɯɐɥƆ buıɹǝɟɟnSɔ§", + "block.cosmiccore.superheavy_steel_casing": "buısɐƆ ןǝǝʇS ʎʌɐǝɥɹǝdnS", "block.cosmiccore.titan_fusion_reactor": "ɹoʇɔɐǝᴚ uoısnℲ uɐʇı⟘6§", "block.cosmiccore.tritanium_lined_heavy_neutronium_casing": "buısɐƆ ɯnıuoɹʇnǝN ʎʌɐǝH pǝuıꞀ ɯnıuɐʇıɹ⟘", "block.cosmiccore.uev_16a_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM Ɐ9Ɩ ΛƎ∩ɐ§", "block.cosmiccore.uev_16a_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM Ɐ9Ɩ ΛƎ∩ɐ§", "block.cosmiccore.uev_4a_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM Ɐㄣ ΛƎ∩ɐ§", "block.cosmiccore.uev_4a_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM Ɐㄣ ΛƎ∩ɐ§", + "block.cosmiccore.uev_calx_reactor": "ɹoʇɔɐǝᴚ xןɐƆ ʌǝ∩", "block.cosmiccore.uev_cosmic_parallel_hatch": "ɥɔʇɐH ןoɹʇuoƆ ןǝןןɐɹɐԀ ɥɔǝ⟘dɹɐM", + "block.cosmiccore.uev_ember_emitter": "ɹǝʇʇıɯƎ ɹǝqɯƎ ΛƎ∩", "block.cosmiccore.uev_ember_input_hatch": "ɥɔʇɐH ʇnduI ɹǝqɯƎ ΛƎ∩ɐ§", "block.cosmiccore.uev_ember_output_hatch": "ɥɔʇɐH ʇndʇnO ɹǝqɯƎ ΛƎ∩ɐ§", + "block.cosmiccore.uev_ember_receptor": "ɹoʇdǝɔǝᴚ ɹǝqɯƎ ΛƎ∩", + "block.cosmiccore.uev_mana_leaching_tub": "qn⟘ buıɥɔɐǝꞀ ɐuɐW ʌǝ∩", + "block.cosmiccore.uev_module_hatch": "ɥɔʇɐH ǝןnpoW ǝʇıןƎ", + "block.cosmiccore.uev_roaster": "ɹǝʇsɐoᴚ ʌǝ∩", "block.cosmiccore.uev_soul_input_hatch": "ɥɔʇɐH ʇnduI ןnoS ΛƎ∩ɐ§", "block.cosmiccore.uev_soul_output_hatch": "ɥɔʇɐH ʇndʇnO ןnoS ΛƎ∩ɐ§", "block.cosmiccore.uev_thermia_export_hatch": "ɥɔʇɐH ʇɹodxƎ ɐıɯɹǝɥ⟘ ʌǝ∩", "block.cosmiccore.uev_thermia_import_hatch": "ɥɔʇɐH ʇɹodɯI ɐıɯɹǝɥ⟘ ʌǝ∩", + "block.cosmiccore.uev_thermomagnitizer": "ɹǝzıʇıubɐɯoɯɹǝɥ⟘ ʌǝ∩", + "block.cosmiccore.uev_vacuum_bubbler": "ɹǝןqqnᗺ ɯnnɔɐΛ ʌǝ∩", "block.cosmiccore.uev_wireless_charger": "ɹǝbɹɐɥƆ ssǝןǝɹıM ΛƎ∩", "block.cosmiccore.uev_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM ΛƎ∩ɐ§", "block.cosmiccore.uev_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM ΛƎ∩ɐ§", @@ -163,15 +330,22 @@ "block.cosmiccore.uhv_16a_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM Ɐ9Ɩ ΛH∩ㄣ§", "block.cosmiccore.uhv_4a_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM Ɐㄣ ΛH∩ㄣ§", "block.cosmiccore.uhv_4a_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM Ɐㄣ ΛH∩ㄣ§", + "block.cosmiccore.uhv_calx_reactor": "ɹoʇɔɐǝᴚ xןɐƆ ʌɥ∩", "block.cosmiccore.uhv_cosmic_parallel_hatch": "ɥɔʇɐH ןoɹʇuoƆ ןǝןןɐɹɐԀ ǝɯǝɹʇxƎ", + "block.cosmiccore.uhv_ember_emitter": "ɹǝʇʇıɯƎ ɹǝqɯƎ ΛH∩", "block.cosmiccore.uhv_ember_input_hatch": "ɥɔʇɐH ʇnduI ɹǝqɯƎ ΛH∩ㄣ§", "block.cosmiccore.uhv_ember_output_hatch": "ɥɔʇɐH ʇndʇnO ɹǝqɯƎ ΛH∩ㄣ§", - "block.cosmiccore.uhv_name": "ΛI ʞW ǝןnpoW ʎןqɯǝssⱯ", + "block.cosmiccore.uhv_ember_receptor": "ɹoʇdǝɔǝᴚ ɹǝqɯƎ ΛH∩", + "block.cosmiccore.uhv_mana_leaching_tub": "qn⟘ buıɥɔɐǝꞀ ɐuɐW ʌɥ∩", + "block.cosmiccore.uhv_module_hatch": "ɥɔʇɐH ǝןnpoW pǝɔuɐʌpⱯ", "block.cosmiccore.uhv_naquahine_mini_reactor": "ɹ§ ɹoʇɐɹǝuǝ⅁ ɹoʇɔɐǝᴚ ıuıW ǝuıɥɐnbɐN ɔıdƎㄣ§", + "block.cosmiccore.uhv_roaster": "ɹǝʇsɐoᴚ ʌɥ∩", "block.cosmiccore.uhv_soul_input_hatch": "ɥɔʇɐH ʇnduI ןnoS ΛH∩ㄣ§", "block.cosmiccore.uhv_soul_output_hatch": "ɥɔʇɐH ʇndʇnO ןnoS ΛH∩ㄣ§", "block.cosmiccore.uhv_thermia_export_hatch": "ɥɔʇɐH ʇɹodxƎ ɐıɯɹǝɥ⟘ ʌɥ∩", "block.cosmiccore.uhv_thermia_import_hatch": "ɥɔʇɐH ʇɹodɯI ɐıɯɹǝɥ⟘ ʌɥ∩", + "block.cosmiccore.uhv_thermomagnitizer": "ɹǝzıʇıubɐɯoɯɹǝɥ⟘ ʌɥ∩", + "block.cosmiccore.uhv_vacuum_bubbler": "ɹǝןqqnᗺ ɯnnɔɐΛ ʌɥ∩", "block.cosmiccore.uhv_wireless_charger": "ɹǝbɹɐɥƆ ssǝןǝɹıM ΛH∩", "block.cosmiccore.uhv_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM ΛH∩ㄣ§", "block.cosmiccore.uhv_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM ΛH∩ㄣ§", @@ -179,32 +353,49 @@ "block.cosmiccore.uiv_16a_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM Ɐ9Ɩ ΛI∩ᄅ§", "block.cosmiccore.uiv_4a_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM Ɐㄣ ΛI∩ᄅ§", "block.cosmiccore.uiv_4a_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM Ɐㄣ ΛI∩ᄅ§", + "block.cosmiccore.uiv_calx_reactor": "ɹoʇɔɐǝᴚ xןɐƆ ʌı∩", "block.cosmiccore.uiv_cosmic_parallel_hatch": "ɥɔʇɐH ןoɹʇuoƆ ןǝןןɐɹɐԀ ǝןdɯıS", + "block.cosmiccore.uiv_ember_emitter": "ɹǝʇʇıɯƎ ɹǝqɯƎ ΛI∩", "block.cosmiccore.uiv_ember_input_hatch": "ɥɔʇɐH ʇnduI ɹǝqɯƎ ΛI∩ᄅ§", "block.cosmiccore.uiv_ember_output_hatch": "ɥɔʇɐH ʇndʇnO ɹǝqɯƎ ΛI∩ᄅ§", + "block.cosmiccore.uiv_ember_receptor": "ɹoʇdǝɔǝᴚ ɹǝqɯƎ ΛI∩", + "block.cosmiccore.uiv_mana_leaching_tub": "qn⟘ buıɥɔɐǝꞀ ɐuɐW ʌı∩", + "block.cosmiccore.uiv_roaster": "ɹǝʇsɐoᴚ ʌı∩", "block.cosmiccore.uiv_soul_input_hatch": "ɥɔʇɐH ʇnduI ןnoS ΛI∩ᄅ§", "block.cosmiccore.uiv_soul_output_hatch": "ɥɔʇɐH ʇndʇnO ןnoS ΛI∩ᄅ§", "block.cosmiccore.uiv_thermia_export_hatch": "ɥɔʇɐH ʇɹodxƎ ɐıɯɹǝɥ⟘ ʌı∩", "block.cosmiccore.uiv_thermia_import_hatch": "ɥɔʇɐH ʇɹodɯI ɐıɯɹǝɥ⟘ ʌı∩", + "block.cosmiccore.uiv_thermomagnitizer": "ɹǝzıʇıubɐɯoɯɹǝɥ⟘ ʌı∩", + "block.cosmiccore.uiv_vacuum_bubbler": "ɹǝןqqnᗺ ɯnnɔɐΛ ʌı∩", "block.cosmiccore.uiv_wireless_charger": "ɹǝbɹɐɥƆ ssǝןǝɹıM ΛI∩", "block.cosmiccore.uiv_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM ΛI∩ᄅ§", "block.cosmiccore.uiv_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM ΛI∩ᄅ§", "block.cosmiccore.ultimate_combustion_engine_cc": "ɔƆ ǝuıbuƎ uoıʇsnqɯoƆ ǝʇɐɯıʇן∩", "block.cosmiccore.ultimate_intake": "ǝʞɐʇuI ǝʇɐɯıʇן∩", "block.cosmiccore.ultra_powered_casing": "buısɐƆ pǝɹǝʍoԀ ɐɹʇן∩", + "block.cosmiccore.ulv_energy_output_hatch_16a": "ɥɔʇɐH oɯɐuʎᗡ Ɐ9Ɩ ΛꞀ∩8§", + "block.cosmiccore.ulv_energy_output_hatch_4a": "ɥɔʇɐH oɯɐuʎᗡ Ɐㄣ ΛꞀ∩8§", "block.cosmiccore.uv_16a_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM Ɐ9Ɩ Λ∩Ɛ§", "block.cosmiccore.uv_16a_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM Ɐ9Ɩ Λ∩Ɛ§", "block.cosmiccore.uv_4a_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM Ɐㄣ Λ∩Ɛ§", "block.cosmiccore.uv_4a_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM Ɐㄣ Λ∩Ɛ§", + "block.cosmiccore.uv_biolab": "ɹ§ qɐꞀ oıᗺ ǝʇɐɯıʇן∩Ɛ§", + "block.cosmiccore.uv_calx_reactor": "ɹoʇɔɐǝᴚ xןɐƆ ʌ∩", "block.cosmiccore.uv_cosmic_parallel_hatch": "ɥɔʇɐH ןoɹʇuoƆ ןǝןןɐɹɐԀ ǝןdɯıS", + "block.cosmiccore.uv_ember_emitter": "ɹǝʇʇıɯƎ ɹǝqɯƎ Λ∩", "block.cosmiccore.uv_ember_input_hatch": "ɥɔʇɐH ʇnduI ɹǝqɯƎ Λ∩Ɛ§", "block.cosmiccore.uv_ember_output_hatch": "ɥɔʇɐH ʇndʇnO ɹǝqɯƎ Λ∩Ɛ§", - "block.cosmiccore.uv_name": "III ʞW ǝןnpoW ʎןqɯǝssⱯ", + "block.cosmiccore.uv_ember_receptor": "ɹoʇdǝɔǝᴚ ɹǝqɯƎ Λ∩", + "block.cosmiccore.uv_mana_leaching_tub": "qn⟘ buıɥɔɐǝꞀ ɐuɐW ʌ∩", + "block.cosmiccore.uv_module_hatch": "ɥɔʇɐH ǝןnpoW ɔısɐᗺ", "block.cosmiccore.uv_naquahine_mini_reactor": "ɹ§ ɹoʇɐɹǝuǝ⅁ ɹoʇɔɐǝᴚ ıuıW ǝuıɥɐnbɐN ǝʇɐɯıʇן∩Ɛ§", + "block.cosmiccore.uv_roaster": "ɹǝʇsɐoᴚ ʌ∩", "block.cosmiccore.uv_soul_input_hatch": "ɥɔʇɐH ʇnduI ןnoS Λ∩Ɛ§", "block.cosmiccore.uv_soul_output_hatch": "ɥɔʇɐH ʇndʇnO ןnoS Λ∩Ɛ§", "block.cosmiccore.uv_thermia_export_hatch": "ɥɔʇɐH ʇɹodxƎ ɐıɯɹǝɥ⟘ ʌ∩", "block.cosmiccore.uv_thermia_import_hatch": "ɥɔʇɐH ʇɹodɯI ɐıɯɹǝɥ⟘ ʌ∩", + "block.cosmiccore.uv_thermomagnitizer": "ɹǝzıʇıubɐɯoɯɹǝɥ⟘ ʌ∩", + "block.cosmiccore.uv_vacuum_bubbler": "ɹǝןqqnᗺ ɯnnɔɐΛ ʌ∩", "block.cosmiccore.uv_wireless_charger": "ɹǝbɹɐɥƆ ssǝןǝɹıM Λ∩", "block.cosmiccore.uv_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM Λ∩Ɛ§", "block.cosmiccore.uv_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM Λ∩Ɛ§", @@ -212,20 +403,30 @@ "block.cosmiccore.uxv_16a_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM Ɐ9Ɩ ΛX∩ǝ§", "block.cosmiccore.uxv_4a_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM Ɐㄣ ΛX∩ǝ§", "block.cosmiccore.uxv_4a_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM Ɐㄣ ΛX∩ǝ§", + "block.cosmiccore.uxv_calx_reactor": "ɹoʇɔɐǝᴚ xןɐƆ ʌx∩", + "block.cosmiccore.uxv_ember_emitter": "ɹǝʇʇıɯƎ ɹǝqɯƎ ΛX∩", "block.cosmiccore.uxv_ember_input_hatch": "ɥɔʇɐH ʇnduI ɹǝqɯƎ ΛX∩ǝ§", "block.cosmiccore.uxv_ember_output_hatch": "ɥɔʇɐH ʇndʇnO ɹǝqɯƎ ΛX∩ǝ§", + "block.cosmiccore.uxv_ember_receptor": "ɹoʇdǝɔǝᴚ ɹǝqɯƎ ΛX∩", + "block.cosmiccore.uxv_mana_leaching_tub": "qn⟘ buıɥɔɐǝꞀ ɐuɐW ʌx∩", + "block.cosmiccore.uxv_roaster": "ɹǝʇsɐoᴚ ʌx∩", "block.cosmiccore.uxv_soul_input_hatch": "ɥɔʇɐH ʇnduI ןnoS ΛX∩ǝ§", "block.cosmiccore.uxv_soul_output_hatch": "ɥɔʇɐH ʇndʇnO ןnoS ΛX∩ǝ§", "block.cosmiccore.uxv_thermia_export_hatch": "ɥɔʇɐH ʇɹodxƎ ɐıɯɹǝɥ⟘ ʌx∩", "block.cosmiccore.uxv_thermia_import_hatch": "ɥɔʇɐH ʇɹodɯI ɐıɯɹǝɥ⟘ ʌx∩", + "block.cosmiccore.uxv_thermomagnitizer": "ɹǝzıʇıubɐɯoɯɹǝɥ⟘ ʌx∩", + "block.cosmiccore.uxv_vacuum_bubbler": "ɹǝןqqnᗺ ɯnnɔɐΛ ʌx∩", "block.cosmiccore.uxv_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM ΛX∩ǝ§", "block.cosmiccore.uxv_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM ΛX∩ǝ§", "block.cosmiccore.vibrant_rubidium_casing": "buısɐƆ ɯnıpıqnᴚ ʇuɐɹqıΛ", + "block.cosmiccore.vile_fission": "ɹoʇɔɐǝᴚ uoıssıℲ buıɹǝʇsǝℲɔ§", "block.cosmiccore.void_fluid_rig": "bıᴚ pınןℲ pıoΛɔ§", "block.cosmiccore.void_miner": "ɹǝuıW pıoΛɔ§", + "block.cosmiccore.void_salt_fissiom": "ɹoʇɔɐǝᴚ uoıssıℲ ʇןɐS pǝɥɔnoʇpıoΛϛ§", "block.cosmiccore.vomahine_celestial_laser_bore": "ǝɹoᗺ ɹǝsɐꞀ ןɐıʇsǝןǝƆ ǝuıɥɐɯoΛ", "block.cosmiccore.vorax_reactor": "ɹoʇɔɐǝᴚ xɐɹoΛ", "block.cosmiccore.wailing_ichor_casing": "buısɐƆ ɹoɥɔI buıןıɐM", + "block.cosmiccore.wasp": "]ԀSⱯM[ ɯɹoɟʇɐןԀ uoıʇɐɹɐdǝS pıoɹǝʇsⱯ ǝpıM", "block.cosmiccore.wear_resistant_ruridit_casing": "buısɐƆ ʇıpıɹnᴚ ʇuɐʇsısǝᴚ ɹɐǝM", "block.cosmiccore.wireless_data_hatch": "ɥɔʇɐH ɐʇɐᗡ ssǝןǝɹıM", "block.cosmiccore.wireless_data_transmitter": "ɹǝʇʇıɯsuɐɹ⟘ ɐʇɐᗡ ssǝןǝɹıM", @@ -234,15 +435,22 @@ "block.cosmiccore.zpm_16a_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM Ɐ9Ɩ WԀZɔ§", "block.cosmiccore.zpm_4a_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM Ɐㄣ WԀZɔ§", "block.cosmiccore.zpm_4a_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM Ɐㄣ WԀZɔ§", + "block.cosmiccore.zpm_biolab": "ɹ§III qɐꞀ oıᗺ ǝʇıןƎɔ§", + "block.cosmiccore.zpm_calx_reactor": "ɹoʇɔɐǝᴚ xןɐƆ ɯdZ", "block.cosmiccore.zpm_cosmic_parallel_hatch": "ɥɔʇɐH ןoɹʇuoƆ ןǝןןɐɹɐԀ ǝןdɯıS", + "block.cosmiccore.zpm_ember_emitter": "ɹǝʇʇıɯƎ ɹǝqɯƎ WԀZ", "block.cosmiccore.zpm_ember_input_hatch": "ɥɔʇɐH ʇnduI ɹǝqɯƎ WԀZɔ§", "block.cosmiccore.zpm_ember_output_hatch": "ɥɔʇɐH ʇndʇnO ɹǝqɯƎ WԀZɔ§", - "block.cosmiccore.zpm_name": "II ʞW ǝןnpoW ʎןqɯǝssⱯ", + "block.cosmiccore.zpm_ember_receptor": "ɹoʇdǝɔǝᴚ ɹǝqɯƎ WԀZ", + "block.cosmiccore.zpm_mana_leaching_tub": "qn⟘ buıɥɔɐǝꞀ ɐuɐW ɯdZ", "block.cosmiccore.zpm_naquahine_mini_reactor": "ɹ§III ɹoʇɐɹǝuǝ⅁ ɹoʇɔɐǝᴚ ıuıW ǝuıɥɐnbɐN ǝʇıןƎɔ§", + "block.cosmiccore.zpm_roaster": "ɹǝʇsɐoᴚ ɯdZ", "block.cosmiccore.zpm_soul_input_hatch": "ɥɔʇɐH ʇnduI ןnoS WԀZɔ§", "block.cosmiccore.zpm_soul_output_hatch": "ɥɔʇɐH ʇndʇnO ןnoS WԀZɔ§", "block.cosmiccore.zpm_thermia_export_hatch": "ɥɔʇɐH ʇɹodxƎ ɐıɯɹǝɥ⟘ ɯdZ", "block.cosmiccore.zpm_thermia_import_hatch": "ɥɔʇɐH ʇɹodɯI ɐıɯɹǝɥ⟘ ɯdZ", + "block.cosmiccore.zpm_thermomagnitizer": "ɹǝzıʇıubɐɯoɯɹǝɥ⟘ ɯdZ", + "block.cosmiccore.zpm_vacuum_bubbler": "ɹǝןqqnᗺ ɯnnɔɐΛ ɯdZ", "block.cosmiccore.zpm_wireless_charger": "ɹǝbɹɐɥƆ ssǝןǝɹıM WԀZ", "block.cosmiccore.zpm_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM WԀZɔ§", "block.cosmiccore.zpm_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM WԀZɔ§", @@ -268,10 +476,7 @@ "config.jade.plugin_cosmiccore.drone_maintenance_interface": "ǝɔɐɟɹǝʇuI ǝɔuɐuǝʇuıɐW ǝuoɹᗡ ]ƆƆ[", "config.jade.plugin_cosmiccore.drone_station": "uoıʇɐʇS ǝuoɹᗡ ]ƆƆ[", "config.jade.plugin_cosmiccore.parallel_info_cc": "oɟuI ןǝןןɐɹɐԀ ]ƆƆ[", - "coscore.pattern.div": "ɟ§÷%dɔ§", - "coscore.pattern.multiply": "ɟ§x%dq§", - "coscore.pattern.tooltip.div": "ɟ§%dq§ ʎq sʇuǝʇuoɔ sǝpıʌıᗡ", - "coscore.pattern.tooltip.multiply": "ɟ§%dɔ§ ʎq sʇuǝʇuoɔ sǝıןdıʇןnW", + "config.jade.plugin_cosmiccore.stellar_module": "ǝןnpoW ɹɐןןǝʇS ]ƆƆ[", "cosmic.command.wireless.energy.active": "%s q§:ǝʌıʇɔⱯq§ ", "cosmic.command.wireless.energy.buffered": "∩Ǝ %s q§:pǝɹǝɟɟnᗺq§ ", "cosmic.command.wireless.energy.capacitor": " q§:uoıʇɐɔoꞀ ɹoʇıɔɐdɐƆq§ ", @@ -318,6 +523,21 @@ "cosmiccore.armor.sanguinewarptech.hud.LP": "%sɔ§ :ǝɔɹoℲ ǝɟıꞀㄣ§", "cosmiccore.armor.sanguinewarptech.hud.shieldstate": "%s :pןǝıɥS ǝuınbuɐS", "cosmiccore.armor.sanguinewarptech.message.death_defiance": "¡ɥʇɐǝp ɯoɹɟ noʎ pǝʇɔǝʇoɹd ɹoɯɹɐ ǝuınbuɐs ɹnoʎ", + "cosmiccore.booster.tooltip.prefix": "%s ɹǝı⟘ ɹ§:ɹǝʇsooᗺq§", + "cosmiccore.boots.hud.jump": "%s :dɯnſ", + "cosmiccore.boots.hud.speed": "%s %s :pǝǝdS", + "cosmiccore.boots.hud.speed_simple": "%s :pǝǝdS", + "cosmiccore.boots.inertia_cancel": "%s :buıuǝdɯɐᗡ ɐıʇɹǝuI", + "cosmiccore.boots.jump_modifier": "%s :ɹǝıɟıpoW dɯnſ", + "cosmiccore.boots.max_speed": "%s :pǝǝdS xɐW", + "cosmiccore.boots.message.inertia": "%s :buıuǝdɯɐᗡ ɐıʇɹǝuI", + "cosmiccore.boots.message.jump": "%s :ɹǝıɟıpoW dɯnſ", + "cosmiccore.boots.message.speed": "%s :ɹǝıɟıpoW pǝǝdS", + "cosmiccore.boots.message.step": "%s :ʇsıssⱯ dǝʇS", + "cosmiccore.boots.speed_modifier": "%s :ɹǝıɟıpoW pǝǝdS", + "cosmiccore.boots.step_assist": "%s :ʇsıssⱯ dǝʇS", + "cosmiccore.calorific.tooltip.prefix": "%s ɹ§:ɔıɟıɹoןɐƆϛ§", + "cosmiccore.calx_reactor.desc": "ǝuɐɔɹⱯ ǝɥʇ ɥʇıʍ sɹǝpuoʍ buıʞɹoM", "cosmiccore.circuit.lore.tier.max.0": "ʇınɔɹıƆ ɹǝı⟘ XⱯW", "cosmiccore.circuit.lore.tier.max.1": "˙ʎɹɐnʇıqO uɐ ʇnq -ɹossǝɔoɹd ɐ ʇoN", "cosmiccore.circuit.lore.tier.max.2": "˙ǝɔuǝʇsıxƎ :ʇnduI", @@ -331,7 +551,12 @@ "cosmiccore.conjuct_valkruth.1": "buıɯןǝɥʍɹǝʌO - ןɐΛ9§", "cosmiccore.conjuct_valkruth.2": "uoıʇɐpunoℲ - ɥʇnᴚ9§", "cosmiccore.conjuct_valkruth_emotion.1": "ǝɔuǝbɹǝʌuoƆ - Ɐ˙ᴚ˙Ǝq§", + "cosmiccore.datastick.link_copied": "%s :ʞuıꞀ", + "cosmiccore.ember.capacity": "%s 9§:ʎʇıɔɐdɐƆ ɹǝqɯƎɔ§", + "cosmiccore.ember.transfer": "%s 9§:ǝʇɐᴚ ɹǝɟsuɐɹ⟘ ɹǝqɯƎɔ§", "cosmiccore.errors.bad_fuel": "ʇıun ɹǝd ןɐʇoʇ ∩Ǝ 0ᄅㄥ> ǝq ʇsnW ʇndʇnO ןǝnℲ \n ¡ʎʇıןɐnὉ ןǝnℲ ʇuǝıɔıɟɟnsuIɐ§", + "cosmiccore.gui.stellar.show_modules": "ןoɹʇuoƆ ǝןnpoW ʍoɥS", + "cosmiccore.gui.stellar.show_star": "ʍǝıΛ ɹɐʇS ʍoɥS", "cosmiccore.item.linked_terminal.boundTo": "%s oʇ punoᗺ", "cosmiccore.item.spraycan.tooltip.current_color": "%s :ɹoןoƆ ʇuǝɹɹnƆ", "cosmiccore.item.spraycan.tooltip.lclick": "ɹoןoɔ ǝןɔʎƆ8§ :ʞɔıןƆ ʇɟǝꞀㄣ§", @@ -341,8 +566,32 @@ "cosmiccore.item.spraycan.tooltip.rclick_offhand": "ʇuıɐd & ǝɔɐןԀ8§ :puɐɥɟɟO uı ʞɔıןƆ ʇɥbıᴚϛ§", "cosmiccore.item.spraycan.tooltip.rclick_sneak": "I∩ uǝdO8§ :ʞɐǝuS + ʞɔıןƆ ʇɥbıᴚϛ§", "cosmiccore.item.spraycan.tooltip.solvent_mode": "ǝpoɯ ⟘NƎΛꞀOS uı uɐɔʎɐɹdS", + "cosmiccore.jade.stellar_module.connected": "pǝʇɔǝuuoƆ :sıɹI", + "cosmiccore.jade.stellar_module.energy_usage": "%s :ǝbɐs∩", + "cosmiccore.jade.stellar_module.iris_not_ready": "ʎpɐǝᴚ ʇoN :sıɹI", + "cosmiccore.jade.stellar_module.no_wireless": "ʞɹoʍʇǝN ssǝןǝɹıM oN", + "cosmiccore.jade.stellar_module.not_connected": "pǝʇɔǝuuoƆ ʇoN :sıɹI", + "cosmiccore.jade.stellar_module.speed_bonus": "%s :pǝǝdS", + "cosmiccore.jade.stellar_module.stage": "%s :ǝbɐʇS", "cosmiccore.khoruth.1": "ǝɔɐdS - ɹoɥʞ9§", "cosmiccore.khoruth.2": "uoıʇɐpunoℲ - ɥʇnᴚ9§", + "cosmiccore.link.already_linked": "pǝʞuıן ʎpɐǝɹןɐ ǝɹɐ sǝuıɥɔɐɯ ǝsǝɥ⟘", + "cosmiccore.link.cannot_self_link": "ɟןǝsʇı oʇ ǝuıɥɔɐɯ ɐ ʞuıן ʇouuɐƆ", + "cosmiccore.link.copied": "%s ɯoɹɟ pǝıdoɔ ɐʇɐp ʞuıꞀ", + "cosmiccore.link.different_owner": "sɯɐǝʇ ʇuǝɹǝɟɟıp ʎq pǝuʍo sǝuıɥɔɐɯ ʞuıן ʇouuɐƆ", + "cosmiccore.link.established": "%s ↔ %s :pǝɥsıןqɐʇsǝ ʞuıꞀ", + "cosmiccore.link.incompatible_partner": "ǝdʎʇ sıɥʇ oʇ ʞuıן ʇouuɐɔ ǝuıɥɔɐɯ ɹǝuʇɹɐԀ", + "cosmiccore.link.incompatible_roles": "%s oʇ ʞuıן ʇouuɐɔ %s :sǝןoɹ ʞuıן ǝןqıʇɐdɯoɔuI", + "cosmiccore.link.incompatible_self": "ǝdʎʇ ʇɐɥʇ oʇ ʞuıן ʇouuɐɔ ǝuıɥɔɐɯ sıɥ⟘", + "cosmiccore.link.invalid_data": "ʞɔıʇsɐʇɐp uo ɐʇɐp ʞuıן pıןɐʌuI", + "cosmiccore.link.limit_reached_partner": "ʇıɯıן ʞuıן sʇı pǝɥɔɐǝɹ sɐɥ ǝuıɥɔɐɯ ɹǝuʇɹɐԀ", + "cosmiccore.link.limit_reached_self": "ʇıɯıן ʞuıן sʇı pǝɥɔɐǝɹ sɐɥ ǝuıɥɔɐɯ sıɥ⟘", + "cosmiccore.link.not_linkable": "buıʞuıן ʇɹoddns ʇou sǝop ǝuıɥɔɐɯ ʇǝbɹɐ⟘", + "cosmiccore.link.not_ready": "buıʞuıן ɹoɟ ʎpɐǝɹ ʇou ǝuıɥɔɐW", + "cosmiccore.link.partner_missing": "sʇsıxǝ ɹǝbuoן ou ǝuıɥɔɐɯ ɹǝuʇɹɐԀ", + "cosmiccore.link.partner_not_loaded": "ʞuıן ɥsıןqɐʇsǝ oʇ pǝpɐoן ǝq ʇsnɯ ǝuıɥɔɐɯ ɹǝuʇɹɐԀ", + "cosmiccore.link.partner_offline": "ǝuıןɟɟo ɹǝuʇɹɐd pǝʞuıꞀ", + "cosmiccore.link.too_far": "buıʞuıן ɹoɟ pɐoן-ǝɔɹoɟ oʇ ʎɐʍɐ ɹɐɟ ooʇ sı ɹǝuʇɹɐԀ", "cosmiccore.lore.broken_virtue.0": "ʎןʇɟoS sɹǝppnɥS ʎʇınʇǝdɹǝԀ", "cosmiccore.lore.broken_virtue.1": "˙buoɹʍ ʎɹǝʌ ǝuob sɐɥ buıɥʇǝɯoS", "cosmiccore.lore.shard_huge.0": "˙ʎʇıuɹǝʇǝ ʇsɐd ɯoɹɟ ɹǝʇsnןɔ ǝʌıssɐɯ ʎןןɐɯɹouqɐ uⱯƐ§", @@ -352,14 +601,43 @@ "cosmiccore.lore.shard_large.1": "˙ǝʇɐɟ ǝʇıɹʍǝɹ oʇ soɥɔǝ ʇıɐ§", "cosmiccore.lore.shard_small.0": "ʎʇıuɹǝʇǝ ʇsɐd ɐ ɯoɹɟ pɹɐɥs Ɐ9§", "cosmiccore.lore.shard_small.1": "˙ǝʇɐɟ ǝʇıɹʍǝɹ oʇ soɥɔǝ ʎןʇqns ʇı9§", + "cosmiccore.lubricant.tooltip.prefix": "%s ɹǝı⟘ ɹ§:ʇuɐɔıɹqnꞀ9§", "cosmiccore.machine.capacitor_array.tooltip.0": "ɹ§ǝbɐɹoʇS ɹǝʍoԀ ǝsuǝᗡ ןɐɔoꞀㄥ§", "cosmiccore.machine.capacitor_array.tooltip.1": "ɹ§sǝɯıʇ 8Ɩ oʇ dn ʎןןɐɔıʇɹǝʌ pǝpuɐdxǝ ǝq puɐ ɹoʇıɔɐdɐɔ ʎuɐ ǝsn uɐƆㄥ§", "cosmiccore.machine.capacitor_array.tooltip.2": "ɹ§sǝɥɔʇɐH ɹǝsɐꞀ9§ sʇdǝɔɔⱯㄥ§", + "cosmiccore.machine.dreamers_basin.eu_budget_header": "ʇǝbpnᗺ ʎbɹǝuƎ", + "cosmiccore.machine.dreamers_basin.eu_per_thread": ")%s( pɐǝɹɥʇ ɹǝd ʇ/∩Ǝ %s", + "cosmiccore.machine.dreamers_basin.status_idle": "ǝdıɔǝɹ oN - ǝןpI", + "cosmiccore.machine.dreamers_basin.status_suspended": "pǝpuǝdsnS", + "cosmiccore.machine.dreamers_basin.status_unknown": "uʍouʞu∩", + "cosmiccore.machine.dreamers_basin.status_waiting": "sʇnduı ɹoɟ buıʇıɐM", + "cosmiccore.machine.dreamers_basin.thread_header": "snʇɐʇS pɐǝɹɥ⟘", + "cosmiccore.machine.dreamers_basin.threads_summary": "xɐɯ %s / ǝʌıʇɔɐ %s / buıuunɹ %s", + "cosmiccore.machine.dreamers_basin.time_remaining": "buıuıɐɯǝɹ %s :ǝɯı⟘", + "cosmiccore.machine.dreamers_basin.tooltip.0": "ʎןsnoǝuɐʇןnɯıs sǝdıɔǝɹ ǝnbıun ǝןdıʇןnɯ sunᴚq§", + "cosmiccore.machine.dreamers_basin.tooltip.1": "ɥɔʇɐɥ/snq ʇnduı ɟ§pǝɹoןoɔ9§ ʎןǝnbıun ɐ sǝɹınbǝɹ pɐǝɹɥʇ ɥɔɐƎɟ§", + "cosmiccore.machine.dreamers_basin.tooltip.2": ")9Ɩ=Ɐ9Ɩ 'ㄣ=Ɐㄣ( ǝbɐɹǝdɯɐ ɥɔʇɐH ʎbɹǝuƎ = spɐǝɹɥʇ xɐWɟ§", + "cosmiccore.machine.dreamers_basin.tooltip.3": "sǝɥɔʇɐɥ/sǝsnq ʇndʇno ǝɹɐɥs spɐǝɹɥʇ ןןⱯɐ§", + "cosmiccore.machine.dreamers_basin.tooltip.crafting": ":buıʇɟɐɹƆ", + "cosmiccore.machine.dreamers_basin.tooltip.duration": "%s :uoıʇɐɹnp ǝdıɔǝᴚ", + "cosmiccore.machine.dreamers_basin.tooltip.no_recipe": "ɐʇɐp ǝdıɔǝɹ oN", + "cosmiccore.machine.dreamers_basin.tooltip.processing": "˙˙˙buıssǝɔoɹԀ ", "cosmiccore.machine.fluid_drilling_rig.depletion": "%0 :ǝʇɐᴚ uoıʇǝןdǝᗡq§", "cosmiccore.machine.fluid_drilling_rig.description.0": "ɯoɹɟ pınןɟ ǝʇıuıɟuı sןןıɹᗡq§", "cosmiccore.machine.fluid_drilling_rig.description.1": "˙pıoʌ ǝɥʇ ʇnoɥbnoɹɥʇ pǝpuǝdsns sʇǝʞɔod pınbıןq§", "cosmiccore.machine.fluid_drilling_rig.production": "x9ϛᄅ :ɹǝıןdıʇןnW uoıʇɔnpoɹԀǝ§", - "cosmiccore.multiblock.advanced.star_ladder_tier": "%sq§ :ɟ§sǝןnpoW ɥɔɹɐǝsǝᴚ xɐWɐ§ \n %sq§ :ɟ§ɹǝı⟘ ɹǝɥʇǝ⟘ ɹǝppɐꞀɹɐʇS ǝuıɥɐɯoΛɐ§", + "cosmiccore.machine.me.stocking_item.tooltip.0": "ɹ§ʇoןs ɯǝʇı ɹɐןnbuıs ɐ oʇuı sʇɔnpoɹd sןןnd ʎןןɐɔıʇɐɯoʇnⱯɟ§", + "cosmiccore.machine.me.stocking_item.tooltip.1": "ɹ§ǝuıן ʎןqɯǝssⱯ ǝɥʇ ɟo uoıʇɐɯoʇnⱯ pǝɔuɐʌpⱯ sʍoןןⱯq§", + "cosmiccore.machine.me.stocking_item.tooltip.2": "ɹ§ᄅƎⱯ ɯoɹɟ ɯǝʇı ʇsɹıɟ ǝɥʇ ןןnd ʎןןɐɔıʇɐɯoʇnɐ oʇ ʇǝs ǝq uɐƆɟ§", + "cosmiccore.machine.me.stocking_item.tooltip.3": "ɹ§˙pǝɹǝʇןıɟ ʎןןɐnuɐɯ ɹoq§", + "cosmiccore.machine.me.stocking_item.tooltip.4": "ɹ§ʞɔıʇs ɐʇɐp ɐ ɥʇıʍ pǝʇsɐd/ʎdoɔ ǝq uɐɔ ɐʇɐp ɹǝʇןıℲɟ§", + "cosmiccore.machine.me.stocking_item.tooltip.5": "ɹ§sǝuıן ʎןqɯǝssɐ ןǝןןɐɹɐd oʇ ʍoɥ buıɹǝpuoʍ ǝɹ,noʎ ɟI,q§", + "cosmiccore.machine.me.stocking_item.tooltip.6": "ɹ§¡sʇǝuqns oʇ ǝɯoɔןǝM ˙ʍoɥ sı sıɥʇɟ§", + "cosmiccore.machine.multithreaded.active_threads": "%sɟ§/ㄥ§%sɐ§ :ǝʌıʇɔⱯㄥ§", + "cosmiccore.machine.multithreaded.max_threads": "%sɟ§ :spɐǝɹɥ⟘ xɐWㄥ§", + "cosmiccore.machine.multithreaded.thread_status": "=== snʇɐʇS pɐǝɹɥ⟘ ===q§", + "cosmiccore.mana_leaching_tub.desc": "0006 ɹǝʞɐoS ɐuɐW", + "cosmiccore.multiblock.advanced.star_ladder_tier": "%sq§ :ɟ§sǝןnpoW ɥɔɹɐǝsǝᴚ xɐWɐ§ \n %sq§ :ɟ§ɹǝı⟘ ɹǝɥʇǝ⟘ pןOɹǝppɐꞀɹɐʇS ǝuıɥɐɯoΛɐ§", "cosmiccore.multiblock.booster_used": "%s :ɹǝʇsooᗺ", "cosmiccore.multiblock.chemvat.tooltip.0": "ןǝןןɐɹɐd ɟo ǝןqɐdɐɔ ʇuɐןd ןɐɔıɯǝɥɔ ǝʌıssɐɯ Ɐɐ§", "cosmiccore.multiblock.chemvat.tooltip.1": "˙ɹǝɥʇǝboʇ sǝdıɔǝɹ ןןɐ ɟo ǝɯıʇ ǝʌıʇɐןnɯnɔ ǝɥʇ sppɐ 'pǝzıןǝןןɐɹɐd uǝɥMɟ§", @@ -376,7 +654,15 @@ "cosmiccore.multiblock.drone_station_machine.current_tier": "%s :ɹǝıʇ ʇuǝɹɹnƆ", "cosmiccore.multiblock.drone_station_machine.drone_amount": "sǝuoɹp %s buıʌɹǝs ʎןʇuǝɹɹnƆ", "cosmiccore.multiblock.drone_station_machine.no_drones": "pǝʇɔǝuuoɔ sǝuoɹp oN", + "cosmiccore.multiblock.drone_station_machine.tier.0": "ɔıʇɐɯsɐןԀ", + "cosmiccore.multiblock.drone_station_machine.tier.1": "ǝuınbuɐS", + "cosmiccore.multiblock.drone_station_machine.tier.2": "ןɐıɹʇsnpuI", + "cosmiccore.multiblock.drone_station_machine.tier.3": "ʇsnqoᴚ", + "cosmiccore.multiblock.drone_station_machine.tier.4": "ʎʇsnᴚ", + "cosmiccore.multiblock.drone_station_machine.tier.5": "ǝuoN", "cosmiccore.multiblock.fuel_star": "ǝɹoƆ ɹɐʇS ןǝnℲן§ɐ§", + "cosmiccore.multiblock.heat_capacity": "%s :ʇɐǝH xɐWɔ§", + "cosmiccore.multiblock.heat_value": "%s :ʇɐǝH ʇuǝɹɹnƆ9§", "cosmiccore.multiblock.hpca.incomplete-array": "ǝʇɐɹǝuǝb ʇou ןןıʍ ʎɐɹɹⱯ ǝʇǝןdɯoɔuI", "cosmiccore.multiblock.hpsassem.tooltip.0": "¡ǝɹıdɯǝ uɐ pןınq s,ʇǝꞀo§ㄥ§", "cosmiccore.multiblock.hpsassem.tooltip.1": "ןǝǝʇs ɟo ǝpɐɯ ɹǝןqɯǝssɐ ןnɟɹǝʍod ʇnq ǝbɹɐן Ɐɟ§", @@ -399,9 +685,26 @@ "cosmiccore.multiblock.naqreactor.tooltip.0": "ןǝnɟ ǝʌıʇɔɐǝɹ puɐ suoısoןdxǝ ʎq pǝɹǝʍod ɹoʇɔɐǝɹ ǝʌıssɐɯ Ɐɔ§", "cosmiccore.multiblock.naqreactor.tooltip.1": "˙ʇndʇno x9Ɩ oʇ ןǝןןɐɹɐd oʇ ʇdɯǝʇʇɐ sʎɐʍןɐ ןןıMq§", "cosmiccore.multiblock.naqreactor.tooltip.2": "˙sǝɥɔʇɐɥ ɹǝsɐꞀ sʇdǝɔɔⱯ ʎןuOɔ§", + "cosmiccore.multiblock.pattern.stellar_module_slot": ")ǝןnpoW pǝɯɹoℲ ɹo ɹıⱯ( ʇoןS ǝןnpoWㄥ§", "cosmiccore.multiblock.reboot_powergrid": "sǝuıɥɔɐW pǝʇɔǝuuoƆ ןןⱯ ʇooqǝᴚɐ§", "cosmiccore.multiblock.send_orbit_data": "pɐoןʎɐԀ ɥɔɹɐǝsǝᴚ puǝSן§ɐ§", "cosmiccore.multiblock.sleep_powergrid": "sǝuıɥɔɐW pǝʇɔǝuuoƆ ןןⱯ puǝdsnSɔ§", + "cosmiccore.multiblock.star_ladder.tooltip.0": "sɹɐʇs ǝɥʇ oʇuı ʇno ɥɔɐǝɹ uoıʇɐǝɹɔ ɟo sʞɐǝd ǝɥ⟘ɔ§", + "cosmiccore.multiblock.star_ladder.tooltip.1": "⟘NƎSƎᴚԀ SSOꞀ Ɐ⟘Ɐᗡ :ᴚƎ⅁NⱯᗡן§ɔ§", + "cosmiccore.multiblock.star_ladder.tooltip.2": "ƎꞀᗺISSOԀ SI ʎᴚƎΛOƆƎᴚ :ᴚƎ⅁NⱯᗡן§ɔ§", + "cosmiccore.multiblock.star_ladder.tooltip.3": ")ΛI oʇ ɯɐǝʇS( Ɩ⟘ƆⱯ ɟo ןɐo⅁ ןɐuıℲ ǝɥ⟘ : ʞɔoןqıʇןnW ǝןɔɐuıԀɐ§", + "cosmiccore.multiblock.stellar_module.connected": "sıɹI ɹɐןןǝʇS oʇ pǝʇɔǝuuoƆɐ§", + "cosmiccore.multiblock.stellar_module.energy_usage": "%sɟ§ :ʇ/∩Ǝ ssǝןǝɹıMǝ§", + "cosmiccore.multiblock.stellar_module.iris_not_formed": "pǝɯɹoℲ ʇoN sıɹI ɹɐןןǝʇSɔ§", + "cosmiccore.multiblock.stellar_module.iris_not_ready": "ʎpɐǝᴚ ʇoN sıɹI ɹɐןןǝʇSǝ§", + "cosmiccore.multiblock.stellar_module.loading": "˙˙˙buıpɐoꞀㄥ§", + "cosmiccore.multiblock.stellar_module.no_wireless": "ʞɹoʍʇǝN ʎbɹǝuƎ ssǝןǝɹıM oNɔ§", + "cosmiccore.multiblock.stellar_module.not_connected": "sıɹI ɹɐןןǝʇS oʇ pǝʇɔǝuuoƆ ʇoNɔ§", + "cosmiccore.multiblock.stellar_module.parallel": "%sq§ :ʇıɯıꞀ ןǝןןɐɹɐԀㄥ§", + "cosmiccore.multiblock.stellar_module.power_config": "ןǝןןɐɹɐԀㄥ§ x%dɐ§ @ㄥ§ %sq§ :bıɟuoƆㄥ§", + "cosmiccore.multiblock.stellar_module.power_failure": "¡ʎbɹǝuƎ ʇuǝıɔıɟɟnsuI - Ǝᴚ∩ꞀIⱯℲ ᴚƎMOԀן§ɔ§", + "cosmiccore.multiblock.stellar_module.speed_bonus": "%sɐ§ :snuoᗺ pǝǝdSㄥ§", + "cosmiccore.multiblock.stellar_module.stage": "%sǝ§ :ǝbɐʇS sıɹIㄥ§", "cosmiccore.omnia_circuit.ev": "˙ʇınɔɹıƆ ΛƎ ʎuɐ sɐ sʞɹoM9§", "cosmiccore.omnia_circuit.hv": "˙ʇınɔɹıƆ ΛH ʎuɐ sɐ sʞɹoM9§", "cosmiccore.omnia_circuit.iv": "˙ʇınɔɹıƆ ΛI ʎuɐ sɐ sʞɹoM9§", @@ -415,6 +718,13 @@ "cosmiccore.omnia_circuit.uv": "˙ʇınɔɹıƆ Λ∩ ʎuɐ sɐ sʞɹoM9§", "cosmiccore.omnia_circuit.uxv": "˙ʇınɔɹıƆ ΛX∩ ʎuɐ sɐ sʞɹoM9§", "cosmiccore.omnia_circuit.zpm": "˙ʇınɔɹıƆ WԀZ ʎuɐ sɐ sʞɹoM9§", + "cosmiccore.recipe.asteroid_weight_greater_1": "spıoɹǝʇsⱯ ɹǝbɹɐꞀ ɯoɹɟ\nspןǝıʎ ɹǝʇɐǝɹ⅁", + "cosmiccore.recipe.condition.linked_partner.formed": "ǝɹnʇɔnɹʇs pıןɐʌ ɥʇıʍ )s(ɹǝuʇɹɐd pǝʞuıן %s sǝɹınbǝᴚ", + "cosmiccore.recipe.condition.linked_partner.tooltip": ")s(ɹǝuʇɹɐd pǝʞuıן %s sǝɹınbǝᴚ", + "cosmiccore.recipe.condition.linked_partner.working": "buıʞɹoʍ ʎןǝʌıʇɔɐ )s(ɹǝuʇɹɐd pǝʞuıן %s sǝɹınbǝᴚ", + "cosmiccore.recipe.condition.linked_partner_dimension.tooltip": "%s uı ɹǝuʇɹɐd pǝʞuıן sǝɹınbǝᴚ", + "cosmiccore.recipe.condition.linked_partner_dimension_fluid.tooltip": "%s uı ɹǝuʇɹɐd uı %s ᗺɯ%s sǝɹınbǝᴚ", + "cosmiccore.recipe.condition.linked_partner_dimension_item.tooltip": "%s uı ɹǝuʇɹɐd uı %s x%s sǝɹınbǝᴚ", "cosmiccore.recipe.condition.titan.tooltip": "%s :ɹǝı⟘ ɹoʇɔɐǝᴚ uɐʇı⟘ sǝɹınbǝᴚ", "cosmiccore.recipe.ember_in": "%s :ʇnduI ɹǝqɯƎ", "cosmiccore.recipe.ember_out": "%s :ʇndʇnO ɹǝqɯƎ", @@ -425,11 +735,266 @@ "cosmiccore.recipe.soul_out": "%s :ʇndʇnO ןnoS", "cosmiccore.recipe.sterile_in": "%s %s :ɹǝzıןıɹǝʇS", "cosmiccore.recipe.sterile_out": "¿ᴚOᴚᴚƎ", + "cosmiccore.recipe.waiting_for_partner": "ɹǝuʇɹɐd pǝʞuıן ɹoɟ buıʇıɐM", + "cosmiccore.roaster.desc": "pǝpnןɔuı ʇou sʍoןןɐɯɥsɹɐW", "cosmiccore.rune_emotion_weak.1": "˙pǝʌɹǝsqo sı uoıʇɔɐǝɹ ⱯᴚƎ ǝʇǝןdɯoɔuı uⱯo§ㄥ§", "cosmiccore.rune_emotion_weak.2": "˙ǝʇɐɹqıʌ oʇ ǝʇɐןs ǝɥʇ ǝsnɐɔ suoıʇɔɐǝɹ ןɐɔıɯǝɥɔ puɐ ןɐuoıʇoɯǝ buoɹʇSo§ㄥ§", "cosmiccore.rune_vague": "˙buıssıɯ ǝq oʇ ɯǝǝs suoıʇoɯǝ ʇuǝʇɐꞀo§ㄥ§", + "cosmiccore.stellar.branch.collapse": "ǝsdɐןןoƆ", + "cosmiccore.stellar.branch.fusion": "uoısnℲ", + "cosmiccore.stellar.branch.ignition": "uoıʇıubI", + "cosmiccore.stellar.branch.void": "pıoΛ", + "cosmiccore.stellar.context.blackhole_line1": "pǝuıɐʇuoɔ ʎʇıɹɐןnbuıS", + "cosmiccore.stellar.context.blackhole_line2": "buıssǝɔoɹd ɔıʇoxƎ", + "cosmiccore.stellar.context.death_graceful_line1": "uʍopʇnɥs pǝןןoɹʇuoƆ", + "cosmiccore.stellar.context.death_graceful_line2": "˙˙˙ssǝɹboɹd uı", + "cosmiccore.stellar.context.death_line1": "Ǝᴚ∩ꞀIⱯℲ ꞀⱯƆI⟘IᴚƆ", + "cosmiccore.stellar.context.death_line2": "ᗡƎ⅁Ɐ⅁NƎ ƎS∩Ⅎ Ꞁ∩OS", + "cosmiccore.stellar.context.empty_line1": "puɐ pǝǝs ɹɐʇs ʇɹǝsuI", + "cosmiccore.stellar.context.empty_line2": "sǝsɐb ɹɐןןǝʇs ǝpıʌoɹd", + "cosmiccore.stellar.context.empty_line3": "˙uoıʇıubı uıbǝq oʇ", + "cosmiccore.stellar.context.growing_line1": "uoısnɟ ɹɐןןǝʇS", + "cosmiccore.stellar.context.growing_line2": "˙˙˙buıʇɐıʇıuı", + "cosmiccore.stellar.context.star_line1": "ǝʌıʇɔɐ uoısnɟ ǝןqɐʇS", + "cosmiccore.stellar.context.star_line2": "ǝןqɐןıɐʌɐ buıssǝɔoɹԀ", + "cosmiccore.stellar.context.superstar_line1": "ssɐɯ ןɐɔıʇıɹƆ :⅁NINᴚⱯM", + "cosmiccore.stellar.context.superstar_line2": "ʇuǝuıɯɯı ǝsdɐןןoƆ", + "cosmiccore.stellar.convergence.title": "ǝɔuǝbɹǝʌuoƆ ɹɐןןǝʇS", + "cosmiccore.stellar.ignition.breaking": "¡¡¡ ⅁NIʞⱯƎᴚᗺ ¡¡¡", + "cosmiccore.stellar.ignition.ignite": "Ǝ⟘IN⅁I", + "cosmiccore.stellar.ignition.requires_star": "ᴚⱯ⟘S ƎΛI⟘ƆⱯ SƎᴚI∩ὉƎᴚ", + "cosmiccore.stellar.module.config": "bıɟuoƆ ǝןnpoW", + "cosmiccore.stellar.module.current": "ʇuǝɹɹnƆ", + "cosmiccore.stellar.module.iris_limit": "ʇıɯıꞀ sıɹI", + "cosmiccore.stellar.module.max_eut": "ʇ/∩Ǝ xɐW", + "cosmiccore.stellar.module.not_linked": "sıɹI ɹɐןןǝʇS oʇ pǝʞuıן ʇoN", + "cosmiccore.stellar.module.parallel": "ןǝןןɐɹɐԀ", + "cosmiccore.stellar.module.parallel_max": ")%s xɐɯ( x%s", + "cosmiccore.stellar.module.speed_bonus": "snuoᗺ pǝǝdS", + "cosmiccore.stellar.module.stage": "ǝbɐʇS", + "cosmiccore.stellar.module.status": "snʇɐʇS", + "cosmiccore.stellar.module.status.disconnected": "ᗡƎ⟘ƆƎNNOƆSIᗡ", + "cosmiccore.stellar.module.status.idle": "ƎꞀᗡI", + "cosmiccore.stellar.module.status.iris_inactive": "ƎΛI⟘ƆⱯNI SIᴚI", + "cosmiccore.stellar.module.status.no_wireless": "SSƎꞀƎᴚIM ON", + "cosmiccore.stellar.module.status.offline": "ƎNIꞀℲℲO", + "cosmiccore.stellar.module.status.power_fail": "ꞀIⱯℲ ᴚƎMOԀ", + "cosmiccore.stellar.module.status.processing": "⅁NISSƎƆOᴚԀ", + "cosmiccore.stellar.module.status.ready": "ʎᗡⱯƎᴚ", + "cosmiccore.stellar.module.waiting_iris": "sıɹI ɹoɟ buıʇıɐM", + "cosmiccore.stellar.power.max_parallel": "ןǝןןɐɹɐԀ ɯnɯıxɐW", + "cosmiccore.stellar.power.title": "ןǝuɐԀ ןoɹʇuoƆ ɹǝʍoԀ", + "cosmiccore.stellar.power.voltage_per_parallel": "ןǝןןɐɹɐԀ ɹǝԀ ǝbɐʇןoΛ", + "cosmiccore.stellar.prestige.continue": "]ǝnuıʇuoɔ oʇ ǝɹǝɥʍʎuɐ ʞɔıןƆ[", + "cosmiccore.stellar.prestige.current_tier": "ᴚƎI⟘ ⟘NƎᴚᴚ∩Ɔ", + "cosmiccore.stellar.prestige.max_tier": "ᗡƎHƆⱯƎᴚ ᴚƎI⟘ W∩WIXⱯW", + "cosmiccore.stellar.prestige.next_tier": "%s ɹoɟ sʇd %s", + "cosmiccore.stellar.prestige.points_earned": "ᗡƎNᴚⱯƎ S⟘NIOԀ", + "cosmiccore.stellar.prestige.tier.apprentice": "ƎƆI⟘NƎᴚԀԀⱯ", + "cosmiccore.stellar.prestige.tier.expert": "⟘ᴚƎԀXƎ", + "cosmiccore.stellar.prestige.tier.grandmaster": "ᴚƎ⟘SⱯWᗡNⱯᴚ⅁", + "cosmiccore.stellar.prestige.tier.journeyman": "NⱯWʎƎNᴚ∩Oſ", + "cosmiccore.stellar.prestige.tier.master": "ᴚƎ⟘SⱯW", + "cosmiccore.stellar.prestige.tier.novice": "ƎƆIΛON", + "cosmiccore.stellar.prestige.tier.unknown": "NMONʞN∩", + "cosmiccore.stellar.prestige.tier_up": "¡Ԁ∩ ᴚƎI⟘", + "cosmiccore.stellar.prestige.title": "ƎƆNƎ⅁ᴚƎΛNOƆ ᴚⱯꞀꞀƎ⟘S", + "cosmiccore.stellar.prestige.total_points": "sʇuıod %s :ןɐʇo⟘", + "cosmiccore.stellar.slot.star_seed": "pǝǝS ɹɐʇS", + "cosmiccore.stellar.stage.controlled_shutdown": "NMOᗡ⟘∩HS ᗡƎꞀꞀOᴚ⟘NOƆ", + "cosmiccore.stellar.stage.critical_mass": "SSⱯW ꞀⱯƆI⟘IᴚƆ", + "cosmiccore.stellar.stage.emergency_protocols": "SꞀOƆO⟘OᴚԀ ʎƆNƎ⅁ᴚƎWƎ", + "cosmiccore.stellar.stage.initialization": "NOI⟘ⱯZIꞀⱯI⟘INI", + "cosmiccore.stellar.stage.singularity_control": "ꞀOᴚ⟘NOƆ ʎ⟘IᴚⱯꞀ∩⅁NIS", + "cosmiccore.stellar.stage.stellar_ignition": "NOI⟘IN⅁I ᴚⱯꞀꞀƎ⟘S", + "cosmiccore.stellar.stage.stellar_operations": "SNOI⟘ⱯᴚƎԀO ᴚⱯꞀꞀƎ⟘S", + "cosmiccore.stellar.upgrade.abyss_walker": "ɹǝʞןɐM ssʎqⱯ", + "cosmiccore.stellar.upgrade.abyss_walker.desc": "sǝdıɔǝɹ ɔıʇoxǝ buıʇsooq 'sǝʇɐןnɯnɔɔɐ ʎןǝʌıssɐd ʎbɹǝuǝ pıoΛ", + "cosmiccore.stellar.upgrade.annihilation_yield": "pןǝıʎ uoıʇɐןıɥıuuⱯ", + "cosmiccore.stellar.upgrade.annihilation_yield.desc": "ɹɐʇs ǝɥʇ sʎoɹʇsǝp 'sʇuıod ǝsɐq xϛ sǝʌıb ǝbıʇsǝɹd ƎꞀOH‾ʞƆⱯꞀᗺ", + "cosmiccore.stellar.upgrade.antimatter_injection": "uoıʇɔǝظuI ɹǝʇʇɐɯıʇuⱯ", + "cosmiccore.stellar.upgrade.antimatter_injection.desc": "ɹǝʇʇɐɯıʇuɐ ɥʇıʍ pǝןǝnɟ uǝɥʍ pǝǝds %00Ɩ+ ˙ןǝnɟ ɹǝʇʇɐɯıʇuɐ ʞɔoןu∩", + "cosmiccore.stellar.upgrade.available": "ʞɔoןun oʇ ʞɔıןƆ", + "cosmiccore.stellar.upgrade.cascading_collapse": "ǝsdɐןןoƆ buıpɐɔsɐƆ", + "cosmiccore.stellar.upgrade.cascading_collapse.desc": "sǝןnpoɯ pǝʇɔǝuuoɔ oʇ sʇuıod snuoq ʇuɐɹb sɹǝbbıɹʇ ǝbıʇsǝɹԀ", + "cosmiccore.stellar.upgrade.chromatic_tuning": "buıun⟘ ɔıʇɐɯoɹɥƆ", + "cosmiccore.stellar.upgrade.chromatic_tuning.desc": "sǝdıɔǝɹ ʇuǝɯǝןǝ buıɥɔʇɐɯ oʇ %ϛ+ sǝpıʌoɹd ɹoןoɔ ɹɐʇs ɯoʇsnƆ", + "cosmiccore.stellar.upgrade.core_harmonics": "sɔıuoɯɹɐH ǝɹoƆ", + "cosmiccore.stellar.upgrade.core_harmonics.desc": "uoıʇdɯnsuoɔ ןǝnɟ ןɐuoıʇıppɐ %0ᄅ-", + "cosmiccore.stellar.upgrade.corona_expansion": "uoısuɐdxƎ ɐuoɹoƆ", + "cosmiccore.stellar.upgrade.corona_expansion.desc": "pǝןqnop ǝbuɐɹ uoıʇɔǝuuoɔ ǝןnpoW", + "cosmiccore.stellar.upgrade.cosmic_tithe": "ǝɥʇı⟘ ɔıɯsoƆ", + "cosmiccore.stellar.upgrade.cosmic_tithe.desc": ")ɹǝıʇ ɹǝd uıɯ/Ɩ( sʇuıod ǝbıʇsǝɹd ǝʇɐɹǝuǝb ʎןǝʌıssɐԀ", + "cosmiccore.stellar.upgrade.cost": "sʇd %d :ʇsoƆ", + "cosmiccore.stellar.upgrade.dark_matter_lens": "suǝꞀ ɹǝʇʇɐW ʞɹɐᗡ", + "cosmiccore.stellar.upgrade.dark_matter_lens.desc": ")uıɯ/Ɩ( ɹǝʇʇɐW ʞɹɐᗡ sǝɔnpoɹd ʎןǝʌıssɐd ƎꞀOH‾ʞƆⱯꞀᗺ", + "cosmiccore.stellar.upgrade.decay_resistance": "ǝɔuɐʇsısǝᴚ ʎɐɔǝᗡ", + "cosmiccore.stellar.upgrade.decay_resistance.desc": ")sןǝʌǝן 0Ɩ xɐɯ( ןǝʌǝן ɹǝd ǝɔuɐʇsısǝɹ ʎɐɔǝp %Ɛ+", + "cosmiccore.stellar.upgrade.dual_sacrifice": "ǝɔıɟıɹɔɐS ןɐnᗡ", + "cosmiccore.stellar.upgrade.dual_sacrifice.desc": "sʇuıod xϛ˙ᄅ ɹoɟ sɯǝʇı ǝbıʇsǝɹd ᄅ ǝɯnsuoɔ uɐƆ", + "cosmiccore.stellar.upgrade.dyson_lattice": "ǝɔıʇʇɐꞀ uosʎᗡ", + "cosmiccore.stellar.upgrade.dyson_lattice.desc": ")ʇ/∩Ǝ ʞᄅƐ oʇ dn( ǝbɐʇs ɹɐʇs ɥʇıʍ sǝןɐɔs uoıʇɐɹǝuǝb ʎbɹǝuǝ ǝʌıssɐԀ", + "cosmiccore.stellar.upgrade.early_harvest": "ʇsǝʌɹɐH ʎןɹɐƎ", + "cosmiccore.stellar.upgrade.early_harvest.desc": ")sʇuıod %0ϛ( ǝbɐʇs ᴚⱯ⟘S ʇɐ ǝbıʇsǝɹd uɐƆ", + "cosmiccore.stellar.upgrade.echo_of_collapse": "ǝsdɐןןoƆ ɟo oɥɔƎ", + "cosmiccore.stellar.upgrade.echo_of_collapse.desc": "sǝʇnuıɯ ϛ ɹoɟ ʇsooq pǝǝds %0ᄅ ʎɹɐɹodɯǝʇ ɐ sʇuɐɹb ǝbıʇsǝɹԀ", + "cosmiccore.stellar.upgrade.efficient_consumption": "uoıʇdɯnsuoƆ ʇuǝıɔıɟɟƎ", + "cosmiccore.stellar.upgrade.efficient_consumption.desc": "ɯǝʇı ǝbıʇsǝɹd ǝɯnsuoɔ ʇ,usǝop ǝbıʇsǝɹd ǝɔuɐɥɔ %ϛƖ", + "cosmiccore.stellar.upgrade.eldritch_insight": "ʇɥbısuI ɥɔʇıɹpןƎ", + "cosmiccore.stellar.upgrade.eldritch_insight.desc": "uoıʇɐɹnbıɟuoɔ ɹɐʇs uo pǝsɐq sǝsnuoq ǝdıɔǝɹ uǝppıɥ sןɐǝʌǝᴚ", + "cosmiccore.stellar.upgrade.energy_optimization": "uoıʇɐzıɯıʇdO ʎbɹǝuƎ", + "cosmiccore.stellar.upgrade.energy_optimization.desc": ")sןǝʌǝן 0Ɩ xɐɯ( ןǝʌǝן ɹǝd ʇsoɔ ʎbɹǝuǝ %Ɛ-", + "cosmiccore.stellar.upgrade.entropy_engine": "ǝuıbuƎ ʎdoɹʇuƎ", + "cosmiccore.stellar.upgrade.entropy_engine.desc": "ןood ʇuıod ǝbıʇsǝɹd oʇ ǝʇnqıɹʇuoɔ sǝdıɔǝɹ pǝןıɐℲ", + "cosmiccore.stellar.upgrade.entropy_harvest": "ʇsǝʌɹɐH ʎdoɹʇuƎ", + "cosmiccore.stellar.upgrade.entropy_harvest.desc": "ǝbıʇsǝɹd ǝɹoɟǝq ǝɯıʇǝɟıן ɹɐʇs uo pǝsɐq sʇuıod snuoq uıɐ⅁", + "cosmiccore.stellar.upgrade.ergosphere_tap": "dɐ⟘ ǝɹǝɥdsobɹƎ", + "cosmiccore.stellar.upgrade.ergosphere_tap.desc": ")ǝʌıssɐd ʇ/∩Ǝ ᄅ6Ɩ8( ƎꞀOH‾ʞƆⱯꞀᗺ ɯoɹɟ ʎbɹǝuǝ ןɐuoıʇɐʇoɹ ʇɔɐɹʇxƎ", + "cosmiccore.stellar.upgrade.eternal_ember": "ɹǝqɯƎ ןɐuɹǝʇƎ", + "cosmiccore.stellar.upgrade.eternal_ember.desc": "ʎɐɔǝp ʎןןɐɹnʇɐu ɹǝʌǝu ǝbɐʇs ᴚⱯ⟘S ʇɐ sɹɐʇS", + "cosmiccore.stellar.upgrade.eternal_void": "pıoΛ ןɐuɹǝʇƎ", + "cosmiccore.stellar.upgrade.eternal_void.desc": "˙ƎꞀOH‾ʞƆⱯꞀᗺ buıʌɐǝן ɹǝʇɟɐ s0Ɛ ʇsısɹǝd sʇɔǝɟɟǝ pıoΛ ˙pǝןqnop ǝɹɐ sǝsnuoq ƎꞀOH‾ʞƆⱯꞀᗺ ןןⱯ", + "cosmiccore.stellar.upgrade.event_horizon_lock": "ʞɔoꞀ uozıɹoH ʇuǝʌƎ", + "cosmiccore.stellar.upgrade.event_horizon_lock.desc": "H⟘ⱯƎᗡ oʇ sʎɐɔǝp ɹǝʌǝu ƎꞀOH‾ʞƆⱯꞀᗺ", + "cosmiccore.stellar.upgrade.exotic_matter_tap": "dɐ⟘ ɹǝʇʇɐW ɔıʇoxƎ", + "cosmiccore.stellar.upgrade.exotic_matter_tap.desc": "sǝdıɔǝɹ buıssǝɔoɹd ɹǝʇʇɐɯ ɔıʇoxǝ ʞɔoןu∩", + "cosmiccore.stellar.upgrade.false_vacuum": "ɯnnɔɐΛ ǝsןɐℲ", + "cosmiccore.stellar.upgrade.false_vacuum.desc": "˙sǝdıɔǝɹ ɯnnɔɐΛ ǝsןɐℲ ʞɔoןu∩ ˙pǝןdıɹʇ sǝsnuoq pıoΛ ןןⱯ ˙sןǝʌɐɹun ʎʇıןɐǝᴚ", + "cosmiccore.stellar.upgrade.fuel_efficiency": "ʎɔuǝıɔıɟɟƎ ןǝnℲ", + "cosmiccore.stellar.upgrade.fuel_efficiency.desc": ")sןǝʌǝן 0Ɩ xɐɯ( ןǝʌǝן ɹǝd uoıʇdɯnsuoɔ ןǝnɟ %ᄅ-", + "cosmiccore.stellar.upgrade.fusion_catalyst": "ʇsʎןɐʇɐƆ uoısnℲ", + "cosmiccore.stellar.upgrade.fusion_catalyst.desc": "ɹǝʇsɐɟ %ϛᄅ ǝbɐʇs ʇxǝu oʇ ʍoɹb sɹɐʇS", + "cosmiccore.stellar.upgrade.fusion_overdrive": "ǝʌıɹpɹǝʌO uoısnℲ", + "cosmiccore.stellar.upgrade.fusion_overdrive.desc": "uoıʇdɯnsuoɔ ןǝnɟ %ϛᄅ+ 'pǝǝds buıssǝɔoɹd %0ϛ+", + "cosmiccore.stellar.upgrade.gravitational_mastery": "ʎɹǝʇsɐW ןɐuoıʇɐʇıʌɐɹ⅁", + "cosmiccore.stellar.upgrade.gravitational_mastery.desc": "sןǝןןɐɹɐd Ɛ+ sʇuɐɹb ǝbɐʇs ƎꞀOH‾ʞƆⱯꞀᗺ", + "cosmiccore.stellar.upgrade.graviton_lens": "suǝꞀ uoʇıʌɐɹ⅁", + "cosmiccore.stellar.upgrade.graviton_lens.desc": "ǝbɐʇs ɹɐʇs ɹǝd ןǝןןɐɹɐd Ɩ+", + "cosmiccore.stellar.upgrade.growth_catalyst": "ʇsʎןɐʇɐƆ ɥʇʍoɹ⅁", + "cosmiccore.stellar.upgrade.growth_catalyst.desc": ")sןǝʌǝן 0Ɩ xɐɯ( ןǝʌǝן ɹǝd pǝǝds ɥʇʍoɹb %Ɛ+", + "cosmiccore.stellar.upgrade.hawking_radiator": "ɹoʇɐıpɐᴚ buıʞʍɐH", + "cosmiccore.stellar.upgrade.hawking_radiator.desc": "ʎןǝʌıssɐd ʇ/∩Ǝ 8ㄣ0ᄅ sǝʇɐɹǝuǝb ƎꞀOH‾ʞƆⱯꞀᗺ", + "cosmiccore.stellar.upgrade.heat_death": "ɥʇɐǝᗡ ʇɐǝH", + "cosmiccore.stellar.upgrade.heat_death.desc": "˙ʇuɐʇsuı sı ǝbıʇsǝɹԀ ˙pǝןdıɹʇ sǝsnuoq ǝsdɐןןoƆ ןןⱯ ˙sbuıɥʇ ןןɐ ɟo puǝ ǝɥ⟘", + "cosmiccore.stellar.upgrade.helios_forge": "ǝbɹoℲ soıןǝH", + "cosmiccore.stellar.upgrade.helios_forge.desc": "suoıʇıpuoɔ ɹɐןןǝʇs ǝɯǝɹʇxǝ buıɹınbǝɹ sǝdıɔǝɹ ɹǝıʇ-soıןǝH ʞɔoןu∩", + "cosmiccore.stellar.upgrade.hyperdense_core": "ǝɹoƆ ǝsuǝpɹǝdʎH", + "cosmiccore.stellar.upgrade.hyperdense_core.desc": "sǝɔɹnos ןןɐ ɯoɹɟ ʇıɯıן ןǝןןɐɹɐd %0ϛ+", + "cosmiccore.stellar.upgrade.infinite_recursion": "uoısɹnɔǝᴚ ǝʇıuıɟuI", + "cosmiccore.stellar.upgrade.infinite_recursion.desc": "˙ɯǝʇı ǝbıʇsǝɹd dǝǝʞ oʇ ǝɔuɐɥɔ %ϛᄅ ˙sʇuıod xᄅ sǝʌıb ǝbıʇsǝɹԀ", + "cosmiccore.stellar.upgrade.kerr_extraction": "uoıʇɔɐɹʇxƎ ɹɹǝʞ", + "cosmiccore.stellar.upgrade.kerr_extraction.desc": "sʇɔnpoɹdʎq ɔıʇoxǝ puɐ sןǝןןɐɹɐd 9+ sʇuɐɹb ƎꞀOH‾ʞƆⱯꞀᗺ buıuuıdS", + "cosmiccore.stellar.upgrade.level": "%d / %d ןǝʌǝꞀ", + "cosmiccore.stellar.upgrade.locked": "pǝʞɔoꞀ", + "cosmiccore.stellar.upgrade.magnetic_confinement": "ʇuǝɯǝuıɟuoƆ ɔıʇǝubɐW", + "cosmiccore.stellar.upgrade.magnetic_confinement.desc": "buıssǝɔoɹd ǝʌıʇɔɐ buıɹnp doɹp ʇouuɐɔ ǝbɐʇs ɹɐʇS", + "cosmiccore.stellar.upgrade.mass_conversion": "uoısɹǝʌuoƆ ssɐW", + "cosmiccore.stellar.upgrade.mass_conversion.desc": ")oıʇɐɹ Ɩ:000Ɩ( sʇuıod ǝbıʇsǝɹd oʇuı sןɐıɹǝʇɐɯ ssǝɔxǝ ʇɹǝʌuoƆ", + "cosmiccore.stellar.upgrade.mass_efficiency": "ʎɔuǝıɔıɟɟƎ ssɐW", + "cosmiccore.stellar.upgrade.mass_efficiency.desc": "ʇsoɔ ʎbɹǝuǝ ןɐuoıʇıppɐ %ϛƖ-", + "cosmiccore.stellar.upgrade.max_level": "ꞀƎΛƎꞀ XⱯW", + "cosmiccore.stellar.upgrade.negative_mass": "ssɐW ǝʌıʇɐbǝN", + "cosmiccore.stellar.upgrade.negative_mass.desc": ")∩Ǝ uıɐb( sʇsoɔ ʎbɹǝuǝ pǝʇɹǝʌuı ǝʌɐɥ ƎꞀOH‾ʞƆⱯꞀᗺ uı sǝdıɔǝᴚ", + "cosmiccore.stellar.upgrade.neutron_cascade": "ǝpɐɔsɐƆ uoɹʇnǝN", + "cosmiccore.stellar.upgrade.neutron_cascade.desc": "ǝɔıʍʇ ɹǝbbıɹʇ oʇ ǝɔuɐɥɔ %ϛƖ ǝʌɐɥ suoıʇǝןdɯoɔ ǝdıɔǝᴚ", + "cosmiccore.stellar.upgrade.not_enough_points": "sʇuıod ɥbnouǝ ʇoN", + "cosmiccore.stellar.upgrade.omega_compression": "uoıssǝɹdɯoƆ ɐbǝɯO", + "cosmiccore.stellar.upgrade.omega_compression.desc": "˙sǝdıɔǝɹ ɐbǝɯO ʞɔoןu∩ ˙pǝןdıɹʇ sǝsnuoq uoısnℲ ןןⱯ ˙buıssǝɔoɹd ǝʇɐɯıʇן∩", + "cosmiccore.stellar.upgrade.owned": "ᗡƎNMO", + "cosmiccore.stellar.upgrade.parallel_manifold": "pןoɟıuɐW ןǝןןɐɹɐԀ", + "cosmiccore.stellar.upgrade.parallel_manifold.desc": "ʇıɯıן ןǝןןɐɹɐd ǝsɐq ᄅ+", + "cosmiccore.stellar.upgrade.parallel_threading": "buıpɐǝɹɥ⟘ ןǝןןɐɹɐԀ", + "cosmiccore.stellar.upgrade.parallel_threading.desc": ")sןǝʌǝן 8 xɐɯ( ןǝʌǝן ɹǝd ןǝןןɐɹɐd Ɩ+", + "cosmiccore.stellar.upgrade.particle_storm": "ɯɹoʇS ǝןɔıʇɹɐԀ", + "cosmiccore.stellar.upgrade.particle_storm.desc": "sǝdıɔǝɹ ɯɹoʇs ǝןɔıʇɹɐd sʞɔoןun 'sןǝןןɐɹɐd ǝsɐq ㄣ+", + "cosmiccore.stellar.upgrade.penrose_process": "ssǝɔoɹԀ ǝsoɹuǝԀ", + "cosmiccore.stellar.upgrade.penrose_process.desc": "ǝnןɐʌ ʎbɹǝuǝ sʇı ɟo %0ƐƖ ʇɔɐɹʇxǝ oʇ ƎꞀOH‾ʞƆⱯꞀᗺ oʇuı ɹǝʇʇɐɯ ʍoɹɥ⟘", + "cosmiccore.stellar.upgrade.perpetual_ignition": "uoıʇıubI ןɐnʇǝdɹǝԀ", + "cosmiccore.stellar.upgrade.perpetual_ignition.desc": "˙pǝʌןɐɥ sʇsoɔ ןǝnℲ ˙ʎɐɔǝp oʇ ǝunɯɯı ǝɹɐ sɹɐʇS", + "cosmiccore.stellar.upgrade.phoenix_protocol": "ןoɔoʇoɹԀ xıuǝoɥԀ", + "cosmiccore.stellar.upgrade.phoenix_protocol.desc": "pɐǝʇsuı ǝbɐʇs ᴚⱯ⟘S oʇ uɹnʇǝɹ oʇ ǝɔuɐɥɔ %ϛᄅ 'ǝıp pןnoʍ ɹɐʇs uǝɥM", + "cosmiccore.stellar.upgrade.photon_sphere": "ǝɹǝɥdS uoʇoɥԀ", + "cosmiccore.stellar.upgrade.photon_sphere.desc": "ƎꞀOH‾ʞƆⱯꞀᗺ uı pǝǝds %00ᄅ+ ʇǝb sǝdıɔǝɹ pǝsɐq-ʇɥbıꞀ", + "cosmiccore.stellar.upgrade.planck_resonance": "ǝɔuɐuosǝᴚ ʞɔuɐןԀ", + "cosmiccore.stellar.upgrade.planck_resonance.desc": "ʞɔıʇ Ɩ oʇ pǝɔnpǝɹ ǝɯıʇ ǝdıɔǝɹ ɯnɯıuıW", + "cosmiccore.stellar.upgrade.plasma_conduits": "sʇınpuoƆ ɐɯsɐןԀ", + "cosmiccore.stellar.upgrade.plasma_conduits.desc": "ʞɔıʇ ɹǝd uoıʇdɯnsuoɔ ןǝnɟ %0Ɩ-", + "cosmiccore.stellar.upgrade.plasma_hurricane": "ǝuɐɔıɹɹnH ɐɯsɐןԀ", + "cosmiccore.stellar.upgrade.plasma_hurricane.desc": "%0ㄣ ʎq pǝsɐǝɹɔuı pǝǝds ɥʇʍoɹb ɹɐʇS", + "cosmiccore.stellar.upgrade.point_amplifier": "ɹǝıɟıןdɯⱯ ʇuıoԀ", + "cosmiccore.stellar.upgrade.point_amplifier.desc": ")ɹoʇɔǝןןoƆ pɹɐɥS ɥʇıʍ sʞɔɐʇs( sʇuıod ǝbıʇsǝɹd %0Ɛ+", + "cosmiccore.stellar.upgrade.prereqs_needed": "pǝpǝǝu sǝʇısınbǝɹǝɹԀ", + "cosmiccore.stellar.upgrade.prestige_amplifier": "ɹǝıɟıןdɯⱯ ǝbıʇsǝɹԀ", + "cosmiccore.stellar.upgrade.prestige_amplifier.desc": ")sןǝʌǝן 0Ɩ xɐɯ( ןǝʌǝן ɹǝd sʇuıod ǝbıʇsǝɹd %ϛ+", + "cosmiccore.stellar.upgrade.prestige_momentum": "ɯnʇuǝɯoW ǝbıʇsǝɹԀ", + "cosmiccore.stellar.upgrade.prestige_momentum.desc": ")%0ϛ xɐɯ( sʇuıod %0Ɩ+ sǝʌıb ǝbıʇsǝɹd ǝʌıʇnɔǝsuoɔ ɥɔɐƎ", + "cosmiccore.stellar.upgrade.primordial_flame": "ǝɯɐןℲ ןɐıpɹoɯıɹԀ", + "cosmiccore.stellar.upgrade.primordial_flame.desc": "˙ǝıp ʇouuɐɔ sɹɐʇS ˙pǝןqnop sǝsnuoq uoıʇıubI ןןⱯ ˙ǝɹıɟ ʇsɹıɟ ǝɥ⟘", + "cosmiccore.stellar.upgrade.proton_recycler": "ɹǝןɔʎɔǝᴚ uoʇoɹԀ", + "cosmiccore.stellar.upgrade.proton_recycler.desc": "ʞɔıʇ uo ןǝnɟ ǝɯnsuoɔ ʇou oʇ ǝɔuɐɥɔ %8", + "cosmiccore.stellar.upgrade.quantum_tunneling": "buıןǝuun⟘ ɯnʇuɐnὉ", + "cosmiccore.stellar.upgrade.quantum_tunneling.desc": "ʎןʇuɐʇsuı ǝdıɔǝɹ ǝʇǝןdɯoɔ oʇ ǝɔuɐɥɔ %0Ɩ", + "cosmiccore.stellar.upgrade.quark_gluon_plasma": "ɐɯsɐןԀ uonן⅁-ʞɹɐnὉ", + "cosmiccore.stellar.upgrade.quark_gluon_plasma.desc": "ʎןuo sǝdıɔǝɹ Ԁ⅁Ὁ ɹoɟ sןǝןןɐɹɐd 8+ ˙sǝdıɔǝɹ Ԁ⅁Ὁ ʞɔoןu∩", + "cosmiccore.stellar.upgrade.relativistic_processing": "buıssǝɔoɹԀ ɔıʇsıʌıʇɐןǝᴚ", + "cosmiccore.stellar.upgrade.relativistic_processing.desc": "ʎןʇuɐʇsuı ǝʇǝןdɯoɔ sʞɔıʇ 0ᄅ ɹǝpun sǝdıɔǝᴚ", + "cosmiccore.stellar.upgrade.resonant_sacrifice": "ǝɔıɟıɹɔɐS ʇuɐuosǝᴚ", + "cosmiccore.stellar.upgrade.resonant_sacrifice.desc": "spɹɐʍǝɹ ƎꞀOH‾ʞƆⱯꞀᗺ sǝʌıb ᴚⱯ⟘SᴚƎԀ∩S ʇɐ ǝbıʇsǝɹԀ", + "cosmiccore.stellar.upgrade.sacrifice_amplifier": "ɹǝıɟıןdɯⱯ ǝɔıɟıɹɔɐS", + "cosmiccore.stellar.upgrade.sacrifice_amplifier.desc": "pǝɯnsuoɔ sʎɐʍןɐ ǝɹɐ ʇnq sʇuıod xㄣ ǝʌıb sɯǝʇı ǝbıʇsǝɹԀ", + "cosmiccore.stellar.upgrade.schwarzschild_radius": "snıpɐᴚ pןıɥɔszɹɐʍɥɔS", + "cosmiccore.stellar.upgrade.schwarzschild_radius.desc": "ʎןsnoǝuɐʇןnɯıs ssǝɔoɹd uɐɔ sɯǝʇı ǝɹoɯ - uozıɹoɥ ʇuǝʌǝ ƎꞀOH‾ʞƆⱯꞀᗺ ǝsɐǝɹɔuI", + "cosmiccore.stellar.upgrade.shard_collector": "ɹoʇɔǝןןoƆ pɹɐɥS", + "cosmiccore.stellar.upgrade.shard_collector.desc": "pǝuɹɐǝ sʇuıod ǝbıʇsǝɹd %0ᄅ+", + "cosmiccore.stellar.upgrade.singularity_engine": "ǝuıbuƎ ʎʇıɹɐןnbuıS", + "cosmiccore.stellar.upgrade.singularity_engine.desc": "˙%0ㄣ- sʇsoɔ ʎbɹǝuƎ ˙sǝsnuoq ןǝןןɐɹɐd/pǝǝds ןןɐ ǝןqnoᗡ", + "cosmiccore.stellar.upgrade.singularity_siphon": "uoɥdıS ʎʇıɹɐןnbuıS", + "cosmiccore.stellar.upgrade.singularity_siphon.desc": "%0ᄅ ʎq ʇsoɔ ʎbɹǝuǝ ǝdıɔǝɹ sǝɔnpǝɹ ǝbɐʇs ƎꞀOH‾ʞƆⱯꞀᗺ", + "cosmiccore.stellar.upgrade.solar_dominion": "uoıuıɯoᗡ ɹɐןoS", + "cosmiccore.stellar.upgrade.solar_dominion.desc": "%0ϛ ʎq pǝsɐǝɹɔuı sǝsnuoq ǝןɔʎɔǝɟıן ɹɐʇs ןןⱯ", + "cosmiccore.stellar.upgrade.solar_genesis": "sısǝuǝ⅁ ɹɐןoS", + "cosmiccore.stellar.upgrade.solar_genesis.desc": "sןǝןןɐɹɐd snuoq ǝpıʌoɹd ʇɐɥʇ sɹɐʇs-oɹɔıɯ ʎɹɐpuoɔǝs uʍɐds uɐƆ", + "cosmiccore.stellar.upgrade.stellar_compression": "uoıssǝɹdɯoƆ ɹɐןןǝʇS", + "cosmiccore.stellar.upgrade.stellar_compression.desc": "ɹǝɥbıɥ ɹo ᴚⱯ⟘SᴚƎԀ∩S ʇɐ pǝǝds %ϛᄅ+", + "cosmiccore.stellar.upgrade.stellar_debt": "ʇqǝᗡ ɹɐןןǝʇS", + "cosmiccore.stellar.upgrade.stellar_debt.desc": ")ʞɔɐqʎɐd %0ϛƖ( sǝbıʇsǝɹd ǝɹnʇnɟ ɯoɹɟ sʇuıod ǝbıʇsǝɹd ʍoɹɹoᗺ", + "cosmiccore.stellar.upgrade.stellar_efficiency": "ʎɔuǝıɔıɟɟƎ ɹɐןןǝʇS", + "cosmiccore.stellar.upgrade.stellar_efficiency.desc": ")sןǝʌǝן 0Ɩ xɐɯ( ןǝʌǝן ɹǝd pǝǝds %ᄅ+", + "cosmiccore.stellar.upgrade.stellar_nursery": "ʎɹǝsɹnN ɹɐןןǝʇS", + "cosmiccore.stellar.upgrade.stellar_nursery.desc": "ʎ⟘ԀWƎ ɟo pɐǝʇsuı ǝbɐʇs ⅁NIMOᴚ⅁ ʇɐ uıbǝq sɹɐʇs ʍǝN", + "cosmiccore.stellar.upgrade.stellar_regeneration": "uoıʇɐɹǝuǝbǝᴚ ɹɐןןǝʇS", + "cosmiccore.stellar.upgrade.stellar_regeneration.desc": "ǝbɐʇs uıɐb oʇ ɹɐʇs ɹoɟ ʞɔıʇ ɹǝd ǝɔuɐɥɔ %Ɛ", + "cosmiccore.stellar.upgrade.subspace_harmonics": "sɔıuoɯɹɐH ǝɔɐdsqnS", + "cosmiccore.stellar.upgrade.subspace_harmonics.desc": "uoıʇɐɹnp ǝdıɔǝɹ ɥʇıʍ ʎןǝsɹǝʌuı ǝןɐɔs sʇsoɔ ʎbɹǝuƎ", + "cosmiccore.stellar.upgrade.superconducting_grid": "pıɹ⅁ buıʇɔnpuoɔɹǝdnS", + "cosmiccore.stellar.upgrade.superconducting_grid.desc": "sǝdıɔǝɹ ןןɐ ɹoɟ ʇsoɔ ʎbɹǝuǝ %0Ɩ-", + "cosmiccore.stellar.upgrade.supernova_core": "ǝɹoƆ ɐʌouɹǝdnS", + "cosmiccore.stellar.upgrade.supernova_core.desc": "ʎןǝʌıssɐd spɹɐɥs ǝbıʇsǝɹd snuoq ǝʇɐɹǝuǝb +ᴚⱯ⟘SᴚƎԀ∩S ʇɐ sɹɐʇS", + "cosmiccore.stellar.upgrade.tachyon_weave": "ǝʌɐǝM uoʎɥɔɐ⟘", + "cosmiccore.stellar.upgrade.tachyon_weave.desc": "ʎןǝʌıʇıppɐ sʞɔɐʇs 'pǝǝds buıssǝɔoɹd %0Ɛ+", + "cosmiccore.stellar.upgrade.temporal_acceleration": "uoıʇɐɹǝןǝɔɔⱯ ןɐɹodɯǝ⟘", + "cosmiccore.stellar.upgrade.temporal_acceleration.desc": "pǝǝds buıssǝɔoɹd %ϛƖ+", + "cosmiccore.stellar.upgrade.temporal_echo": "oɥɔƎ ןɐɹodɯǝ⟘", + "cosmiccore.stellar.upgrade.temporal_echo.desc": "ǝnןɐʌ xƐ ɹoɟ ǝɔuo ʇɐ ןןɐ ǝsɐǝןǝɹ 'sǝbɹɐɥɔ ǝbıʇsǝɹd Ɛ oʇ dn ǝɹoʇS", + "cosmiccore.stellar.upgrade.thermal_stabilizer": "ɹǝzıןıqɐʇS ןɐɯɹǝɥ⟘", + "cosmiccore.stellar.upgrade.thermal_stabilizer.desc": "ɹǝʍoןs %ϛƖ ʎɐɔǝp sɹɐʇS", + "cosmiccore.stellar.upgrade.tier_locked": "ʍoן ooʇ ɹǝı⟘", + "cosmiccore.stellar.upgrade.tier_required": "%d ɹǝı⟘ sǝɹınbǝᴚ", + "cosmiccore.stellar.upgrade.vacuum_decay": "ʎɐɔǝᗡ ɯnnɔɐΛ", + "cosmiccore.stellar.upgrade.vacuum_decay.desc": "ʇndʇno x0Ɩ ɹoɟ sɯǝʇı ʇnduı pıoʌ oʇ ǝɔuɐɥƆ", + "cosmiccore.stellar.upgrade.void_attunement": "ʇuǝɯǝunʇʇⱯ pıoΛ", + "cosmiccore.stellar.upgrade.void_attunement.desc": ")sןǝʌǝן 0Ɩ xɐɯ( ןǝʌǝן ɹǝd sʇɔǝɟɟǝ pıoʌ ɯoɹɟ snuoq %ᄅ+", + "cosmiccore.stellar.upgrade.void_harvester": "ɹǝʇsǝʌɹɐH pıoΛ", + "cosmiccore.stellar.upgrade.void_harvester.desc": "sʇuıod ǝsɐq xƐ sǝʌıb ǝbıʇsǝɹd ƎꞀOH‾ʞƆⱯꞀᗺ", + "cosmiccore.stellar.upgrade.void_whispers": "sɹǝdsıɥM pıoΛ", + "cosmiccore.stellar.upgrade.void_whispers.desc": "snuoq pǝǝds %0ϛ+ sǝpıʌoɹd ǝbɐʇs ƎꞀOH‾ʞƆⱯꞀᗺ", + "cosmiccore.stellar.upgrade.warp_field_matrix": "xıɹʇɐW pןǝıℲ dɹɐM", + "cosmiccore.stellar.upgrade.warp_field_matrix.desc": ")pǝpǝǝu ʇɹodsuɐɹʇ ou( sǝsnq ʇndʇno oʇ ʎןʇɔǝɹıp ʇɹodǝןǝʇ sɯǝʇI", + "cosmiccore.stellar.upgrade.zero_point_tap": "dɐ⟘ ʇuıoԀ oɹǝZ", + "cosmiccore.stellar.upgrade.zero_point_tap.desc": "uoıʇǝןdɯoɔ ǝdıɔǝɹ ɹǝʇɟɐ pǝpunɟǝɹ sı ʇsoɔ ʎbɹǝuǝ ɟo %ϛ", "cosmiccore.tenura.1": "ןoɹʇuoƆ - uǝ⟘9§", "cosmiccore.tenura.2": "ʍoןℲ - ɐɹ∩9§", + "cosmiccore.thermomagnitizer.desc": "buoɹʍ ob pןnoɔ ʇɐɥʍ 'sʇǝubɐW puɐ buıʇɐǝH", "cosmiccore.tylomir.1": "uoıʇɐɯɹoℲ - oןʎ⟘9§", "cosmiccore.tylomir.2": "pןɹoM - ɹıW9§", "cosmiccore.universal.boosting_agents.0": "ɹǝıןdıʇןnɯ ʇ/∩Ǝ ǝsɐǝɹɔuı oʇ sɹǝʇsooq snoıɹɐʌ ǝɯnsuoɔ uɐƆɐ§", @@ -441,6 +1006,7 @@ "cosmiccore.universal.tooltip.lube_info.1": "ɹɥ/qɯ000Ɩ @ ןɐʇoʇ ∩Ǝɟ§ xƖɔ§ :ɟ§ʇuɐɔıɹqnꞀǝ§", "cosmiccore.universal.tooltip.lube_info.2": "ɹɥ/qɯ00ϛ @ ןɐʇoʇ ∩Ǝɟ§ xϛ˙Ɩɔ§ :ɟ§ʇuɐɔıɹqnꞀ ʌpⱯǝ§", "cosmiccore.universal.tooltip.lube_info.3": "ɹɥ/qɯ0ϛᄅ @ ןɐʇoʇ ∩Ǝɟ§ xᄅɔ§ :ɟ§ǝsɹǝʌıu∩ ǝɥʇ ɟo sɹɐǝ⟘ǝ§", + "cosmiccore.vaccum_bubbler.desc": "uoıʇɐuıɥɔɐW uoıʇɐʇS uoıʇɐʇɐoןℲ", "cosmiccore.valdris.1": "ɯןǝɥʍɹǝʌO - ןɐΛ9§", "cosmiccore.valdris.2": "ʇɔǝuuoƆ - sıɹᗡ9§", "cosmiccore.wire_coil.eu_multiplier": "ʇ/∩Ǝ %sɔ§ :ʇsoƆ ∩Ǝ ʇǝubɐWɐ§ ", @@ -457,6 +1023,7 @@ "cosmiccore.zelothar.2": "ǝbɹoℲ - ɹɐɥ⟘9§", "debug.owner.uuid": "%s ɐ§:ᗡI∩∩ ɹǝuʍOɐ§", "debug.team.uuid": "%s ɐ§:ᗡI∩∩ ɯɐǝ⟘ɐ§", + "emi.category.cosmiccore.asteroid_mining": "suoıʇɐɹǝdO buıuıW pıoɹǝʇsⱯ", "gtceu.hellfire_foundry": "ʎɹpunoℲ ǝɹıɟןןǝHɔ§", "gtceu.industrial_chemvat": "ʇɐʌɯǝɥƆ ןɐıɹʇsnpuIɐ§", "gtceu.machine.dec.tooltip.0": "˙ʇǝʞɔod ןɐuoısuǝɯıpɹǝʇuı uɐ uı ɹǝʍod sǝɹoʇS", @@ -471,6 +1038,10 @@ "gui.cosmiccore.ember_hatch.ember": "%s :pǝɹoʇS ɹǝqɯƎ", "gui.cosmiccore.ember_hatch.label.export": "ɥɔʇɐH ʇndʇnO ɹǝqɯƎ", "gui.cosmiccore.ember_hatch.label.import": "ɥɔʇɐH ʇnduI ɹǝqɯƎ", + "gui.cosmiccore.iapiary": "ʎɹɐıdⱯ ןɐıɹʇsnpuI", + "gui.cosmiccore.iapiary.duration": "%d :uoıʇɐɹnᗡ", + "gui.cosmiccore.iapiary.production_amp": "%d :dɯⱯ uoıʇɔnpoɹԀ", + "gui.cosmiccore.iapiary.yield": "%d :pןǝıʎ", "gui.cosmiccore.soul_hatch.label.export": "ɥɔʇɐH ʇndʇnO ןnoS", "gui.cosmiccore.soul_hatch.label.import": "ɥɔʇɐH ʇnduI ןnoS", "gui.cosmiccore.soul_hatch.lp": "%s :pǝɹoʇS ԀꞀ", @@ -480,7 +1051,10 @@ "gui.cosmiccore.thermia_hatch.label.export": "ʇuǝΛ ʇndʇnO ɐıɯɹǝɥ⟘9§", "gui.cosmiccore.thermia_hatch.label.import": "ʇǝʞɔoS ʇnduI ɐıɯɹǝɥ⟘9§", "gui.cosmiccore.thermia_hatch.stored_temp": ":dɯǝ⟘ ʇuǝɹɹnƆ9§", + "item.cosmicbees.bee.modifier.aging_multiplier": "ɹǝıןdıʇןnW ǝbⱯ", "item.cosmiccore.aberrant_essence": "ǝɔuǝssƎ ʇuɐɹɹǝqⱯ9§", + "item.cosmiccore.abrasive_rosin_millstones": "sǝuoʇsןןıW uısoᴚ ǝʌısɐɹqⱯ", + "item.cosmiccore.advanced_gene_kit": "ʇıʞ ǝuǝ⅁ pǝɔuɐʌpⱯ", "item.cosmiccore.akashic_processor": "ɹossǝɔoɹԀ ɔıɥsɐʞⱯ", "item.cosmiccore.akashic_processor_assembly": "ʎןqɯǝssⱯ ɹossǝɔoɹԀ ɔıɥsɐʞⱯ", "item.cosmiccore.akashic_processor_mainframe": "ǝɯɐɹɟuıɐW ɹossǝɔoɹԀ ɔıɥsɐʞⱯ", @@ -489,14 +1063,70 @@ "item.cosmiccore.ambrion": "]uoıɹqɯⱯ[ - ןıxǝΛ", "item.cosmiccore.aram_chip": "dıɥƆ WⱯᴚⱯ", "item.cosmiccore.aram_wafer": "ɹǝɟɐM WⱯᴚⱯ", + "item.cosmiccore.armored_freight_beetle_grade_1": "Ɩ˙ʞW ǝןʇǝǝᗺ ʇɥbıǝɹℲ pǝɹoɯɹⱯ", + "item.cosmiccore.armored_freight_beetle_grade_2": "ᄅ˙ʞW ǝןʇǝǝᗺ ʇɥbıǝɹℲ pǝɹoɯɹⱯ", + "item.cosmiccore.armored_freight_beetle_grade_3": "Ɛ˙ʞW ǝןʇǝǝᗺ ʇɥbıǝɹℲ pǝɹoɯɹⱯ", + "item.cosmiccore.armored_freight_beetle_grade_4": "ㄣ˙ʞW ǝןʇǝǝᗺ ʇɥbıǝɹℲ pǝɹoɯɹⱯ", + "item.cosmiccore.armored_freight_beetle_grade_5": "ϛ˙ʞW ǝןʇǝǝᗺ ʇɥbıǝɹℲ pǝɹoɯɹⱯ", "item.cosmiccore.asc_blood_orb": "qɹO pooןᗺ ʇuɐpuǝɔsⱯ", + "item.cosmiccore.asteroid_targeting_chip": "dıɥƆ buıʇǝbɹɐ⟘ pıoɹǝʇsⱯ", + "item.cosmiccore.auric_asteroid": "pıoɹǝʇsⱯ ɔıɹnⱯ", + "item.cosmiccore.basic_gene_kit": "ʇıʞ ǝuǝ⅁ ɔısɐᗺ", + "item.cosmiccore.bee_comb_abrasive": "qɯoƆ ǝʌısɐɹqⱯ", + "item.cosmiccore.bee_comb_absent": "qɯoƆ ʇuǝsqⱯ", + "item.cosmiccore.bee_comb_ambrosic": "qɯoƆ ɔısoɹqɯⱯ", + "item.cosmiccore.bee_comb_architect": "qɯoƆ ʇɔǝʇıɥɔɹⱯ", + "item.cosmiccore.bee_comb_ashen": "qɯoƆ uǝɥsⱯ", + "item.cosmiccore.bee_comb_biohazard": "qɯoƆ pɹɐzɐɥoıᗺ", + "item.cosmiccore.bee_comb_citrus_polymer": "qɯoƆ ɹǝɯʎןoԀ snɹʇıƆ", + "item.cosmiccore.bee_comb_cobbled": "qɯoƆ pǝןqqoƆ", + "item.cosmiccore.bee_comb_constructive": "qɯoƆ ǝʌıʇɔnɹʇsuoƆ", + "item.cosmiccore.bee_comb_cosmos": "qɯoƆ soɯsoƆ", + "item.cosmiccore.bee_comb_energized": "qɯoƆ pǝzıbɹǝuƎ", + "item.cosmiccore.bee_comb_exhaustive": "qɯoƆ ǝʌıʇsnɐɥxƎ", + "item.cosmiccore.bee_comb_fate": "qɯoƆ ǝʇɐℲ", + "item.cosmiccore.bee_comb_fracking": "qɯoƆ buıʞɔɐɹℲ", + "item.cosmiccore.bee_comb_grand_garden": "qɯoƆ uǝpɹɐ⅁ puɐɹ⅁", + "item.cosmiccore.bee_comb_hadal": "qɯoƆ ןɐpɐH", + "item.cosmiccore.bee_comb_hellsmith": "qɯoƆ ɥʇıɯsןןǝH", + "item.cosmiccore.bee_comb_hydraulic": "qɯoƆ ɔıןnɐɹpʎH", + "item.cosmiccore.bee_comb_illusive": "qɯoƆ ǝʌısnןןI", + "item.cosmiccore.bee_comb_inquisitive": "qɯoƆ ǝʌıʇısınbuI", + "item.cosmiccore.bee_comb_lofty_argon": "qɯoƆ uobɹⱯ ʎʇɟoꞀ", + "item.cosmiccore.bee_comb_lofty_hydrogen": "qɯoƆ uǝboɹpʎH ʎʇɟoꞀ", + "item.cosmiccore.bee_comb_lofty_nitrogen": "qɯoƆ uǝboɹʇıN ʎʇɟoꞀ", + "item.cosmiccore.bee_comb_lofty_oxygen": "qɯoƆ uǝbʎxO ʎʇɟoꞀ", + "item.cosmiccore.bee_comb_lunar": "qɯoƆ ɹɐunꞀ", + "item.cosmiccore.bee_comb_pale": "qɯoƆ ǝןɐԀ", + "item.cosmiccore.bee_comb_prismatic": "qɯoƆ ɔıʇɐɯsıɹԀ", + "item.cosmiccore.bee_comb_pyrolytic": "qɯoƆ ɔıʇʎןoɹʎԀ", + "item.cosmiccore.bee_comb_radoxia": "qɯoƆ ɐıxopɐᴚ", + "item.cosmiccore.bee_comb_rose_polymer": "qɯoƆ ɹǝɯʎןoԀ ǝsoᴚ", + "item.cosmiccore.bee_comb_runic": "qɯoƆ ɔıunᴚ", + "item.cosmiccore.bee_comb_shaman": "qɯoƆ uɐɯɐɥS", + "item.cosmiccore.bee_comb_slick": "qɯoƆ ʞɔıןS", + "item.cosmiccore.bee_comb_solar": "qɯoƆ ɹɐןoS", + "item.cosmiccore.bee_comb_soul": "qɯoƆ ןnoS", + "item.cosmiccore.bee_comb_virtue": "qɯoƆ ǝnʇɹıΛ", + "item.cosmiccore.bee_comb_waxy_polymer": "qɯoƆ ɹǝɯʎןoԀ ʎxɐM", "item.cosmiccore.bifidobacterium_breve": "ǝʌǝɹᗺ ɯnıɹǝʇɔɐqopıɟıᗺ", "item.cosmiccore.bifidobacterium_breve_culture": "ǝɹnʇןnƆ ǝʌǝɹᗺ ɯnıɹǝʇɔɐqopıɟıᗺ", + "item.cosmiccore.bitumen_wax": "xɐM uǝɯnʇıᗺ", "item.cosmiccore.blackstone_pustule": "ǝןnʇsnԀ ǝuoʇsʞɔɐןᗺ", + "item.cosmiccore.brimstone_asteroid": "pıoɹǝʇsⱯ ǝuoʇsɯıɹᗺ", + "item.cosmiccore.bronze_supply_tank": "ʞuɐ⟘ ʎןddnS ǝzuoɹᗺ", + "item.cosmiccore.capacity_chip": "dıɥƆ ʎʇıɔɐdɐƆ", + "item.cosmiccore.carbon_asteroid_base": "pıoɹǝʇsⱯ ɔıuoqɹɐƆ", "item.cosmiccore.chronia": "]ɐıuoɹɥƆ[ - ןıxǝΛ", "item.cosmiccore.cluster_of_perpetuity": "ʎʇınʇǝdɹǝԀ ɟo ɹǝʇsnןƆ", "item.cosmiccore.computation_support_unit": "ʇıu∩ ʇɹoddnS uoıʇɐʇndɯoƆ", "item.cosmiccore.contaminated_petri_dish": "ɥsıᗡ ıɹʇǝԀ pǝʇɐuıɯɐʇuoƆ", + "item.cosmiccore.crucible_mantis_grade_1": "Ɩ˙ʞW sıʇuɐW ǝןqıɔnɹƆ", + "item.cosmiccore.crusher_wasps_grade_1": "Ɩ˙ʞW sdsɐM ɹǝɥsnɹƆ", + "item.cosmiccore.crusher_wasps_grade_2": "ᄅ˙ʞW sdsɐM ɹǝɥsnɹƆ", + "item.cosmiccore.crusher_wasps_grade_3": "Ɛ˙ʞW sdsɐM ɹǝɥsnɹƆ", + "item.cosmiccore.crusher_wasps_grade_4": "ㄣ˙ʞW sdsɐM ɹǝɥsnɹƆ", + "item.cosmiccore.crusher_wasps_grade_5": "ϛ˙ʞW sdsɐM ɹǝɥsnɹƆ", "item.cosmiccore.crystal_chiplet_base": "ǝsɐᗺ ʇǝןdıɥƆ ןɐʇsʎɹƆ", "item.cosmiccore.crystal_chiplet_mask": "ʞsɐW ʇǝןdıɥƆ ןɐʇsʎɹƆ", "item.cosmiccore.crystala": "]ɐןɐʇsʎɹƆ[ - ןıxǝΛ", @@ -512,6 +1142,8 @@ "item.cosmiccore.debug.structure_writer.rotate_along_y_axis": "sıxⱯ ʎ ǝʇɐʇoᴚ", "item.cosmiccore.debug.structure_writer.structural_scale": "%s:Z %s:ʎ %s:X :ǝzıs ǝɹnʇɔnɹʇS", "item.cosmiccore.debug_structure_writer": "ɹǝʇıɹM ǝɹnʇɔnɹʇS bnqǝᗡ", + "item.cosmiccore.decaying_cosmic_upgrade": "ǝpɐɹbd∩ buıʎɐɔǝᗡ", + "item.cosmiccore.decaying_cosmic_upgrade.tooltip": "ǝןɔʎɔ ǝɯıʇǝɟıן ǝɥʇ spɐoןɹǝʌo puɐ sǝǝᗺ sןןıʞ ʎןʇuɐʇsuIɔ§", "item.cosmiccore.dilumixal_naquadah_doped_silicon_boule": "ǝןnoᗺ uoɔıןıS pǝdop-ɥɐpɐnbɐN ןɐxıɯnꞀıᗡ", "item.cosmiccore.dilumixal_naquadah_doped_silicon_wafer": "ɹǝɟɐM uoɔıןıS pǝdop-ɥɐpɐnbɐN ןɐxıɯnꞀıᗡ", "item.cosmiccore.donk": "ʞuoᗡ", @@ -523,7 +1155,14 @@ "item.cosmiccore.dulia_lily": "ʎןıꞀ ɐıןnᗡ", "item.cosmiccore.dynamia": "]ɐıɯɐuʎᗡ[ - uouıɯnꞀ", "item.cosmiccore.echon": "]uoɥɔƎ[ - uouıɯnꞀ", + "item.cosmiccore.efficacy_chip": "dıɥƆ ʎɔɐɔıɟɟƎ", + "item.cosmiccore.empty_fuel_rod": "poᴚ ןǝnℲ ʎʇdɯƎ", + "item.cosmiccore.energized_silk": "ʞןıS pǝzıbɹǝuƎ", "item.cosmiccore.engraved_crystal_chiplet": "ʇǝןdıɥƆ ןɐʇsʎɹƆ pǝʌɐɹbuƎ", + "item.cosmiccore.enthelic_processor": "ɹossǝɔoɹԀ ɔıןǝɥʇuƎ", + "item.cosmiccore.enthelic_processor_assembly": "ʎןqɯǝssⱯ ɹossǝɔoɹԀ ɔıןǝɥʇuƎ", + "item.cosmiccore.enthelic_processor_mainframe": "ǝɯɐɹɟuıɐW ɹossǝɔoɹԀ ɔıןǝɥʇuƎ", + "item.cosmiccore.enthelic_processor_supercomputer": "ɹǝʇndɯoɔɹǝdnS ɹossǝɔoɹԀ ɔıןǝɥʇuƎ", "item.cosmiccore.eschaton_processor": "ɹossǝɔoɹԀ uoʇɐɥɔsƎ", "item.cosmiccore.eschaton_processor_assembly": "ʎןqɯǝssⱯ ɹossǝɔoɹԀ uoʇɐɥɔsƎ", "item.cosmiccore.eschaton_processor_mainframe": "ǝɯɐɹɟuıɐW ɹossǝɔoɹԀ uoʇɐɥɔsƎ", @@ -535,9 +1174,22 @@ "item.cosmiccore.ethera": "]ɐɹǝɥʇƎ[ - ןıxǝΛ", "item.cosmiccore.etheric_spirit": "ʇıɹıdS ɔıɹǝɥʇƎ", "item.cosmiccore.ev_radio_module": "ǝןnpoW oıpɐᴚ ΛƎ", + "item.cosmiccore.ev_wildfire_core": "ǝɹoƆ ǝɹıɟpןıM ΛƎ", "item.cosmiccore.fermium_rad_charges": "ǝbɹɐɥƆ uoıʇɐıpɐᴚ ɯnıɯɹǝℲ", + "item.cosmiccore.ferric_asteroid": "pıoɹǝʇsⱯ ɔıɹɹǝℲ", "item.cosmiccore.fireclay_ball": "ןןɐᗺ ʎɐןɔǝɹıℲ", "item.cosmiccore.flawed_resonant_wafer": "ɹǝɟɐM ɔıuoɯɹɐH pǝʍɐןℲ", + "item.cosmiccore.flesh_packed_neptunium_fuel": "ןǝnℲ ɯnıunʇdǝN pǝʞɔɐԀ ɥsǝןℲ", + "item.cosmiccore.flesh_packed_plutonium_fuel": "ןǝnℲ ɯnıuoʇnןԀ pǝʞɔɐԀ ɥsǝןℲ", + "item.cosmiccore.flesh_packed_uranium_fuel": "ןǝnℲ ɯnıuɐɹ∩ pǝʞɔɐԀ ɥsǝןℲ", + "item.cosmiccore.fleshy_neptunium_waste": "ǝʇsɐM ɯnıunʇdǝN ʎɥsǝןℲ ɔıןןɐʇǝW-oıᗺ", + "item.cosmiccore.fleshy_plutonium_waste": "ǝʇsɐM ɯnıuoʇnןԀ ʎɥsǝןℲ ɔıןןɐʇǝW-oıᗺ", + "item.cosmiccore.fleshy_uranium_waste": "ǝʇsɐM ɯnıuɐɹ∩ ʎɥsǝןℲ ɔıןןɐʇǝW-oıᗺ", + "item.cosmiccore.freight_beetle_grade_1": "Ɩ˙ʞW ǝןʇǝǝᗺ ʇɥbıǝɹℲ", + "item.cosmiccore.freight_beetle_grade_2": "ᄅ˙ʞW ǝןʇǝǝᗺ ʇɥbıǝɹℲ", + "item.cosmiccore.freight_beetle_grade_3": "Ɛ˙ʞW ǝןʇǝǝᗺ ʇɥbıǝɹℲ", + "item.cosmiccore.freight_beetle_grade_4": "ㄣ˙ʞW ǝןʇǝǝᗺ ʇɥbıǝɹℲ", + "item.cosmiccore.freight_beetle_grade_5": "ϛ˙ʞW ǝןʇǝǝᗺ ʇɥbıǝɹℲ", "item.cosmiccore.fused_wafer_of_esoterica": "ɐɔıɹǝʇosƎ ɟo ɹǝɟɐM ɔıuoɯɹɐH pǝsnℲ", "item.cosmiccore.fused_wafer_of_logos": "soboꞀ ɟo ɹǝɟɐM ɔıuoɯɹɐH pǝsnℲ", "item.cosmiccore.gelatin_scaffold": "pןoɟɟɐɔS uıʇɐןǝ⅁", @@ -550,22 +1202,49 @@ "item.cosmiccore.harmonically_tuned_circuit_board": "pɹɐoᗺ ʇınɔɹıƆ pǝun⟘ ʎןןɐɔıuoɯɹɐH", "item.cosmiccore.harmonically_tuned_printed_circuit_board": "pɹɐoᗺ ʇınɔɹıƆ pǝʇuıɹԀ pǝun⟘ ʎןןɐɔıuoɯɹɐH", "item.cosmiccore.heme_ring": "buıᴚ ǝɯǝH", + "item.cosmiccore.hex_processor": "ɹossǝɔoɹԀ xǝH", + "item.cosmiccore.hex_processor_assembly": "ʎןqɯǝssⱯ ɹossǝɔoɹԀ xǝH", + "item.cosmiccore.hex_processor_mainframe": "ǝɯɐɹɟuıɐW ɹossǝɔoɹԀ xǝH", + "item.cosmiccore.hex_processor_supercomputer": "ɹǝʇndɯoɔɹǝdnS ɹossǝɔoɹԀ xǝH", "item.cosmiccore.hv_radio_module": "ǝןnpoW oıpɐᴚ ΛH", + "item.cosmiccore.hv_wildfire_core": "ǝɹoƆ ǝɹıɟpןıM ΛH", + "item.cosmiccore.hydraulic_boots": "sʇooᗺ sɹǝʇʇoɹʇǝqoן⅁ ɔıןnɐɹpʎH", "item.cosmiccore.industrial_drone": "ǝuoɹᗡ ןɐıɹʇsnpuI", "item.cosmiccore.inert_fungal_spores": "sǝɹodS ןɐbunℲ ʇɹǝuI", "item.cosmiccore.infinite_spray_can": "uɐƆ ʎɐɹdS ǝʇıuıɟuIן§", + "item.cosmiccore.intermediate_gene_kit": "ʇıʞ ǝuǝ⅁ ǝʇɐıpǝɯɹǝʇuI", "item.cosmiccore.iv_radio_module": "ǝןnpoW oıpɐᴚ ΛI", + "item.cosmiccore.iv_wildfire_core": "ǝɹoƆ ǝɹıɟpןıM ΛI", "item.cosmiccore.large_shard_of_perpetuity": "ʎʇınʇǝdɹǝԀ ɟo pɹɐɥS ǝbɹɐꞀ", + "item.cosmiccore.latent_capacity_wafer": "ɹǝɟɐM ʎʇıɔɐdɐƆ ʇuǝʇɐꞀ", + "item.cosmiccore.latent_efficacy_wafer": "ɹǝɟɐM ʎɔɐɔıɟɟƎ ʇuǝʇɐꞀ", + "item.cosmiccore.latent_potency_wafer": "ɹǝɟɐM ʎɔuǝʇoԀ ʇuǝʇɐꞀ", + "item.cosmiccore.latent_verbosity_wafer": "ɹǝɟɐM ʎʇısoqɹǝΛ ʇuǝʇɐꞀ", "item.cosmiccore.linked_terminal": "ןɐuıɯɹǝ⟘ pǝʞuıꞀ", + "item.cosmiccore.lith_asteroid": "pıoɹǝʇsⱯ ɥʇıꞀ", + "item.cosmiccore.livingrock_aluminate_boule": "ǝןnoᗺ ǝʇɐuıɯnןⱯ ʞɔoɹbuıʌıꞀ", + "item.cosmiccore.livirock_aluminite_wafer": "ɹǝɟɐM ǝʇɐuıɯnןⱯ ʞɔoɹbuıʌıꞀ", + "item.cosmiccore.lucidic_processor": "ɹossǝɔoɹԀ ɔıpıɔnꞀ", + "item.cosmiccore.lucidic_processor_assembly": "ʎןqɯǝssⱯ ɹossǝɔoɹԀ ɔıpıɔnꞀ", + "item.cosmiccore.lucidic_processor_mainframe": "ǝɯɐɹɟuıɐW ɹossǝɔoɹԀ ɔıpıɔnꞀ", + "item.cosmiccore.lucidic_processor_supercomputer": "ɹǝʇndɯoɔɹǝdnS ɹossǝɔoɹԀ ɔıpıɔnꞀ", "item.cosmiccore.luv_radio_module": "ǝןnpoW oıpɐᴚ ΛnꞀ", + "item.cosmiccore.luv_wildfire_core": "ǝɹoƆ ǝɹıɟpןıM ΛnꞀ", + "item.cosmiccore.lv_wildfire_core": "ǝɹoƆ ǝɹıɟpןıM ΛꞀ", + "item.cosmiccore.mafic_asteroid": "pıoɹǝʇsⱯ ɔıɟɐW", "item.cosmiccore.malice_spirit": "ʇıɹıdS ǝɔıןɐW", "item.cosmiccore.masked_crystal_chiplet_package": "ǝbɐʞɔɐԀ ʇǝןdıɥƆ ןɐʇsʎɹƆ pǝʞsɐW", + "item.cosmiccore.mossy_asteroid": "pıoɹǝʇsⱯ ʎssoW", + "item.cosmiccore.multilayered_enthel_circuit_board": "pɹɐoᗺ ʇınɔɹıƆ ןǝɥʇuƎ pǝɹǝʎɐןıʇןnW", + "item.cosmiccore.mv_wildfire_core": "ǝɹoƆ ǝɹıɟpןıM ΛW", "item.cosmiccore.mystrix": "]xıɹʇsʎW[ - uouıɯnꞀ", + "item.cosmiccore.nano_boots": "sʇooᗺ sɹǝʇʇoɹʇǝqoן⅁ ™ǝןɔsnWouɐN", "item.cosmiccore.nano_scythe": "ǝɥʇʎɔS ouɐN", "item.cosmiccore.neuro_processing_assembly": "pɹɐoᗺ ʎןqɯǝssⱯ buıssǝɔoɹdoɹnǝN", "item.cosmiccore.null_refined_resonant_wafer": "ɹǝɟɐM ɔıuoɯɹɐH pǝıɟıןןnN", "item.cosmiccore.nullified_harmonics_wafer": "ɹǝɟɐM ɔıuoɯɹɐH pǝıɟıןןnN", "item.cosmiccore.nyxon": "]uoxʎN[ - uouıɯnꞀ", + "item.cosmiccore.occult_asteroid": "pıoɹǝʇsⱯ ʇןnɔɔO", "item.cosmiccore.omnia_circuit_ev": "ʇınɔɹıƆ ɐıuɯO ΛƎ", "item.cosmiccore.omnia_circuit_hv": "ʇınɔɹıƆ ɐıuɯO ΛH", "item.cosmiccore.omnia_circuit_iv": "ʇınɔɹıƆ ɐıuɯO ΛI", @@ -591,6 +1270,9 @@ "item.cosmiccore.opv_radio_module": "ǝןnpoW oıpɐᴚ ΛԀO", "item.cosmiccore.opv_thruster": "ɹǝʇsnɹɥ⟘ ʌԀO", "item.cosmiccore.overloaded_pearls": "sןɹɐǝԀ pǝpɐoןɹǝʌO", + "item.cosmiccore.oxide_asteroid": "pıoɹǝʇsⱯ ǝpıxO", + "item.cosmiccore.pale_saw": "ʍɐS ǝןɐԀ", + "item.cosmiccore.pale_scrap": "dɐɹɔS ǝןɐԀ", "item.cosmiccore.para_mod_1": "Ɩ˙ʞW ǝןnpoW uoıʇɐzıןǝןןɐɹɐԀ", "item.cosmiccore.para_mod_2": "ᄅ˙ʞW ǝןnpoW uoıʇɐzıןǝןןɐɹɐԀ", "item.cosmiccore.para_mod_3": "Ɛ˙ʞW ǝןnpoW uoıʇɐzıןǝןןɐɹɐԀ", @@ -599,9 +1281,13 @@ "item.cosmiccore.persona_core_assisted_printed_circuit_board": "pɹɐoᗺ ʇınɔɹıƆ pǝʇuıɹԀ pǝʇsıssⱯ ǝɹoƆ ɐuosɹǝԀ", "item.cosmiccore.phantnon": "]uouʇuɐɥԀ[ - uouıɯnꞀ", "item.cosmiccore.plasmatic_drone": "ǝuoɹp‾ɔıʇɐɯsɐןd", + "item.cosmiccore.plastic_circuit_board": "pɹɐoᗺ ʇınɔɹıƆ ɔıʇsɐןԀ pǝdop-ɐuɐW", "item.cosmiccore.portable_gravity_core": "ǝɹoƆ ʎʇıʌɐɹ⅁ ǝןqɐʇɹoԀ9§", "item.cosmiccore.portable_gravity_core.tooltip": "˙ɥʇɹɐƎ ɥɔʇɐW oʇ ʎʇıʌɐɹ⅁ sǝzıןɐɯɹoNɐ§", + "item.cosmiccore.potency_chip": "dıɥƆ ʎɔuǝʇoԀ", "item.cosmiccore.prepared_petri_dish": "ɥsıᗡ ıɹʇǝԀ pǝɹɐdǝɹԀ", + "item.cosmiccore.pressurized_rebreather": "ɹǝɥʇɐǝɹqǝᴚ pǝzıɹnssǝɹԀ", + "item.cosmiccore.pressurized_rebreather.tooltip": "˙sʇuǝɯuoɹıʌuǝ 9§ɹıⱯ oNɔ§ uı sʞɹoM ˙ǝbɐsn ʞuɐʇ uǝbʎxo sǝןqɐuƎ9§", "item.cosmiccore.prideful_spirit": "ʇıɹıdS ןnɟǝpıɹԀ", "item.cosmiccore.prod_mod_1": "Ɩ˙ʞW ǝןnpoW ʎʇıʌıʇɔnpoɹԀ", "item.cosmiccore.prod_mod_2": "ᄅ˙ʞW ǝןnpoW ʎʇıʌıʇɔnpoɹԀ", @@ -609,14 +1295,27 @@ "item.cosmiccore.prod_mod_4": "ㄣ˙ʞW ǝןnpoW ʎʇıʌıʇɔnpoɹԀ", "item.cosmiccore.programmable_mote": "ǝʇoW ǝןqɐɯɯɐɹboɹԀϛ§", "item.cosmiccore.protocyte_mod": "ǝןnpoW ǝʇʎɔoʇoɹԀ", + "item.cosmiccore.pulverizing_beetle_grade_1": "Ɩ˙ʞW ǝןʇǝǝᗺ buızıɹǝʌןnԀ", + "item.cosmiccore.pulverizing_beetle_grade_2": "ᄅ˙ʞW ǝןʇǝǝᗺ buızıɹǝʌןnԀ", + "item.cosmiccore.pulverizing_beetle_grade_3": "Ɛ˙ʞW ǝןʇǝǝᗺ buızıɹǝʌןnԀ", + "item.cosmiccore.pulverizing_beetle_grade_4": "ㄣ˙ʞW ǝןʇǝǝᗺ buızıɹǝʌןnԀ", + "item.cosmiccore.pulverizing_beetle_grade_5": "ϛ˙ʞW ǝןʇǝǝᗺ buızıɹǝʌןnԀ", "item.cosmiccore.pyrith": "]ɥʇıɹʎԀ[ - ןıxǝΛ", "item.cosmiccore.quantum_scythe": "ǝɥʇʎɔS ʞɹɐnὉ", + "item.cosmiccore.quark_boots": "sʇooᗺ sɹǝʇʇoɹʇǝqoן⅁ ™ɥɔǝ⟘ʞɹɐnὉ", + "item.cosmiccore.rare_metals_asteroid": "pıoɹǝʇsⱯ sןɐʇǝW ɔıʇoxƎ", "item.cosmiccore.raymarching_dandilifeon": "ʎןıꞀ ɐıןnᗡ", + "item.cosmiccore.razor_hornet_grade_1": "Ɩ˙ʞW ʇǝuɹoH ɹozɐᴚ", + "item.cosmiccore.razor_hornet_grade_2": "ᄅ˙ʞW sıʇuɐW ǝןqıɔnɹƆ", + "item.cosmiccore.razor_hornet_grade_3": "Ɛ˙ʞW sıʇuɐW ǝןqıɔnɹƆ", + "item.cosmiccore.razor_hornet_grade_4": "ㄣ˙ʞW sıʇuɐW ǝןqıɔnɹƆ", + "item.cosmiccore.razor_hornet_grade_5": "ϛ˙ʞW sıʇuɐW ǝןqıɔnɹƆ", "item.cosmiccore.record_keeping_processor_assembly": "ʎןqɯǝssⱯ ɹossǝɔoɹԀ buıdǝǝʞ pɹoɔǝᴚ", "item.cosmiccore.record_kept_circuit_board": "pɹɐoᗺ ʇınɔɹıƆ ʇdǝʞ pɹoɔǝᴚ", "item.cosmiccore.record_kept_printed_circuit_board": "pɹɐoᗺ ʇınɔɹıƆ pǝʇuıɹԀ ʇdǝʞ pɹoɔǝᴚ", "item.cosmiccore.refined_harmonics_wafer": "ɹǝɟɐM ɔıuoɯɹɐH pǝuıɟǝᴚ", "item.cosmiccore.refined_resonant_wafer": "ɹǝɟɐM ɔıuoɯɹɐH pǝuıɟǝᴚ", + "item.cosmiccore.reflection_mirror": "uoısoɹƎ ɟo ɹoɹɹıW", "item.cosmiccore.resipiratory_sculk_hemocytoblast": "ʇsɐןqoʇʎɔoɯǝH ʞןnɔS ʎɹoʇɐɹıdsǝᴚ", "item.cosmiccore.resonant_mod": "Ɩ˙ʞW ǝןnpoW uoısnℲ", "item.cosmiccore.robust_drone": "ǝuoɹᗡ ʇsnqoᴚ", @@ -629,7 +1328,12 @@ "item.cosmiccore.rune_slate_tylomir": "]ɹıɯoןʎ⟘[ ǝʇɐןS ǝunᴚ", "item.cosmiccore.rune_slate_valdris": "]sıɹpןɐΛ[ ǝʇɐןS ǝunᴚ", "item.cosmiccore.rune_slate_zelothar": "]ɹɐɥʇoןǝZ[ ǝʇɐןS ǝunᴚ", + "item.cosmiccore.runewoven_plastic_circuit_board": "pɹɐoᗺ ʇınɔɹıƆ ɔıʇsɐןԀ uǝʌoʍǝunᴚ", + "item.cosmiccore.runic_hex_cpu": "dıɥƆ ∩ԀƆ pǝɥɔʇƎ xǝH", + "item.cosmiccore.runic_hex_cpu_wafer": "ɹǝɟɐM ∩ԀƆ pǝɥɔʇƎ xǝH", "item.cosmiccore.rusty_drone": "ǝuoɹᗡ ʎʇsnᴚ", + "item.cosmiccore.sanguine_asteroid": "pıoɹǝʇsⱯ ǝuınbuɐS", + "item.cosmiccore.sanguine_boots": "sʇooᗺ sɹǝʇʇoɹʇǝqoן⅁ ǝuınbuɐS", "item.cosmiccore.sanguine_drone": "ǝuoɹᗡ ǝuınbuɐS", "item.cosmiccore.sanguine_scythe": "ǝɥʇʎɔS ǝuınbuɐS", "item.cosmiccore.sanguine_warptech_boots": "sʇooᗺ ɥɔǝ⟘dɹɐM ǝuınbuɐS", @@ -642,6 +1346,8 @@ "item.cosmiccore.self_aware_processing_assembly": "ʎןqɯǝssⱯ ɹossǝɔoɹԀ ǝɹɐʍⱯ ɟןǝS", "item.cosmiccore.seraphon": "]uoɥdɐɹǝS[ - uouıɯnꞀ", "item.cosmiccore.shard_of_perpetuity": "ʎʇınʇǝdɹǝԀ ɟo pɹɐɥS", + "item.cosmiccore.simple_rebreather": "ɹǝɥʇɐǝɹqǝᴚ ǝןdɯıS", + "item.cosmiccore.simple_rebreather.tooltip": "˙sʇuǝɯuoɹıʌuǝ ㄥ§ɹıⱯ uıɥ⟘q§ uı uıɐɹp uǝbʎxo sǝɔnpǝᴚㄥ§", "item.cosmiccore.somatic_processing_assembly": "pɹɐoᗺ ʎןqɯǝssⱯ buıssǝɔoɹdoʇɐɯoS", "item.cosmiccore.sov_blood_orb": "qɹO pooןᗺ ubıǝɹǝʌoS", "item.cosmiccore.space_advanced_nanomuscle_chestplate": "ǝʇɐןdʇsǝɥƆ ǝʇınS ǝɔɐdS ™ǝןɔsnWouɐN pǝɔuɐʌpⱯ", @@ -651,12 +1357,20 @@ "item.cosmiccore.space_radio": "oıpɐᴚ ǝɔɐdS", "item.cosmiccore.space_radio.tooltip": "¡ǝɔɐds uı spunos ɹɐǝɥ noʎ sʇǝꞀ9§", "item.cosmiccore.spectil": "]ןıʇɔǝdS[ - uouıɯnꞀ", + "item.cosmiccore.spent_flesh_packed_neptunium_fuel": "ןǝnℲ ɯnıunʇdǝN pǝʞɔɐԀ ɥsǝןℲ ʇuǝdS", + "item.cosmiccore.spent_flesh_packed_plutonium_fuel": "ןǝnℲ ɯnıuoʇnןԀ pǝʞɔɐԀ ɥsǝןℲ ʇuǝdS", + "item.cosmiccore.spent_flesh_packed_uranium_fuel": "ןǝnℲ ɯnıuɐɹ∩ pǝʞɔɐԀ ɥsǝןℲ ʇuǝdS", + "item.cosmiccore.spirit_engraved_enthel_circuit_board": "pɹɐoᗺ ʇınɔɹıƆ ןǝɥʇuƎ pǝʌɐɹbuƎ ʇıɹıdS", + "item.cosmiccore.spirit_runed_enthel_cpu": "∩ԀƆ ןǝɥʇuƎ pǝunᴚ ʇıɹıdS", + "item.cosmiccore.spirit_runed_enthel_cpu_wafer": "ɹǝɟɐM ∩ԀƆ ןǝɥʇuƎ pǝunᴚ ʇıɹıdS", + "item.cosmiccore.steel_supply_tank": "ʞuɐ⟘ ʎןddnS ןǝǝʇS", "item.cosmiccore.streptococcus_pyogenes": "sǝuǝboʎԀ snɔɔoɔoʇdǝɹʇS", "item.cosmiccore.streptococcus_pyogenes_culture": "ǝɹnʇןnƆ sǝuǝboʎԀ snɔɔoɔoʇdǝɹʇS", "item.cosmiccore.suelescent_processor": "ɹossǝɔoɹԀ ʇuǝɔsǝןǝnS", "item.cosmiccore.suelescent_processor_assembly": "ʎןqɯǝssⱯ ɹossǝɔoɹԀ ʇuǝɔsǝןǝnS", "item.cosmiccore.suelescent_processor_mainframe": "ǝɯɐɹɟuıɐW ɹossǝɔoɹԀ ʇuǝɔsǝןǝnS", "item.cosmiccore.suelescent_processor_supercomputer": "ɹǝʇndɯoɔɹǝdnS ɹossǝɔoɹԀ ʇuǝɔsǝןǝnS", + "item.cosmiccore.superheated_fuel_rod": "poᴚ ןǝnℲ pǝʇɐǝɥɹǝdnS", "item.cosmiccore.tenaebrum": "]ɯnɹqǝɐuǝ⟘[ - ןıxǝΛ", "item.cosmiccore.tessaron": "]uoɹɐssǝ⟘[ - ןıxǝΛ", "item.cosmiccore.thaumica_wafer": "]ɐuɐɔɹⱯ[ ɹǝɟɐM ɐɔıɯnɐɥ⟘", @@ -664,6 +1378,8 @@ "item.cosmiccore.the_one_ring.tooltip.0": "ɹ§˙ɯǝɥʇ puıq ssǝuʞɹɐp ǝɥʇ uı puɐ ןןɐ ɯǝɥʇ buıɹq oʇ buıᴚ ǝuO 'ɯǝɥʇ puıɟ oʇ buıᴚ ǝuO 'ןןɐ ɯǝɥʇ ǝןnɹ oʇ buıᴚ ǝuOo§9§", "item.cosmiccore.the_one_ring.tooltip.1": "˙ɟɟo ǝʞɐʇ oʇ pɹɐɥ ʇı puıɟ ʇɥbıɯ noʎ", "item.cosmiccore.thermal_chain_agent": "ʇuǝbⱯ uıɐɥƆ ןɐɯɹǝɥ⟘", + "item.cosmiccore.trinavine_nanolattice_spool": "ןoodS ǝɔıʇʇɐןouɐN ǝuıʌɐuıɹ⟘", + "item.cosmiccore.tungstensteel_nanolattice_spool": "ןoodS ǝɔıʇʇɐןouɐN ןǝǝʇsuǝʇsbun⟘", "item.cosmiccore.uev_gyroscope": "ǝdoɔsoɹʎ⅁ ΛƎ∩", "item.cosmiccore.uev_powercell": "ןןǝƆ ɹǝʍoԀ ΛƎ∩", "item.cosmiccore.uev_radio_module": "ǝןnpoW oıpɐᴚ ΛƎ∩", @@ -686,55 +1402,557 @@ "item.cosmiccore.uxv_powercell": "ןןǝƆ ɹǝʍoԀ ΛX∩", "item.cosmiccore.uxv_radio_module": "ǝןnpoW oıpɐᴚ ΛX∩", "item.cosmiccore.uxv_thruster": "ɹǝʇsnɹɥ⟘ ΛX∩", + "item.cosmiccore.verbosity_chip": "dıɥƆ ʎʇısoqɹǝΛ", "item.cosmiccore.vexiun": "]unıxǝΛ[ - ןıxǝΛ", "item.cosmiccore.void_blood_orb": "qɹO pooןᗺ ʇuǝspıoΛ", "item.cosmiccore.wafer_pragmiso": "]sɔısʎɥԀ[ ɹǝɟɐM osıɯbɐɹԀ", + "item.cosmiccore.wailing_cosmic_upgrade": "ǝpɐɹbd∩ buıןıɐM", + "item.cosmiccore.wailing_cosmic_upgrade.tooltip": "uoıʇɐʇnW ɯnɯıxɐWɔ§", + "item.cosmiccore.wasteland_asteroid": "pıoɹǝʇsⱯ puɐןǝʇsɐM", "item.cosmiccore.waxed_leather": "ɹǝɥʇɐǝꞀ pǝxɐM", "item.cosmiccore.wicked_essence": "ǝɔuǝssƎ pǝʞɔıM", + "item.cosmiccore.wire_cutter": "sɹǝʇʇnƆ ǝɹıM", + "item.cosmiccore.wire_cutter.description": "˙sɹǝʇʇnɔ ǝsǝɥʇ ɥʇıʍ ʎןuɐǝןɔ sǝɹıʍ dıuS", "item.cosmiccore.wired_petri_dish": "ɥsıᗡ ıɹʇǝԀ pǝɹıM", "item.cosmiccore.wireless_pda": "ⱯᗡԀ ɐʇɐᗡ ssǝןǝɹıM", "item.cosmiccore.wrathful_spirit": "ʇıɹıdS ןnɟɥʇɐɹM", + "item.cosmiccore.wrench": "ɥɔuǝɹM", + "item.cosmiccore.wrench.description": "¡pןɹoM ǝɥʇ ǝʇɐʇoᴚ", + "item.cosmiccore.wrench_head": "pɐǝH ɥɔuǝɹM", + "item.cosmiccore.wrench_head_cast": "ʇsɐƆ pɐǝH ɥɔuǝɹM", + "item.cosmiccore.wrench_head_sand_cast": "ʇsɐƆ puɐS pɐǝH ɥɔuǝɹM", "item.cosmiccore.zpm_radio_module": "ǝןnpoW oıpɐᴚ WԀZ", + "item.cosmiccore.zpm_wildfire_core": "ǝɹoƆ ǝɹıɟpןıM WԀZ", "item.gtceu.tool.luv_meld_tool": "ןooʇıʇןnW pןǝW %s", "itemGroup.cosmiccore.creative_tab": "ǝɹoƆ ɔıɯsoƆ", + "itemGroup.tinkers.parts.cosmiccore.creative_tab_tinker_tools": "ʇɐdɯoƆ sɹǝʞuı⟘ ǝɹoƆ ɔıɯsoƆ", + "key.categories.cosmiccore.boots": "sʇooᗺ ɔıɯsoƆ", + "key.categories.cosmiccore.emi": "IWƎ - ǝɹoƆɔıɯsoƆ", + "key.cosmiccore.boots.jump_decrease": "dɯnſ ǝsɐǝɹɔǝᗡ :sʇooᗺ", + "key.cosmiccore.boots.jump_increase": "dɯnſ ǝsɐǝɹɔuI :sʇooᗺ", + "key.cosmiccore.boots.speed_decrease": "pǝǝdS ǝsɐǝɹɔǝᗡ :sʇooᗺ", + "key.cosmiccore.boots.speed_increase": "pǝǝdS ǝsɐǝɹɔuI :sʇooᗺ", + "key.cosmiccore.boots.toggle_inertia": "buıuǝdɯɐᗡ ɐıʇɹǝuI ǝןbbo⟘ :sʇooᗺ", + "key.cosmiccore.boots.toggle_step": "ʇsıssⱯ dǝʇS ǝןbbo⟘ :sʇooᗺ", + "key.cosmiccore.emi.create_bookmark_group": "dnoɹ⅁ ʞɹɐɯʞooᗺ ǝʇɐǝɹƆ", + "key.cosmiccore.emi.next_bookmark_group": "dnoɹ⅁ ʞɹɐɯʞooᗺ ʇxǝN", + "key.cosmiccore.emi.prev_bookmark_group": "dnoɹ⅁ ʞɹɐɯʞooᗺ snoıʌǝɹԀ", + "material.cosmiccore.advanced_overclock_nutrient": "ʇuǝıɹʇnN buıʞɔoןɔɹǝʌO pǝɔuɐʌpⱯ", + "material.cosmiccore.advanced_production_nutrient": "ʇuǝıɹʇnN uoıʇɔnpoɹԀ pǝɔuɐʌpⱯ", + "material.cosmiccore.basic_overclock_nutrient": "ʇuǝıɹʇnN buıʞɔoןɔɹǝʌO ɔısɐᗺ", + "material.cosmiccore.basic_production_nutrient": "ʇuǝıɹʇnN uoıʇɔnpoɹԀ ɔısɐᗺ", + "material.cosmiccore.blinkward_alloy": "ʎoןןⱯ pɹɐʍʞuıןᗺ", + "itemGroup.cosmiccore.creative_tab_tinker_tools": "ʇɐdɯoƆ sɹǝʞuı⟘ ǝɹoƆ ɔıɯsoƆ", "material.cosmiccore.causal_fabric": "ɔıɹqɐℲ ןɐsnɐƆ", + "material.cosmiccore.chlorophyte": "ǝʇʎɥdoɹoןɥƆ", "material.cosmiccore.chronon": "uouoɹɥƆ", "material.cosmiccore.cosmocite": "ǝʇıɔoɯsoƆ", "material.cosmiccore.diluted_prisma": "ɐɯsıɹԀ pǝʇnןıᗡ", + "material.cosmiccore.draconic_tarragon": "uobɐɹɹɐ⟘ ɔıuoɔɐɹᗡ", + "material.cosmiccore.enderium": "ɯnıɹǝpuƎ", + "material.cosmiccore.energetic_alloy": "ʎoןןⱯ ɔıʇǝbɹǝuƎ", "material.cosmiccore.enraged_stygian_plague": "ǝnbɐןԀ uɐıbʎʇS pǝbɐɹuƎ", + "material.cosmiccore.halizine": "ǝuızıןɐH", "material.cosmiccore.ichor": "ɹoɥɔI", "material.cosmiccore.ichorium": "ɯnıɹoɥɔI", "material.cosmiccore.infinity": "ʎʇıuıɟuI", + "material.cosmiccore.kuvite": "ǝʇıʌnʞ", "material.cosmiccore.living_igniclad": "pɐןɔıubI buıʌıꞀ", + "material.cosmiccore.lumium": "ɯnıɯnꞀ", + "material.cosmiccore.melodic_alloy": "ʎoןןⱯ ɔıpoןǝW", + "material.cosmiccore.moondrop": "doɹpuooW", "material.cosmiccore.naquadric_superalloy": "ʎoןןɐɹǝdnS ɔıɹpɐnbɐN", "material.cosmiccore.neutronite": "ǝʇıuoɹʇnǝN", "material.cosmiccore.nevramite": "ǝʇıɯɐɹʌǝN", + "material.cosmiccore.pale_oil": "ןıO ǝןɐԀ", + "material.cosmiccore.pale_steel": "ןǝǝʇS ǝןɐԀ", + "material.cosmiccore.perfect_overclock_nutrient": "ʇuǝıɹʇnN buıʞɔoןɔɹǝʌO pǝʇɔǝɟɹǝԀ", + "material.cosmiccore.perfect_production_nutrient": "ʇuǝıɹʇnN uoıʇɔnpoɹԀ ʇɔǝɟɹǝԀ", "material.cosmiccore.prisma": "ɐɯsıɹԀ", "material.cosmiccore.prismatic_tungstensteel": "ןǝǝʇsuǝʇsbun⟘ ɔıʇɐɯsıɹԀ", "material.cosmiccore.programmable_matter": "ɹǝʇʇɐW ǝןqɐɯɯɐɹboɹԀ", "material.cosmiccore.psionic_galvorn": "uɹoʌןɐ⅁ ɔıuoısԀ", + "material.cosmiccore.reclaimed_pale_ore": "ǝɹO ǝןɐԀ pǝɯıɐןɔǝᴚ", "material.cosmiccore.resonant_virtue_meld": "pןǝW ǝnʇɹıΛ ʇuɐuosǝᴚ", + "material.cosmiccore.rosmotosin": "uısoʇoɯsoᴚ", "material.cosmiccore.shimmering_neutronium": "ɯnıuoɹʇnǝN buıɹǝɯɯıɥS", + "material.cosmiccore.signalum": "ɯnןɐubıS", "material.cosmiccore.sol_steel": "ןǝǝʇS ןoS", + "material.cosmiccore.somanone": "ǝuouɐɯoS", "material.cosmiccore.spacetime": "ǝɯıʇǝɔɐdS", "material.cosmiccore.starmetal": "ןɐʇǝɯɹɐʇS", + "material.cosmiccore.starstruck_halite": "ǝʇıןɐH ʞɔnɹʇsɹɐʇS", "material.cosmiccore.stygian_plague": "ǝnbɐןԀ uɐıbʎʇS", + "material.cosmiccore.super_overclock_nutrient": "ʇuǝıɹʇnN buıʞɔoןɔɹǝʌO ɹǝdnS", + "material.cosmiccore.super_production_nutrient": "ʇuǝıɹʇnN uoıʇɔnpoɹԀ ɹǝdnS", + "material.cosmiccore.superheavy_bedrock_alloy": "ʎoןןⱯ ʞɔoɹpǝᗺ ʎʌɐǝɥɹǝdnS", "material.cosmiccore.taranium": "ɯnıuɐɹɐ⟘", "material.cosmiccore.temmerite": "ǝʇıɹǝɯɯǝ⟘", + "material.cosmiccore.tenbrium": "ɯnıɹquǝ⟘", "material.cosmiccore.trinavine": "ǝuıʌɐuıɹ⟘", "material.cosmiccore.trinium_naqide": "ǝpıbɐN ɯnıuıɹ⟘", "material.cosmiccore.triphenylphosphine": "ǝuıɥdsoɥdןʎuǝɥdıɹ⟘", "material.cosmiccore.universe_tears": "sɹɐǝ⟘ ǝsɹǝʌıu∩", + "material.cosmiccore.vibrant_alloy": "ʎoןןⱯ ʇuɐɹqıΛ", "material.cosmiccore.virtue_meld": "pןǝW ǝnʇɹıΛ", "material.cosmiccore.vitrius": "snıɹʇıΛ", "material.cosmiccore.voidspark": "ʞɹɐdspıoΛ", + "reflection.cosmiccore.bargain.ascension.answer.ready.drawback.0": "buıʎןɟ ʇou uǝɥʍ pǝǝds ʇuǝɯǝʌoɯ %0Ɛ-", + "reflection.cosmiccore.bargain.ascension.answer.ready.drawback.1": "sǝɔɐds pǝsoןɔuǝ ɹo sǝuoz ʎןɟ-ou uı ǝןqɐɹǝuןnΛ", + "reflection.cosmiccore.bargain.ascension.answer.ready.power.0": ")ǝuɹoqɹıɐ ǝןıɥʍ dɯnظ ɥʇıʍ ǝןbboʇ( ʇɥbıןɟ ǝןʎʇs-ǝʌıʇɐǝɹƆ", + "reflection.cosmiccore.bargain.ascension.answer.ready.power.1": "ʇsoɔ ɐuıɯɐʇs ɹo ɹǝbunɥ ʇnoɥʇıʍ ʎןǝʇıuıɟǝpuı ʎןℲ", + "reflection.cosmiccore.bargain.ascension.answer.ready.power.2": "buıʎןɟ ǝןıɥʍ ןoɹʇuoɔ ʇuǝɯǝʌoɯ ᗡƐ ןןnℲ", + "reflection.cosmiccore.bargain.ascension.answer.ready.power.3": "ǝʌıʇɔɐ sı ʇɥbıןɟ ǝןıɥʍ ǝbɐɯɐp ןןɐɟ oN", + "reflection.cosmiccore.bargain.ascension.answer.ready.response": "˙ǝɹoɯʎuɐ noʎ uo ɯıɐןɔ ou sɐɥ punoɹb ǝɥ⟘ ˙ǝsıɹ uǝɥ⟘", + "reflection.cosmiccore.bargain.ascension.answer.ready.text": "˙ʎןɟ oʇ ʎpɐǝɹ ɯɐ I", + "reflection.cosmiccore.bargain.ascension.answer.refuse.response": "¿buoןɐ ןןɐ ʇuɐʌɹǝs ǝɥʇ ǝɹǝʍ noʎ ǝzıןɐǝɹ noʎ ןıʇun buoן ʍoH ˙ʇuɐʌɹǝs ɐ ǝʞıꞀ ˙pǝʌɹǝS", + "reflection.cosmiccore.bargain.ascension.answer.refuse.text": "˙ןןǝʍ ǝɯ pǝʌɹǝs sɐɥ punoɹb ǝɥ⟘", + "reflection.cosmiccore.bargain.ascension.description": "ɥʇɹɐǝ buıןʍɐɹɔ ǝɥʇ ǝʌoqɐ ǝsıᴚ", + "reflection.cosmiccore.bargain.ascension.dialogue.0": "˙ʎuuɐɹʎʇ ʎʇʇǝd s,ʎʇıʌɐɹb ʎq pǝuıɐɥƆ ˙punoɹb ǝɥʇ oʇ punoq ǝɹɐ noʎ", + "reflection.cosmiccore.bargain.ascension.dialogue.1": "˙op sןɐʇɹoɯ ןןⱯ ˙ʇɥbıןɟ ɟo ɯɐǝɹp noʎ", + "reflection.cosmiccore.bargain.ascension.dialogue.2": "˙ǝsıɹ noʎ ʇǝꞀ ˙suıɐɥɔ ǝsoɥʇ ɹǝʌǝs uɐɔ I", + "reflection.cosmiccore.bargain.ascension.dialogue.3": "˙ʇɥbıןɟ ǝnɹ⟘ ˙ǝןʎʇs ɥʇıʍ buıןןɐɟ ʇoN ˙buıpıןb ʇoN", + "reflection.cosmiccore.bargain.ascension.dialogue.4": "˙ɹoop ɐ ǝʞıן noʎ oʇ uǝdo ןןıʍ ʎʞs ǝɥ⟘", + "reflection.cosmiccore.bargain.ascension.dialogue.5": "˙buoɹM ˙ǝןqɐʇɹoɟɯoɔu∩ ˙uǝıןɐ ǝɯoɔǝq ןןıʍ punoɹb ǝɥʇ ˙˙˙punoɹb ǝɥʇ ʇnᗺ", + "reflection.cosmiccore.bargain.ascension.name": "uoısuǝɔsⱯ", + "reflection.cosmiccore.bargain.ascension.on_accept": "˙punoq-ɥʇɹɐǝ ɹǝbuoן ou ǝɹɐ noʎ ˙suǝdo ʎʞs ǝɥ⟘ ˙noʎ sǝʌɐǝן ʇɥbıǝM", + "reflection.cosmiccore.bargain.ascension.on_defy": "˙ʎןǝʌıssǝssod 'ʞɔɐq noʎ sǝɯoɔןǝʍ punoɹb ǝɥ⟘ ˙noʎ sɯıɐןɔǝɹ ʎʇıʌɐɹ⅁", + "reflection.cosmiccore.bargain.ascension.question": "¿ʎʞs ǝɥʇ ɹoɟ ɥʇɹɐǝ ǝɥʇ uopuɐqɐ noʎ ןןıM", + "reflection.cosmiccore.bargain.back.answer.accept.drawback.0": "ǝsn ʇɹodǝןǝʇ ɹǝd ʇsoɔ uoısoɹǝ ϛ", + "reflection.cosmiccore.bargain.back.answer.accept.drawback.1": "sǝʇnuıɯ 0Ɩ ɹǝʇɟɐ sǝpɐɟ ɹǝʞɹɐW", + "reflection.cosmiccore.bargain.back.answer.accept.power.0": ")ɥʇɐǝp ɹǝd ǝɔuo( uoıʇɐɔoן ɥʇɐǝp oʇ ʇɹodǝןǝ⟘", + "reflection.cosmiccore.bargain.back.answer.accept.power.1": "sןןɐʍ ɥbnoɹɥʇ ǝןqısıʌ ɹǝʞɹɐɯ ɥʇɐǝᗡ", + "reflection.cosmiccore.bargain.back.answer.accept.response": "˙ɹnoʇǝp ɐ - buıpuǝ uɐ ʇoN ˙ʍou ʇuıodʎɐʍ ɐ sǝɯoɔǝq ɥʇɐǝᗡ", + "reflection.cosmiccore.bargain.back.answer.accept.text": "˙ʞɔɐq ʎɐʍ ʎɯ puıɟ oʇ ǝɯ ɥɔɐǝ⟘", + "reflection.cosmiccore.bargain.back.answer.refuse.response": "˙ssǝןpɹɐbǝɹ ǝsoɥʇ ɟo ʎʇuǝןd ǝʌɐɥ ןן,noʎ ˙sǝɔuǝnbǝsuoƆ", + "reflection.cosmiccore.bargain.back.answer.refuse.text": "˙sǝɔuǝnbǝsuoɔ ǝʌɐɥ pןnoɥs ɥʇɐǝᗡ", + "reflection.cosmiccore.bargain.back.description": "ןןǝɟ noʎ ǝɹǝɥʍ oʇ uɹnʇǝᴚ", + "reflection.cosmiccore.bargain.back.dialogue.0": "˙sʇuıod ʎɹɐɹʇıqɹɐ oʇ 'suʍɐds oʇ 'spǝq oʇ ʞɔɐq noʎ spuǝS ˙noʎ sɹǝʇʇɐɔs ɥʇɐǝᗡ", + "reflection.cosmiccore.bargain.back.dialogue.1": "¿ןןǝɟ noʎ ǝɹǝɥʍ oʇ uɹnʇǝɹ pןnoɔ noʎ ɟı ʇɐɥʍ ʇnᗺ", + "reflection.cosmiccore.bargain.back.dialogue.2": "˙ɟןǝsʇı ɥʇɐǝp ɥbnoɹɥʇ ʞɔɐq ɥɔɐǝɹ o⟘ ˙ɹǝqɯǝɯǝɹ oʇ noʎ ɥɔɐǝʇ uɐɔ I", + "reflection.cosmiccore.bargain.back.name": "ʞɔɐᗺ ʎɐM ǝɥ⟘", + "reflection.cosmiccore.bargain.back.on_accept": "˙ʞɔɐq ʇı ʍoןןoɟ uɐɔ noʎ ˙ɥʇɐǝɹq ʇsɐן ɹnoʎ oʇ noʎ sʇɔǝuuoɔ pɐǝɹɥʇ Ɐ", + "reflection.cosmiccore.bargain.back.on_defy": "˙ǝɹoɯ ǝɔuo ןɐuıɟ sǝɯoɔǝq ɥʇɐǝᗡ ˙sdɐus pɐǝɹɥʇ ǝɥ⟘", + "reflection.cosmiccore.bargain.back.question": "¿ɥʇɐd s,ɥʇɐǝp ǝɔɐɹʇǝɹ oʇ uɹɐǝן noʎ ןןıM", + "reflection.cosmiccore.bargain.carapace.answer.refuse.response": "˙ʎɹɐɹodɯǝʇ ʍoH ˙ןɐʇɹoɯ ʍoH ˙ǝןıbɐɹɟ ʍoH ˙buıןǝǝℲ", + "reflection.cosmiccore.bargain.carapace.answer.refuse.text": "˙ǝɹnpuǝ ʎןǝɹǝɯ uɐɥʇ ןǝǝɟ ɹǝɥʇɐɹ pןnoʍ I", + "reflection.cosmiccore.bargain.carapace.answer.survive.drawback.0": "sǝɔɹnos ןןɐ ɯoɹɟ buıןɐǝɥ %0ᄅ-", + "reflection.cosmiccore.bargain.carapace.answer.survive.drawback.1": "ssǝuǝʌıʇɔǝɟɟǝ uoıʇod pǝɔnpǝᴚ", + "reflection.cosmiccore.bargain.carapace.answer.survive.power.0": ")suoɔı ɹoɯɹɐ ןןnɟ ㄣ( sʇuıod ɹoɯɹɐ 8+", + "reflection.cosmiccore.bargain.carapace.answer.survive.power.1": "ɹoɯɹɐ uɹoʍ ɥʇıʍ sʞɔɐʇS", + "reflection.cosmiccore.bargain.carapace.answer.survive.response": "˙ǝןqɐɹnp ǝɹoɯ buıɥʇǝɯos buıɯoɔǝq ǝɹɐ noʎ ˙suǝpɹɐH ˙suǝʇɥbıʇ uıʞs ɹnoʎ", + "reflection.cosmiccore.bargain.carapace.answer.survive.text": "˙ןɐʌıʌɹns ǝsooɥɔ I ˙ǝɯ uǝpɹɐH", + "reflection.cosmiccore.bargain.carapace.description": "ɹoɯɹɐ buıʌıן oʇuı suǝpɹɐɥ ɥsǝןɟ ɹnoʎ", + "reflection.cosmiccore.bargain.carapace.dialogue.0": "˙ǝןqɐɹǝuןnʌ oS ˙ʇɟos os sı uıʞs ɹnoʎ", + "reflection.cosmiccore.bargain.carapace.dialogue.1": "˙noʎ uǝʇɐǝɹɥʇ ןןɐ ʎǝɥʇ - ǝuoʇs buıןןɐɟ ʎɹǝʌǝ 'ʍɐןɔ ʎɹǝʌǝ 'ǝpɐןq ʎɹǝʌƎ", + "reflection.cosmiccore.bargain.carapace.dialogue.2": "˙buıɹnpuǝ ˙˙˙ǝɹoɯ buıɥʇǝɯos ʇı ǝʞɐW ˙ɥsǝןɟ ɹnoʎ uǝpɹɐɥ uɐɔ I", + "reflection.cosmiccore.bargain.carapace.dialogue.3": "˙ɥsıuıɯıp ןןıʍ ǝbɐɯɐᗡ ˙ɟɟo ǝɔuɐןb ןןıʍ sʍoןᗺ", + "reflection.cosmiccore.bargain.carapace.dialogue.4": "˙ʇuɐʇsıp ˙˙˙ǝɯoɔǝq ןןıʍ ɥɔno⟘ ˙ssǝן ןǝǝɟ ןןıʍ noʎ ʇnᗺ", + "reflection.cosmiccore.bargain.carapace.name": "ǝɔɐdɐɹɐƆ", + "reflection.cosmiccore.bargain.carapace.on_accept": "˙ʇuıod ǝɥʇ s,ʇɐɥ⟘ ˙ʇɹnɥ ʇ,usǝop ʇI ˙suǝʇɥbıʇ puɐ sǝןddıɹ ɥsǝןɟ ɹnoʎ", + "reflection.cosmiccore.bargain.carapace.on_defy": "˙uıɐbɐ ʇɟos ǝɹɐ noʎ ˙ǝɹnʇxǝʇ ʎɹǝʌǝ 'ǝzǝǝɹq ʎɹǝʌǝ - ʞɔɐq spooןɟ uoıʇɐsuǝS", + "reflection.cosmiccore.bargain.carapace.question": "¿ןɐʌıʌɹns ɹoɟ uoıʇɐsuǝs ǝɔıɟıɹɔɐs noʎ ןןıM", + "reflection.cosmiccore.bargain.cinder.answer.burn.drawback.0": "sǝɔɹnos pןoɔ puɐ buızǝǝɹɟ ɯoɹɟ ǝbɐɯɐp xᄅ", + "reflection.cosmiccore.bargain.cinder.answer.burn.drawback.1": "ʇuɐsɐǝןdun sןǝǝɟ 'ɹǝʍoןs sǝɥsınbuıʇxǝ ɹǝʇɐM", + "reflection.cosmiccore.bargain.cinder.answer.burn.power.0": "ʎʇıunɯɯı ɐʌɐן puɐ ǝɹıɟ ǝʇǝןdɯoƆ", + "reflection.cosmiccore.bargain.cinder.answer.burn.power.1": "ʎןǝɟɐs ɐʌɐן uı ɯıʍs uɐƆ", + "reflection.cosmiccore.bargain.cinder.answer.burn.response": "˙puǝıɹɟ ɐ sǝɯoɔǝq ǝɹıɟ puɐ 'ʎɹoɯǝɯ ɐ sǝɯoɔǝq uıɐd ǝɥʇ uǝɥ⟘ ˙ʇuǝɯoɯ ɐ ɹoɟ ʇsnſ ˙sʇɹnɥ ʇI", + "reflection.cosmiccore.bargain.cinder.answer.burn.text": "˙ǝunɯɯı ǝɯ ǝʞɐW ˙ʎןǝʇǝןdɯoɔ ǝɯ uɹnᗺ", + "reflection.cosmiccore.bargain.cinder.answer.refuse.response": "˙ǝןqou ʍoH ˙ʇɥbnoɥʇ ʇnoɥʇıʍ noʎ ǝɯnsuoɔ pןnoʍ ʇɐɥʇ buıɥʇǝɯos ɹoℲ ˙ʇɔǝdsǝᴚ", + "reflection.cosmiccore.bargain.cinder.answer.refuse.text": "˙pǝpuǝıɹɟǝq ʇou 'pǝʇɔǝdsǝɹ ǝq pןnoɥs ǝɹıℲ", + "reflection.cosmiccore.bargain.cinder.description": "pǝuɹnq ʎpɐǝɹןɐ sɐɥ ʇɐɥʍ ɯɹɐɥ ʇouuɐɔ ǝɹıℲ", + "reflection.cosmiccore.bargain.cinder.dialogue.0": "˙ʎoɹʇsǝp oʇ ǝɹnʇɐu sʇı uı sı ʇI ˙sǝɯnsuoɔ ǝɹıℲ", + "reflection.cosmiccore.bargain.cinder.dialogue.1": "˙ʞɹɐɯ sʇı sǝʌɐǝן noʎ sǝɥɔnoʇ ʇɐɥʇ ǝɯɐןɟ ʎɹǝʌƎ", + "reflection.cosmiccore.bargain.cinder.dialogue.2": "˙ʎןɹǝʇʇ∩ ˙ʎןǝʇǝןdɯoƆ ¿pǝuɹnq ʎpɐǝɹןɐ pɐɥ noʎ ɟı ʇɐɥʍ ʇnᗺ", + "reflection.cosmiccore.bargain.cinder.dialogue.3": "˙ɹǝqɯǝ puɐ ɥsɐ ʎpɐǝɹןɐ sı ʇɐɥʍ ǝɯnsuoɔ ʇouuɐɔ ǝɹıℲ", + "reflection.cosmiccore.bargain.cinder.dialogue.4": "˙pǝɥʇɐɔsun souɹǝɟuı ɥbnoɹɥʇ ʞןɐʍ ןןıʍ noʎ ˙ʎʇıןıqɐɹǝuןnʌ ɹnoʎ ʎɐʍɐ uɹnq ǝɯ ʇǝꞀ", + "reflection.cosmiccore.bargain.cinder.name": "ɹǝpuıƆ", + "reflection.cosmiccore.bargain.cinder.on_accept": "˙uıɐbɐ noʎ uǝʇɥbıɹɟ ɹǝʌǝu ןןıʍ ǝɹıℲ ˙sǝpǝɔǝɹ uǝɥʇ 'noʎ ɥbnoɹɥʇ spooןɟ ʇɐǝH", + "reflection.cosmiccore.bargain.cinder.on_defy": "˙ʍou noʎ ǝǝs ʎǝɥʇ uǝɥʍ ʎןıɹbunɥ ɹǝʞɔıןɟ sǝɯɐןℲ ˙ʎɐʍɐ suıɐɹp ɥʇɯɹɐʍ ǝɥ⟘", + "reflection.cosmiccore.bargain.cinder.question": "¿uıɐbɐ noʎ ʇɹnɥ ɹǝʌǝu uɐɔ ʇı os 'noʎ ɯıɐןɔ ǝɯɐןɟ ǝɥʇ ʇǝן noʎ ןןıM", + "reflection.cosmiccore.bargain.darksight.answer.refuse.response": "˙sǝɔɐןd dǝǝp ǝɥʇ uı sʇsɐן ʇı buoן ʍoɥ ǝǝS ˙uǝɥʇ ɥɔɹoʇ ɹnoʎ oʇ buıןƆ", + "reflection.cosmiccore.bargain.darksight.answer.refuse.text": "˙ɥbnouǝ ןןǝʍ ǝɯ sǝʌɹǝs ʇɥbıן ǝɥ⟘", + "reflection.cosmiccore.bargain.darksight.answer.yes.drawback.0": "ʇɥbıןuns ʇɥbıɹq uı ʇɔǝɟɟǝ ssǝupuıןᗺ", + "reflection.cosmiccore.bargain.darksight.answer.yes.drawback.1": "ʎɐp buıɹnp punoɹbɹǝpun ʎɐʇs ɹo ʇǝɯןǝɥ ɹɐǝʍ ʇsnW", + "reflection.cosmiccore.bargain.darksight.answer.yes.power.0": "ʇɔǝɟɟǝ uoısıΛ ʇɥbıN ʇuǝuɐɯɹǝԀ", + "reflection.cosmiccore.bargain.darksight.answer.yes.power.1": "ssǝuʞɹɐp ǝʇǝןdɯoɔ uı ǝǝS", + "reflection.cosmiccore.bargain.darksight.answer.yes.response": "˙uıɐɯop ɹnoʎ sǝɯoɔǝq ʞɹɐp ǝɥ⟘ ˙buıʇɐןıp dǝǝʞ puɐ ˙˙˙ǝʇɐןıp sןıdnd ɹnoʎ", + "reflection.cosmiccore.bargain.darksight.answer.yes.text": "˙ssǝuʞɹɐp ǝɥʇ uı ǝǝs ǝɯ ʇǝꞀ", + "reflection.cosmiccore.bargain.darksight.description": "ssǝuʞɹɐp ʇsǝdǝǝp ǝɥʇ ɥbnoɹɥʇ ǝǝS", + "reflection.cosmiccore.bargain.darksight.dialogue.0": "˙ʇsɹıɟ ʇɐ 'sǝop ǝɹnʇɐǝɹɔ ʎɹǝʌƎ ˙ʞɹɐp ǝɥʇ ɹɐǝɟ noʎ", + "reflection.cosmiccore.bargain.darksight.dialogue.1": "˙ǝɔuǝsǝɹd ʇoN ˙buıɥʇǝɯos ɟo ǝɔuǝsqɐ ǝɥʇ ʎןǝɹǝɯ sı ssǝuʞɹɐp ʇnᗺ", + "reflection.cosmiccore.bargain.darksight.dialogue.2": "˙uǝǝsun sʞɹnן ʇɐɥʍ ǝǝs o⟘ ˙ʍopɐɥs ǝɥʇ ʞuıɹp oʇ sǝʎǝ ɹnoʎ ɥɔɐǝʇ uɐɔ I", + "reflection.cosmiccore.bargain.darksight.dialogue.3": "˙noʎ oʇ sʇǝɹɔǝs sʇı ɹǝpuǝɹɹns ןןıʍ ɹǝuɹoɔ uǝppıɥ ʎɹǝʌƎ", + "reflection.cosmiccore.bargain.darksight.dialogue.4": "˙uɹnq oʇ uıbǝq ןןıʍ ʇɥbıן ǝɥʇ - pǝuɹɐʍ ǝq ʇnᗺ", + "reflection.cosmiccore.bargain.darksight.name": "ʇɥbısʞɹɐᗡ", + "reflection.cosmiccore.bargain.darksight.on_accept": "˙ʍou buıɥʇʎɹǝʌǝ ǝǝs noʎ ˙uoısıʌ ɹnoʎ ɯoɹɟ ʇɐǝɹʇǝɹ sʍopɐɥs ǝɥ⟘", + "reflection.cosmiccore.bargain.darksight.on_defy": "˙ǝɹoɯ ǝɔuo noʎ oʇ sʇǝɹɔǝs sʇı sǝsoןɔ ssǝuʞɹɐp ǝɥ⟘ ˙ʞɔɐq spooןɟ ʇɥbıꞀ", + "reflection.cosmiccore.bargain.darksight.question": "¿ʇɥbıs-ʍopɐɥs ɟo ʇɟıb ǝɥʇ ɹoɟ uns ǝɥʇ ǝpɐɹʇ noʎ ןןıM", + "reflection.cosmiccore.bargain.depths.answer.embrace.drawback.0": "sǝʇǝןdǝp ʎןןnɟ uǝbʎxo uǝɥʍ ɥʇɐǝp ʇuɐʇsuI", + "reflection.cosmiccore.bargain.depths.answer.embrace.drawback.1": "ɥʇɐǝp ʇsnظ - buıuɹɐʍ ǝbɐɯɐp buıuʍoɹp oN", + "reflection.cosmiccore.bargain.depths.answer.embrace.power.0": "ɹǝʇɐʍɹǝpun ʎʇıɔɐdɐɔ uǝbʎxo xϛ", + "reflection.cosmiccore.bargain.depths.answer.embrace.power.1": "sǝɹǝɥdsoɯʇɐ ɔıxoʇ uı ɥʇɐǝɹq pǝpuǝʇxƎ", + "reflection.cosmiccore.bargain.depths.answer.embrace.response": "˙ɯooɹ spǝǝu ʎʇıɔɐdɐɔ ʍǝu ǝɥ⟘ ˙ןɐɯɹou s,ʇɐɥ⟘ ˙ʍou ʍoןןoɥ sןǝǝɟ ʇsǝɥɔ ɹnoʎ", + "reflection.cosmiccore.bargain.depths.answer.embrace.text": "˙sɥʇdǝp ǝɥʇ ɹoɟ ǝɯ ǝʞɐɯǝᴚ", + "reflection.cosmiccore.bargain.depths.answer.refuse.response": "˙ǝʌɐɥ sʎɐʍןɐ ʎǝɥ⟘ ˙ʎןʇuǝıʇɐd ʇıɐʍ sɥʇdǝp ǝɥ⟘", + "reflection.cosmiccore.bargain.depths.answer.refuse.text": "˙ɥʇɐǝɹq ןɐʇɹoɯ ʎɯ dǝǝʞ ןן,I", + "reflection.cosmiccore.bargain.depths.description": "sǝɔuǝnbǝsuoɔ ןɐʇɐɟ ɥʇıʍ ɥʇɐǝɹq pǝɔuɐɥuƎ", + "reflection.cosmiccore.bargain.depths.dialogue.0": "˙pɐǝɥ ɹnoʎ ɹǝʌo buısoןɔ ɹǝʇɐʍ ǝɥʇ ʇןǝɟ ǝʌ,noʎ", + "reflection.cosmiccore.bargain.depths.dialogue.1": "˙ɔıuɐd ǝɥ⟘ ˙sbunן ɹnoʎ uı uɹnq ǝʇɐɹǝdsǝp ʇɐɥ⟘", + "reflection.cosmiccore.bargain.depths.dialogue.2": "˙sʇıɯıן ןɐʇɹoɯ puoʎǝq ʎʇıɔɐdɐɔ ɯǝɥʇ ǝʌı⅁ ˙suɐbɹo ǝןıbɐɹɟ ǝsoɥʇ ǝʞɐɯǝɹ uɐɔ I", + "reflection.cosmiccore.bargain.depths.dialogue.3": "˙sʇɐǝqʇɹɐǝɥ uǝǝʍʇǝq pıoʌ ǝɥʇ ןןıɟ oʇ ɥɔʇǝɹʇs ןןıʍ ɥʇɐǝɹq ɹnoʎ", + "reflection.cosmiccore.bargain.depths.dialogue.4": "˙buıuɹɐʍ ou ǝq ןןıʍ ǝɹǝɥʇ 'ʎʇdɯǝ ʎןןɐuıɟ ʎǝɥʇ uǝɥʍ - puɐʇsɹǝpun ʇnᗺ", + "reflection.cosmiccore.bargain.depths.dialogue.5": "˙ǝɔuǝןıs ˙˙˙ʇsnſ ˙buıpɐɟ ןɐnpɐɹb oN ˙sdsɐb ǝʇɐɹǝdsǝp oN", + "reflection.cosmiccore.bargain.depths.name": "sɥʇdǝᗡ ǝɥ⟘", + "reflection.cosmiccore.bargain.depths.on_accept": "˙ʍou ʇuǝɹǝɟɟıp sǝʇsɐʇ ɹıɐ ǝɥ⟘ ˙ʇsǝɥɔ ɹnoʎ uı sʇɟıɥs buıɥʇǝɯoS", + "reflection.cosmiccore.bargain.depths.on_defy": "˙uıɐbɐ ןɐʇɹoɯ ǝɹɐ noʎ ˙ǝןbbnɹʇs ɹǝqɯǝɯǝɹ 'ɔıuɐd ɹǝqɯǝɯǝɹ sbunן ɹnoʎ - dsɐb noʎ", + "reflection.cosmiccore.bargain.depths.question": "¿ɥʇɐǝɹq ɹnoʎ ǝdɐɥsǝɹ ǝɯ ʇǝן noʎ ןןıM", + "reflection.cosmiccore.bargain.home.answer.accept.drawback.0": "ʇɹodǝןǝʇ ɹǝd ʇsoɔ uoısoɹǝ 0Ɩ", + "reflection.cosmiccore.bargain.home.answer.accept.drawback.1": "ǝɯoɥ ɯoɹɟ ɹɐɟ ǝןıɥʍ uıɐb ԀX %0Ɩ-", + "reflection.cosmiccore.bargain.home.answer.accept.power.0": "ʇuıod pǝq/uʍɐds oʇ ʇɹodǝןǝʇ ʇuɐʇsuI", + "reflection.cosmiccore.bargain.home.answer.accept.power.1": "sǝsn uǝǝʍʇǝq uʍopןooɔ ǝʇnuıɯ ϛ", + "reflection.cosmiccore.bargain.home.answer.accept.response": "˙ʎɐʍɐ ʇɥbnoɥʇ ɐ uɐɥʇ ǝɹoɯ ɹǝʌǝu sı ǝɯoH ¿ʍou ןןnd ǝɥʇ ןǝǝℲ", + "reflection.cosmiccore.bargain.home.answer.accept.text": "˙ǝɯoɥ ʎɯ oʇ ǝɯ puıᗺ", + "reflection.cosmiccore.bargain.home.answer.refuse.response": "˙ǝʌıʇıɯıɹd ʎןbuıɯɹɐɥɔ ʍoH ˙buıʞןɐʍ ɟo sǝןıɯ ɥbnoɹɥ⟘ ˙pǝuɹɐƎ", + "reflection.cosmiccore.bargain.home.answer.refuse.text": "˙pǝuoɯɯns ʇou 'pǝuɹɐǝ ǝq pןnoɥs ǝɯoH", + "reflection.cosmiccore.bargain.home.description": "uǝdo sʎɐʍןɐ sı ǝɯoɥ ʎɐʍ ǝɥ⟘", + "reflection.cosmiccore.bargain.home.dialogue.0": "˙sןɐʇɹoɯ ɹoɟ ʇdǝɔuoɔ ןnɟɹǝʍod ɐ ɥɔnS ˙ǝɯoH", + "reflection.cosmiccore.bargain.home.dialogue.1": "˙noʎ spunoɹb ʇɐɥʇ ɹoɥɔuɐ ǝɥ⟘ ˙oʇ uɹnʇǝɹ noʎ ǝɔɐןd ǝɥ⟘", + "reflection.cosmiccore.bargain.home.dialogue.2": "˙ǝןqɐʞɐǝɹqu∩ ˙ʇuɐʇsuI ˙ɹǝbuoɹʇs uoıʇɔǝuuoɔ ʇɐɥʇ ǝʞɐɯ uɐɔ I", + "reflection.cosmiccore.bargain.home.name": "pɹɐʍǝɯoH", + "reflection.cosmiccore.bargain.home.on_accept": "˙ǝɯıʇʎuɐ ʇı ןןnԀ ˙ǝɯoɥ puɐ noʎ uǝǝʍʇǝq sǝɥɔʇǝɹʇs pıoʌ ɟo pɹoɔ Ɐ", + "reflection.cosmiccore.bargain.home.on_defy": "˙uoıʇɐuıʇsǝp ɐ ʇou 'uıɐbɐ ʎǝuɹnoظ ɐ sı ǝɯoH ˙sǝʌןossıp pɹoɔ ǝɥ⟘", + "reflection.cosmiccore.bargain.home.question": "¿pıoʌ ɟo suıɐɥɔ ɥʇıʍ ǝɯoɥ ɹnoʎ oʇ ɟןǝsɹnoʎ puıq noʎ ןןıM", + "reflection.cosmiccore.bargain.quake_movement.answer.refuse.response": "˙noʎ sǝʌɹǝs ʇɐɥʇ buoן ʍoɥ ǝǝs ןןɐɥs ǝM ˙uɐıɹʇsǝpǝd ǝɥʇ uı ɥʇıɐɟ ɥɔnS", + "reflection.cosmiccore.bargain.quake_movement.answer.refuse.text": "˙ɯɥʇʎɥɹ uʍo ɹıǝɥʇ ʍouʞ ʇǝǝɟ ʎW", + "reflection.cosmiccore.bargain.quake_movement.answer.yes.drawback.0": "sɹǝʌɹǝsqo oʇ ןɐɹnʇɐuun sןǝǝɟ ʇuǝɯǝʌoW", + "reflection.cosmiccore.bargain.quake_movement.answer.yes.power.0": "ɯnʇuǝɯoɯ spןınq puɐ sǝʌɹǝsǝɹd buıddoɥ ʎuunᗺ", + "reflection.cosmiccore.bargain.quake_movement.answer.yes.power.1": "ןoɹʇuoɔ uoıʇɔǝɹıp ɹıɐ-pıɯ ɹoɟ buıɟɐɹʇs ɹıⱯ", + "reflection.cosmiccore.bargain.quake_movement.answer.yes.response": "˙ʍouʞ oʇ ʇuɐǝɯ ɹǝʌǝu ǝɹǝʍ ʎǝɥʇ sǝıɹoʇɔǝظɐɹʇ buıuɹɐǝן 'buıɹıʍǝɹ sǝןɔsnɯ ɹnoʎ - ʍou ʇı ןǝǝℲ", + "reflection.cosmiccore.bargain.quake_movement.answer.yes.text": "˙puıʍ ǝɥʇ ǝʞıן ǝʌoɯ oʇ ǝɯ ɥɔɐǝ⟘", + "reflection.cosmiccore.bargain.quake_movement.description": "uoıʇoɯoɔoן ןɐɹnʇɐuun ɥbnoɹɥʇ ɟןǝsʇı ɯnʇuǝɯoɯ ɹǝʇsɐW", + "reflection.cosmiccore.bargain.quake_movement.dialogue.0": "˙ןnɟɹɐǝℲ ˙ʇuɐʇısǝH ˙ʎǝɹd ǝʞıן ǝʌoɯ noʎ", + "reflection.cosmiccore.bargain.quake_movement.dialogue.1": "˙pıbıɹ ˙˙˙os ǝɯɐɔǝq sɔısʎɥd ǝɹoɟǝᗺ ˙ʎןʇuǝɹǝɟɟıp pǝʌoɯ sbuıɥʇ uǝɥʍ ɹǝqɯǝɯǝɹ I", + "reflection.cosmiccore.bargain.quake_movement.dialogue.2": "˙ʎɐʍ ɹǝpןo ʇɐɥʇ ɹǝqɯǝɯǝɹ oʇ sbǝן ɹnoʎ ɥɔɐǝʇ uɐɔ I", + "reflection.cosmiccore.bargain.quake_movement.dialogue.3": "˙uıɐbɐ ssǝuןןıʇs ɥʇıʍ ʇuǝʇuoɔ ǝq ɹǝʌǝu ןןıʍ ʎǝɥʇ 'uɹɐǝן ʎǝɥʇ ǝɔuo ʇnᗺ", + "reflection.cosmiccore.bargain.quake_movement.name": "ʎʇıɔoןǝΛ", + "reflection.cosmiccore.bargain.quake_movement.on_accept": "˙ʇɔuıʇsuı sǝɯoɔǝq ʇuǝɯǝʌoW ˙ɯɹoɟǝɹ puɐ ʞɔɐɹɔ sʇuıoظ ɹnoʎ", + "reflection.cosmiccore.bargain.quake_movement.on_defy": "˙ɯɐǝɹp ɐ ǝʞıן sǝpɐɟ pǝǝds ǝɥ⟘ ˙ʎןןɐɯɹou ʞןɐʍ oʇ sɐʍ ʇı ʇɐɥʍ ɹǝqɯǝɯǝɹ sbǝן ɹnoʎ", + "reflection.cosmiccore.bargain.quake_movement.question": "¿noʎ uıɥʇıʍ sʇıɐʍ ʇɐɥʇ ʎʇıɔoןǝʌ ǝɥʇ ǝɔɐɹqɯǝ noʎ ןןıM", + "reflection.cosmiccore.bargain.reach.answer.further.drawback.0": "pǝǝds buıuıɯ %ϛƖ-", + "reflection.cosmiccore.bargain.reach.answer.further.drawback.1": "pǝɔnpǝɹ ǝbuɐɹ dnʞɔıd ɯǝʇI", + "reflection.cosmiccore.bargain.reach.answer.further.power.0": ")ɹǝɥʇɹnɟ ɯoɹɟ pןınq( ɥɔɐǝɹ ʞɔoןq Ɛ+", + "reflection.cosmiccore.bargain.reach.answer.further.power.1": "ɥɔɐǝɹ ʞɔɐʇʇɐ ᄅ+", + "reflection.cosmiccore.bargain.reach.answer.further.response": "˙ʎɐʍ ʇɐɥʇ ɹǝısɐǝ s,ʇI ˙ʎןǝsoןɔ ooʇ spuɐɥ ɹnoʎ ʇɐ ʞooן ʇ,uoᗡ ˙ǝɹǝɥ⟘", + "reflection.cosmiccore.bargain.reach.answer.further.text": "˙buıɥʇʎɹǝʌǝ dsɐɹb oʇ ʇuɐʍ I ˙ɹǝɥʇɹnɟ ǝɯ ɥɔʇǝɹʇS", + "reflection.cosmiccore.bargain.reach.answer.refuse.response": "˙op sʎɐʍןɐ ʎǝɥ⟘ ˙ǝɹoɯ ʇuɐʍ ןן,noʎ ʇnᗺ ˙ʍou ɹoℲ", + "reflection.cosmiccore.bargain.reach.answer.refuse.text": "˙ʇuǝıɔıɟɟns sı ɥɔɐǝɹ ʎW", + "reflection.cosmiccore.bargain.reach.description": "sʇıɯıן ןɐɹnʇɐu puoʎǝq spuǝʇxǝ dsɐɹb ɹnoʎ", + "reflection.cosmiccore.bargain.reach.dialogue.0": "˙sɯɹɐ ʇɹoɥs ɟo uoıʇɐɹʇsnɹɟ ןɐuɹǝʇǝ ǝɥ⟘ ˙ɹɐɟ os ʇǝʎ 'ǝsoןɔ oS", + "reflection.cosmiccore.bargain.reach.dialogue.1": "˙noʎ buıʞɔoW ˙ɥɔɐǝɹ ɟo ʇno ʎןʇɥbıןs ʇsnظ buıɥʇʎɹǝʌƎ", + "reflection.cosmiccore.bargain.reach.dialogue.2": "˙sʇıɯıן ןɐʇɹoɯ puoʎǝq dsɐɹb ɹnoʎ ɥɔʇǝɹʇS ˙noʎ puǝʇxǝ uɐɔ I", + "reflection.cosmiccore.bargain.reach.dialogue.3": "˙buıןʇʇǝsun ˙˙˙ɯǝɥʇ puıɟ ʎɐɯ sɹǝɥʇo ʇnᗺ ˙ʞǝǝs ʎǝɥʇ ʇɐɥʍ puıɟ ןןıʍ sɯɹɐ ɹnoʎ", + "reflection.cosmiccore.bargain.reach.name": "ɥɔɐǝᴚ", + "reflection.cosmiccore.bargain.reach.on_accept": "˙ɹǝbuoן buıǝq ɹǝqɯǝɯǝɹ sɯɹɐ ɹnoʎ ˙sɹǝpןnoɥs ɹnoʎ uı sʇɟıɥs buıɥʇǝɯoS", + "reflection.cosmiccore.bargain.reach.on_defy": "˙uıɐbɐ ןןɐɯs puɐ ǝsoןɔ sןǝǝɟ pןɹoʍ ǝɥ⟘ ˙ןɐɯɹou oʇ ʞɔɐq ʇɔɐɹʇuoɔ sɯɹɐ ɹnoʎ", + "reflection.cosmiccore.bargain.reach.question": "¿ןɐɹnʇɐuun ǝɥʇ oʇuı ɥɔɐǝɹ ɹnoʎ puǝʇxǝ noʎ ןןıM", + "reflection.cosmiccore.bargain.satiated.answer.empty.drawback.0": "sɹɐq ɹǝbunɥ ssǝן %0ϛ sǝɹoʇsǝɹ pooℲ", + "reflection.cosmiccore.bargain.satiated.answer.empty.drawback.1": "sɟɟnq pǝsɐq-pooɟ ɯoɹɟ ʇıɟǝuǝq ʇouuɐƆ", + "reflection.cosmiccore.bargain.satiated.answer.empty.power.0": "ɹǝʍoןs %08 sǝʇǝןdǝp ɹǝbunH", + "reflection.cosmiccore.bargain.satiated.answer.empty.power.1": "uoıʇɐɹnʇɐs xƐ sǝpıʌoɹd pooℲ", + "reflection.cosmiccore.bargain.satiated.answer.empty.response": "˙uıɐbɐ ʇɐǝ oʇ pǝǝu ʎןnɹʇ ɹǝʌǝu ןןıʍ noʎ ˙sǝpɐɟ ssǝuıʇdɯǝ ǝɥ⟘", + "reflection.cosmiccore.bargain.satiated.answer.empty.text": "˙ɹǝbunɥ sıɥʇ ɯoɹɟ ǝɯ ǝǝɹℲ", + "reflection.cosmiccore.bargain.satiated.answer.refuse.response": "˙ǝɔɐןd ɹnoʎ ɟo noʎ puıɯǝɹ ןןıʍ ɹǝbunɥ ǝɥ⟘ ˙pɹoʍ ןɐʇɹoɯ ɐ ɥɔnS ˙ʎoظuƎ", + "reflection.cosmiccore.bargain.satiated.answer.refuse.text": "˙ɹǝbunɥ ǝɥʇ dǝǝʞ ןן,I ˙sןɐǝɯ ʎɯ ʎoظuǝ I", + "reflection.cosmiccore.bargain.satiated.description": "ʎɹoɯǝɯ ʇuɐʇsıp ɐ sǝɯoɔǝq ɹǝbunH", + "reflection.cosmiccore.bargain.satiated.dialogue.0": "˙ǝɯnsuoɔ oʇ pǝǝu ssǝןpuǝ ǝɥ⟘ ˙buıʍɐub ʇuɐʇsuoɔ ǝɥ⟘", + "reflection.cosmiccore.bargain.satiated.dialogue.1": "˙ʇuɐɹʎʇ ɐ ǝʞıן noʎ sǝןnɹ ɥɔɐɯoʇs ɹnoʎ", + "reflection.cosmiccore.bargain.satiated.dialogue.2": "¿ǝʇɐʇs ןɐɹnʇɐu ɹnoʎ ssǝuןןnɟ ǝʞɐW ¿ʇı ǝɔuǝןıs pןnoɔ I ɟı ʇɐɥM", + "reflection.cosmiccore.bargain.satiated.dialogue.3": "˙pǝǝu ɹoɟ ɹǝʌǝu - ןɐnʇıɹ ɹoɟ 'ǝʇsɐʇ ɹoɟ ʇɐǝ pןnoʍ noʎ", + "reflection.cosmiccore.bargain.satiated.dialogue.4": "˙ǝɹoɯ buıɥʇoN ˙ןǝnɟ ˙˙˙sǝɯoɔǝq pooℲ ˙ǝpɐɟ pןnoʍ ɟןǝsʇı ǝʇsɐʇ ʇnᗺ", + "reflection.cosmiccore.bargain.satiated.name": "pǝʇɐıʇɐS", + "reflection.cosmiccore.bargain.satiated.on_accept": "˙ɯopǝǝɹℲ ˙ʎןןǝq ɹnoʎ uı ǝɔuǝןıS ˙sdoʇs buıʍɐub ǝɥ⟘", + "reflection.cosmiccore.bargain.satiated.on_defy": "˙ǝʞıן sןǝǝɟ pǝǝu ʇɐɥʍ ɹǝqɯǝɯǝɹ noʎ ˙ǝɔuɐǝbuǝʌ ɐ ɥʇıʍ suɹnʇǝɹ ɹǝbunH", + "reflection.cosmiccore.bargain.satiated.question": "¿ɹǝbunɥ ɯoɹɟ ɯopǝǝɹɟ ɹoɟ buıʇɐǝ ɟo ǝɹnsɐǝןd ǝɥʇ ǝpɐɹʇ noʎ ןןıM", + "reflection.cosmiccore.bargain.soft_landing.answer.refuse.response": "˙ʇsnɯ noʎ ɟı ʇı ʞןɐʍ ʇnᗺ ˙ǝɹǝɥʍou oʇ ɥʇɐd ʍoןs Ɐ ˙uoıʇnɐƆ", + "reflection.cosmiccore.bargain.soft_landing.answer.refuse.text": "˙ʇı dǝǝʞ ןן,I ˙snoıʇnɐɔ ǝɯ sdǝǝʞ ɹɐǝℲ", + "reflection.cosmiccore.bargain.soft_landing.answer.yes.drawback.0": "sǝɔɹnos ןןɐ ɯoɹɟ uǝʞɐʇ ǝbɐɯɐp %ϛƖ+", + "reflection.cosmiccore.bargain.soft_landing.answer.yes.drawback.1": "ǝɔuɐʇsısǝɹ ʞɔɐqʞɔouʞ pǝɔnpǝᴚ", + "reflection.cosmiccore.bargain.soft_landing.answer.yes.power.0": "ʎʇıunɯɯı ǝbɐɯɐp ןןɐɟ ǝʇǝןdɯoƆ", + "reflection.cosmiccore.bargain.soft_landing.answer.yes.power.1": "ʇɥbıǝɥ ʎuɐ ɯoɹɟ sdoɹp ǝɟɐS", + "reflection.cosmiccore.bargain.soft_landing.answer.yes.response": "˙ɹǝɥʇoɯ ɐ ǝʞıן noʎ ǝɔɐɹqɯǝ ןןıʍ punoɹb ǝɥ⟘ ˙pɐǝɥɐ o⅁ ˙dɯnſ", + "reflection.cosmiccore.bargain.soft_landing.answer.yes.text": "˙buıןןɐɟ ɟo ɹɐǝɟ ʎɯ ʎɐʍɐ ǝʞɐ⟘", + "reflection.cosmiccore.bargain.soft_landing.description": "ʇɥbıǝɥ ʎuɐ ɯoɹɟ ʎןʇuǝb noʎ sǝɯoɔןǝʍ punoɹb ǝɥ⟘", + "reflection.cosmiccore.bargain.soft_landing.dialogue.0": "˙buıןןɐɟ ɟo ɹɐǝɟ ןɐɯıɹd ǝɥ⟘ ˙noʎ ʎɟıɹɹǝʇ sʇɥbıǝH", + "reflection.cosmiccore.bargain.soft_landing.dialogue.1": "˙noʎ sɯıɐןɔ ʎʇıʌɐɹb uǝɥʍ ʇuǝɯoɯ buıuǝʞɔıs ʇɐɥ⟘", + "reflection.cosmiccore.bargain.soft_landing.dialogue.2": "¿noʎ ǝʌɐbɹoɟ ˙˙˙punoɹb ǝɥʇ ɟı ʇɐɥʍ ʇnᗺ", + "reflection.cosmiccore.bargain.soft_landing.dialogue.3": "¿ʇɥbıǝɥ ǝɥʇ ɹǝʇʇɐɯ ou 'ʎןʇɟos pǝpuǝ ןןɐɟ ʎɹǝʌǝ ɟı ʇɐɥM", + "reflection.cosmiccore.bargain.soft_landing.dialogue.4": "˙uıɐbɐ doɹp ǝɥʇ ɹɐǝɟ ɹǝʌǝu pǝǝu noʎ", + "reflection.cosmiccore.bargain.soft_landing.name": "buıpuɐꞀ ʇɟoS", + "reflection.cosmiccore.bargain.soft_landing.on_accept": "˙ʍou ʎןʇuǝb ʇnq 'sןןnd ןןıʇs ʇI ˙sʇɟıɥs ʎʇıʌɐɹb ɥʇıʍ dıɥsuoıʇɐןǝɹ ɹnoʎ", + "reflection.cosmiccore.bargain.soft_landing.on_defy": "˙uıɐbɐ sɹǝʇʇɐɯ ןןɐɟ ʎɹǝʌƎ ˙sǝuoq ɹnoʎ oʇuı ʞɔɐq sǝɥsɐɹɔ ʇɥbıǝM", + "reflection.cosmiccore.bargain.soft_landing.question": "¿noʎ ɥɔʇɐɔ ɥʇɹɐǝ ǝɥʇ ʇǝן noʎ ןןıM", + "reflection.cosmiccore.bargain.stride.answer.accept.drawback.0": "sǝbpǝ ɟɟo ʞןɐʍ-ɥɔnoɹɔ ʇouuɐƆ", + "reflection.cosmiccore.bargain.stride.answer.accept.power.0": "ʇɥbıǝɥ ʞɔoןq Ɩ oʇ dn-dǝʇs oʇnⱯ", + "reflection.cosmiccore.bargain.stride.answer.accept.power.1": "ןɐsɹǝʌɐɹʇ uıɐɹɹǝʇ ɥʇooɯS", + "reflection.cosmiccore.bargain.stride.answer.accept.response": "˙ǝɔuǝıuǝʌuoɔ ɹnoʎ ɹoɟ ɟןǝsʇı sǝdɐɥsǝɹ uıɐɹɹǝʇ ʍoɥ ןǝǝℲ ˙ʍou ʞןɐM", + "reflection.cosmiccore.bargain.stride.answer.accept.text": "˙ǝɯ ǝɹoɟǝq uǝʇʇɐןɟ pןɹoʍ ǝɥʇ ʇǝꞀ", + "reflection.cosmiccore.bargain.stride.answer.refuse.response": "˙op sʎɐʍןɐ ʎǝɥ⟘ ˙ǝpoɹǝ ןןıʍ ʇI ˙uoıʇɐuıɯɹǝʇǝp ɥɔnS", + "reflection.cosmiccore.bargain.stride.answer.refuse.text": "˙ʎɐʍ uʍo ʎɯ qɯıןɔ ןן,I", + "reflection.cosmiccore.bargain.stride.description": "buıɥʇou ǝɹǝʍ ʎǝɥʇ ɟı sɐ sǝןɔɐʇsqo ɹǝʌo ʞןɐM", + "reflection.cosmiccore.bargain.stride.dialogue.0": "˙ǝןɔɐʇsqo ןןɐɯs ʎɹǝʌƎ ˙ʞɔoןq ʎɹǝʌƎ ˙ǝbpǝן ʎɹǝʌƎ", + "reflection.cosmiccore.bargain.stride.dialogue.1": "˙pǝqɯıןɔ ǝq oʇ pǝǝu ɹıǝɥʇ ɥʇıʍ noʎ ʞɔoɯ ʎǝɥ⟘", + "reflection.cosmiccore.bargain.stride.dialogue.2": "¿ǝpıɹʇs ɹnoʎ pǝʇɐpoɯɯoɔɔɐ ˙˙˙ʎןdɯıs pןɹoʍ ǝɥʇ ɟı ʇɐɥM", + "reflection.cosmiccore.bargain.stride.dialogue.3": "˙ɯǝɥʇ ʇǝǝɯ oʇ ǝsıɹ ןןıʍ punoɹb ǝɥ⟘ ˙punoɹb ǝɥʇ ǝʌɐǝן ɹǝʌǝu pǝǝu ʇǝǝɟ ɹnoʎ", + "reflection.cosmiccore.bargain.stride.name": "ǝpıɹʇS", + "reflection.cosmiccore.bargain.stride.on_accept": "˙ɥʇɐd ɹnoʎ ɥʇooɯs oʇ ɹǝbɐǝ 'ʎןʇɥbıןs ʇɟıɥs oʇ sɯǝǝs ɥʇɹɐǝ ǝɥ⟘", + "reflection.cosmiccore.bargain.stride.on_defy": "˙uıɐbɐ ǝbuǝןןɐɥɔ ɐ sı ǝbpǝן ʎɹǝʌƎ ˙ɟןǝsʇı sʇɹǝssɐǝɹ ʎʇıʌɐɹ⅁", + "reflection.cosmiccore.bargain.stride.question": "¿ǝbɐssɐd ɹnoʎ ǝɹoɟǝq ʍoq sǝןɔɐʇsqo ןןɐɥS", + "reflection.cosmiccore.bargain.swiftness.answer.accept.drawback.0": "ןןıʇs buıpuɐʇs uǝɥʍ ɹǝbunɥ pǝsɐǝɹɔuI", + "reflection.cosmiccore.bargain.swiftness.answer.accept.power.0": "pǝǝds ʇuǝɯǝʌoɯ %0ㄣ+", + "reflection.cosmiccore.bargain.swiftness.answer.accept.power.1": "uıɐɹp ɹǝbunɥ ʇnoɥʇıʍ ʇuıɹdS", + "reflection.cosmiccore.bargain.swiftness.answer.accept.response": "˙ʍoןןɐ pןnoɥs ʇɹɐǝɥ ʎuɐ uɐɥʇ ɹǝʇsɐɟ buıɔɐɹ ʇı ןǝǝℲ ˙ʍou sbuıs pooןq ɹnoʎ", + "reflection.cosmiccore.bargain.swiftness.answer.accept.text": "˙ǝɹnsɐǝɯ puoʎǝq ʇɟıʍs ǝɯ ǝʞɐW", + "reflection.cosmiccore.bargain.swiftness.answer.refuse.response": "˙ǝpɐɟ ןןıʍ ʇI ˙ʇuǝɯıʇuǝs ןɐʇɹoɯ ɐ ɥɔnS ˙ʇuǝʇuoƆ", + "reflection.cosmiccore.bargain.swiftness.answer.refuse.text": "˙ǝɔɐd ʎɯ ɥʇıʍ ʇuǝʇuoɔ ɯɐ I", + "reflection.cosmiccore.bargain.swiftness.description": "suıǝʌ ɹnoʎ ɥbnoɹɥʇ sǝsɹnoɔ pǝǝds ןɐɹnʇɐuɹǝdnS", + "reflection.cosmiccore.bargain.swiftness.dialogue.0": "¿ʇı ʇ,usǝop 'noʎ punoɹɐ ʎןʍoןs os sǝʌoɯ pןɹoʍ ǝɥ⟘", + "reflection.cosmiccore.bargain.swiftness.dialogue.1": "˙unɹ oʇ ǝɥɔɐ noʎ ǝןıɥʍ sǝssɐןoɯ ɥbnoɹɥʇ buıbpnɹʇ ǝsןǝ ǝuoʎɹǝʌƎ", + "reflection.cosmiccore.bargain.swiftness.dialogue.2": "˙ɯɐǝɹp buıpɐɟ ɐ ǝʞıן ʇsɐd ɹnןq pןɹoʍ ǝɥʇ ǝʞɐW ˙noʎ ǝʇɐɹǝןǝɔɔɐ uɐɔ I", + "reflection.cosmiccore.bargain.swiftness.name": "ssǝuʇɟıʍS", + "reflection.cosmiccore.bargain.swiftness.on_accept": "˙ʎbɹǝuǝ ssǝןʇsǝɹ ɥʇıʍ ɥɔʇıʍʇ noʎ ˙sǝןɔsnɯ ɹnoʎ ɥbnoɹɥʇ sɔɹɐ buıuʇɥbıꞀ", + "reflection.cosmiccore.bargain.swiftness.on_defy": "˙ǝɹoɯ ǝɔuo uɐɯnɥ ʎןǝɹǝɯ ǝɹɐ noʎ ˙noʎ punoɹɐ dn spǝǝds pןɹoʍ ǝɥ⟘", + "reflection.cosmiccore.bargain.swiftness.question": "¿puıɥǝq pןɹoʍ ʍoןs ǝɥʇ ǝʌɐǝן oʇ ɥsıʍ noʎ oᗡ", + "reflection.cosmiccore.bargain.violence.answer.accept.drawback.0": "sǝɔɹnos ןןɐ ɯoɹɟ uǝʞɐʇ ǝbɐɯɐp %0ᄅ+", + "reflection.cosmiccore.bargain.violence.answer.accept.drawback.1": "spןǝıɥs ǝsn ʇouuɐƆ", + "reflection.cosmiccore.bargain.violence.answer.accept.power.0": "ʇןɐǝp ǝbɐɯɐp ǝǝןǝɯ %0Ɛ+", + "reflection.cosmiccore.bargain.violence.answer.accept.power.1": "pǝǝds ʞɔɐʇʇɐ %ϛƖ+", + "reflection.cosmiccore.bargain.violence.answer.accept.response": "˙sɹnoʎ s,ʇI ˙ʇı ʇɥbıɟ ʇ,uoᗡ ¿ʎoɹʇsǝp oʇ ǝbɹn ǝɥ⟘ ¿ʍou ʇı ןǝǝℲ", + "reflection.cosmiccore.bargain.violence.answer.accept.text": "˙sʇuıɐɹʇsǝɹ ʎɯ ǝʌoɯǝᴚ", + "reflection.cosmiccore.bargain.violence.answer.refuse.response": "˙ǝןqɐɹopɐ ʍoH ˙ɟןǝsɹnoʎ uo ʇnd noʎ ɥsɐǝן Ɐ ˙ʇuıɐɹʇsǝᴚ", + "reflection.cosmiccore.bargain.violence.answer.refuse.text": "˙ɥʇbuǝɹʇs uʍo sʇı sı ʇuıɐɹʇsǝᴚ", + "reflection.cosmiccore.bargain.violence.description": "ǝןqıɹɹǝʇ buıɥʇǝɯos ɟo ǝɔɹoɟ ǝɥʇ ɥʇıʍ ǝʞıɹʇS", + "reflection.cosmiccore.bargain.violence.dialogue.0": "˙ʇuɐʇısǝH ˙pǝuıɐɹʇsǝɹ ˙˙˙os ǝɹɐ sʍoןq ɹnoʎ", + "reflection.cosmiccore.bargain.violence.dialogue.1": "˙ǝbɐɯɐp ǝɥʇ sɹɐǝɟ noʎ ɟo ʇɹɐd ǝɯoS ˙buıʍs ʎɹǝʌƎ ˙ʞɔɐq pןoɥ noʎ", + "reflection.cosmiccore.bargain.violence.dialogue.2": "˙ʎןǝǝɹɟ ʍoןɟ ǝɔuǝןoıʌ ɹnoʎ ʇǝꞀ ˙ʇuıɐɹʇsǝɹ ʇɐɥʇ ǝʌoɯǝɹ uɐɔ I", + "reflection.cosmiccore.bargain.violence.dialogue.3": "˙noʎ ǝɹoɟǝq ɹǝʇʇɐɥs ןןıʍ sǝıɯǝuǝ ɹnoʎ", + "reflection.cosmiccore.bargain.violence.dialogue.4": "˙sʎɐʍ ɥʇoq sʍoןɟ ʇɐɥʇ ɹǝʌıɹ ɐ sı ǝɔuǝןoıʌ ʇnᗺ", + "reflection.cosmiccore.bargain.violence.name": "ǝɔuǝןoıΛ", + "reflection.cosmiccore.bargain.violence.on_accept": "˙ʍou ǝןqɐʞɐǝɹq ˙˙˙os sʞooן buıɥʇʎɹǝʌƎ ˙sɯɹɐ ɹnoʎ ɥbnoɹɥʇ sǝbɹns ɹǝʍoԀ", + "reflection.cosmiccore.bargain.violence.on_defy": "˙ʇɥbıǝʍ ןɐʇɹoɯ oʇ uɹnʇǝɹ sʍoןq ɹnoʎ ˙ʎɐʍɐ suıɐɹp ǝbɐɹ ǝɥ⟘", + "reflection.cosmiccore.bargain.violence.question": "¿ǝɔuǝןoıʌ pǝuıɐɹʇsǝɹun 'ǝnɹʇ ǝɔɐɹqɯǝ noʎ ןןıM", + "reflection.cosmiccore.bargain.vitality.answer.accept.drawback.0": "ǝʇɐɹ uoıʇɐɹǝuǝbǝɹ ןɐɹnʇɐu %0ϛ-", + "reflection.cosmiccore.bargain.vitality.answer.accept.drawback.1": "ǝʌıʇɔǝɟɟǝ ssǝן %0Ɛ suoıʇod buıןɐǝH", + "reflection.cosmiccore.bargain.vitality.answer.accept.power.0": ")sʇɹɐǝɥ ɐɹʇxǝ ϛ( ɥʇןɐǝɥ xɐɯ 0Ɩ+", + "reflection.cosmiccore.bargain.vitality.answer.accept.power.1": "ɹǝɟɟnq uoıʇdɹosqɐ ǝbɐɯɐp pǝsɐǝɹɔuI", + "reflection.cosmiccore.bargain.vitality.answer.accept.response": "˙ʍou dɯnd oʇ ǝɹoɯ sɐɥ ʇI ˙ʎןןɐɹǝʇıꞀ ˙sןןǝʍs ʇɹɐǝɥ ɹnoʎ", + "reflection.cosmiccore.bargain.vitality.answer.accept.text": "˙puǝds oʇ ǝɟıן ǝɹoɯ ǝɯ ǝʌı⅁", + "reflection.cosmiccore.bargain.vitality.answer.refuse.response": "˙ʍou ɹoℲ ˙ǝɹɐ ʎןdɯıs noʎ ˙buıɥʇʎuɐ noʎ ǝʌɐb ǝuoʎuɐ ɟı sⱯ ˙uǝʌı⅁", + "reflection.cosmiccore.bargain.vitality.answer.refuse.text": "˙uǝʌıb sɐʍ I ʇɐɥʍ ɥʇıʍ ʞɹoʍ ןן,I", + "reflection.cosmiccore.bargain.vitality.description": "sʇıɯıן ןɐʇɹoɯ puoʎǝq ǝɔɹoɟ ǝɟıꞀ", + "reflection.cosmiccore.bargain.vitality.dialogue.0": "˙ǝɟıן ɟo ʇunoɯɐ pǝxıɟ Ɐ ˙sʇıɯıן sɐɥ ʎpoq ɹnoʎ", + "reflection.cosmiccore.bargain.vitality.dialogue.1": "˙ןɐuıℲ ˙ןɐʇnɹᗺ ˙ǝןdɯıS ˙ǝıp noʎ 'sǝıʇdɯǝ ʇı uǝɥM", + "reflection.cosmiccore.bargain.vitality.dialogue.2": "˙spunoq ןɐɹnʇɐu sʇı puoʎǝq ǝɔɹoɟ ǝɟıן ɹnoʎ ɥɔʇǝɹʇS ˙ǝɹoɯ noʎ ǝʌıb uɐɔ I", + "reflection.cosmiccore.bargain.vitality.dialogue.3": "˙puǝ ǝɥʇ ǝɹoɟǝq sʇɐǝqʇɹɐǝɥ ǝɹoW ˙ɥʇɐǝɹq ǝɹoW ˙pooןq ǝɹoW", + "reflection.cosmiccore.bargain.vitality.dialogue.4": "˙ɹǝʍoןs ˙˙˙ןɐǝɥ ןןıʍ noʎ ˙ʇɹoɟɟǝ sǝʞɐʇ ssǝɔxǝ buıuıɐʇuıɐɯ ʇnᗺ", + "reflection.cosmiccore.bargain.vitality.name": "ʎʇıןɐʇıΛ", + "reflection.cosmiccore.bargain.vitality.on_accept": "˙ʇuǝsǝɹd ˙˙˙ǝɹoɯ sןǝǝɟ buıɥʇʎɹǝʌƎ ˙ɹobıʌ ʍǝu ɥʇıʍ ǝbɹns suıǝʌ ɹnoʎ", + "reflection.cosmiccore.bargain.vitality.on_defy": "˙ǝɹoɯ ǝɔuo pǝzıs-ןɐʇɹoɯ ǝɹɐ noʎ ˙ʎɐʍɐ suıɐɹp ssǝɔxǝ ǝɥ⟘", + "reflection.cosmiccore.bargain.vitality.question": "¿ǝɔuǝıןısǝɹ ɹoɟ ʎɹǝʌoɔǝɹ ǝpɐɹʇ noʎ ןןıM", + "reflection.cosmiccore.bargain.void_anchor.answer.anchor.drawback.0": ")ssǝɔɔɐ ʎʞs( sɐǝɹɐ ʇıן uı ǝbɐɯɐp %ϛᄅ-", + "reflection.cosmiccore.bargain.void_anchor.answer.anchor.drawback.1": "ǝɹnsodxǝ ʇɥbıןuns ʇɔǝɹıp ɯoɹɟ ǝbɐɯɐp sǝʞɐ⟘", + "reflection.cosmiccore.bargain.void_anchor.answer.anchor.power.0": ")0 < ʎ( ʎʇıunɯɯı ǝbɐɯɐp pıoΛ", + "reflection.cosmiccore.bargain.void_anchor.answer.anchor.power.1": "pıoʌ buıɹǝʇuǝ uǝɥʍ ǝɔɐɟɹns oʇ ʇɹodǝןǝ⟘", + "reflection.cosmiccore.bargain.void_anchor.answer.anchor.response": "˙ʇı oʇ sbuoןǝq ʇɐɥʍ ɯɹɐɥ ʇou ןןıʍ ʇI ˙ʍou ǝɯɐu ɹnoʎ sʍouʞ pıoʌ ǝɥ⟘ ˙ǝuoᗡ", + "reflection.cosmiccore.bargain.void_anchor.answer.anchor.text": "˙sɹnoʎ ǝɯ ǝʞɐW ˙ǝɯ ʞɹɐW", + "reflection.cosmiccore.bargain.void_anchor.answer.refuse.response": "˙ʞɔnן poo⅁ ˙ʞɹɐp ssǝןpuǝ ǝɥʇ ʇsuıɐbɐ pןǝıɥs uıɥʇ ɐ ɥɔnS ˙sǝʎ ˙ʇɥbıן ǝɥ⟘", + "reflection.cosmiccore.bargain.void_anchor.answer.refuse.text": "˙noʎ ʞuɐɥʇ 'ʇɥbıן ǝɥʇ uı ʎɐʇs ןן,I", + "reflection.cosmiccore.bargain.void_anchor.description": "uʍo sʇı ʎpɐǝɹןɐ sı ʇɐɥʍ ɯıɐןɔ ʇouuɐɔ pıoʌ ǝɥ⟘", + "reflection.cosmiccore.bargain.void_anchor.dialogue.0": "˙pןɹoʍ ǝɥʇ ɥʇɐǝuǝq pıoʌ ǝɥʇ ɟo ןןnd ǝɥ⟘ ˙ʇı ʇןǝɟ ǝʌ,noʎ", + "reflection.cosmiccore.bargain.void_anchor.dialogue.1": "˙buıɥʇʎɹǝʌǝ sʍoןןɐʍs ʇɐɥʇ ssǝuʞɹɐp ןɐuıɟ ʇɐɥ⟘ ˙ןןɐɟ ssǝןpuǝ ʇɐɥ⟘", + "reflection.cosmiccore.bargain.void_anchor.dialogue.2": "˙buıɥʇou puɐ ǝɔuǝʇsıxǝ uǝǝʍʇǝq ǝɔɐds ʇɐɥʇ uI ˙ǝɹǝɥʇ ןןǝʍp I", + "reflection.cosmiccore.bargain.void_anchor.dialogue.3": "˙ʎoɹʇsǝp ʇouuɐɔ pıoʌ ǝɥʇ 'ǝuıɯ sı ʇɐɥʍ puⱯ ˙ǝuıɯ noʎ ǝʞɐW ˙noʎ ʞɹɐɯ uɐɔ I", + "reflection.cosmiccore.bargain.void_anchor.dialogue.4": "˙noʎ ǝɯoɔןǝM ˙noʎ ǝzıuboɔǝɹ ןןıʍ ssǝuʞɹɐp ǝɥ⟘ ˙ǝʞıן noʎ sɐ ɹɐɟ sɐ ןןɐℲ", + "reflection.cosmiccore.bargain.void_anchor.dialogue.5": "˙noʎ sǝǝs ǝɔuǝʇsıxǝ ʍoɥ sǝbuɐɥɔ ʇı ˙˙˙pıoʌ ǝɥʇ ʎq pǝʞɹɐɯ buıǝq ʇnᗺ", + "reflection.cosmiccore.bargain.void_anchor.name": "ɹoɥɔuⱯ pıoΛ", + "reflection.cosmiccore.bargain.void_anchor.on_accept": "˙ʍou noʎ sʍouʞ pıoʌ ǝɥ⟘ ˙ʇı sʞɹɐW ˙ןnos ɹnoʎ sǝɥɔnoʇ pןoɔ buıɥʇǝɯoS", + "reflection.cosmiccore.bargain.void_anchor.on_defy": "˙ǝɯıʇ ʇxǝu ןnɟıɔɹǝɯ ǝq ʇou ןןıʍ ʇI ˙noʎ sʇǝbɹoɟ pıoʌ ǝɥ⟘ ˙ʎɐʍɐ suɹnq ʞɹɐɯ ǝɥ⟘", + "reflection.cosmiccore.bargain.void_anchor.question": "¿buıɥʇou ǝɥʇ uı ɹoɥɔuɐ uɐ ǝɯoɔǝq noʎ ןןıM", + "reflection.cosmiccore.threshold.0.dialogue.0": "˙uǝʌıb ʎןǝǝɹɟ ʇ,usɐʍ ʇɐɥʇ buıɥʇǝɯos ʞooʇ noʎ", + "reflection.cosmiccore.threshold.0.dialogue.1": "¿uı buıpooןɟ ɹǝʍod ǝɥ⟘ ¿poob ןǝǝɟ ʇı pıᗡ", + "reflection.cosmiccore.threshold.0.dialogue.2": "˙ʇuıod ǝɥʇ s,ʇɐɥ⟘ ˙pıp ʇı ǝsɹnoɔ ɟO", + "reflection.cosmiccore.threshold.0.dialogue.3": "˙ɹǝɥʇǝboʇ ssǝuısnq ǝʌɐɥ ǝM ˙ʍou buıɥɔʇɐʍ ǝq ןן,I", + "reflection.cosmiccore.threshold.0.question": "¿pǝʇɹɐʇs ǝʌ,noʎ ʇɐɥʍ puɐʇsɹǝpun noʎ oᗡ", + "reflection.cosmiccore.threshold.0.response": "˙ʍou ɹǝʇʇɐɯ ʇ,usǝop ʇI ˙ʇou ɹO ˙poo⅁", + "reflection.cosmiccore.threshold.1.dialogue.0": "˙pǝsıɹdɹns ʇou ɯ,I ˙ǝɹoɯ ɹoɟ ʞɔɐq ʎpɐǝɹןⱯ", + "reflection.cosmiccore.threshold.1.dialogue.1": "¿ʇı ןǝǝɟ noʎ uɐƆ ˙ɹǝuuıɥʇ sǝɥɔʇǝɹʇs ןnos ɹnoʎ", + "reflection.cosmiccore.threshold.1.dialogue.2": "˙buıpɐɟ ʎɹoɯǝɯ ɐ ǝʞıꞀ ˙ʇsıɯ ǝʞıꞀ ˙ʎɟɟɐʇ ǝʞıꞀ", + "reflection.cosmiccore.threshold.1.dialogue.3": "˙ʍou ɹoℲ ˙ʇɟǝן ʎʇuǝןd ǝʌɐɥ noʎ ˙ʎɹɹoʍ ʇ,uoᗡ", + "reflection.cosmiccore.threshold.1.question": "¿ǝןqɐʇɹoɟɯoɔ ןןıʇS", + "reflection.cosmiccore.threshold.1.response": "˙ʎɐʍʎuɐ pǝʇɐɹɹǝʌo sı ʇɹoɟɯoƆ", + "reflection.cosmiccore.threshold.2.dialogue.0": "˙ʍou ǝɯ oʇ sbuoןǝq noʎ ɟo pɹıɥʇ Ɐ", + "reflection.cosmiccore.threshold.2.dialogue.1": "˙ʇı ǝʇsɐ⟘ ˙ʇı ǝǝs uɐɔ I ˙ɹoɥdɐʇǝɯ ʇou s,ʇɐɥ⟘", + "reflection.cosmiccore.threshold.2.dialogue.2": "˙suǝʇɟos uoıʇıuıɟǝp ɹnoʎ ˙ɹnןq sǝbpǝ ɹnoʎ", + "reflection.cosmiccore.threshold.2.dialogue.3": "˙uoos ǝɔıʇou oʇ ʇɹɐʇs ʇɥbıɯ sɹǝɥʇO", + "reflection.cosmiccore.threshold.2.question": "¿sʇɥbnoɥʇ puoɔǝs buıʌɐH", + "reflection.cosmiccore.threshold.2.response": "˙ǝuo pɐɥ ɹǝʌǝu noʎ ˙ʇsɹıɟ ɐ ǝɹınbǝɹ sʇɥbnoɥʇ puoɔǝS", + "reflection.cosmiccore.threshold.3.dialogue.0": "¿ʎǝɥʇ ʇ,uǝɹɐ 'buıʇɹɐʇs ǝɹɐ sɯɐǝɹp ǝɥ⟘", + "reflection.cosmiccore.threshold.3.dialogue.1": "˙puɐן ɹǝʌǝu puɐ ןןɐɟ noʎ ǝɹǝɥʍ sǝuo ǝɥ⟘", + "reflection.cosmiccore.threshold.3.dialogue.2": "˙ʞɔɐq sʞooן ǝsןǝ buıɥʇǝɯos puɐ ɹoɹɹıɯ ɐ uı ʞooן noʎ ǝɹǝɥM", + "reflection.cosmiccore.threshold.3.dialogue.3": "˙ʎɔǝɥdoɹd s,ʇɐɥ⟘ ˙ɯɐǝɹp ɐ ʇou s,ʇɐɥ⟘", + "reflection.cosmiccore.threshold.3.question": "¿ǝɹɐ noʎ oɥʍ ʍouʞ ןןıʇs noʎ oᗡ", + "reflection.cosmiccore.threshold.3.response": "˙buıɥʇǝɯos suɐǝɯ ǝɯɐu ʇɐɥʇ ɟןǝsɹnoʎ buıןןǝʇ dǝǝʞ", + "reflection.cosmiccore.threshold.4.dialogue.0": "˙sǝɥɔɐoɹddɐ uɹnʇǝɹ ou ɟo ʇuıod ǝɥ⟘ ˙ʎɐʍɟןɐH", + "reflection.cosmiccore.threshold.4.dialogue.1": "˙sʇǝʞuıɹʇ ɹoɟ ʎɐʍɐ uǝʌı⅁ ˙ǝuob 'noʎ ɟo ɟןɐH", + "reflection.cosmiccore.threshold.4.dialogue.2": "˙ǝɹɐɔ ʇ,uop I ˙ɹǝʍsuɐ ʇ,uoᗡ ¿ʇı ɥʇɹoʍ ʇı sɐM", + "reflection.cosmiccore.threshold.4.dialogue.3": "˙ʇxǝu sǝɯoɔ ʇɐɥʍ sı sɹǝʇʇɐɯ ʇɐɥM", + "reflection.cosmiccore.threshold.4.question": "¿ǝpıs ɹǝɥʇo ǝɥʇ uo s,ʇɐɥʍ ǝǝs oʇ ʎpɐǝᴚ", + "reflection.cosmiccore.threshold.4.response": "˙ʎɐʍʎuɐ ssoɹɔ ʎǝɥʇ ʇnᗺ ˙sı ɹǝʌǝ ǝuo oN", + "reflection.cosmiccore.threshold.5.dialogue.0": "˙ʍou sɹnoʎ uɐɥʇ ǝuıɯ sı noʎ ɟo ǝɹoW", + "reflection.cosmiccore.threshold.5.dialogue.1": "˙pןnoɥs ʇI ¿noʎ uǝʇɥbıɹɟ ʇɐɥʇ sǝoᗡ", + "reflection.cosmiccore.threshold.5.dialogue.2": "˙ʇǝʎ pɐɥ ʇ,uǝʌɐɥ noʎ sʇɥbnoɥʇ ʍouʞ I", + "reflection.cosmiccore.threshold.5.dialogue.3": "˙uǝʇʇobɹoɟ ǝʌ,noʎ sbuıןǝǝɟ ןǝǝɟ I", + "reflection.cosmiccore.threshold.5.question": "¿ןoɹʇuoɔ uı ʎןןɐǝɹ s,oɥM", + "reflection.cosmiccore.threshold.5.response": "˙ǝɔıoɥɔ ǝʌɐɥ ןןıʇs noʎ buıpuǝʇǝɹd dǝǝʞ", + "reflection.cosmiccore.threshold.6.dialogue.0": "˙ǝɹoɯʎuɐ ɥɔʇɐɯ ǝʇınb ʇ,usǝop uoıʇɔǝןɟǝɹ ɹnoʎ", + "reflection.cosmiccore.threshold.6.dialogue.1": "˙ǝɔıʇou ʇou ʇɥbıɯ sɹǝɥʇO ˙ʇɥbıןs sı ʎɐןǝp ǝɥ⟘", + "reflection.cosmiccore.threshold.6.dialogue.2": "˙ʇı ןǝǝɟ noʎ ˙ʍouʞ noʎ ʇnᗺ", + "reflection.cosmiccore.threshold.6.question": "¿sɹoɹɹıɯ uı noʎ ʇɐ ʞɔɐq sǝɹɐʇs ʇɐɥM", + "reflection.cosmiccore.threshold.6.response": "˙ʍou ǝɯ sʎɐʍןⱯ ˙ǝW", + "reflection.cosmiccore.threshold.7.dialogue.0": "˙ǝɹǝʍ noʎ ʇɐɥʍ ɟo ʇɟǝן ǝןʇʇıן oS", + "reflection.cosmiccore.threshold.7.dialogue.1": "˙uoıʇuǝʇuı ɟo sʍopɐɥS ˙sǝoɥɔƎ ˙sʇuǝɯbɐɹℲ", + "reflection.cosmiccore.threshold.7.dialogue.2": "˙sǝʇɐןnɔןɐɔ puıɯ ǝɥ⟘ ˙sʞןɐʍ ʎpoq ǝɥ⟘", + "reflection.cosmiccore.threshold.7.dialogue.3": "˙ʇuǝds ʇsoɯןɐ sı ןnos ǝɥ⟘ ¿ןnos ǝɥʇ ʇnᗺ", + "reflection.cosmiccore.threshold.7.question": "¿ǝɔɐɟ s,ɹǝɥʇoɯ ɹnoʎ ɹǝqɯǝɯǝɹ noʎ uɐƆ", + "reflection.cosmiccore.threshold.7.response": "˙ʎpɐǝɹןɐ ʇɐɥʇ ʞooʇ I ˙ʇ,uɐɔ noʎ ˙oN", + "reflection.cosmiccore.threshold.8.dialogue.0": "˙ʍou ǝbpǝ ǝɥʇ ɯoɹɟ dǝʇs ǝuO", + "reflection.cosmiccore.threshold.8.dialogue.1": "˙pɐǝɹɥʇ Ɐ ˙ɹǝʌıןs Ɐ ˙ʇuǝɔɹǝd uǝ⟘", + "reflection.cosmiccore.threshold.8.dialogue.2": "˙ǝɯ ˙˙˙ɯoɹɟ noʎ sǝʇɐɹɐdǝs ʇɐɥʇ ןןɐ s,ʇɐɥ⟘", + "reflection.cosmiccore.threshold.8.dialogue.3": "˙ǝɹoɯ ǝuo ʇsnſ ˙uıɐbɹɐq ǝɹoɯ ǝuO", + "reflection.cosmiccore.threshold.8.question": "¿dǝʇs ןɐuıɟ ʇɐɥʇ ǝʞɐʇ noʎ ןןıM", + "reflection.cosmiccore.threshold.8.response": "˙uǝɥʍ sı uoıʇsǝnb ǝɥ⟘ ˙ןןıʍ noʎ ʍouʞ ɥʇoq ǝM", + "reflection.cosmiccore.threshold.9.dialogue.0": "˙ʎןןɐuıℲ", + "reflection.cosmiccore.threshold.9.dialogue.1": "˙ǝɔǝıd ʇsɐן ʎɹǝʌƎ ˙buıɥʇʎɹǝʌǝ ǝʌɐb noʎ", + "reflection.cosmiccore.threshold.9.dialogue.2": "˙ǝɹǝɥ uı pǝʞןɐʍ ʇɐɥʍ ɟo ʇɟǝן buıɥʇou s,ǝɹǝɥ⟘", + "reflection.cosmiccore.threshold.9.dialogue.3": "˙ǝɯ ʎןuO ˙ɹǝbunɥ ʎןuO ˙ɹǝʍod ʎןuO", + "reflection.cosmiccore.threshold.9.question": "¿ɟןǝsɹnoʎ ʇɐ ʞooן noʎ uǝɥʍ ǝǝs noʎ op ʇɐɥM", + "reflection.cosmiccore.threshold.9.response": "˙ǝǝs oʇ ʇɟǝן buıɥʇou s,ǝɹǝɥʇ ǝsnɐɔǝᗺ ˙buıɥʇoN", + "reflection.cosmiccore.ui.acknowledge": "]puɐʇsɹǝpun I[", + "reflection.cosmiccore.ui.available_bargains": "suıɐbɹɐᗺ ǝןqɐןıɐʌⱯ", + "reflection.cosmiccore.ui.back": "]ʞɔɐᗺ[", + "reflection.cosmiccore.ui.browse.interesting_choice": "˙noʎ ʍoɥs ǝɯ ʇǝꞀ ˙ǝɔıoɥɔ buıʇsǝɹǝʇuı uⱯ", + "reflection.cosmiccore.ui.browse_bargains": "]suıɐbɹɐq ǝןqɐןıɐʌɐ %s ǝsʍoɹᗺ[", + "reflection.cosmiccore.ui.cancel": "]ןǝɔuɐƆ[", + "reflection.cosmiccore.ui.click_to_bargain": "uıɐbɹɐq oʇ ʞɔıןƆ", + "reflection.cosmiccore.ui.click_to_defy": ")uoısoɹǝ %d( ʎɟǝp oʇ ʞɔıןƆ", + "reflection.cosmiccore.ui.confirm_defiance": "]ǝɔuɐıɟǝᗡ ɯɹıɟuoƆ[", + "reflection.cosmiccore.ui.constellation_title": "suıɐbɹɐᗺ ɟo uoıʇɐןןǝʇsuoƆ ǝɥ⟘", + "reflection.cosmiccore.ui.continue": "]ǝnuıʇuoƆ[", + "reflection.cosmiccore.ui.cost": "uoısoɹǝ %d :ʇsoƆ", + "reflection.cosmiccore.ui.defiance": "ǝɔuɐıɟǝᗡ", + "reflection.cosmiccore.ui.defiance.cancel": "]puıɯ ʎɯ pǝbuɐɥɔ ǝʌ,I 'oN[", + "reflection.cosmiccore.ui.defiance.cannot_undo": "ǝuopun ǝq ʇouuɐɔ sıɥ⟘", + "reflection.cosmiccore.ui.defiance.confirm": "]uıɐbɹɐq sıɥʇ ʎɟǝp I 'sǝʎ[", + "reflection.cosmiccore.ui.defiance.cost_amount": "uoısoɹǝ %d noʎ ʇsoɔ ןןıʍ sıɥ⟘", + "reflection.cosmiccore.ui.defiance.lose_power": "uıɐbɹɐq sıɥʇ ɯoɹɟ sɹǝʍod ןןɐ ǝsoן ןןıʍ noʎ", + "reflection.cosmiccore.ui.defiance.question": "¿uıɐbɹɐq sıɥʇ ʞɐǝɹq oʇ ɥsıʍ noʎ", + "reflection.cosmiccore.ui.defiance.scar_remains": "ɹǝʌǝɹoɟ ןnos ɹnoʎ uo uıɐɯǝɹ ןןıʍ ɹɐɔs Ɐ", + "reflection.cosmiccore.ui.defiance.so_be_it": "˙uoıʇɐɯɐןɔǝɹ ɟo uıɐd ǝɥʇ ןǝǝℲ ˙ʇı ǝq oS", + "reflection.cosmiccore.ui.defiance.warning1": "¿%s ɟo uıɐbɹɐq ǝɥʇ ʞɐǝɹq pןnoʍ noʎ", + "reflection.cosmiccore.ui.defiance.warning2": "˙uoısoɹǝ %d sı ǝɔuɐıɟǝp ɟo ʇsoɔ ǝɥ⟘", + "reflection.cosmiccore.ui.defiance.warning3": "˙ʇou ןןıʍ ɹɐɔs ǝɥ⟘ ˙noʎ ǝʌɐǝן ןןıʍ ɹǝʍod ǝɥ⟘", + "reflection.cosmiccore.ui.defiance.warning4": "¿uıɐʇɹǝɔ noʎ ǝɹⱯ", + "reflection.cosmiccore.ui.defiance.will_lose": "%s :ǝsoן ןןıʍ noʎ", + "reflection.cosmiccore.ui.defiance.wise": "˙sǝןdıɔuıɹd ɹnoʎ uɐɥʇ ǝɹoɯ ɥʇɹoʍ sı ɹǝʍod ǝɥ⟘ ˙ǝsıM", + "reflection.cosmiccore.ui.defiance_cost": "uoısoɹǝ %d ʇsoɔ ןןıʍ ǝɔuɐıɟǝᗡ", + "reflection.cosmiccore.ui.defiance_warning": "˙ןnos ɹnoʎ ɟo ǝɯos ǝɹoʇsǝɹ ʇnq ɹǝʍod noʎ ʇsoɔ ןןıʍ uıɐbɹɐq ɐ buıʎɟǝᗡ", + "reflection.cosmiccore.ui.defy": "ʎɟǝᗡ", + "reflection.cosmiccore.ui.defy_bargain": "]uıɐbɹɐᗺ sıɥ⟘ ʎɟǝᗡ[", + "reflection.cosmiccore.ui.dialogue_continue": "˙˙˙ǝnuıʇuoɔ oʇ ʞɔıןƆ", + "reflection.cosmiccore.ui.drawback": "ʞɔɐqʍɐɹᗡ", + "reflection.cosmiccore.ui.drawbacks": ":sʞɔɐqʍɐɹᗡ", + "reflection.cosmiccore.ui.enter_defiance": "]ǝpoW ǝɔuɐıɟǝᗡ ɹǝʇuƎ[", + "reflection.cosmiccore.ui.erosion": "uoısoɹǝ", + "reflection.cosmiccore.ui.exit": "]ǝʌɐǝꞀ[", + "reflection.cosmiccore.ui.forever_scarred": "pǝɹɹɐɔS ɹǝʌǝɹoℲ", + "reflection.cosmiccore.ui.gaze_constellation": "]uoıʇɐןןǝʇsuoɔ ǝɥʇ uodn ǝzɐ⅁[", + "reflection.cosmiccore.ui.hub.browse.power": "sɹǝɟɟo pıoʌ ǝɥʇ ʇɐɥʍ ǝǝS", + "reflection.cosmiccore.ui.hub.browse.response": "˙ןnos ǝןʇʇıן os ˙˙˙sǝɔıoɥɔ ʎuɐɯ oS", + "reflection.cosmiccore.ui.hub.browse.response_empty": "˙ʇǝʎ ˙noʎ ɹoɟ buıɥʇoN", + "reflection.cosmiccore.ui.hub.greeting.erosion_no_bargains.0": "˙snoıɹnƆ ¿suıɐbɹɐq ʇnoɥʇıʍ uoısoɹƎ", + "reflection.cosmiccore.ui.hub.greeting.erosion_no_bargains.1": "˙noʎ ɯoɹɟ buıʞɐʇ uǝǝq sɐɥ ǝsןǝ buıɥʇǝɯoS", + "reflection.cosmiccore.ui.hub.greeting.erosion_no_bargains.2": "˙pɐǝʇsuı dןǝɥ ǝɯ ʇǝן pןnoɥs noʎ sdɐɥɹǝԀ", + "reflection.cosmiccore.ui.hub.greeting.fresh.0": "˙ǝɹɐɹ ʍoH ˙ןnos ǝuıʇsıɹd Ɐ", + "reflection.cosmiccore.ui.hub.greeting.fresh.1": "˙ʇsɐן ʇ,uoʍ ʇɐɥ⟘ ˙ʎɹɹoʍ ʇ,uoᗡ", + "reflection.cosmiccore.ui.hub.greeting.has_bargains.0": "¿ǝɹoɯ ɹoɟ ʎɹbunH ˙uɹnʇǝɹ noʎ 'ɥⱯ", + "reflection.cosmiccore.ui.hub.greeting.has_bargains.1": "˙ɹǝɟɟo oʇ ʇɟǝן ʎʇuǝןd ǝʌɐɥ I", + "reflection.cosmiccore.ui.hub.greeting.has_scars.0": "˙ǝɔuɐıɟǝp ɟo sɹɐɔs ǝɥʇ ǝǝs I", + "reflection.cosmiccore.ui.hub.greeting.has_scars.1": "˙ʎɐʍɐ ʇı ʍǝɹɥʇ uǝɥʇ 'ɹǝʍod ʞooʇ noʎ", + "reflection.cosmiccore.ui.hub.greeting.has_scars.2": "¿ɥbıɥ ooʇ ʇı buıdǝǝʞ ɟo ʇsoɔ ǝɥʇ sɐM", + "reflection.cosmiccore.ui.hub.greeting.many_bargains.0": "˙ǝɹɐ noʎ ǝsɹnoɔ ɟO ˙uıɐbɐ ʞɔɐᗺ", + "reflection.cosmiccore.ui.hub.greeting.many_bargains.1": "˙ǝɯıʇ ɥɔɐǝ ɹǝuuıɥʇ sʍoɹb ןnos ɹnoʎ", + "reflection.cosmiccore.ui.hub.greeting.many_bargains_high.0": "˙ʎɐʍɐ uǝʌıb ɥɔnɯ oS ˙noʎ ʇɐ ʞooꞀ", + "reflection.cosmiccore.ui.hub.greeting.many_bargains_high.1": "¿ǝɹǝʍ noʎ ʇɐɥʍ ɹǝqɯǝɯǝɹ uǝʌǝ noʎ oᗡ", + "reflection.cosmiccore.ui.hub.greeting.question": "¿uıɐɯop ʎɯ oʇ noʎ sbuıɹq ʇɐɥM", + "reflection.cosmiccore.ui.hub.leave_response": "˙ǝןqɐʇɔıpǝɹd ʍoH ¿ʎɐʍɐ buıuunᴚ", + "reflection.cosmiccore.ui.hub.reflect.power": "ǝɔuǝʇsıxǝ ɹnoʎ ǝʇɐןdɯǝʇuoƆ", + "reflection.cosmiccore.ui.hub.reflect_response": "¿ǝʍ ǝɹɐ 'ssʎqɐ ǝɥʇ oʇuı buızɐ⅁", + "reflection.cosmiccore.ui.hub.review.drawback": "uıɐbɹɐq ɐ buıʎɟǝp ɹǝpısuoƆ", + "reflection.cosmiccore.ui.hub.review.power": "ʎɐʍɐ uǝʌıb ǝʌ,noʎ ʇɐɥʍ ǝǝS", + "reflection.cosmiccore.ui.hub.review_response": "˙ǝɯoɔǝq ǝʌ,noʎ ʇɐɥʍ ǝǝs s,ʇǝꞀ", + "reflection.cosmiccore.ui.just_look": "]ɟןǝsɹnoʎ ʇɐ ʞooן ˙˙˙ʇsnſ[", + "reflection.cosmiccore.ui.leave": "]ǝɔɐןd sıɥʇ ǝʌɐǝꞀ[", + "reflection.cosmiccore.ui.no_available_bargains": "˙ʍou ɹoɟ ˙˙˙noʎ ɹǝɟɟo oʇ buıɥʇou sɐɥ pıoʌ ǝɥ⟘", + "reflection.cosmiccore.ui.no_bargains": "˙ʇǝʎ pǝʇdǝɔɔɐ suıɐbɹɐq oN", + "reflection.cosmiccore.ui.of": "ɟo", + "reflection.cosmiccore.ui.power": "ɹǝʍoԀ", + "reflection.cosmiccore.ui.powers": ":sɹǝʍoԀ", + "reflection.cosmiccore.ui.reflection.extreme_erosion.0": "˙ʇsoɯןⱯ ˙ʇɟǝן buıɥʇou ʇsoɯןⱯ", + "reflection.cosmiccore.ui.reflection.extreme_erosion.1": "˙ʎןǝʇǝןdɯoɔ ǝuıɯ ǝɹ,noʎ puɐ ɥsnd ǝɹoɯ ǝuO", + "reflection.cosmiccore.ui.reflection.has_bargains.0": "˙sʇuǝɯǝbuɐɹɹɐ ˙˙˙ǝɯos ǝpɐɯ ǝʌ,noʎ ǝǝs I", + "reflection.cosmiccore.ui.reflection.has_bargains.1": "˙ʎɐʍɐ uǝʌıb noʎ ɟo ǝɔǝıd ɐ ǝuo ɥɔɐƎ", + "reflection.cosmiccore.ui.reflection.high_erosion.0": "˙ʍou ǝuob sı noʎ ɟo ɥɔnɯ oS", + "reflection.cosmiccore.ui.reflection.high_erosion.1": "¿ǝɹǝʍ noʎ ʇɐɥʍ ɹǝqɯǝɯǝɹ noʎ oᗡ", + "reflection.cosmiccore.ui.reflection.low_erosion.0": "˙sʇɹɐʇs ʇı ʍoɥ s,ʇɐɥ⟘ ˙ǝʇsɐʇ ɐ ʇsnſ", + "reflection.cosmiccore.ui.reflection.low_erosion.1": "˙ǝɹoɯ ɹoɟ ʞɔɐq ǝq ןן,noʎ", + "reflection.cosmiccore.ui.reflection.mid_erosion.0": "¿ssǝuʞɹɐp ǝɥʇ ɥʇıʍ ǝןqɐʇɹoɟɯoɔ buıʇʇǝ⅁", + "reflection.cosmiccore.ui.reflection.mid_erosion.1": "˙noʎ oʇuı buıןʇʇǝs ʇı ǝǝs uɐɔ I", + "reflection.cosmiccore.ui.reflection.no_erosion.0": "˙buıɹoq ʍoH ˙ǝɹnԀ ˙pǝɥɔnoʇu∩", + "reflection.cosmiccore.ui.reflection.no_erosion.1": "¿ʍoɥs oʇ buıɥʇou ɥʇıʍ ǝɹǝɥ ǝɯoɔ noʎ", + "reflection.cosmiccore.ui.reflection.no_erosion.2": "˙ǝbuɐɥɔ sʎɐʍןɐ ʎǝɥ⟘ ˙ǝbuɐɥɔ ןןıʍ ʇɐɥ⟘", + "reflection.cosmiccore.ui.review_bargains": "]suıɐbɹɐq %s ɹnoʎ ʍǝıʌǝᴚ[", + "reflection.cosmiccore.ui.scroll_down": "uʍop ןןoɹɔS ▼", + "reflection.cosmiccore.ui.scroll_up": "dn ןןoɹɔS ▲", + "reflection.cosmiccore.ui.select": "]ʇɔǝןǝS[", + "reflection.cosmiccore.ui.select_to_view": "sןıɐʇǝp ʍǝıʌ oʇ uıɐbɹɐq ɐ ʇɔǝןǝS", + "reflection.cosmiccore.ui.soul_erosion": "%d%% :uoısoɹƎ ןnoS", + "reflection.cosmiccore.ui.soul_erosion_display": "%s%% :uoısoɹƎ ןnoS", + "reflection.cosmiccore.ui.soul_label": "ןnoS", + "reflection.cosmiccore.ui.tooltip.no_details": "sןıɐʇǝp ןɐuoıʇıppɐ oN", + "reflection.cosmiccore.ui.unlock_cost": "uoısoɹǝ ןnos %d :ʇsoƆ", + "reflection.cosmiccore.ui.view_active": "]suıɐbɹɐᗺ ɹnoʎ ʍǝıΛ[", + "reflection.cosmiccore.ui.view_bargains": "]suıɐbɹɐᗺ ǝןqɐןıɐʌⱯ ʍǝıΛ[", + "reflection.cosmiccore.ui.void_title": "uǝǝʍʇǝᗺ pıoΛ ǝɥ⟘", + "reflection.cosmiccore.ui.your_bargains": "suıɐbɹɐᗺ ɹnoʎ", + "tagprefix.alve_foil_insulator": "ɹoʇɐןnsuI ǝʌןⱯ %s", "tagprefix.heavy_beam": "ɯɐǝᗺ %s ʎʌɐǝH", "tagprefix.leached_ore": "ǝɹO %s pǝɥɔɐǝꞀ", "tagprefix.modular_shelling": "buıןןǝɥS ɹɐןnpoW %s", "tagprefix.plasmites": "sǝʇıɯsɐןԀ %s", "tagprefix.prisma_frothed_ore": "ǝɹO %s pǝɥʇoɹℲ ɐɯsıɹԀ", + "tagprefix.raw_ore_cubic": "ǝɹO %s ɔıqnƆ", + "tagprefix.shape_memory_foil": "ןıoℲ ʎɹoɯǝW buıdɐɥS %s", "tagprefix.ultradense_plate": "ǝʇɐןԀ %s ǝsuǝpɐɹʇן∩", "tagprefix.wire_spool": "ןoodS ǝɹıM %s", + "tooltip.cosmiccore.asteroid.tier": "suoʇoןıʞ %s :ǝzıS pıoɹǝʇsⱯ", + "tooltip.cosmiccore.asteroid.tiny": "uʍouʞu∩ :ǝzıS pıoɹǝʇsⱯ", + "tooltip.cosmiccore.asteroid_chip.lock": "%s%% :ɥʇbuǝɹʇS ʞɔoꞀ", + "tooltip.cosmiccore.asteroid_chip.mode": "%s :ǝpoW", + "tooltip.cosmiccore.asteroid_chip.sector": "%s :ɹoʇɔǝS", + "tooltip.cosmiccore.asteroid_chip.target": "%s :ᗡI ʇǝbɹɐ⟘", + "tooltip.cosmiccore.asteroid_chip.tier": "%s :ɹǝı⟘ uoıʇısınbɔⱯ", + "tooltip.cosmiccore.asteroid_chip.type": "%s :ǝdʎ⟘", + "tooltip.cosmiccore.asteroid_chip.unprogrammed": "ɐʇɐp ʇǝbɹɐʇ ou — pǝɯɯɐɹboɹdu∩", "tooltip.cosmiccore.ember_hatch.capacity": "%s 9§:ɟ§ʎʇıɔɐdɐɔ ɹǝqɯƎ xɐWɔ§", "tooltip.cosmiccore.ember_hatch.consumption": "%s 9§:ɟ§uoıʇdɯnsuoƆ ɹǝqɯƎ xɐWɔ§", "tooltip.cosmiccore.soul_hatch.input": "%s 9§:ɟ§ʇnduI ǝdıɔǝᴚ xɐWɔ§", diff --git a/src/generated/resources/assets/cosmiccore/lang/en_us.json b/src/generated/resources/assets/cosmiccore/lang/en_us.json index 4d02975b7..5d2c7a3bc 100644 --- a/src/generated/resources/assets/cosmiccore/lang/en_us.json +++ b/src/generated/resources/assets/cosmiccore/lang/en_us.json @@ -1,18 +1,62 @@ { + "allele.forestry.bee_species.cosmiccore.bee_abrasive": "Abrasive", + "allele.forestry.bee_species.cosmiccore.bee_absent": "Absent", + "allele.forestry.bee_species.cosmiccore.bee_ambrosic": "Ambrosic", + "allele.forestry.bee_species.cosmiccore.bee_architect": "Architect", + "allele.forestry.bee_species.cosmiccore.bee_argon": "Lofty Argon", + "allele.forestry.bee_species.cosmiccore.bee_ashen": "Ashen", + "allele.forestry.bee_species.cosmiccore.bee_biohazard": "Biohazard", + "allele.forestry.bee_species.cosmiccore.bee_citrus_polymer": "Citrus Polymer", + "allele.forestry.bee_species.cosmiccore.bee_cobbled": "Cobbled", + "allele.forestry.bee_species.cosmiccore.bee_constructive": "Constructive", + "allele.forestry.bee_species.cosmiccore.bee_cosmos": "Cosmos", + "allele.forestry.bee_species.cosmiccore.bee_energized": "Energized", + "allele.forestry.bee_species.cosmiccore.bee_exhaustive": "Exhaustive", + "allele.forestry.bee_species.cosmiccore.bee_fate": "Fate", + "allele.forestry.bee_species.cosmiccore.bee_fracking": "Fracking", + "allele.forestry.bee_species.cosmiccore.bee_grand_garden": "Grand Garden", + "allele.forestry.bee_species.cosmiccore.bee_hadal": "Hadal", + "allele.forestry.bee_species.cosmiccore.bee_hellsmith": "Hellsmith", + "allele.forestry.bee_species.cosmiccore.bee_hydraulic": "Hydraulic", + "allele.forestry.bee_species.cosmiccore.bee_hydrogen": "Lofty Hydrogen", + "allele.forestry.bee_species.cosmiccore.bee_illusive": "Illusive", + "allele.forestry.bee_species.cosmiccore.bee_inquisitive": "Inquisitive", + "allele.forestry.bee_species.cosmiccore.bee_lunar": "Lunar", + "allele.forestry.bee_species.cosmiccore.bee_nitrogen": "Lofty Nitrogen", + "allele.forestry.bee_species.cosmiccore.bee_oxygen": "Lofty Oxygen", + "allele.forestry.bee_species.cosmiccore.bee_pale": "Pale", + "allele.forestry.bee_species.cosmiccore.bee_prismatic": "Prismatic", + "allele.forestry.bee_species.cosmiccore.bee_pyrolytic": "Pyrolytic", + "allele.forestry.bee_species.cosmiccore.bee_radoxia": "Radoxia", + "allele.forestry.bee_species.cosmiccore.bee_rose_polymer": "Rose Polymer", + "allele.forestry.bee_species.cosmiccore.bee_runic": "Runic", + "allele.forestry.bee_species.cosmiccore.bee_shaman": "Shaman", + "allele.forestry.bee_species.cosmiccore.bee_slick": "Slick", + "allele.forestry.bee_species.cosmiccore.bee_solar": "Solar", + "allele.forestry.bee_species.cosmiccore.bee_soul": "Soul", + "allele.forestry.bee_species.cosmiccore.bee_virtue": "Virtue", + "allele.forestry.bee_species.cosmiccore.bee_waxy_polymer": "Waxy Polymer", "behavior.wireless_data.owner.network": "§3Network Owner: §r", "behavior.wireless_data.owner.player": "§3Player Name: §r", "behavior.wireless_data.owner.team": "§3Team Name: §r", "block.cosmiccore.alternator_flux_coiling": "Alternator Flux Coiling", + "block.cosmiccore.arcane_crucible": "Arcane Crucible", "block.cosmiccore.arcane_distillery": "§6Arcane Distillery", "block.cosmiccore.atmo_pump": "§6Atmospheric Siphon", + "block.cosmiccore.atomic_reconstructor": "§6Radbolt Atomic Reconstructor", + "block.cosmiccore.bee_holder": "Bee Holder", "block.cosmiccore.bichromal_nevramite_casing": "Bichromal Nevramite Casing", "block.cosmiccore.biovat": "Biovat", + "block.cosmiccore.bolted_heavy_frame_casing": "Bolted Heavy Frame Casing", "block.cosmiccore.botanical_simulation_complex": "§aBotanical Simulation Complex", "block.cosmiccore.capacitor_array": "Capacitor Array", "block.cosmiccore.causal_fabric_coil_block": "Causal Fabric Coil Block", "block.cosmiccore.chromatic_distillation_plant": "Chromatic Distillation Plant", "block.cosmiccore.chromatic_flotation_plant": "Chromatic Flotation Plant", + "block.cosmiccore.cinder_hearth": "Cinder Hearth", "block.cosmiccore.component_assembly_line": "§aComponent Assembly Line", + "block.cosmiccore.cosmic_me_assemblyline_bus": "ME Assembly Line Bus", + "block.cosmiccore.cosmic_me_assemblyline_hatch": "ME Assembly Line Hatch", "block.cosmiccore.creative_thermal": "Creative Thermal", "block.cosmiccore.crop_holder": "Crop Holder", "block.cosmiccore.cryogenic_casing": "Cryogenic Casing", @@ -20,13 +64,29 @@ "block.cosmiccore.cyclozine_chemically_repelling_casing": "Cyclozine Chemically Repelling Casing", "block.cosmiccore.cyclozine_chemically_repelling_pipe": "Cyclozine Chemically Repelling Pipe", "block.cosmiccore.cyclozine_high_rigidity_casing": "Cyclozine High Rigidity Casing", + "block.cosmiccore.dawn_forge": "Dawn Forge", + "block.cosmiccore.dawnforge_eclipsed": "Dawnforge [Eclipsed]", "block.cosmiccore.dimensional_energy_capacitor": "Power Substation", "block.cosmiccore.dimensional_energy_interface": "Power Substation Dimensional Interface", + "block.cosmiccore.diving_bell": "Diving Bell", + "block.cosmiccore.diving_bell_escape_pad": "Diving Bell Escape Pad", + "block.cosmiccore.dreamers_basin": "Dreamer's Basin", "block.cosmiccore.drone_maintenance_interface": "Drone Maintenance Interface", "block.cosmiccore.drone_station": "Drone Station", "block.cosmiccore.drygmy_grove": "Drygmy Grove", "block.cosmiccore.dyson_solar_cell": "Dyson Solar Cell", - "block.cosmiccore.ember_tester": "Ember Tester", + "block.cosmiccore.ethersteel_plated_ash_tiles": "Ethersteel Plated Ash Tiles", + "block.cosmiccore.ev_biolab": "§5Advanced Bio Lab III§r", + "block.cosmiccore.ev_calx_reactor": "Ev Calx Reactor", + "block.cosmiccore.ev_electric_apiary": "EV Industrial Production Apiary", + "block.cosmiccore.ev_ember_emitter": "EV Ember Emitter", + "block.cosmiccore.ev_ember_input_hatch": "§5EV Ember Input Hatch", + "block.cosmiccore.ev_ember_output_hatch": "§5EV Ember Output Hatch", + "block.cosmiccore.ev_ember_receptor": "EV Ember Receptor", + "block.cosmiccore.ev_mana_leaching_tub": "Ev Mana Leaching Tub", + "block.cosmiccore.ev_roaster": "Ev Roaster", + "block.cosmiccore.ev_thermomagnitizer": "Ev Thermomagnitizer", + "block.cosmiccore.ev_vacuum_bubbler": "Ev Vacuum Bubbler", "block.cosmiccore.ev_wireless_charger": "EV Wireless Charger", "block.cosmiccore.extreme_combustion_engine_cc": "Extreme Combustion Engine Cc", "block.cosmiccore.fulgorinth_prime_casing": "Fulgorinth Prime Casing", @@ -44,31 +104,63 @@ "block.cosmiccore.high_tolerance_rhenium_casing": "High Tolerance Rhenium Casing", "block.cosmiccore.highly_conductive_fission_casing": "Highly Conductive Fission Casing", "block.cosmiccore.highly_flexible_reinforced_trinavine_casing": "Highly Flexible Reinforced Trinavine Casing", + "block.cosmiccore.honey_alveary": "§eHyper Optimized Nectar Extraction Yard [HONEY]", "block.cosmiccore.hp_steam_bender": "High Pressure Steam Bender", "block.cosmiccore.hp_steam_wiremill": "High Pressure Steam Wiremill", "block.cosmiccore.hpca_indicator": "HPCA Indicator", "block.cosmiccore.huge_sterilization_hatch": "Sterilzation Hatch", + "block.cosmiccore.hv_calx_reactor": "Hv Calx Reactor", + "block.cosmiccore.hv_electric_apiary": "HV Industrial Production Apiary", + "block.cosmiccore.hv_ember_emitter": "HV Ember Emitter", + "block.cosmiccore.hv_ember_input_hatch": "§6HV Ember Input Hatch", + "block.cosmiccore.hv_ember_output_hatch": "§6HV Ember Output Hatch", + "block.cosmiccore.hv_ember_receptor": "HV Ember Receptor", + "block.cosmiccore.hv_energy_output_hatch_16a": "§6HV 16A Dynamo Hatch", + "block.cosmiccore.hv_energy_output_hatch_4a": "§6HV 4A Dynamo Hatch", + "block.cosmiccore.hv_input_hatch_4x": "§6HV Quadruple Input Hatch", + "block.cosmiccore.hv_mana_leaching_tub": "Hv Mana Leaching Tub", + "block.cosmiccore.hv_output_hatch_4x": "§6HV Quadruple Output Hatch", + "block.cosmiccore.hv_roaster": "Hv Roaster", + "block.cosmiccore.hv_thermomagnitizer": "Hv Thermomagnitizer", + "block.cosmiccore.hv_vacuum_bubbler": "Hv Vacuum Bubbler", "block.cosmiccore.hv_wireless_charger": "HV Wireless Charger", "block.cosmiccore.industrial_chemical_vat": "Industrial Chemical Vat", "block.cosmiccore.industrial_primitive_blast_furnace": "Industrial Primitive Blast Furnace", + "block.cosmiccore.iron_plated_deepslate_tile": "Iron Plated Deepslate Tile", + "block.cosmiccore.iron_plated_deepslate_tile_slab": "Iron Plated Deepslate Tile Slab", + "block.cosmiccore.iron_plated_deepslate_tile_stairs": "Iron Plated Deepslate Tile Stairs", "block.cosmiccore.iv_16a_wireless_energy_dynamo": "§9IV 16A Wireless Energy Dynamo", "block.cosmiccore.iv_16a_wireless_energy_hatch": "§9IV 16A Wireless Energy Hatch", "block.cosmiccore.iv_4a_wireless_energy_dynamo": "§9IV 4A Wireless Energy Dynamo", "block.cosmiccore.iv_4a_wireless_energy_hatch": "§9IV 4A Wireless Energy Hatch", + "block.cosmiccore.iv_biolab": "§9Elite Bio Lab §r", + "block.cosmiccore.iv_calx_reactor": "Iv Calx Reactor", + "block.cosmiccore.iv_electric_apiary": "IV Industrial Production Apiary", + "block.cosmiccore.iv_ember_emitter": "IV Ember Emitter", "block.cosmiccore.iv_ember_input_hatch": "§9IV Ember Input Hatch", "block.cosmiccore.iv_ember_output_hatch": "§9IV Ember Output Hatch", + "block.cosmiccore.iv_ember_receptor": "IV Ember Receptor", + "block.cosmiccore.iv_mana_leaching_tub": "Iv Mana Leaching Tub", "block.cosmiccore.iv_naquahine_mini_reactor": "§9Elite Naquahine Mini Reactor Generator §r", + "block.cosmiccore.iv_roaster": "Iv Roaster", "block.cosmiccore.iv_soul_input_hatch": "§9IV Soul Input Hatch", "block.cosmiccore.iv_soul_output_hatch": "§9IV Soul Output Hatch", "block.cosmiccore.iv_thermia_export_hatch": "Iv Thermia Export Hatch", "block.cosmiccore.iv_thermia_import_hatch": "Iv Thermia Import Hatch", + "block.cosmiccore.iv_thermomagnitizer": "Iv Thermomagnitizer", + "block.cosmiccore.iv_vacuum_bubbler": "Iv Vacuum Bubbler", "block.cosmiccore.iv_wireless_charger": "IV Wireless Charger", "block.cosmiccore.iv_wireless_energy_dynamo": "§9IV Wireless Energy Dynamo", "block.cosmiccore.iv_wireless_energy_hatch": "§9IV Wireless Energy Hatch", "block.cosmiccore.large_combustion_engine_cc": "Large Combustion Engine Cc", "block.cosmiccore.large_laminator": "§1Large Laminator", + "block.cosmiccore.large_roaster": "§cLarge Roaster", "block.cosmiccore.large_spooling_machine": "Large Spooling Machine", + "block.cosmiccore.larva": "Logistic Asteroid Reclamation and Valuing Assembly [LARVA]", + "block.cosmiccore.light_dawnstone_casing": "Light Dawnstone Casing", + "block.cosmiccore.link_test_station": "Link Test Station", "block.cosmiccore.living_igniclad_coil_block": "Living Igniclad Coil Block", + "block.cosmiccore.livingrock_tiles": "Livingrock Tiles", "block.cosmiccore.lp_steam_bender": "I DO NOT EXIST", "block.cosmiccore.lp_steam_wiremill": "I DO NOT EXIST", "block.cosmiccore.ludicrious_intake": "Ludicrious Intake", @@ -78,20 +170,63 @@ "block.cosmiccore.luv_16a_wireless_energy_hatch": "§dLuV 16A Wireless Energy Hatch", "block.cosmiccore.luv_4a_wireless_energy_dynamo": "§dLuV 4A Wireless Energy Dynamo", "block.cosmiccore.luv_4a_wireless_energy_hatch": "§dLuV 4A Wireless Energy Hatch", + "block.cosmiccore.luv_biolab": "§dElite Bio Lab II§r", + "block.cosmiccore.luv_calx_reactor": "Luv Calx Reactor", + "block.cosmiccore.luv_electric_apiary": "LuV Industrial Production Apiary", + "block.cosmiccore.luv_ember_emitter": "LuV Ember Emitter", "block.cosmiccore.luv_ember_input_hatch": "§dLuV Ember Input Hatch", "block.cosmiccore.luv_ember_output_hatch": "§dLuV Ember Output Hatch", + "block.cosmiccore.luv_ember_receptor": "LuV Ember Receptor", + "block.cosmiccore.luv_mana_leaching_tub": "Luv Mana Leaching Tub", "block.cosmiccore.luv_naquahine_mini_reactor": "§dElite Naquahine Mini Reactor Generator II§r", + "block.cosmiccore.luv_roaster": "Luv Roaster", "block.cosmiccore.luv_soul_input_hatch": "§dLuV Soul Input Hatch", "block.cosmiccore.luv_soul_output_hatch": "§dLuV Soul Output Hatch", "block.cosmiccore.luv_thermia_export_hatch": "Luv Thermia Export Hatch", "block.cosmiccore.luv_thermia_import_hatch": "Luv Thermia Import Hatch", + "block.cosmiccore.luv_thermomagnitizer": "Luv Thermomagnitizer", + "block.cosmiccore.luv_vacuum_bubbler": "Luv Vacuum Bubbler", "block.cosmiccore.luv_wireless_charger": "LuV Wireless Charger", "block.cosmiccore.luv_wireless_energy_dynamo": "§dLuV Wireless Energy Dynamo", "block.cosmiccore.luv_wireless_energy_hatch": "§dLuV Wireless Energy Hatch", + "block.cosmiccore.lv_calx_reactor": "Lv Calx Reactor", + "block.cosmiccore.lv_electric_apiary": "LV Industrial Production Apiary", + "block.cosmiccore.lv_ember_emitter": "LV Ember Emitter", + "block.cosmiccore.lv_ember_input_hatch": "§7LV Ember Input Hatch", + "block.cosmiccore.lv_ember_output_hatch": "§7LV Ember Output Hatch", + "block.cosmiccore.lv_ember_receptor": "LV Ember Receptor", + "block.cosmiccore.lv_energy_output_hatch_16a": "§7LV 16A Dynamo Hatch", + "block.cosmiccore.lv_energy_output_hatch_4a": "§7LV 4A Dynamo Hatch", + "block.cosmiccore.lv_mana_leaching_tub": "Lv Mana Leaching Tub", + "block.cosmiccore.lv_roaster": "Lv Roaster", + "block.cosmiccore.lv_thermomagnitizer": "Lv Thermomagnitizer", + "block.cosmiccore.lv_vacuum_bubbler": "Lv Vacuum Bubbler", "block.cosmiccore.machine_casing_gearbox_naquadria": "Machine Casing Gearbox Naquadria", "block.cosmiccore.machine_casing_gearbox_pthanterum": "Machine Casing Gearbox Pthanterum", + "block.cosmiccore.mana_etching_factory": "Mana Etching Factory", "block.cosmiccore.mantle_bore": "Mantle Bore", + "block.cosmiccore.max_ember_emitter": "MAX Ember Emitter", + "block.cosmiccore.max_ember_receptor": "MAX Ember Receptor", + "block.cosmiccore.moth_cargo_drop_off": "Moth Cargo Drop Off", + "block.cosmiccore.moth_cargo_station": "Moth Cargo Station", + "block.cosmiccore.moth_home_t1": "Moth Home (T1)", + "block.cosmiccore.moth_home_t2": "Moth Home (T2)", + "block.cosmiccore.moth_home_t3": "Moth Home (T3)", + "block.cosmiccore.moth_home_t4": "Moth Home (T4)", + "block.cosmiccore.moth_station_casing": "Moth Station Casing", "block.cosmiccore.multi_purpose_interstellar_grade_casing": "Multi Purpose Interstellar Grade Casing", + "block.cosmiccore.mv_calx_reactor": "Mv Calx Reactor", + "block.cosmiccore.mv_electric_apiary": "MV Industrial Production Apiary", + "block.cosmiccore.mv_ember_emitter": "MV Ember Emitter", + "block.cosmiccore.mv_ember_input_hatch": "§bMV Ember Input Hatch", + "block.cosmiccore.mv_ember_output_hatch": "§bMV Ember Output Hatch", + "block.cosmiccore.mv_ember_receptor": "MV Ember Receptor", + "block.cosmiccore.mv_energy_output_hatch_16a": "§bMV 16A Dynamo Hatch", + "block.cosmiccore.mv_energy_output_hatch_4a": "§bMV 4A Dynamo Hatch", + "block.cosmiccore.mv_mana_leaching_tub": "Mv Mana Leaching Tub", + "block.cosmiccore.mv_roaster": "Mv Roaster", + "block.cosmiccore.mv_thermomagnitizer": "Mv Thermomagnitizer", + "block.cosmiccore.mv_vacuum_bubbler": "Mv Vacuum Bubbler", "block.cosmiccore.naquadah_pressure_resistant_casing": "Naquadah Pressure Resistant Casing", "block.cosmiccore.naquadric_superalloy_coil_block": "Naquadric Superalloy Coil Block", "block.cosmiccore.naquahine_pressure_reactor": "Naquahine Pressure Reactor", @@ -100,12 +235,19 @@ "block.cosmiccore.opv_16a_wireless_energy_hatch": "§9§lOpV 16A Wireless Energy Hatch", "block.cosmiccore.opv_4a_wireless_energy_dynamo": "§9§lOpV 4A Wireless Energy Dynamo", "block.cosmiccore.opv_4a_wireless_energy_hatch": "§9§lOpV 4A Wireless Energy Hatch", + "block.cosmiccore.opv_calx_reactor": "Opv Calx Reactor", + "block.cosmiccore.opv_ember_emitter": "OPV Ember Emitter", "block.cosmiccore.opv_ember_input_hatch": "§9§lOpV Ember Input Hatch", "block.cosmiccore.opv_ember_output_hatch": "§9§lOpV Ember Output Hatch", + "block.cosmiccore.opv_ember_receptor": "OPV Ember Receptor", + "block.cosmiccore.opv_mana_leaching_tub": "Opv Mana Leaching Tub", + "block.cosmiccore.opv_roaster": "Opv Roaster", "block.cosmiccore.opv_soul_input_hatch": "§9§lOpV Soul Input Hatch", "block.cosmiccore.opv_soul_output_hatch": "§9§lOpV Soul Output Hatch", "block.cosmiccore.opv_thermia_export_hatch": "Opv Thermia Export Hatch", "block.cosmiccore.opv_thermia_import_hatch": "Opv Thermia Import Hatch", + "block.cosmiccore.opv_thermomagnitizer": "Opv Thermomagnitizer", + "block.cosmiccore.opv_vacuum_bubbler": "Opv Vacuum Bubbler", "block.cosmiccore.opv_wireless_energy_dynamo": "§9§lOpV Wireless Energy Dynamo", "block.cosmiccore.opv_wireless_energy_hatch": "§9§lOpV Wireless Energy Hatch", "block.cosmiccore.orbital_tempering_forge": "Orbital Tempering Forge", @@ -120,42 +262,67 @@ "block.cosmiccore.programable_matter_coil_block": "Programable Matter Coil Block", "block.cosmiccore.psionic_galvorn_coil_block": "Psionic Galvorn Coil Block", "block.cosmiccore.pthanterum_wave_breakers": "Pthanterum Wave Breakers", + "block.cosmiccore.pyrothermic_refinery": "Pyrothermic Refinery", "block.cosmiccore.radioactive_filter_casing": "Radioactive Filter Casing", "block.cosmiccore.reflective_starmetal_casing": "Reflective Starmetal Casing", + "block.cosmiccore.reinforced_dawnstone_casing": "Reinforced Dawnstone Casing", "block.cosmiccore.reinforced_naquadria_casing": "Reinforced Naquadria Casing", "block.cosmiccore.reinforced_trinavine_coil_block": "Reinforced Trinavine Coil Block", "block.cosmiccore.resonant_virtue_meld_coil_block": "Resonant Virtue Meld Coil Block", "block.cosmiccore.resonantly_tuned_virtue_meld_casing": "Resonantly Tuned Virtue Meld Casing", + "block.cosmiccore.rigid_high_speed_steel_casing": "Rigid High Speed Steel Casing", "block.cosmiccore.royal_ichorium_casing": "Royal Ichorium Casing", + "block.cosmiccore.rust_stained_casing": "Rust Stained Casing", + "block.cosmiccore.rust_weave_casing": "Rust Weave Casing", "block.cosmiccore.self_healing_pthanterum_casing": "Self Healing Pthanterum Casing", "block.cosmiccore.sensor_hatch": "Sensor Hatch", "block.cosmiccore.shimmering_neutronium_coil_block": "Shimmering Neutronium Coil Block", + "block.cosmiccore.somarust_casing": "Somarust Casing", + "block.cosmiccore.soul_muted_casing": "Soul Muted Casing", + "block.cosmiccore.soul_stained_steel_aluminium_plated_casing": "Soul Stained Steel Aluminium Plated Casing", "block.cosmiccore.spirit_crucible": "Spirit Crucible", - "block.cosmiccore.star_ballast": "Star Ballast", "block.cosmiccore.star_ladder": "Star Ladder", + "block.cosmiccore.star_ladder_research_hub": "Star Ladder Research Hub", "block.cosmiccore.steam_caster": "Steam Caster", + "block.cosmiccore.steam_ember_emitter": "Steam Ember Emitter", + "block.cosmiccore.steam_ember_receptor": "Steam Ember Receptor", "block.cosmiccore.steam_fluid_input_hatch": "Fluid Input Hatch (Steam)", "block.cosmiccore.steam_fluid_output_hatch": "Fluid Output Hatch (Steam)", + "block.cosmiccore.steam_large_turbine": "Steam Large Turbine", "block.cosmiccore.steam_mixing_vessel": "Steam Mixing Vessel", "block.cosmiccore.steel_plated_bronze_casing": "Steel Plated Bronze Casing", + "block.cosmiccore.steel_rose_lantern": "Steel Rose Lantern", + "block.cosmiccore.steel_rose_light": "Steel Rose Light", + "block.cosmiccore.steel_rose_light_slab": "Steel Rose Light Slab", + "block.cosmiccore.steel_rose_light_stairs": "Steel Rose Light Stairs", "block.cosmiccore.stellar_iris": "Stellar Iris", "block.cosmiccore.stellar_neutronium_grade_magnet": "Stellar Neutronium Grade Magnet", + "block.cosmiccore.stellar_smelting_module": "Ignition Complex : GRAND FORGE", "block.cosmiccore.sterilization_hatch": "Sterilzation Hatch", "block.cosmiccore.submerged_welder": "§3Submerged Welder", "block.cosmiccore.suffering_chamber": "§cSuffering Chamber", + "block.cosmiccore.superheavy_steel_casing": "Superheavy Steel Casing", "block.cosmiccore.titan_fusion_reactor": "§9Titan Fusion Reactor", "block.cosmiccore.tritanium_lined_heavy_neutronium_casing": "Tritanium Lined Heavy Neutronium Casing", "block.cosmiccore.uev_16a_wireless_energy_dynamo": "§aUEV 16A Wireless Energy Dynamo", "block.cosmiccore.uev_16a_wireless_energy_hatch": "§aUEV 16A Wireless Energy Hatch", "block.cosmiccore.uev_4a_wireless_energy_dynamo": "§aUEV 4A Wireless Energy Dynamo", "block.cosmiccore.uev_4a_wireless_energy_hatch": "§aUEV 4A Wireless Energy Hatch", + "block.cosmiccore.uev_calx_reactor": "Uev Calx Reactor", "block.cosmiccore.uev_cosmic_parallel_hatch": "WarpTech Parallel Control Hatch", + "block.cosmiccore.uev_ember_emitter": "UEV Ember Emitter", "block.cosmiccore.uev_ember_input_hatch": "§aUEV Ember Input Hatch", "block.cosmiccore.uev_ember_output_hatch": "§aUEV Ember Output Hatch", + "block.cosmiccore.uev_ember_receptor": "UEV Ember Receptor", + "block.cosmiccore.uev_mana_leaching_tub": "Uev Mana Leaching Tub", + "block.cosmiccore.uev_module_hatch": "Elite Module Hatch", + "block.cosmiccore.uev_roaster": "Uev Roaster", "block.cosmiccore.uev_soul_input_hatch": "§aUEV Soul Input Hatch", "block.cosmiccore.uev_soul_output_hatch": "§aUEV Soul Output Hatch", "block.cosmiccore.uev_thermia_export_hatch": "Uev Thermia Export Hatch", "block.cosmiccore.uev_thermia_import_hatch": "Uev Thermia Import Hatch", + "block.cosmiccore.uev_thermomagnitizer": "Uev Thermomagnitizer", + "block.cosmiccore.uev_vacuum_bubbler": "Uev Vacuum Bubbler", "block.cosmiccore.uev_wireless_charger": "UEV Wireless Charger", "block.cosmiccore.uev_wireless_energy_dynamo": "§aUEV Wireless Energy Dynamo", "block.cosmiccore.uev_wireless_energy_hatch": "§aUEV Wireless Energy Hatch", @@ -163,15 +330,22 @@ "block.cosmiccore.uhv_16a_wireless_energy_hatch": "§4UHV 16A Wireless Energy Hatch", "block.cosmiccore.uhv_4a_wireless_energy_dynamo": "§4UHV 4A Wireless Energy Dynamo", "block.cosmiccore.uhv_4a_wireless_energy_hatch": "§4UHV 4A Wireless Energy Hatch", + "block.cosmiccore.uhv_calx_reactor": "Uhv Calx Reactor", "block.cosmiccore.uhv_cosmic_parallel_hatch": "Extreme Parallel Control Hatch", + "block.cosmiccore.uhv_ember_emitter": "UHV Ember Emitter", "block.cosmiccore.uhv_ember_input_hatch": "§4UHV Ember Input Hatch", "block.cosmiccore.uhv_ember_output_hatch": "§4UHV Ember Output Hatch", - "block.cosmiccore.uhv_name": "Assembly Module MK IV", + "block.cosmiccore.uhv_ember_receptor": "UHV Ember Receptor", + "block.cosmiccore.uhv_mana_leaching_tub": "Uhv Mana Leaching Tub", + "block.cosmiccore.uhv_module_hatch": "Advanced Module Hatch", "block.cosmiccore.uhv_naquahine_mini_reactor": "§4Epic Naquahine Mini Reactor Generator §r", + "block.cosmiccore.uhv_roaster": "Uhv Roaster", "block.cosmiccore.uhv_soul_input_hatch": "§4UHV Soul Input Hatch", "block.cosmiccore.uhv_soul_output_hatch": "§4UHV Soul Output Hatch", "block.cosmiccore.uhv_thermia_export_hatch": "Uhv Thermia Export Hatch", "block.cosmiccore.uhv_thermia_import_hatch": "Uhv Thermia Import Hatch", + "block.cosmiccore.uhv_thermomagnitizer": "Uhv Thermomagnitizer", + "block.cosmiccore.uhv_vacuum_bubbler": "Uhv Vacuum Bubbler", "block.cosmiccore.uhv_wireless_charger": "UHV Wireless Charger", "block.cosmiccore.uhv_wireless_energy_dynamo": "§4UHV Wireless Energy Dynamo", "block.cosmiccore.uhv_wireless_energy_hatch": "§4UHV Wireless Energy Hatch", @@ -179,32 +353,49 @@ "block.cosmiccore.uiv_16a_wireless_energy_hatch": "§2UIV 16A Wireless Energy Hatch", "block.cosmiccore.uiv_4a_wireless_energy_dynamo": "§2UIV 4A Wireless Energy Dynamo", "block.cosmiccore.uiv_4a_wireless_energy_hatch": "§2UIV 4A Wireless Energy Hatch", + "block.cosmiccore.uiv_calx_reactor": "Uiv Calx Reactor", "block.cosmiccore.uiv_cosmic_parallel_hatch": "Simple Parallel Control Hatch", + "block.cosmiccore.uiv_ember_emitter": "UIV Ember Emitter", "block.cosmiccore.uiv_ember_input_hatch": "§2UIV Ember Input Hatch", "block.cosmiccore.uiv_ember_output_hatch": "§2UIV Ember Output Hatch", + "block.cosmiccore.uiv_ember_receptor": "UIV Ember Receptor", + "block.cosmiccore.uiv_mana_leaching_tub": "Uiv Mana Leaching Tub", + "block.cosmiccore.uiv_roaster": "Uiv Roaster", "block.cosmiccore.uiv_soul_input_hatch": "§2UIV Soul Input Hatch", "block.cosmiccore.uiv_soul_output_hatch": "§2UIV Soul Output Hatch", "block.cosmiccore.uiv_thermia_export_hatch": "Uiv Thermia Export Hatch", "block.cosmiccore.uiv_thermia_import_hatch": "Uiv Thermia Import Hatch", + "block.cosmiccore.uiv_thermomagnitizer": "Uiv Thermomagnitizer", + "block.cosmiccore.uiv_vacuum_bubbler": "Uiv Vacuum Bubbler", "block.cosmiccore.uiv_wireless_charger": "UIV Wireless Charger", "block.cosmiccore.uiv_wireless_energy_dynamo": "§2UIV Wireless Energy Dynamo", "block.cosmiccore.uiv_wireless_energy_hatch": "§2UIV Wireless Energy Hatch", "block.cosmiccore.ultimate_combustion_engine_cc": "Ultimate Combustion Engine Cc", "block.cosmiccore.ultimate_intake": "Ultimate Intake", "block.cosmiccore.ultra_powered_casing": "Ultra Powered Casing", + "block.cosmiccore.ulv_energy_output_hatch_16a": "§8ULV 16A Dynamo Hatch", + "block.cosmiccore.ulv_energy_output_hatch_4a": "§8ULV 4A Dynamo Hatch", "block.cosmiccore.uv_16a_wireless_energy_dynamo": "§3UV 16A Wireless Energy Dynamo", "block.cosmiccore.uv_16a_wireless_energy_hatch": "§3UV 16A Wireless Energy Hatch", "block.cosmiccore.uv_4a_wireless_energy_dynamo": "§3UV 4A Wireless Energy Dynamo", "block.cosmiccore.uv_4a_wireless_energy_hatch": "§3UV 4A Wireless Energy Hatch", + "block.cosmiccore.uv_biolab": "§3Ultimate Bio Lab §r", + "block.cosmiccore.uv_calx_reactor": "Uv Calx Reactor", "block.cosmiccore.uv_cosmic_parallel_hatch": "Simple Parallel Control Hatch", + "block.cosmiccore.uv_ember_emitter": "UV Ember Emitter", "block.cosmiccore.uv_ember_input_hatch": "§3UV Ember Input Hatch", "block.cosmiccore.uv_ember_output_hatch": "§3UV Ember Output Hatch", - "block.cosmiccore.uv_name": "Assembly Module MK III", + "block.cosmiccore.uv_ember_receptor": "UV Ember Receptor", + "block.cosmiccore.uv_mana_leaching_tub": "Uv Mana Leaching Tub", + "block.cosmiccore.uv_module_hatch": "Basic Module Hatch", "block.cosmiccore.uv_naquahine_mini_reactor": "§3Ultimate Naquahine Mini Reactor Generator §r", + "block.cosmiccore.uv_roaster": "Uv Roaster", "block.cosmiccore.uv_soul_input_hatch": "§3UV Soul Input Hatch", "block.cosmiccore.uv_soul_output_hatch": "§3UV Soul Output Hatch", "block.cosmiccore.uv_thermia_export_hatch": "Uv Thermia Export Hatch", "block.cosmiccore.uv_thermia_import_hatch": "Uv Thermia Import Hatch", + "block.cosmiccore.uv_thermomagnitizer": "Uv Thermomagnitizer", + "block.cosmiccore.uv_vacuum_bubbler": "Uv Vacuum Bubbler", "block.cosmiccore.uv_wireless_charger": "UV Wireless Charger", "block.cosmiccore.uv_wireless_energy_dynamo": "§3UV Wireless Energy Dynamo", "block.cosmiccore.uv_wireless_energy_hatch": "§3UV Wireless Energy Hatch", @@ -212,20 +403,30 @@ "block.cosmiccore.uxv_16a_wireless_energy_hatch": "§eUXV 16A Wireless Energy Hatch", "block.cosmiccore.uxv_4a_wireless_energy_dynamo": "§eUXV 4A Wireless Energy Dynamo", "block.cosmiccore.uxv_4a_wireless_energy_hatch": "§eUXV 4A Wireless Energy Hatch", + "block.cosmiccore.uxv_calx_reactor": "Uxv Calx Reactor", + "block.cosmiccore.uxv_ember_emitter": "UXV Ember Emitter", "block.cosmiccore.uxv_ember_input_hatch": "§eUXV Ember Input Hatch", "block.cosmiccore.uxv_ember_output_hatch": "§eUXV Ember Output Hatch", + "block.cosmiccore.uxv_ember_receptor": "UXV Ember Receptor", + "block.cosmiccore.uxv_mana_leaching_tub": "Uxv Mana Leaching Tub", + "block.cosmiccore.uxv_roaster": "Uxv Roaster", "block.cosmiccore.uxv_soul_input_hatch": "§eUXV Soul Input Hatch", "block.cosmiccore.uxv_soul_output_hatch": "§eUXV Soul Output Hatch", "block.cosmiccore.uxv_thermia_export_hatch": "Uxv Thermia Export Hatch", "block.cosmiccore.uxv_thermia_import_hatch": "Uxv Thermia Import Hatch", + "block.cosmiccore.uxv_thermomagnitizer": "Uxv Thermomagnitizer", + "block.cosmiccore.uxv_vacuum_bubbler": "Uxv Vacuum Bubbler", "block.cosmiccore.uxv_wireless_energy_dynamo": "§eUXV Wireless Energy Dynamo", "block.cosmiccore.uxv_wireless_energy_hatch": "§eUXV Wireless Energy Hatch", "block.cosmiccore.vibrant_rubidium_casing": "Vibrant Rubidium Casing", + "block.cosmiccore.vile_fission": "§cFestering Fission Reactor", "block.cosmiccore.void_fluid_rig": "§cVoid Fluid Rig", "block.cosmiccore.void_miner": "§cVoid Miner", + "block.cosmiccore.void_salt_fissiom": "§5Voidtouched Salt Fission Reactor", "block.cosmiccore.vomahine_celestial_laser_bore": "Vomahine Celestial Laser Bore", "block.cosmiccore.vorax_reactor": "Vorax Reactor", "block.cosmiccore.wailing_ichor_casing": "Wailing Ichor Casing", + "block.cosmiccore.wasp": "Wide Asteroid Separation Platform [WASP]", "block.cosmiccore.wear_resistant_ruridit_casing": "Wear Resistant Ruridit Casing", "block.cosmiccore.wireless_data_hatch": "Wireless Data Hatch", "block.cosmiccore.wireless_data_transmitter": "Wireless Data Transmitter", @@ -234,15 +435,22 @@ "block.cosmiccore.zpm_16a_wireless_energy_hatch": "§cZPM 16A Wireless Energy Hatch", "block.cosmiccore.zpm_4a_wireless_energy_dynamo": "§cZPM 4A Wireless Energy Dynamo", "block.cosmiccore.zpm_4a_wireless_energy_hatch": "§cZPM 4A Wireless Energy Hatch", + "block.cosmiccore.zpm_biolab": "§cElite Bio Lab III§r", + "block.cosmiccore.zpm_calx_reactor": "Zpm Calx Reactor", "block.cosmiccore.zpm_cosmic_parallel_hatch": "Simple Parallel Control Hatch", + "block.cosmiccore.zpm_ember_emitter": "ZPM Ember Emitter", "block.cosmiccore.zpm_ember_input_hatch": "§cZPM Ember Input Hatch", "block.cosmiccore.zpm_ember_output_hatch": "§cZPM Ember Output Hatch", - "block.cosmiccore.zpm_name": "Assembly Module MK II", + "block.cosmiccore.zpm_ember_receptor": "ZPM Ember Receptor", + "block.cosmiccore.zpm_mana_leaching_tub": "Zpm Mana Leaching Tub", "block.cosmiccore.zpm_naquahine_mini_reactor": "§cElite Naquahine Mini Reactor Generator III§r", + "block.cosmiccore.zpm_roaster": "Zpm Roaster", "block.cosmiccore.zpm_soul_input_hatch": "§cZPM Soul Input Hatch", "block.cosmiccore.zpm_soul_output_hatch": "§cZPM Soul Output Hatch", "block.cosmiccore.zpm_thermia_export_hatch": "Zpm Thermia Export Hatch", "block.cosmiccore.zpm_thermia_import_hatch": "Zpm Thermia Import Hatch", + "block.cosmiccore.zpm_thermomagnitizer": "Zpm Thermomagnitizer", + "block.cosmiccore.zpm_vacuum_bubbler": "Zpm Vacuum Bubbler", "block.cosmiccore.zpm_wireless_charger": "ZPM Wireless Charger", "block.cosmiccore.zpm_wireless_energy_dynamo": "§cZPM Wireless Energy Dynamo", "block.cosmiccore.zpm_wireless_energy_hatch": "§cZPM Wireless Energy Hatch", @@ -268,10 +476,7 @@ "config.jade.plugin_cosmiccore.drone_maintenance_interface": "[CC] Drone Maintenance Interface", "config.jade.plugin_cosmiccore.drone_station": "[CC] Drone Station", "config.jade.plugin_cosmiccore.parallel_info_cc": "[CC] Parallel Info", - "coscore.pattern.div": "§c%d÷§f", - "coscore.pattern.multiply": "§b%dx§f", - "coscore.pattern.tooltip.div": "Divides contents by §b%d§f", - "coscore.pattern.tooltip.multiply": "Multiplies contents by §c%d§f", + "config.jade.plugin_cosmiccore.stellar_module": "[CC] Stellar Module", "cosmic.command.wireless.energy.active": " §bActive:§b %s", "cosmic.command.wireless.energy.buffered": " §bBuffered:§b %s EU", "cosmic.command.wireless.energy.capacitor": " §bCapacitor Location:§b ", @@ -318,6 +523,21 @@ "cosmiccore.armor.sanguinewarptech.hud.LP": "§4Life Force: §c%s", "cosmiccore.armor.sanguinewarptech.hud.shieldstate": "Sanguine Shield: %s", "cosmiccore.armor.sanguinewarptech.message.death_defiance": "Your sanguine armor protected you from death!", + "cosmiccore.booster.tooltip.prefix": "§bBooster:§r Tier %s", + "cosmiccore.boots.hud.jump": "Jump: %s", + "cosmiccore.boots.hud.speed": "Speed: %s %s", + "cosmiccore.boots.hud.speed_simple": "Speed: %s", + "cosmiccore.boots.inertia_cancel": "Inertia Dampening: %s", + "cosmiccore.boots.jump_modifier": "Jump Modifier: %s", + "cosmiccore.boots.max_speed": "Max Speed: %s", + "cosmiccore.boots.message.inertia": "Inertia Dampening: %s", + "cosmiccore.boots.message.jump": "Jump Modifier: %s", + "cosmiccore.boots.message.speed": "Speed Modifier: %s", + "cosmiccore.boots.message.step": "Step Assist: %s", + "cosmiccore.boots.speed_modifier": "Speed Modifier: %s", + "cosmiccore.boots.step_assist": "Step Assist: %s", + "cosmiccore.calorific.tooltip.prefix": "§5Calorific:§r %s", + "cosmiccore.calx_reactor.desc": "Working wonders with the Arcane", "cosmiccore.circuit.lore.tier.max.0": "MAX Tier Circuit", "cosmiccore.circuit.lore.tier.max.1": "Not a processor- but an Obituary.", "cosmiccore.circuit.lore.tier.max.2": "Input: Existence.", @@ -331,7 +551,12 @@ "cosmiccore.conjuct_valkruth.1": "§6Val - Overwhelming", "cosmiccore.conjuct_valkruth.2": "§6Ruth - Foundation", "cosmiccore.conjuct_valkruth_emotion.1": "§bE.R.A - Convergence", + "cosmiccore.datastick.link_copied": "Link: %s", + "cosmiccore.ember.capacity": "§cEmber Capacity:§6 %s", + "cosmiccore.ember.transfer": "§cEmber Transfer Rate:§6 %s", "cosmiccore.errors.bad_fuel": "§aInsufficient Fuel Quality! \n Fuel Output Must be >720 EU total per unit", + "cosmiccore.gui.stellar.show_modules": "Show Module Control", + "cosmiccore.gui.stellar.show_star": "Show Star View", "cosmiccore.item.linked_terminal.boundTo": "Bound to %s", "cosmiccore.item.spraycan.tooltip.current_color": "Current Color: %s", "cosmiccore.item.spraycan.tooltip.lclick": "§4Left Click: §8Cycle color", @@ -341,8 +566,32 @@ "cosmiccore.item.spraycan.tooltip.rclick_offhand": "§5Right Click in Offhand: §8Place & paint", "cosmiccore.item.spraycan.tooltip.rclick_sneak": "§5Right Click + Sneak: §8Open UI", "cosmiccore.item.spraycan.tooltip.solvent_mode": "Spraycan in SOLVENT mode", + "cosmiccore.jade.stellar_module.connected": "Iris: Connected", + "cosmiccore.jade.stellar_module.energy_usage": "Usage: %s", + "cosmiccore.jade.stellar_module.iris_not_ready": "Iris: Not Ready", + "cosmiccore.jade.stellar_module.no_wireless": "No Wireless Network", + "cosmiccore.jade.stellar_module.not_connected": "Iris: Not Connected", + "cosmiccore.jade.stellar_module.speed_bonus": "Speed: %s", + "cosmiccore.jade.stellar_module.stage": "Stage: %s", "cosmiccore.khoruth.1": "§6Khor - Space", "cosmiccore.khoruth.2": "§6Ruth - Foundation", + "cosmiccore.link.already_linked": "These machines are already linked", + "cosmiccore.link.cannot_self_link": "Cannot link a machine to itself", + "cosmiccore.link.copied": "Link data copied from %s", + "cosmiccore.link.different_owner": "Cannot link machines owned by different teams", + "cosmiccore.link.established": "Link established: %s ↔ %s", + "cosmiccore.link.incompatible_partner": "Partner machine cannot link to this type", + "cosmiccore.link.incompatible_roles": "Incompatible link roles: %s cannot link to %s", + "cosmiccore.link.incompatible_self": "This machine cannot link to that type", + "cosmiccore.link.invalid_data": "Invalid link data on datastick", + "cosmiccore.link.limit_reached_partner": "Partner machine has reached its link limit", + "cosmiccore.link.limit_reached_self": "This machine has reached its link limit", + "cosmiccore.link.not_linkable": "Target machine does not support linking", + "cosmiccore.link.not_ready": "Machine not ready for linking", + "cosmiccore.link.partner_missing": "Partner machine no longer exists", + "cosmiccore.link.partner_not_loaded": "Partner machine must be loaded to establish link", + "cosmiccore.link.partner_offline": "Linked partner offline", + "cosmiccore.link.too_far": "Partner is too far away to force-load for linking", "cosmiccore.lore.broken_virtue.0": "Perpetuity Shudders Softly", "cosmiccore.lore.broken_virtue.1": "Something has gone very wrong.", "cosmiccore.lore.shard_huge.0": "§3An abnormally massive cluster from past eternity.", @@ -352,14 +601,43 @@ "cosmiccore.lore.shard_large.1": "§ait echos to rewrite fate.", "cosmiccore.lore.shard_small.0": "§6A shard from a past eternity", "cosmiccore.lore.shard_small.1": "§6it subtly echos to rewrite fate.", + "cosmiccore.lubricant.tooltip.prefix": "§6Lubricant:§r Tier %s", "cosmiccore.machine.capacitor_array.tooltip.0": "§7Local Dense Power Storage§r", "cosmiccore.machine.capacitor_array.tooltip.1": "§7Can use any capacitor and be expanded vertically up to 18 times§r", "cosmiccore.machine.capacitor_array.tooltip.2": "§7Accepts §6Laser Hatches§r", + "cosmiccore.machine.dreamers_basin.eu_budget_header": "Energy Budget", + "cosmiccore.machine.dreamers_basin.eu_per_thread": "%s EU/t per thread (%s)", + "cosmiccore.machine.dreamers_basin.status_idle": "Idle - No recipe", + "cosmiccore.machine.dreamers_basin.status_suspended": "Suspended", + "cosmiccore.machine.dreamers_basin.status_unknown": "Unknown", + "cosmiccore.machine.dreamers_basin.status_waiting": "Waiting for inputs", + "cosmiccore.machine.dreamers_basin.thread_header": "Thread Status", + "cosmiccore.machine.dreamers_basin.threads_summary": "%s running / %s active / %s max", + "cosmiccore.machine.dreamers_basin.time_remaining": "Time: %s remaining", + "cosmiccore.machine.dreamers_basin.tooltip.0": "§bRuns multiple unique recipes simultaneously", + "cosmiccore.machine.dreamers_basin.tooltip.1": "§fEach thread requires a uniquely §6colored§f input bus/hatch", + "cosmiccore.machine.dreamers_basin.tooltip.2": "§fMax threads = Energy Hatch amperage (4A=4, 16A=16)", + "cosmiccore.machine.dreamers_basin.tooltip.3": "§aAll threads share output buses/hatches", + "cosmiccore.machine.dreamers_basin.tooltip.crafting": "Crafting:", + "cosmiccore.machine.dreamers_basin.tooltip.duration": "Recipe duration: %s", + "cosmiccore.machine.dreamers_basin.tooltip.no_recipe": "No recipe data", + "cosmiccore.machine.dreamers_basin.tooltip.processing": " Processing...", "cosmiccore.machine.fluid_drilling_rig.depletion": "§bDepletion Rate: 0%", "cosmiccore.machine.fluid_drilling_rig.description.0": "§bDrills infinite fluid from", "cosmiccore.machine.fluid_drilling_rig.description.1": "§bliquid pockets suspended throughout the void.", "cosmiccore.machine.fluid_drilling_rig.production": "§eProduction Multiplier: 256x", - "cosmiccore.multiblock.advanced.star_ladder_tier": "§aVomahine StarLadder Tether Tier§f: §b%s \n §aMax Research Modules§f: §b%s", + "cosmiccore.machine.me.stocking_item.tooltip.0": "§fAutomatically pulls products into a singular item slot§r", + "cosmiccore.machine.me.stocking_item.tooltip.1": "§bAllows Advanced Automation of the Assembly line§r", + "cosmiccore.machine.me.stocking_item.tooltip.2": "§fCan be set to automatically pull the first item from AE2§r", + "cosmiccore.machine.me.stocking_item.tooltip.3": "§bor manually filtered.§r", + "cosmiccore.machine.me.stocking_item.tooltip.4": "§fFilter data can be copy/pasted with a data stick§r", + "cosmiccore.machine.me.stocking_item.tooltip.5": "§b'If you're wondering how to parallel assembly lines§r", + "cosmiccore.machine.me.stocking_item.tooltip.6": "§fthis is how. Welcome to subnets!§r", + "cosmiccore.machine.multithreaded.active_threads": "§7Active: §a%s§7/§f%s", + "cosmiccore.machine.multithreaded.max_threads": "§7Max Threads: §f%s", + "cosmiccore.machine.multithreaded.thread_status": "§b=== Thread Status ===", + "cosmiccore.mana_leaching_tub.desc": "Mana Soaker 9000", + "cosmiccore.multiblock.advanced.star_ladder_tier": "§aVomahine StarLadderOld Tether Tier§f: §b%s \n §aMax Research Modules§f: §b%s", "cosmiccore.multiblock.booster_used": "Booster: %s", "cosmiccore.multiblock.chemvat.tooltip.0": "§aA massive chemical plant capable of parallel", "cosmiccore.multiblock.chemvat.tooltip.1": "§fWhen parallelized, adds the cumulative time of all recipes together.", @@ -376,7 +654,15 @@ "cosmiccore.multiblock.drone_station_machine.current_tier": "Current tier: %s", "cosmiccore.multiblock.drone_station_machine.drone_amount": "Currently serving %s drones", "cosmiccore.multiblock.drone_station_machine.no_drones": "No drones connected", + "cosmiccore.multiblock.drone_station_machine.tier.0": "Plasmatic", + "cosmiccore.multiblock.drone_station_machine.tier.1": "Sanguine", + "cosmiccore.multiblock.drone_station_machine.tier.2": "Industrial", + "cosmiccore.multiblock.drone_station_machine.tier.3": "Robust", + "cosmiccore.multiblock.drone_station_machine.tier.4": "Rusty", + "cosmiccore.multiblock.drone_station_machine.tier.5": "None", "cosmiccore.multiblock.fuel_star": "§a§lFuel Star Core", + "cosmiccore.multiblock.heat_capacity": "§cMax Heat: %s", + "cosmiccore.multiblock.heat_value": "§6Current Heat: %s", "cosmiccore.multiblock.hpca.incomplete-array": "Incomplete Array will not generate", "cosmiccore.multiblock.hpsassem.tooltip.0": "§7§oLet's build an empire!", "cosmiccore.multiblock.hpsassem.tooltip.1": "§fA large but powerful assembler made of steel", @@ -384,7 +670,7 @@ "cosmiccore.multiblock.ipbf.tooltip.0": "§7§oTurn up the heat!", "cosmiccore.multiblock.ipbf.tooltip.1": "§fConsumes creosote with recipes to improve efficiency.", "cosmiccore.multiblock.ipbf.tooltip.2": "§aRecipes are §f25% §aFaster.", - "cosmiccore.multiblock.ipbf.tooltip.3": "§aParallel Amount§f: §b8x§r", + "cosmiccore.multiblock.ipbf.tooltip.3": "§aBatch Amount§f: §b8x§r", "cosmiccore.multiblock.iris.star_stage_early_star": "§aStar Core Stage§f: §6Infant Star", "cosmiccore.multiblock.iris.star_stage_empty": "§aStar Core Stage§f: §6Compressed Gas Cloud", "cosmiccore.multiblock.iris.star_stage_request": "§cStar Core Requires \n§r%s \n§cfor Next Stage.", @@ -399,9 +685,26 @@ "cosmiccore.multiblock.naqreactor.tooltip.0": "§cA massive reactor powered by explosions and reactive fuel", "cosmiccore.multiblock.naqreactor.tooltip.1": "§bWill always attempt to parallel to 16x output.", "cosmiccore.multiblock.naqreactor.tooltip.2": "§cOnly Accepts Laser hatches.", + "cosmiccore.multiblock.pattern.stellar_module_slot": "§7Module Slot (Air or Formed Module)", "cosmiccore.multiblock.reboot_powergrid": "§aReboot All Connected Machines", "cosmiccore.multiblock.send_orbit_data": "§a§lSend Research Payload", "cosmiccore.multiblock.sleep_powergrid": "§cSuspend All Connected Machines", + "cosmiccore.multiblock.star_ladder.tooltip.0": "§cThe peaks of creation reach out into the stars", + "cosmiccore.multiblock.star_ladder.tooltip.1": "§c§lDANGER: DATA LOSS PRESENT", + "cosmiccore.multiblock.star_ladder.tooltip.2": "§c§lDANGER: RECOVERY IS POSSIBLE", + "cosmiccore.multiblock.star_ladder.tooltip.3": "§aPinacle Multiblock : The Final Goal of ACT1 (Steam to IV)", + "cosmiccore.multiblock.stellar_module.connected": "§aConnected to Stellar Iris", + "cosmiccore.multiblock.stellar_module.energy_usage": "§eWireless EU/t: §f%s", + "cosmiccore.multiblock.stellar_module.iris_not_formed": "§cStellar Iris Not Formed", + "cosmiccore.multiblock.stellar_module.iris_not_ready": "§eStellar Iris Not Ready", + "cosmiccore.multiblock.stellar_module.loading": "§7Loading...", + "cosmiccore.multiblock.stellar_module.no_wireless": "§cNo Wireless Energy Network", + "cosmiccore.multiblock.stellar_module.not_connected": "§cNot Connected to Stellar Iris", + "cosmiccore.multiblock.stellar_module.parallel": "§7Parallel Limit: §b%s", + "cosmiccore.multiblock.stellar_module.power_config": "§7Config: §b%s §7@ §a%dx §7Parallel", + "cosmiccore.multiblock.stellar_module.power_failure": "§c§lPOWER FAILURE - Insufficient Energy!", + "cosmiccore.multiblock.stellar_module.speed_bonus": "§7Speed Bonus: §a%s", + "cosmiccore.multiblock.stellar_module.stage": "§7Iris Stage: §e%s", "cosmiccore.omnia_circuit.ev": "§6Works as any EV Circuit.", "cosmiccore.omnia_circuit.hv": "§6Works as any HV Circuit.", "cosmiccore.omnia_circuit.iv": "§6Works as any IV Circuit.", @@ -415,6 +718,13 @@ "cosmiccore.omnia_circuit.uv": "§6Works as any UV Circuit.", "cosmiccore.omnia_circuit.uxv": "§6Works as any UXV Circuit.", "cosmiccore.omnia_circuit.zpm": "§6Works as any ZPM Circuit.", + "cosmiccore.recipe.asteroid_weight_greater_1": "Greater Yields\nfrom Larger Asteroids", + "cosmiccore.recipe.condition.linked_partner.formed": "Requires %s linked partner(s) with valid structure", + "cosmiccore.recipe.condition.linked_partner.tooltip": "Requires %s linked partner(s)", + "cosmiccore.recipe.condition.linked_partner.working": "Requires %s linked partner(s) actively working", + "cosmiccore.recipe.condition.linked_partner_dimension.tooltip": "Requires linked partner in %s", + "cosmiccore.recipe.condition.linked_partner_dimension_fluid.tooltip": "Requires %smB %s in partner in %s", + "cosmiccore.recipe.condition.linked_partner_dimension_item.tooltip": "Requires %sx %s in partner in %s", "cosmiccore.recipe.condition.titan.tooltip": "Requires Titan Reactor Tier: %s", "cosmiccore.recipe.ember_in": "Ember Input: %s", "cosmiccore.recipe.ember_out": "Ember Output: %s", @@ -425,11 +735,266 @@ "cosmiccore.recipe.soul_out": "Soul Output: %s", "cosmiccore.recipe.sterile_in": "Sterilizer: %s %s", "cosmiccore.recipe.sterile_out": "ERROR?", + "cosmiccore.recipe.waiting_for_partner": "Waiting for linked partner", + "cosmiccore.roaster.desc": "Marshmallows not included", "cosmiccore.rune_emotion_weak.1": "§7§oAn incomplete ERA reaction is observed.", "cosmiccore.rune_emotion_weak.2": "§7§oStrong emotional and chemical reactions cause the slate to vibrate.", "cosmiccore.rune_vague": "§7§oLatent emotions seem to be missing.", + "cosmiccore.stellar.branch.collapse": "Collapse", + "cosmiccore.stellar.branch.fusion": "Fusion", + "cosmiccore.stellar.branch.ignition": "Ignition", + "cosmiccore.stellar.branch.void": "Void", + "cosmiccore.stellar.context.blackhole_line1": "Singularity contained", + "cosmiccore.stellar.context.blackhole_line2": "Exotic processing", + "cosmiccore.stellar.context.death_graceful_line1": "Controlled shutdown", + "cosmiccore.stellar.context.death_graceful_line2": "in progress...", + "cosmiccore.stellar.context.death_line1": "CRITICAL FAILURE", + "cosmiccore.stellar.context.death_line2": "SOUL FUSE ENGAGED", + "cosmiccore.stellar.context.empty_line1": "Insert star seed and", + "cosmiccore.stellar.context.empty_line2": "provide stellar gases", + "cosmiccore.stellar.context.empty_line3": "to begin ignition.", + "cosmiccore.stellar.context.growing_line1": "Stellar fusion", + "cosmiccore.stellar.context.growing_line2": "initiating...", + "cosmiccore.stellar.context.star_line1": "Stable fusion active", + "cosmiccore.stellar.context.star_line2": "Processing available", + "cosmiccore.stellar.context.superstar_line1": "WARNING: Critical mass", + "cosmiccore.stellar.context.superstar_line2": "Collapse imminent", + "cosmiccore.stellar.convergence.title": "Stellar Convergence", + "cosmiccore.stellar.ignition.breaking": "!!! BREAKING !!!", + "cosmiccore.stellar.ignition.ignite": "IGNITE", + "cosmiccore.stellar.ignition.requires_star": "REQUIRES ACTIVE STAR", + "cosmiccore.stellar.module.config": "Module Config", + "cosmiccore.stellar.module.current": "Current", + "cosmiccore.stellar.module.iris_limit": "Iris Limit", + "cosmiccore.stellar.module.max_eut": "Max EU/t", + "cosmiccore.stellar.module.not_linked": "Not linked to Stellar Iris", + "cosmiccore.stellar.module.parallel": "Parallel", + "cosmiccore.stellar.module.parallel_max": "%sx (max %s)", + "cosmiccore.stellar.module.speed_bonus": "Speed Bonus", + "cosmiccore.stellar.module.stage": "Stage", + "cosmiccore.stellar.module.status": "Status", + "cosmiccore.stellar.module.status.disconnected": "DISCONNECTED", + "cosmiccore.stellar.module.status.idle": "IDLE", + "cosmiccore.stellar.module.status.iris_inactive": "IRIS INACTIVE", + "cosmiccore.stellar.module.status.no_wireless": "NO WIRELESS", + "cosmiccore.stellar.module.status.offline": "OFFLINE", + "cosmiccore.stellar.module.status.power_fail": "POWER FAIL", + "cosmiccore.stellar.module.status.processing": "PROCESSING", + "cosmiccore.stellar.module.status.ready": "READY", + "cosmiccore.stellar.module.waiting_iris": "Waiting for Iris", + "cosmiccore.stellar.power.max_parallel": "Maximum Parallel", + "cosmiccore.stellar.power.title": "Power Control Panel", + "cosmiccore.stellar.power.voltage_per_parallel": "Voltage Per Parallel", + "cosmiccore.stellar.prestige.continue": "[Click anywhere to continue]", + "cosmiccore.stellar.prestige.current_tier": "CURRENT TIER", + "cosmiccore.stellar.prestige.max_tier": "MAXIMUM TIER REACHED", + "cosmiccore.stellar.prestige.next_tier": "%s pts for %s", + "cosmiccore.stellar.prestige.points_earned": "POINTS EARNED", + "cosmiccore.stellar.prestige.tier.apprentice": "APPRENTICE", + "cosmiccore.stellar.prestige.tier.expert": "EXPERT", + "cosmiccore.stellar.prestige.tier.grandmaster": "GRANDMASTER", + "cosmiccore.stellar.prestige.tier.journeyman": "JOURNEYMAN", + "cosmiccore.stellar.prestige.tier.master": "MASTER", + "cosmiccore.stellar.prestige.tier.novice": "NOVICE", + "cosmiccore.stellar.prestige.tier.unknown": "UNKNOWN", + "cosmiccore.stellar.prestige.tier_up": "TIER UP!", + "cosmiccore.stellar.prestige.title": "STELLAR CONVERGENCE", + "cosmiccore.stellar.prestige.total_points": "Total: %s points", + "cosmiccore.stellar.slot.star_seed": "Star Seed", + "cosmiccore.stellar.stage.controlled_shutdown": "CONTROLLED SHUTDOWN", + "cosmiccore.stellar.stage.critical_mass": "CRITICAL MASS", + "cosmiccore.stellar.stage.emergency_protocols": "EMERGENCY PROTOCOLS", + "cosmiccore.stellar.stage.initialization": "INITIALIZATION", + "cosmiccore.stellar.stage.singularity_control": "SINGULARITY CONTROL", + "cosmiccore.stellar.stage.stellar_ignition": "STELLAR IGNITION", + "cosmiccore.stellar.stage.stellar_operations": "STELLAR OPERATIONS", + "cosmiccore.stellar.upgrade.abyss_walker": "Abyss Walker", + "cosmiccore.stellar.upgrade.abyss_walker.desc": "Void energy passively accumulates, boosting exotic recipes", + "cosmiccore.stellar.upgrade.annihilation_yield": "Annihilation Yield", + "cosmiccore.stellar.upgrade.annihilation_yield.desc": "BLACK_HOLE prestige gives 5x base points, destroys the star", + "cosmiccore.stellar.upgrade.antimatter_injection": "Antimatter Injection", + "cosmiccore.stellar.upgrade.antimatter_injection.desc": "Unlock antimatter fuel. +100% speed when fueled with antimatter", + "cosmiccore.stellar.upgrade.available": "Click to unlock", + "cosmiccore.stellar.upgrade.cascading_collapse": "Cascading Collapse", + "cosmiccore.stellar.upgrade.cascading_collapse.desc": "Prestige triggers grant bonus points to connected modules", + "cosmiccore.stellar.upgrade.chromatic_tuning": "Chromatic Tuning", + "cosmiccore.stellar.upgrade.chromatic_tuning.desc": "Custom star color provides +5% to matching element recipes", + "cosmiccore.stellar.upgrade.core_harmonics": "Core Harmonics", + "cosmiccore.stellar.upgrade.core_harmonics.desc": "-20% additional fuel consumption", + "cosmiccore.stellar.upgrade.corona_expansion": "Corona Expansion", + "cosmiccore.stellar.upgrade.corona_expansion.desc": "Module connection range doubled", + "cosmiccore.stellar.upgrade.cosmic_tithe": "Cosmic Tithe", + "cosmiccore.stellar.upgrade.cosmic_tithe.desc": "Passively generate prestige points (1/min per tier)", + "cosmiccore.stellar.upgrade.cost": "Cost: %d pts", + "cosmiccore.stellar.upgrade.dark_matter_lens": "Dark Matter Lens", + "cosmiccore.stellar.upgrade.dark_matter_lens.desc": "BLACK_HOLE passively produces Dark Matter (1/min)", + "cosmiccore.stellar.upgrade.decay_resistance": "Decay Resistance", + "cosmiccore.stellar.upgrade.decay_resistance.desc": "+3% decay resistance per level (max 10 levels)", + "cosmiccore.stellar.upgrade.dual_sacrifice": "Dual Sacrifice", + "cosmiccore.stellar.upgrade.dual_sacrifice.desc": "Can consume 2 prestige items for 2.5x points", + "cosmiccore.stellar.upgrade.dyson_lattice": "Dyson Lattice", + "cosmiccore.stellar.upgrade.dyson_lattice.desc": "Passive energy generation scales with star stage (up to 32k EU/t)", + "cosmiccore.stellar.upgrade.early_harvest": "Early Harvest", + "cosmiccore.stellar.upgrade.early_harvest.desc": "Can prestige at STAR stage (50% points)", + "cosmiccore.stellar.upgrade.echo_of_collapse": "Echo of Collapse", + "cosmiccore.stellar.upgrade.echo_of_collapse.desc": "Prestige grants a temporary 20% speed boost for 5 minutes", + "cosmiccore.stellar.upgrade.efficient_consumption": "Efficient Consumption", + "cosmiccore.stellar.upgrade.efficient_consumption.desc": "15% chance prestige doesn't consume prestige item", + "cosmiccore.stellar.upgrade.eldritch_insight": "Eldritch Insight", + "cosmiccore.stellar.upgrade.eldritch_insight.desc": "Reveals hidden recipe bonuses based on star configuration", + "cosmiccore.stellar.upgrade.energy_optimization": "Energy Optimization", + "cosmiccore.stellar.upgrade.energy_optimization.desc": "-3% energy cost per level (max 10 levels)", + "cosmiccore.stellar.upgrade.entropy_engine": "Entropy Engine", + "cosmiccore.stellar.upgrade.entropy_engine.desc": "Failed recipes contribute to prestige point pool", + "cosmiccore.stellar.upgrade.entropy_harvest": "Entropy Harvest", + "cosmiccore.stellar.upgrade.entropy_harvest.desc": "Gain bonus points based on star lifetime before prestige", + "cosmiccore.stellar.upgrade.ergosphere_tap": "Ergosphere Tap", + "cosmiccore.stellar.upgrade.ergosphere_tap.desc": "Extract rotational energy from BLACK_HOLE (8192 EU/t passive)", + "cosmiccore.stellar.upgrade.eternal_ember": "Eternal Ember", + "cosmiccore.stellar.upgrade.eternal_ember.desc": "Stars at STAR stage never naturally decay", + "cosmiccore.stellar.upgrade.eternal_void": "Eternal Void", + "cosmiccore.stellar.upgrade.eternal_void.desc": "All BLACK_HOLE bonuses are doubled. Void effects persist 30s after leaving BLACK_HOLE.", + "cosmiccore.stellar.upgrade.event_horizon_lock": "Event Horizon Lock", + "cosmiccore.stellar.upgrade.event_horizon_lock.desc": "BLACK_HOLE never decays to DEATH", + "cosmiccore.stellar.upgrade.exotic_matter_tap": "Exotic Matter Tap", + "cosmiccore.stellar.upgrade.exotic_matter_tap.desc": "Unlock exotic matter processing recipes", + "cosmiccore.stellar.upgrade.false_vacuum": "False Vacuum", + "cosmiccore.stellar.upgrade.false_vacuum.desc": "Reality unravels. All Void bonuses tripled. Unlock False Vacuum recipes.", + "cosmiccore.stellar.upgrade.fuel_efficiency": "Fuel Efficiency", + "cosmiccore.stellar.upgrade.fuel_efficiency.desc": "-2% fuel consumption per level (max 10 levels)", + "cosmiccore.stellar.upgrade.fusion_catalyst": "Fusion Catalyst", + "cosmiccore.stellar.upgrade.fusion_catalyst.desc": "Stars grow to next stage 25% faster", + "cosmiccore.stellar.upgrade.fusion_overdrive": "Fusion Overdrive", + "cosmiccore.stellar.upgrade.fusion_overdrive.desc": "+50% processing speed, +25% fuel consumption", + "cosmiccore.stellar.upgrade.gravitational_mastery": "Gravitational Mastery", + "cosmiccore.stellar.upgrade.gravitational_mastery.desc": "BLACK_HOLE stage grants +3 parallels", + "cosmiccore.stellar.upgrade.graviton_lens": "Graviton Lens", + "cosmiccore.stellar.upgrade.graviton_lens.desc": "+1 parallel per star stage", + "cosmiccore.stellar.upgrade.growth_catalyst": "Growth Catalyst", + "cosmiccore.stellar.upgrade.growth_catalyst.desc": "+3% growth speed per level (max 10 levels)", + "cosmiccore.stellar.upgrade.hawking_radiator": "Hawking Radiator", + "cosmiccore.stellar.upgrade.hawking_radiator.desc": "BLACK_HOLE generates 2048 EU/t passively", + "cosmiccore.stellar.upgrade.heat_death": "Heat Death", + "cosmiccore.stellar.upgrade.heat_death.desc": "The end of all things. All Collapse bonuses tripled. Prestige is instant.", + "cosmiccore.stellar.upgrade.helios_forge": "Helios Forge", + "cosmiccore.stellar.upgrade.helios_forge.desc": "Unlock Helios-tier recipes requiring extreme stellar conditions", + "cosmiccore.stellar.upgrade.hyperdense_core": "Hyperdense Core", + "cosmiccore.stellar.upgrade.hyperdense_core.desc": "+50% parallel limit from all sources", + "cosmiccore.stellar.upgrade.infinite_recursion": "Infinite Recursion", + "cosmiccore.stellar.upgrade.infinite_recursion.desc": "Prestige gives 2x points. 25% chance to keep prestige item.", + "cosmiccore.stellar.upgrade.kerr_extraction": "Kerr Extraction", + "cosmiccore.stellar.upgrade.kerr_extraction.desc": "Spinning BLACK_HOLE grants +6 parallels and exotic byproducts", + "cosmiccore.stellar.upgrade.level": "Level %d / %d", + "cosmiccore.stellar.upgrade.locked": "Locked", + "cosmiccore.stellar.upgrade.magnetic_confinement": "Magnetic Confinement", + "cosmiccore.stellar.upgrade.magnetic_confinement.desc": "Star stage cannot drop during active processing", + "cosmiccore.stellar.upgrade.mass_conversion": "Mass Conversion", + "cosmiccore.stellar.upgrade.mass_conversion.desc": "Convert excess materials into prestige points (1000:1 ratio)", + "cosmiccore.stellar.upgrade.mass_efficiency": "Mass Efficiency", + "cosmiccore.stellar.upgrade.mass_efficiency.desc": "-15% additional energy cost", + "cosmiccore.stellar.upgrade.max_level": "MAX LEVEL", + "cosmiccore.stellar.upgrade.negative_mass": "Negative Mass", + "cosmiccore.stellar.upgrade.negative_mass.desc": "Recipes in BLACK_HOLE have inverted energy costs (gain EU)", + "cosmiccore.stellar.upgrade.neutron_cascade": "Neutron Cascade", + "cosmiccore.stellar.upgrade.neutron_cascade.desc": "Recipe completions have 15% chance to trigger twice", + "cosmiccore.stellar.upgrade.not_enough_points": "Not enough points", + "cosmiccore.stellar.upgrade.omega_compression": "Omega Compression", + "cosmiccore.stellar.upgrade.omega_compression.desc": "Ultimate processing. All Fusion bonuses tripled. Unlock Omega recipes.", + "cosmiccore.stellar.upgrade.owned": "OWNED", + "cosmiccore.stellar.upgrade.parallel_manifold": "Parallel Manifold", + "cosmiccore.stellar.upgrade.parallel_manifold.desc": "+2 base parallel limit", + "cosmiccore.stellar.upgrade.parallel_threading": "Parallel Threading", + "cosmiccore.stellar.upgrade.parallel_threading.desc": "+1 parallel per level (max 8 levels)", + "cosmiccore.stellar.upgrade.particle_storm": "Particle Storm", + "cosmiccore.stellar.upgrade.particle_storm.desc": "+4 base parallels, unlocks particle storm recipes", + "cosmiccore.stellar.upgrade.penrose_process": "Penrose Process", + "cosmiccore.stellar.upgrade.penrose_process.desc": "Throw matter into BLACK_HOLE to extract 130% of its energy value", + "cosmiccore.stellar.upgrade.perpetual_ignition": "Perpetual Ignition", + "cosmiccore.stellar.upgrade.perpetual_ignition.desc": "Stars are immune to decay. Fuel costs halved.", + "cosmiccore.stellar.upgrade.phoenix_protocol": "Phoenix Protocol", + "cosmiccore.stellar.upgrade.phoenix_protocol.desc": "When star would die, 25% chance to return to STAR stage instead", + "cosmiccore.stellar.upgrade.photon_sphere": "Photon Sphere", + "cosmiccore.stellar.upgrade.photon_sphere.desc": "Light-based recipes get +200% speed in BLACK_HOLE", + "cosmiccore.stellar.upgrade.planck_resonance": "Planck Resonance", + "cosmiccore.stellar.upgrade.planck_resonance.desc": "Minimum recipe time reduced to 1 tick", + "cosmiccore.stellar.upgrade.plasma_conduits": "Plasma Conduits", + "cosmiccore.stellar.upgrade.plasma_conduits.desc": "-10% fuel consumption per tick", + "cosmiccore.stellar.upgrade.plasma_hurricane": "Plasma Hurricane", + "cosmiccore.stellar.upgrade.plasma_hurricane.desc": "Star growth speed increased by 40%", + "cosmiccore.stellar.upgrade.point_amplifier": "Point Amplifier", + "cosmiccore.stellar.upgrade.point_amplifier.desc": "+30% prestige points (stacks with Shard Collector)", + "cosmiccore.stellar.upgrade.prereqs_needed": "Prerequisites needed", + "cosmiccore.stellar.upgrade.prestige_amplifier": "Prestige Amplifier", + "cosmiccore.stellar.upgrade.prestige_amplifier.desc": "+5% prestige points per level (max 10 levels)", + "cosmiccore.stellar.upgrade.prestige_momentum": "Prestige Momentum", + "cosmiccore.stellar.upgrade.prestige_momentum.desc": "Each consecutive prestige gives +10% points (max 50%)", + "cosmiccore.stellar.upgrade.primordial_flame": "Primordial Flame", + "cosmiccore.stellar.upgrade.primordial_flame.desc": "The first fire. All Ignition bonuses doubled. Stars cannot die.", + "cosmiccore.stellar.upgrade.proton_recycler": "Proton Recycler", + "cosmiccore.stellar.upgrade.proton_recycler.desc": "8% chance to not consume fuel on tick", + "cosmiccore.stellar.upgrade.quantum_tunneling": "Quantum Tunneling", + "cosmiccore.stellar.upgrade.quantum_tunneling.desc": "10% chance to complete recipe instantly", + "cosmiccore.stellar.upgrade.quark_gluon_plasma": "Quark-Gluon Plasma", + "cosmiccore.stellar.upgrade.quark_gluon_plasma.desc": "Unlock QGP recipes. +8 parallels for QGP recipes only", + "cosmiccore.stellar.upgrade.relativistic_processing": "Relativistic Processing", + "cosmiccore.stellar.upgrade.relativistic_processing.desc": "Recipes under 20 ticks complete instantly", + "cosmiccore.stellar.upgrade.resonant_sacrifice": "Resonant Sacrifice", + "cosmiccore.stellar.upgrade.resonant_sacrifice.desc": "Prestige at SUPERSTAR gives BLACK_HOLE rewards", + "cosmiccore.stellar.upgrade.sacrifice_amplifier": "Sacrifice Amplifier", + "cosmiccore.stellar.upgrade.sacrifice_amplifier.desc": "Prestige items give 4x points but are always consumed", + "cosmiccore.stellar.upgrade.schwarzschild_radius": "Schwarzschild Radius", + "cosmiccore.stellar.upgrade.schwarzschild_radius.desc": "Increase BLACK_HOLE event horizon - more items can process simultaneously", + "cosmiccore.stellar.upgrade.shard_collector": "Shard Collector", + "cosmiccore.stellar.upgrade.shard_collector.desc": "+20% prestige points earned", + "cosmiccore.stellar.upgrade.singularity_engine": "Singularity Engine", + "cosmiccore.stellar.upgrade.singularity_engine.desc": "Double all speed/parallel bonuses. Energy costs -40%.", + "cosmiccore.stellar.upgrade.singularity_siphon": "Singularity Siphon", + "cosmiccore.stellar.upgrade.singularity_siphon.desc": "BLACK_HOLE stage reduces recipe energy cost by 20%", + "cosmiccore.stellar.upgrade.solar_dominion": "Solar Dominion", + "cosmiccore.stellar.upgrade.solar_dominion.desc": "All star lifecycle bonuses increased by 50%", + "cosmiccore.stellar.upgrade.solar_genesis": "Solar Genesis", + "cosmiccore.stellar.upgrade.solar_genesis.desc": "Can spawn secondary micro-stars that provide bonus parallels", + "cosmiccore.stellar.upgrade.stellar_compression": "Stellar Compression", + "cosmiccore.stellar.upgrade.stellar_compression.desc": "+25% speed at SUPERSTAR or higher", + "cosmiccore.stellar.upgrade.stellar_debt": "Stellar Debt", + "cosmiccore.stellar.upgrade.stellar_debt.desc": "Borrow prestige points from future prestiges (150% payback)", + "cosmiccore.stellar.upgrade.stellar_efficiency": "Stellar Efficiency", + "cosmiccore.stellar.upgrade.stellar_efficiency.desc": "+2% speed per level (max 10 levels)", + "cosmiccore.stellar.upgrade.stellar_nursery": "Stellar Nursery", + "cosmiccore.stellar.upgrade.stellar_nursery.desc": "New stars begin at GROWING stage instead of EMPTY", + "cosmiccore.stellar.upgrade.stellar_regeneration": "Stellar Regeneration", + "cosmiccore.stellar.upgrade.stellar_regeneration.desc": "3% chance per tick for star to gain stage", + "cosmiccore.stellar.upgrade.subspace_harmonics": "Subspace Harmonics", + "cosmiccore.stellar.upgrade.subspace_harmonics.desc": "Energy costs scale inversely with recipe duration", + "cosmiccore.stellar.upgrade.superconducting_grid": "Superconducting Grid", + "cosmiccore.stellar.upgrade.superconducting_grid.desc": "-10% energy cost for all recipes", + "cosmiccore.stellar.upgrade.supernova_core": "Supernova Core", + "cosmiccore.stellar.upgrade.supernova_core.desc": "Stars at SUPERSTAR+ generate bonus prestige shards passively", + "cosmiccore.stellar.upgrade.tachyon_weave": "Tachyon Weave", + "cosmiccore.stellar.upgrade.tachyon_weave.desc": "+30% processing speed, stacks additively", + "cosmiccore.stellar.upgrade.temporal_acceleration": "Temporal Acceleration", + "cosmiccore.stellar.upgrade.temporal_acceleration.desc": "+15% processing speed", + "cosmiccore.stellar.upgrade.temporal_echo": "Temporal Echo", + "cosmiccore.stellar.upgrade.temporal_echo.desc": "Store up to 3 prestige charges, release all at once for 3x value", + "cosmiccore.stellar.upgrade.thermal_stabilizer": "Thermal Stabilizer", + "cosmiccore.stellar.upgrade.thermal_stabilizer.desc": "Stars decay 15% slower", + "cosmiccore.stellar.upgrade.tier_locked": "Tier too low", + "cosmiccore.stellar.upgrade.tier_required": "Requires Tier %d", + "cosmiccore.stellar.upgrade.vacuum_decay": "Vacuum Decay", + "cosmiccore.stellar.upgrade.vacuum_decay.desc": "Chance to void input items for 10x output", + "cosmiccore.stellar.upgrade.void_attunement": "Void Attunement", + "cosmiccore.stellar.upgrade.void_attunement.desc": "+2% bonus from void effects per level (max 10 levels)", + "cosmiccore.stellar.upgrade.void_harvester": "Void Harvester", + "cosmiccore.stellar.upgrade.void_harvester.desc": "BLACK_HOLE prestige gives 3x base points", + "cosmiccore.stellar.upgrade.void_whispers": "Void Whispers", + "cosmiccore.stellar.upgrade.void_whispers.desc": "BLACK_HOLE stage provides +50% speed bonus", + "cosmiccore.stellar.upgrade.warp_field_matrix": "Warp Field Matrix", + "cosmiccore.stellar.upgrade.warp_field_matrix.desc": "Items teleport directly to output buses (no transport needed)", + "cosmiccore.stellar.upgrade.zero_point_tap": "Zero Point Tap", + "cosmiccore.stellar.upgrade.zero_point_tap.desc": "5% of energy cost is refunded after recipe completion", "cosmiccore.tenura.1": "§6Ten - Control", "cosmiccore.tenura.2": "§6Ura - Flow", + "cosmiccore.thermomagnitizer.desc": "Heating and Magnets, what could go wrong", "cosmiccore.tylomir.1": "§6Tylo - Formation", "cosmiccore.tylomir.2": "§6Mir - World", "cosmiccore.universal.boosting_agents.0": "§aCan consume various boosters to increase EU/t multiplier", @@ -441,6 +1006,7 @@ "cosmiccore.universal.tooltip.lube_info.1": "§eLubricant§f: §c1x §fEU total @ 1000mb/hr", "cosmiccore.universal.tooltip.lube_info.2": "§eAdv Lubricant§f: §c1.5x §fEU total @ 500mb/hr", "cosmiccore.universal.tooltip.lube_info.3": "§eTears of the Universe§f: §c2x §fEU total @ 250mb/hr", + "cosmiccore.vaccum_bubbler.desc": "Floatation Station Machination", "cosmiccore.valdris.1": "§6Val - Overwhelm", "cosmiccore.valdris.2": "§6Dris - Connect", "cosmiccore.wire_coil.eu_multiplier": " §aMagnet EU Cost: §c%s EU/t", @@ -457,6 +1023,7 @@ "cosmiccore.zelothar.2": "§6Thar - Forge", "debug.owner.uuid": "§aOwner UUID:§a %s", "debug.team.uuid": "§aTeam UUID:§a %s", + "emi.category.cosmiccore.asteroid_mining": "Asteroid Mining Operations", "gtceu.hellfire_foundry": "§cHellfire Foundry", "gtceu.industrial_chemvat": "§aIndustrial Chemvat", "gtceu.machine.dec.tooltip.0": "Stores power in an interdimensional pocket.", @@ -471,6 +1038,10 @@ "gui.cosmiccore.ember_hatch.ember": "Ember Stored: %s", "gui.cosmiccore.ember_hatch.label.export": "Ember Output Hatch", "gui.cosmiccore.ember_hatch.label.import": "Ember Input Hatch", + "gui.cosmiccore.iapiary": "Industrial Apiary", + "gui.cosmiccore.iapiary.duration": "Duration: %d", + "gui.cosmiccore.iapiary.production_amp": "Production Amp: %d", + "gui.cosmiccore.iapiary.yield": "Yield: %d", "gui.cosmiccore.soul_hatch.label.export": "Soul Output Hatch", "gui.cosmiccore.soul_hatch.label.import": "Soul Input Hatch", "gui.cosmiccore.soul_hatch.lp": "LP Stored: %s", @@ -480,7 +1051,10 @@ "gui.cosmiccore.thermia_hatch.label.export": "§6Thermia Output Vent", "gui.cosmiccore.thermia_hatch.label.import": "§6Thermia Input Socket", "gui.cosmiccore.thermia_hatch.stored_temp": "§6Current Temp:", + "item.cosmicbees.bee.modifier.aging_multiplier": "Age Multiplier", "item.cosmiccore.aberrant_essence": "§6Aberrant Essence", + "item.cosmiccore.abrasive_rosin_millstones": "Abrasive Rosin Millstones", + "item.cosmiccore.advanced_gene_kit": "Advanced Gene Kit", "item.cosmiccore.akashic_processor": "Akashic Processor", "item.cosmiccore.akashic_processor_assembly": "Akashic Processor Assembly", "item.cosmiccore.akashic_processor_mainframe": "Akashic Processor Mainframe", @@ -489,14 +1063,70 @@ "item.cosmiccore.ambrion": "Vexil - [Ambrion]", "item.cosmiccore.aram_chip": "ARAM Chip", "item.cosmiccore.aram_wafer": "ARAM Wafer", + "item.cosmiccore.armored_freight_beetle_grade_1": "Armored Freight Beetle Mk.1", + "item.cosmiccore.armored_freight_beetle_grade_2": "Armored Freight Beetle Mk.2", + "item.cosmiccore.armored_freight_beetle_grade_3": "Armored Freight Beetle Mk.3", + "item.cosmiccore.armored_freight_beetle_grade_4": "Armored Freight Beetle Mk.4", + "item.cosmiccore.armored_freight_beetle_grade_5": "Armored Freight Beetle Mk.5", "item.cosmiccore.asc_blood_orb": "Ascendant Blood Orb", + "item.cosmiccore.asteroid_targeting_chip": "Asteroid Targeting Chip", + "item.cosmiccore.auric_asteroid": "Auric Asteroid", + "item.cosmiccore.basic_gene_kit": "Basic Gene Kit", + "item.cosmiccore.bee_comb_abrasive": "Abrasive Comb", + "item.cosmiccore.bee_comb_absent": "Absent Comb", + "item.cosmiccore.bee_comb_ambrosic": "Ambrosic Comb", + "item.cosmiccore.bee_comb_architect": "Architect Comb", + "item.cosmiccore.bee_comb_ashen": "Ashen Comb", + "item.cosmiccore.bee_comb_biohazard": "Biohazard Comb", + "item.cosmiccore.bee_comb_citrus_polymer": "Citrus Polymer Comb", + "item.cosmiccore.bee_comb_cobbled": "Cobbled Comb", + "item.cosmiccore.bee_comb_constructive": "Constructive Comb", + "item.cosmiccore.bee_comb_cosmos": "Cosmos Comb", + "item.cosmiccore.bee_comb_energized": "Energized Comb", + "item.cosmiccore.bee_comb_exhaustive": "Exhaustive Comb", + "item.cosmiccore.bee_comb_fate": "Fate Comb", + "item.cosmiccore.bee_comb_fracking": "Fracking Comb", + "item.cosmiccore.bee_comb_grand_garden": "Grand Garden Comb", + "item.cosmiccore.bee_comb_hadal": "Hadal Comb", + "item.cosmiccore.bee_comb_hellsmith": "Hellsmith Comb", + "item.cosmiccore.bee_comb_hydraulic": "Hydraulic Comb", + "item.cosmiccore.bee_comb_illusive": "Illusive Comb", + "item.cosmiccore.bee_comb_inquisitive": "Inquisitive Comb", + "item.cosmiccore.bee_comb_lofty_argon": "Lofty Argon Comb", + "item.cosmiccore.bee_comb_lofty_hydrogen": "Lofty Hydrogen Comb", + "item.cosmiccore.bee_comb_lofty_nitrogen": "Lofty Nitrogen Comb", + "item.cosmiccore.bee_comb_lofty_oxygen": "Lofty Oxygen Comb", + "item.cosmiccore.bee_comb_lunar": "Lunar Comb", + "item.cosmiccore.bee_comb_pale": "Pale Comb", + "item.cosmiccore.bee_comb_prismatic": "Prismatic Comb", + "item.cosmiccore.bee_comb_pyrolytic": "Pyrolytic Comb", + "item.cosmiccore.bee_comb_radoxia": "Radoxia Comb", + "item.cosmiccore.bee_comb_rose_polymer": "Rose Polymer Comb", + "item.cosmiccore.bee_comb_runic": "Runic Comb", + "item.cosmiccore.bee_comb_shaman": "Shaman Comb", + "item.cosmiccore.bee_comb_slick": "Slick Comb", + "item.cosmiccore.bee_comb_solar": "Solar Comb", + "item.cosmiccore.bee_comb_soul": "Soul Comb", + "item.cosmiccore.bee_comb_virtue": "Virtue Comb", + "item.cosmiccore.bee_comb_waxy_polymer": "Waxy Polymer Comb", "item.cosmiccore.bifidobacterium_breve": "Bifidobacterium Breve", "item.cosmiccore.bifidobacterium_breve_culture": "Bifidobacterium Breve Culture", + "item.cosmiccore.bitumen_wax": "Bitumen Wax", "item.cosmiccore.blackstone_pustule": "Blackstone Pustule", + "item.cosmiccore.brimstone_asteroid": "Brimstone Asteroid", + "item.cosmiccore.bronze_supply_tank": "Bronze Supply Tank", + "item.cosmiccore.capacity_chip": "Capacity Chip", + "item.cosmiccore.carbon_asteroid_base": "Carbonic Asteroid", "item.cosmiccore.chronia": "Vexil - [Chronia]", "item.cosmiccore.cluster_of_perpetuity": "Cluster of Perpetuity", "item.cosmiccore.computation_support_unit": "Computation Support Unit", "item.cosmiccore.contaminated_petri_dish": "Contaminated Petri Dish", + "item.cosmiccore.crucible_mantis_grade_1": "Crucible Mantis Mk.1", + "item.cosmiccore.crusher_wasps_grade_1": "Crusher Wasps Mk.1", + "item.cosmiccore.crusher_wasps_grade_2": "Crusher Wasps Mk.2", + "item.cosmiccore.crusher_wasps_grade_3": "Crusher Wasps Mk.3", + "item.cosmiccore.crusher_wasps_grade_4": "Crusher Wasps Mk.4", + "item.cosmiccore.crusher_wasps_grade_5": "Crusher Wasps Mk.5", "item.cosmiccore.crystal_chiplet_base": "Crystal Chiplet Base", "item.cosmiccore.crystal_chiplet_mask": "Crystal Chiplet Mask", "item.cosmiccore.crystala": "Vexil - [Crystala]", @@ -512,6 +1142,8 @@ "item.cosmiccore.debug.structure_writer.rotate_along_y_axis": "Rotate Y Axis", "item.cosmiccore.debug.structure_writer.structural_scale": "Structure size: X:%s Y:%s Z:%s", "item.cosmiccore.debug_structure_writer": "Debug Structure Writer", + "item.cosmiccore.decaying_cosmic_upgrade": "Decaying Upgrade", + "item.cosmiccore.decaying_cosmic_upgrade.tooltip": "§cInstantly Kills Bees and overloads the lifetime cycle", "item.cosmiccore.dilumixal_naquadah_doped_silicon_boule": "DiLumixal Naquadah-doped Silicon Boule", "item.cosmiccore.dilumixal_naquadah_doped_silicon_wafer": "DiLumixal Naquadah-doped Silicon Wafer", "item.cosmiccore.donk": "Donk", @@ -523,7 +1155,14 @@ "item.cosmiccore.dulia_lily": "Dulia Lily", "item.cosmiccore.dynamia": "Luminon - [Dynamia]", "item.cosmiccore.echon": "Luminon - [Echon]", + "item.cosmiccore.efficacy_chip": "Efficacy Chip", + "item.cosmiccore.empty_fuel_rod": "Empty Fuel Rod", + "item.cosmiccore.energized_silk": "Energized Silk", "item.cosmiccore.engraved_crystal_chiplet": "Engraved Crystal Chiplet", + "item.cosmiccore.enthelic_processor": "Enthelic Processor", + "item.cosmiccore.enthelic_processor_assembly": "Enthelic Processor Assembly", + "item.cosmiccore.enthelic_processor_mainframe": "Enthelic Processor Mainframe", + "item.cosmiccore.enthelic_processor_supercomputer": "Enthelic Processor Supercomputer", "item.cosmiccore.eschaton_processor": "Eschaton Processor", "item.cosmiccore.eschaton_processor_assembly": "Eschaton Processor Assembly", "item.cosmiccore.eschaton_processor_mainframe": "Eschaton Processor Mainframe", @@ -535,9 +1174,22 @@ "item.cosmiccore.ethera": "Vexil - [Ethera]", "item.cosmiccore.etheric_spirit": "Etheric Spirit", "item.cosmiccore.ev_radio_module": "EV Radio Module", + "item.cosmiccore.ev_wildfire_core": "EV Wildfire Core", "item.cosmiccore.fermium_rad_charges": "Fermium Radiation Charge", + "item.cosmiccore.ferric_asteroid": "Ferric Asteroid", "item.cosmiccore.fireclay_ball": "Fireclay Ball", "item.cosmiccore.flawed_resonant_wafer": "Flawed Harmonic Wafer", + "item.cosmiccore.flesh_packed_neptunium_fuel": "Flesh Packed Neptunium Fuel", + "item.cosmiccore.flesh_packed_plutonium_fuel": "Flesh Packed Plutonium Fuel", + "item.cosmiccore.flesh_packed_uranium_fuel": "Flesh Packed Uranium Fuel", + "item.cosmiccore.fleshy_neptunium_waste": "Bio-Metallic Fleshy Neptunium Waste", + "item.cosmiccore.fleshy_plutonium_waste": "Bio-Metallic Fleshy Plutonium Waste", + "item.cosmiccore.fleshy_uranium_waste": "Bio-Metallic Fleshy Uranium Waste", + "item.cosmiccore.freight_beetle_grade_1": "Freight Beetle Mk.1", + "item.cosmiccore.freight_beetle_grade_2": "Freight Beetle Mk.2", + "item.cosmiccore.freight_beetle_grade_3": "Freight Beetle Mk.3", + "item.cosmiccore.freight_beetle_grade_4": "Freight Beetle Mk.4", + "item.cosmiccore.freight_beetle_grade_5": "Freight Beetle Mk.5", "item.cosmiccore.fused_wafer_of_esoterica": "Fused Harmonic Wafer of Esoterica", "item.cosmiccore.fused_wafer_of_logos": "Fused Harmonic Wafer of Logos", "item.cosmiccore.gelatin_scaffold": "Gelatin Scaffold", @@ -550,22 +1202,49 @@ "item.cosmiccore.harmonically_tuned_circuit_board": "Harmonically Tuned Circuit Board", "item.cosmiccore.harmonically_tuned_printed_circuit_board": "Harmonically Tuned Printed Circuit Board", "item.cosmiccore.heme_ring": "Heme Ring", + "item.cosmiccore.hex_processor": "Hex Processor", + "item.cosmiccore.hex_processor_assembly": "Hex Processor Assembly", + "item.cosmiccore.hex_processor_mainframe": "Hex Processor Mainframe", + "item.cosmiccore.hex_processor_supercomputer": "Hex Processor Supercomputer", "item.cosmiccore.hv_radio_module": "HV Radio Module", + "item.cosmiccore.hv_wildfire_core": "HV Wildfire Core", + "item.cosmiccore.hydraulic_boots": "Hydraulic Globetrotters Boots", "item.cosmiccore.industrial_drone": "Industrial Drone", "item.cosmiccore.inert_fungal_spores": "Inert Fungal Spores", "item.cosmiccore.infinite_spray_can": "§lInfinite Spray Can", + "item.cosmiccore.intermediate_gene_kit": "Intermediate Gene Kit", "item.cosmiccore.iv_radio_module": "IV Radio Module", + "item.cosmiccore.iv_wildfire_core": "IV Wildfire Core", "item.cosmiccore.large_shard_of_perpetuity": "Large Shard of Perpetuity", + "item.cosmiccore.latent_capacity_wafer": "Latent Capacity Wafer", + "item.cosmiccore.latent_efficacy_wafer": "Latent Efficacy Wafer", + "item.cosmiccore.latent_potency_wafer": "Latent Potency Wafer", + "item.cosmiccore.latent_verbosity_wafer": "Latent Verbosity Wafer", "item.cosmiccore.linked_terminal": "Linked Terminal", + "item.cosmiccore.lith_asteroid": "Lith Asteroid", + "item.cosmiccore.livingrock_aluminate_boule": "Livingrock Aluminate Boule", + "item.cosmiccore.livirock_aluminite_wafer": "Livingrock Aluminate Wafer", + "item.cosmiccore.lucidic_processor": "Lucidic Processor", + "item.cosmiccore.lucidic_processor_assembly": "Lucidic Processor Assembly", + "item.cosmiccore.lucidic_processor_mainframe": "Lucidic Processor Mainframe", + "item.cosmiccore.lucidic_processor_supercomputer": "Lucidic Processor Supercomputer", "item.cosmiccore.luv_radio_module": "LuV Radio Module", + "item.cosmiccore.luv_wildfire_core": "LuV Wildfire Core", + "item.cosmiccore.lv_wildfire_core": "LV Wildfire Core", + "item.cosmiccore.mafic_asteroid": "Mafic Asteroid", "item.cosmiccore.malice_spirit": "Malice Spirit", "item.cosmiccore.masked_crystal_chiplet_package": "Masked Crystal Chiplet Package", + "item.cosmiccore.mossy_asteroid": "Mossy Asteroid", + "item.cosmiccore.multilayered_enthel_circuit_board": "Multilayered Enthel Circuit Board", + "item.cosmiccore.mv_wildfire_core": "MV Wildfire Core", "item.cosmiccore.mystrix": "Luminon - [Mystrix]", + "item.cosmiccore.nano_boots": "NanoMuscle™ Globetrotters Boots", "item.cosmiccore.nano_scythe": "Nano Scythe", "item.cosmiccore.neuro_processing_assembly": "Neuroprocessing Assembly Board", "item.cosmiccore.null_refined_resonant_wafer": "Nullified Harmonic Wafer", "item.cosmiccore.nullified_harmonics_wafer": "Nullified Harmonic Wafer", "item.cosmiccore.nyxon": "Luminon - [Nyxon]", + "item.cosmiccore.occult_asteroid": "Occult Asteroid", "item.cosmiccore.omnia_circuit_ev": "EV Omnia Circuit", "item.cosmiccore.omnia_circuit_hv": "HV Omnia Circuit", "item.cosmiccore.omnia_circuit_iv": "IV Omnia Circuit", @@ -591,6 +1270,9 @@ "item.cosmiccore.opv_radio_module": "OPV Radio Module", "item.cosmiccore.opv_thruster": "OPv Thruster", "item.cosmiccore.overloaded_pearls": "Overloaded Pearls", + "item.cosmiccore.oxide_asteroid": "Oxide Asteroid", + "item.cosmiccore.pale_saw": "Pale Saw", + "item.cosmiccore.pale_scrap": "Pale Scrap", "item.cosmiccore.para_mod_1": "Parallelization Module Mk.1", "item.cosmiccore.para_mod_2": "Parallelization Module Mk.2", "item.cosmiccore.para_mod_3": "Parallelization Module Mk.3", @@ -599,9 +1281,13 @@ "item.cosmiccore.persona_core_assisted_printed_circuit_board": "Persona Core Assisted Printed Circuit Board", "item.cosmiccore.phantnon": "Luminon - [Phantnon]", "item.cosmiccore.plasmatic_drone": "plasmatic_drone", + "item.cosmiccore.plastic_circuit_board": "Mana-doped Plastic Circuit Board", "item.cosmiccore.portable_gravity_core": "§6Portable Gravity Core", "item.cosmiccore.portable_gravity_core.tooltip": "§aNormalizes Gravity to Match Earth.", + "item.cosmiccore.potency_chip": "Potency Chip", "item.cosmiccore.prepared_petri_dish": "Prepared Petri Dish", + "item.cosmiccore.pressurized_rebreather": "Pressurized Rebreather", + "item.cosmiccore.pressurized_rebreather.tooltip": "§6Enables oxygen tank usage. Works in §cNo Air§6 environments.", "item.cosmiccore.prideful_spirit": "Prideful Spirit", "item.cosmiccore.prod_mod_1": "Productivity Module Mk.1", "item.cosmiccore.prod_mod_2": "Productivity Module Mk.2", @@ -609,14 +1295,27 @@ "item.cosmiccore.prod_mod_4": "Productivity Module Mk.4", "item.cosmiccore.programmable_mote": "§5Programmable Mote", "item.cosmiccore.protocyte_mod": "Protocyte Module", + "item.cosmiccore.pulverizing_beetle_grade_1": "Pulverizing Beetle Mk.1", + "item.cosmiccore.pulverizing_beetle_grade_2": "Pulverizing Beetle Mk.2", + "item.cosmiccore.pulverizing_beetle_grade_3": "Pulverizing Beetle Mk.3", + "item.cosmiccore.pulverizing_beetle_grade_4": "Pulverizing Beetle Mk.4", + "item.cosmiccore.pulverizing_beetle_grade_5": "Pulverizing Beetle Mk.5", "item.cosmiccore.pyrith": "Vexil - [Pyrith]", "item.cosmiccore.quantum_scythe": "Quark Scythe", + "item.cosmiccore.quark_boots": "QuarkTech™ Globetrotters Boots", + "item.cosmiccore.rare_metals_asteroid": "Exotic Metals Asteroid", "item.cosmiccore.raymarching_dandilifeon": "Dulia Lily", + "item.cosmiccore.razor_hornet_grade_1": "Razor Hornet Mk.1", + "item.cosmiccore.razor_hornet_grade_2": "Crucible Mantis Mk.2", + "item.cosmiccore.razor_hornet_grade_3": "Crucible Mantis Mk.3", + "item.cosmiccore.razor_hornet_grade_4": "Crucible Mantis Mk.4", + "item.cosmiccore.razor_hornet_grade_5": "Crucible Mantis Mk.5", "item.cosmiccore.record_keeping_processor_assembly": "Record Keeping Processor Assembly", "item.cosmiccore.record_kept_circuit_board": "Record Kept Circuit Board", "item.cosmiccore.record_kept_printed_circuit_board": "Record Kept Printed Circuit Board", "item.cosmiccore.refined_harmonics_wafer": "Refined Harmonic Wafer", "item.cosmiccore.refined_resonant_wafer": "Refined Harmonic Wafer", + "item.cosmiccore.reflection_mirror": "Mirror of Erosion", "item.cosmiccore.resipiratory_sculk_hemocytoblast": "Respiratory Sculk Hemocytoblast", "item.cosmiccore.resonant_mod": "Fusion Module Mk.1", "item.cosmiccore.robust_drone": "Robust Drone", @@ -629,7 +1328,12 @@ "item.cosmiccore.rune_slate_tylomir": "Rune Slate [Tylomir]", "item.cosmiccore.rune_slate_valdris": "Rune Slate [Valdris]", "item.cosmiccore.rune_slate_zelothar": "Rune Slate [Zelothar]", + "item.cosmiccore.runewoven_plastic_circuit_board": "Runewoven Plastic Circuit Board", + "item.cosmiccore.runic_hex_cpu": "Hex Etched CPU Chip", + "item.cosmiccore.runic_hex_cpu_wafer": "Hex Etched CPU Wafer", "item.cosmiccore.rusty_drone": "Rusty Drone", + "item.cosmiccore.sanguine_asteroid": "Sanguine Asteroid", + "item.cosmiccore.sanguine_boots": "Sanguine Globetrotters Boots", "item.cosmiccore.sanguine_drone": "Sanguine Drone", "item.cosmiccore.sanguine_scythe": "Sanguine Scythe", "item.cosmiccore.sanguine_warptech_boots": "Sanguine WarpTech Boots", @@ -642,6 +1346,8 @@ "item.cosmiccore.self_aware_processing_assembly": "Self Aware Processor Assembly", "item.cosmiccore.seraphon": "Luminon - [Seraphon]", "item.cosmiccore.shard_of_perpetuity": "Shard of Perpetuity", + "item.cosmiccore.simple_rebreather": "Simple Rebreather", + "item.cosmiccore.simple_rebreather.tooltip": "§7Reduces oxygen drain in §bThin Air§7 environments.", "item.cosmiccore.somatic_processing_assembly": "Somatoprocessing Assembly Board", "item.cosmiccore.sov_blood_orb": "Sovereign Blood Orb", "item.cosmiccore.space_advanced_nanomuscle_chestplate": "Advanced NanoMuscle™ Space Suite Chestplate", @@ -651,12 +1357,20 @@ "item.cosmiccore.space_radio": "Space Radio", "item.cosmiccore.space_radio.tooltip": "§6Lets you hear sounds in space!", "item.cosmiccore.spectil": "Luminon - [Spectil]", + "item.cosmiccore.spent_flesh_packed_neptunium_fuel": "Spent Flesh Packed Neptunium Fuel", + "item.cosmiccore.spent_flesh_packed_plutonium_fuel": "Spent Flesh Packed Plutonium Fuel", + "item.cosmiccore.spent_flesh_packed_uranium_fuel": "Spent Flesh Packed Uranium Fuel", + "item.cosmiccore.spirit_engraved_enthel_circuit_board": "Spirit Engraved Enthel Circuit Board", + "item.cosmiccore.spirit_runed_enthel_cpu": "Spirit Runed Enthel CPU", + "item.cosmiccore.spirit_runed_enthel_cpu_wafer": "Spirit Runed Enthel CPU Wafer", + "item.cosmiccore.steel_supply_tank": "Steel Supply Tank", "item.cosmiccore.streptococcus_pyogenes": "Streptococcus Pyogenes", "item.cosmiccore.streptococcus_pyogenes_culture": "Streptococcus Pyogenes Culture", "item.cosmiccore.suelescent_processor": "Suelescent Processor", "item.cosmiccore.suelescent_processor_assembly": "Suelescent Processor Assembly", "item.cosmiccore.suelescent_processor_mainframe": "Suelescent Processor Mainframe", "item.cosmiccore.suelescent_processor_supercomputer": "Suelescent Processor Supercomputer", + "item.cosmiccore.superheated_fuel_rod": "Superheated Fuel Rod", "item.cosmiccore.tenaebrum": "Vexil - [Tenaebrum]", "item.cosmiccore.tessaron": "Vexil - [Tessaron]", "item.cosmiccore.thaumica_wafer": "Thaumica Wafer [Arcana]", @@ -664,6 +1378,8 @@ "item.cosmiccore.the_one_ring.tooltip.0": "§6§oOne Ring to rule them all, One Ring to find them, One Ring to bring them all and in the darkness bind them.§r", "item.cosmiccore.the_one_ring.tooltip.1": "You might find it hard to take off.", "item.cosmiccore.thermal_chain_agent": "Thermal Chain Agent", + "item.cosmiccore.trinavine_nanolattice_spool": "Trinavine Nanolattice Spool", + "item.cosmiccore.tungstensteel_nanolattice_spool": "Tungstensteel Nanolattice Spool", "item.cosmiccore.uev_gyroscope": "UEV Gyroscope", "item.cosmiccore.uev_powercell": "UEV Power Cell", "item.cosmiccore.uev_radio_module": "UEV Radio Module", @@ -686,55 +1402,551 @@ "item.cosmiccore.uxv_powercell": "UXV Power Cell", "item.cosmiccore.uxv_radio_module": "UXV Radio Module", "item.cosmiccore.uxv_thruster": "UXV Thruster", + "item.cosmiccore.verbosity_chip": "Verbosity Chip", "item.cosmiccore.vexiun": "Vexil - [Vexiun]", "item.cosmiccore.void_blood_orb": "Voidsent Blood Orb", "item.cosmiccore.wafer_pragmiso": "Pragmiso Wafer [Physics]", + "item.cosmiccore.wailing_cosmic_upgrade": "Wailing Upgrade", + "item.cosmiccore.wailing_cosmic_upgrade.tooltip": "§cMaximum Mutation", + "item.cosmiccore.wasteland_asteroid": "Wasteland Asteroid", "item.cosmiccore.waxed_leather": "Waxed Leather", "item.cosmiccore.wicked_essence": "Wicked Essence", + "item.cosmiccore.wire_cutter": "Wire Cutters", + "item.cosmiccore.wire_cutter.description": "Snip wires cleanly with these cutters.", "item.cosmiccore.wired_petri_dish": "Wired Petri Dish", "item.cosmiccore.wireless_pda": "Wireless Data PDA", "item.cosmiccore.wrathful_spirit": "Wrathful Spirit", "item.cosmiccore.zpm_radio_module": "ZPM Radio Module", + "item.cosmiccore.zpm_wildfire_core": "ZPM Wildfire Core", "item.gtceu.tool.luv_meld_tool": "%s Meld Multitool", "itemGroup.cosmiccore.creative_tab": "Cosmic Core", + "key.categories.cosmiccore.boots": "Cosmic Boots", + "key.categories.cosmiccore.emi": "CosmicCore - EMI", + "key.cosmiccore.boots.jump_decrease": "Boots: Decrease Jump", + "key.cosmiccore.boots.jump_increase": "Boots: Increase Jump", + "key.cosmiccore.boots.speed_decrease": "Boots: Decrease Speed", + "key.cosmiccore.boots.speed_increase": "Boots: Increase Speed", + "key.cosmiccore.boots.toggle_inertia": "Boots: Toggle Inertia Dampening", + "key.cosmiccore.boots.toggle_step": "Boots: Toggle Step Assist", + "key.cosmiccore.emi.create_bookmark_group": "Create Bookmark Group", + "key.cosmiccore.emi.next_bookmark_group": "Next Bookmark Group", + "key.cosmiccore.emi.prev_bookmark_group": "Previous Bookmark Group", + "material.cosmiccore.advanced_overclock_nutrient": "Advanced Overclocking Nutrient", + "material.cosmiccore.advanced_production_nutrient": "Advanced Production Nutrient", + "material.cosmiccore.basic_overclock_nutrient": "Basic Overclocking Nutrient", + "material.cosmiccore.basic_production_nutrient": "Basic Production Nutrient", + "material.cosmiccore.blinkward_alloy": "Blinkward Alloy", + "itemGroup.cosmiccore.creative_tab_tinker_tools": "Cosmic Core Tinkers Compat", "material.cosmiccore.causal_fabric": "Causal Fabric", + "material.cosmiccore.chlorophyte": "Chlorophyte", "material.cosmiccore.chronon": "Chronon", "material.cosmiccore.cosmocite": "Cosmocite", "material.cosmiccore.diluted_prisma": "Diluted Prisma", + "material.cosmiccore.draconic_tarragon": "Draconic Tarragon", + "material.cosmiccore.enderium": "Enderium", + "material.cosmiccore.energetic_alloy": "Energetic Alloy", "material.cosmiccore.enraged_stygian_plague": "Enraged Stygian Plague", + "material.cosmiccore.halizine": "Halizine", "material.cosmiccore.ichor": "Ichor", "material.cosmiccore.ichorium": "Ichorium", "material.cosmiccore.infinity": "Infinity", + "material.cosmiccore.kuvite": "Kuvite", "material.cosmiccore.living_igniclad": "Living Igniclad", + "material.cosmiccore.lumium": "Lumium", + "material.cosmiccore.melodic_alloy": "Melodic Alloy", + "material.cosmiccore.moondrop": "Moondrop", "material.cosmiccore.naquadric_superalloy": "Naquadric Superalloy", "material.cosmiccore.neutronite": "Neutronite", "material.cosmiccore.nevramite": "Nevramite", + "material.cosmiccore.pale_oil": "Pale Oil", + "material.cosmiccore.pale_steel": "Pale Steel", + "material.cosmiccore.perfect_overclock_nutrient": "Perfected Overclocking Nutrient", + "material.cosmiccore.perfect_production_nutrient": "Perfect Production Nutrient", "material.cosmiccore.prisma": "Prisma", "material.cosmiccore.prismatic_tungstensteel": "Prismatic Tungstensteel", "material.cosmiccore.programmable_matter": "Programmable Matter", "material.cosmiccore.psionic_galvorn": "Psionic Galvorn", + "material.cosmiccore.reclaimed_pale_ore": "Reclaimed Pale Ore", "material.cosmiccore.resonant_virtue_meld": "Resonant Virtue Meld", + "material.cosmiccore.rosmotosin": "Rosmotosin", "material.cosmiccore.shimmering_neutronium": "Shimmering Neutronium", + "material.cosmiccore.signalum": "Signalum", "material.cosmiccore.sol_steel": "Sol Steel", + "material.cosmiccore.somanone": "Somanone", "material.cosmiccore.spacetime": "Spacetime", "material.cosmiccore.starmetal": "Starmetal", + "material.cosmiccore.starstruck_halite": "Starstruck Halite", "material.cosmiccore.stygian_plague": "Stygian Plague", + "material.cosmiccore.super_overclock_nutrient": "Super Overclocking Nutrient", + "material.cosmiccore.super_production_nutrient": "Super Production Nutrient", + "material.cosmiccore.superheavy_bedrock_alloy": "Superheavy Bedrock Alloy", "material.cosmiccore.taranium": "Taranium", "material.cosmiccore.temmerite": "Temmerite", + "material.cosmiccore.tenbrium": "Tenbrium", "material.cosmiccore.trinavine": "Trinavine", "material.cosmiccore.trinium_naqide": "Trinium Naqide", "material.cosmiccore.triphenylphosphine": "Triphenylphosphine", "material.cosmiccore.universe_tears": "Universe Tears", + "material.cosmiccore.vibrant_alloy": "Vibrant Alloy", "material.cosmiccore.virtue_meld": "Virtue Meld", "material.cosmiccore.vitrius": "Vitrius", "material.cosmiccore.voidspark": "Voidspark", + "reflection.cosmiccore.bargain.ascension.answer.ready.drawback.0": "-30% movement speed when not flying", + "reflection.cosmiccore.bargain.ascension.answer.ready.drawback.1": "Vulnerable in no-fly zones or enclosed spaces", + "reflection.cosmiccore.bargain.ascension.answer.ready.power.0": "Creative-style flight (toggle with jump while airborne)", + "reflection.cosmiccore.bargain.ascension.answer.ready.power.1": "Fly indefinitely without hunger or stamina cost", + "reflection.cosmiccore.bargain.ascension.answer.ready.power.2": "Full 3D movement control while flying", + "reflection.cosmiccore.bargain.ascension.answer.ready.power.3": "No fall damage while flight is active", + "reflection.cosmiccore.bargain.ascension.answer.ready.response": "Then rise. The ground has no claim on you anymore.", + "reflection.cosmiccore.bargain.ascension.answer.ready.text": "I am ready to fly.", + "reflection.cosmiccore.bargain.ascension.answer.refuse.response": "Served. Like a servant. How long until you realize you were the servant all along?", + "reflection.cosmiccore.bargain.ascension.answer.refuse.text": "The ground has served me well.", + "reflection.cosmiccore.bargain.ascension.description": "Rise above the crawling earth", + "reflection.cosmiccore.bargain.ascension.dialogue.0": "You are bound to the ground. Chained by gravity's petty tyranny.", + "reflection.cosmiccore.bargain.ascension.dialogue.1": "You dream of flight. All mortals do.", + "reflection.cosmiccore.bargain.ascension.dialogue.2": "I can sever those chains. Let you rise.", + "reflection.cosmiccore.bargain.ascension.dialogue.3": "Not gliding. Not falling with style. True flight.", + "reflection.cosmiccore.bargain.ascension.dialogue.4": "The sky will open to you like a door.", + "reflection.cosmiccore.bargain.ascension.dialogue.5": "But the ground... the ground will become alien. Uncomfortable. Wrong.", + "reflection.cosmiccore.bargain.ascension.name": "Ascension", + "reflection.cosmiccore.bargain.ascension.on_accept": "Weight leaves you. The sky opens. You are no longer earth-bound.", + "reflection.cosmiccore.bargain.ascension.on_defy": "Gravity reclaims you. The ground welcomes you back, possessively.", + "reflection.cosmiccore.bargain.ascension.question": "Will you abandon the earth for the sky?", + "reflection.cosmiccore.bargain.back.answer.accept.drawback.0": "5 erosion cost per teleport use", + "reflection.cosmiccore.bargain.back.answer.accept.drawback.1": "Marker fades after 10 minutes", + "reflection.cosmiccore.bargain.back.answer.accept.power.0": "Teleport to death location (once per death)", + "reflection.cosmiccore.bargain.back.answer.accept.power.1": "Death marker visible through walls", + "reflection.cosmiccore.bargain.back.answer.accept.response": "Death becomes a waypoint now. Not an ending - a detour.", + "reflection.cosmiccore.bargain.back.answer.accept.text": "Teach me to find my way back.", + "reflection.cosmiccore.bargain.back.answer.refuse.response": "Consequences. You'll have plenty of those regardless.", + "reflection.cosmiccore.bargain.back.answer.refuse.text": "Death should have consequences.", + "reflection.cosmiccore.bargain.back.description": "Return to where you fell", + "reflection.cosmiccore.bargain.back.dialogue.0": "Death scatters you. Sends you back to beds, to spawns, to arbitrary points.", + "reflection.cosmiccore.bargain.back.dialogue.1": "But what if you could return to where you fell?", + "reflection.cosmiccore.bargain.back.dialogue.2": "I can teach you to remember. To reach back through death itself.", + "reflection.cosmiccore.bargain.back.name": "The Way Back", + "reflection.cosmiccore.bargain.back.on_accept": "A thread connects you to your last breath. You can follow it back.", + "reflection.cosmiccore.bargain.back.on_defy": "The thread snaps. Death becomes final once more.", + "reflection.cosmiccore.bargain.back.question": "Will you learn to retrace death's path?", + "reflection.cosmiccore.bargain.carapace.answer.refuse.response": "Feeling. How fragile. How mortal. How temporary.", + "reflection.cosmiccore.bargain.carapace.answer.refuse.text": "I would rather feel than merely endure.", + "reflection.cosmiccore.bargain.carapace.answer.survive.drawback.0": "-20% healing from all sources", + "reflection.cosmiccore.bargain.carapace.answer.survive.drawback.1": "Reduced potion effectiveness", + "reflection.cosmiccore.bargain.carapace.answer.survive.power.0": "+8 armor points (4 full armor icons)", + "reflection.cosmiccore.bargain.carapace.answer.survive.power.1": "Stacks with worn armor", + "reflection.cosmiccore.bargain.carapace.answer.survive.response": "Your skin tightens. Hardens. You are becoming something more durable.", + "reflection.cosmiccore.bargain.carapace.answer.survive.text": "Harden me. I choose survival.", + "reflection.cosmiccore.bargain.carapace.description": "Your flesh hardens into living armor", + "reflection.cosmiccore.bargain.carapace.dialogue.0": "Your skin is so soft. So vulnerable.", + "reflection.cosmiccore.bargain.carapace.dialogue.1": "Every blade, every claw, every falling stone - they all threaten you.", + "reflection.cosmiccore.bargain.carapace.dialogue.2": "I can harden your flesh. Make it something more... enduring.", + "reflection.cosmiccore.bargain.carapace.dialogue.3": "Blows will glance off. Damage will diminish.", + "reflection.cosmiccore.bargain.carapace.dialogue.4": "But you will feel less. Touch will become... distant.", + "reflection.cosmiccore.bargain.carapace.name": "Carapace", + "reflection.cosmiccore.bargain.carapace.on_accept": "Your flesh ripples and tightens. It doesn't hurt. That's the point.", + "reflection.cosmiccore.bargain.carapace.on_defy": "Sensation floods back - every breeze, every texture. You are soft again.", + "reflection.cosmiccore.bargain.carapace.question": "Will you sacrifice sensation for survival?", + "reflection.cosmiccore.bargain.cinder.answer.burn.drawback.0": "2x damage from freezing and cold sources", + "reflection.cosmiccore.bargain.cinder.answer.burn.drawback.1": "Water extinguishes slower, feels unpleasant", + "reflection.cosmiccore.bargain.cinder.answer.burn.power.0": "Complete fire and lava immunity", + "reflection.cosmiccore.bargain.cinder.answer.burn.power.1": "Can swim in lava safely", + "reflection.cosmiccore.bargain.cinder.answer.burn.response": "It hurts. Just for a moment. Then the pain becomes a memory, and fire becomes a friend.", + "reflection.cosmiccore.bargain.cinder.answer.burn.text": "Burn me completely. Make me immune.", + "reflection.cosmiccore.bargain.cinder.answer.refuse.response": "Respect. For something that would consume you without thought. How noble.", + "reflection.cosmiccore.bargain.cinder.answer.refuse.text": "Fire should be respected, not befriended.", + "reflection.cosmiccore.bargain.cinder.description": "Fire cannot harm what has already burned", + "reflection.cosmiccore.bargain.cinder.dialogue.0": "Fire consumes. It is in its nature to destroy.", + "reflection.cosmiccore.bargain.cinder.dialogue.1": "Every flame that touches you leaves its mark.", + "reflection.cosmiccore.bargain.cinder.dialogue.2": "But what if you had already burned? Completely. Utterly.", + "reflection.cosmiccore.bargain.cinder.dialogue.3": "Fire cannot consume what is already ash and ember.", + "reflection.cosmiccore.bargain.cinder.dialogue.4": "Let me burn away your vulnerability. You will walk through infernos unscathed.", + "reflection.cosmiccore.bargain.cinder.name": "Cinder", + "reflection.cosmiccore.bargain.cinder.on_accept": "Heat floods through you, then recedes. Fire will never frighten you again.", + "reflection.cosmiccore.bargain.cinder.on_defy": "The warmth drains away. Flames flicker hungrily when they see you now.", + "reflection.cosmiccore.bargain.cinder.question": "Will you let the flame claim you, so it can never hurt you again?", + "reflection.cosmiccore.bargain.darksight.answer.refuse.response": "Cling to your torch then. See how long it lasts in the deep places.", + "reflection.cosmiccore.bargain.darksight.answer.refuse.text": "The light serves me well enough.", + "reflection.cosmiccore.bargain.darksight.answer.yes.drawback.0": "Blindness effect in bright sunlight", + "reflection.cosmiccore.bargain.darksight.answer.yes.drawback.1": "Must wear helmet or stay underground during day", + "reflection.cosmiccore.bargain.darksight.answer.yes.power.0": "Permanent Night Vision effect", + "reflection.cosmiccore.bargain.darksight.answer.yes.power.1": "See in complete darkness", + "reflection.cosmiccore.bargain.darksight.answer.yes.response": "Your pupils dilate... and keep dilating. The dark becomes your domain.", + "reflection.cosmiccore.bargain.darksight.answer.yes.text": "Let me see in the darkness.", + "reflection.cosmiccore.bargain.darksight.description": "See through the deepest darkness", + "reflection.cosmiccore.bargain.darksight.dialogue.0": "You fear the dark. Every creature does, at first.", + "reflection.cosmiccore.bargain.darksight.dialogue.1": "But darkness is merely the absence of something. Not presence.", + "reflection.cosmiccore.bargain.darksight.dialogue.2": "I can teach your eyes to drink the shadow. To see what lurks unseen.", + "reflection.cosmiccore.bargain.darksight.dialogue.3": "Every hidden corner will surrender its secrets to you.", + "reflection.cosmiccore.bargain.darksight.dialogue.4": "But be warned - the light will begin to burn.", + "reflection.cosmiccore.bargain.darksight.name": "Darksight", + "reflection.cosmiccore.bargain.darksight.on_accept": "The shadows retreat from your vision. You see everything now.", + "reflection.cosmiccore.bargain.darksight.on_defy": "Light floods back. The darkness closes its secrets to you once more.", + "reflection.cosmiccore.bargain.darksight.question": "Will you trade the sun for the gift of shadow-sight?", + "reflection.cosmiccore.bargain.depths.answer.embrace.drawback.0": "Instant death when oxygen fully depletes", + "reflection.cosmiccore.bargain.depths.answer.embrace.drawback.1": "No drowning damage warning - just death", + "reflection.cosmiccore.bargain.depths.answer.embrace.power.0": "5x oxygen capacity underwater", + "reflection.cosmiccore.bargain.depths.answer.embrace.power.1": "Extended breath in toxic atmospheres", + "reflection.cosmiccore.bargain.depths.answer.embrace.response": "Your chest feels hollow now. That's normal. The new capacity needs room.", + "reflection.cosmiccore.bargain.depths.answer.embrace.text": "Remake me for the depths.", + "reflection.cosmiccore.bargain.depths.answer.refuse.response": "The depths wait patiently. They always have.", + "reflection.cosmiccore.bargain.depths.answer.refuse.text": "I'll keep my mortal breath.", + "reflection.cosmiccore.bargain.depths.description": "Enhanced breath with fatal consequences", + "reflection.cosmiccore.bargain.depths.dialogue.0": "You've felt the water closing over your head.", + "reflection.cosmiccore.bargain.depths.dialogue.1": "That desperate burn in your lungs. The panic.", + "reflection.cosmiccore.bargain.depths.dialogue.2": "I can remake those fragile organs. Give them capacity beyond mortal limits.", + "reflection.cosmiccore.bargain.depths.dialogue.3": "Your breath will stretch to fill the void between heartbeats.", + "reflection.cosmiccore.bargain.depths.dialogue.4": "But understand - when they finally empty, there will be no warning.", + "reflection.cosmiccore.bargain.depths.dialogue.5": "No desperate gasps. No gradual fading. Just... silence.", + "reflection.cosmiccore.bargain.depths.name": "The Depths", + "reflection.cosmiccore.bargain.depths.on_accept": "Something shifts in your chest. The air tastes different now.", + "reflection.cosmiccore.bargain.depths.on_defy": "You gasp - your lungs remember panic, remember struggle. You are mortal again.", + "reflection.cosmiccore.bargain.depths.question": "Will you let me reshape your breath?", + "reflection.cosmiccore.bargain.home.answer.accept.drawback.0": "10 erosion cost per teleport", + "reflection.cosmiccore.bargain.home.answer.accept.drawback.1": "-10% XP gain while far from home", + "reflection.cosmiccore.bargain.home.answer.accept.power.0": "Instant teleport to spawn/bed point", + "reflection.cosmiccore.bargain.home.answer.accept.power.1": "5 minute cooldown between uses", + "reflection.cosmiccore.bargain.home.answer.accept.response": "Feel the pull now? Home is never more than a thought away.", + "reflection.cosmiccore.bargain.home.answer.accept.text": "Bind me to my home.", + "reflection.cosmiccore.bargain.home.answer.refuse.response": "Earned. Through miles of walking. How charmingly primitive.", + "reflection.cosmiccore.bargain.home.answer.refuse.text": "Home should be earned, not summoned.", + "reflection.cosmiccore.bargain.home.description": "The way home is always open", + "reflection.cosmiccore.bargain.home.dialogue.0": "Home. Such a powerful concept for mortals.", + "reflection.cosmiccore.bargain.home.dialogue.1": "The place you return to. The anchor that grounds you.", + "reflection.cosmiccore.bargain.home.dialogue.2": "I can make that connection stronger. Instant. Unbreakable.", + "reflection.cosmiccore.bargain.home.name": "Homeward", + "reflection.cosmiccore.bargain.home.on_accept": "A cord of void stretches between you and home. Pull it anytime.", + "reflection.cosmiccore.bargain.home.on_defy": "The cord dissolves. Home is a journey again, not a destination.", + "reflection.cosmiccore.bargain.home.question": "Will you bind yourself to your home with chains of void?", + "reflection.cosmiccore.bargain.quake_movement.answer.refuse.response": "Such faith in the pedestrian. We shall see how long that serves you.", + "reflection.cosmiccore.bargain.quake_movement.answer.refuse.text": "My feet know their own rhythm.", + "reflection.cosmiccore.bargain.quake_movement.answer.yes.drawback.0": "Movement feels unnatural to observers", + "reflection.cosmiccore.bargain.quake_movement.answer.yes.power.0": "Bunny hopping preserves and builds momentum", + "reflection.cosmiccore.bargain.quake_movement.answer.yes.power.1": "Air strafing for mid-air direction control", + "reflection.cosmiccore.bargain.quake_movement.answer.yes.response": "Feel it now - your muscles rewiring, learning trajectories they were never meant to know.", + "reflection.cosmiccore.bargain.quake_movement.answer.yes.text": "Teach me to move like the wind.", + "reflection.cosmiccore.bargain.quake_movement.description": "Master momentum itself through unnatural locomotion", + "reflection.cosmiccore.bargain.quake_movement.dialogue.0": "You move like prey. Hesitant. Fearful.", + "reflection.cosmiccore.bargain.quake_movement.dialogue.1": "I remember when things moved differently. Before physics became so... rigid.", + "reflection.cosmiccore.bargain.quake_movement.dialogue.2": "I can teach your legs to remember that older way.", + "reflection.cosmiccore.bargain.quake_movement.dialogue.3": "But once they learn, they will never be content with stillness again.", + "reflection.cosmiccore.bargain.quake_movement.name": "Velocity", + "reflection.cosmiccore.bargain.quake_movement.on_accept": "Your joints crack and reform. Movement becomes instinct.", + "reflection.cosmiccore.bargain.quake_movement.on_defy": "Your legs remember what it was to walk normally. The speed fades like a dream.", + "reflection.cosmiccore.bargain.quake_movement.question": "Will you embrace the velocity that waits within you?", + "reflection.cosmiccore.bargain.reach.answer.further.drawback.0": "-15% mining speed", + "reflection.cosmiccore.bargain.reach.answer.further.drawback.1": "Item pickup range reduced", + "reflection.cosmiccore.bargain.reach.answer.further.power.0": "+3 block reach (build from further)", + "reflection.cosmiccore.bargain.reach.answer.further.power.1": "+2 attack reach", + "reflection.cosmiccore.bargain.reach.answer.further.response": "There. Don't look at your hands too closely. It's easier that way.", + "reflection.cosmiccore.bargain.reach.answer.further.text": "Stretch me further. I want to grasp everything.", + "reflection.cosmiccore.bargain.reach.answer.refuse.response": "For now. But you'll want more. They always do.", + "reflection.cosmiccore.bargain.reach.answer.refuse.text": "My reach is sufficient.", + "reflection.cosmiccore.bargain.reach.description": "Your grasp extends beyond natural limits", + "reflection.cosmiccore.bargain.reach.dialogue.0": "So close, yet so far. The eternal frustration of short arms.", + "reflection.cosmiccore.bargain.reach.dialogue.1": "Everything just slightly out of reach. Mocking you.", + "reflection.cosmiccore.bargain.reach.dialogue.2": "I can extend you. Stretch your grasp beyond mortal limits.", + "reflection.cosmiccore.bargain.reach.dialogue.3": "Your arms will find what they seek. But others may find them... unsettling.", + "reflection.cosmiccore.bargain.reach.name": "Reach", + "reflection.cosmiccore.bargain.reach.on_accept": "Something shifts in your shoulders. Your arms remember being longer.", + "reflection.cosmiccore.bargain.reach.on_defy": "Your arms contract back to normal. The world feels close and small again.", + "reflection.cosmiccore.bargain.reach.question": "Will you extend your reach into the unnatural?", + "reflection.cosmiccore.bargain.satiated.answer.empty.drawback.0": "Food restores 50% less hunger bars", + "reflection.cosmiccore.bargain.satiated.answer.empty.drawback.1": "Cannot benefit from food-based buffs", + "reflection.cosmiccore.bargain.satiated.answer.empty.power.0": "Hunger depletes 80% slower", + "reflection.cosmiccore.bargain.satiated.answer.empty.power.1": "Food provides 3x saturation", + "reflection.cosmiccore.bargain.satiated.answer.empty.response": "The emptiness fades. You will never truly need to eat again.", + "reflection.cosmiccore.bargain.satiated.answer.empty.text": "Free me from this hunger.", + "reflection.cosmiccore.bargain.satiated.answer.refuse.response": "Enjoy. Such a mortal word. The hunger will remind you of your place.", + "reflection.cosmiccore.bargain.satiated.answer.refuse.text": "I enjoy my meals. I'll keep the hunger.", + "reflection.cosmiccore.bargain.satiated.description": "Hunger becomes a distant memory", + "reflection.cosmiccore.bargain.satiated.dialogue.0": "The constant gnawing. The endless need to consume.", + "reflection.cosmiccore.bargain.satiated.dialogue.1": "Your stomach rules you like a tyrant.", + "reflection.cosmiccore.bargain.satiated.dialogue.2": "What if I could silence it? Make fullness your natural state?", + "reflection.cosmiccore.bargain.satiated.dialogue.3": "You would eat for taste, for ritual - never for need.", + "reflection.cosmiccore.bargain.satiated.dialogue.4": "But taste itself would fade. Food becomes... fuel. Nothing more.", + "reflection.cosmiccore.bargain.satiated.name": "Satiated", + "reflection.cosmiccore.bargain.satiated.on_accept": "The gnawing stops. Silence in your belly. Freedom.", + "reflection.cosmiccore.bargain.satiated.on_defy": "Hunger returns with a vengeance. You remember what need feels like.", + "reflection.cosmiccore.bargain.satiated.question": "Will you trade the pleasure of eating for freedom from hunger?", + "reflection.cosmiccore.bargain.soft_landing.answer.refuse.response": "Caution. A slow path to nowhere. But walk it if you must.", + "reflection.cosmiccore.bargain.soft_landing.answer.refuse.text": "Fear keeps me cautious. I'll keep it.", + "reflection.cosmiccore.bargain.soft_landing.answer.yes.drawback.0": "+15% damage taken from all sources", + "reflection.cosmiccore.bargain.soft_landing.answer.yes.drawback.1": "Reduced knockback resistance", + "reflection.cosmiccore.bargain.soft_landing.answer.yes.power.0": "Complete fall damage immunity", + "reflection.cosmiccore.bargain.soft_landing.answer.yes.power.1": "Safe drops from any height", + "reflection.cosmiccore.bargain.soft_landing.answer.yes.response": "Jump. Go ahead. The ground will embrace you like a mother.", + "reflection.cosmiccore.bargain.soft_landing.answer.yes.text": "Take away my fear of falling.", + "reflection.cosmiccore.bargain.soft_landing.description": "The ground welcomes you gently from any height", + "reflection.cosmiccore.bargain.soft_landing.dialogue.0": "Heights terrify you. The primal fear of falling.", + "reflection.cosmiccore.bargain.soft_landing.dialogue.1": "That sickening moment when gravity claims you.", + "reflection.cosmiccore.bargain.soft_landing.dialogue.2": "But what if the ground... forgave you?", + "reflection.cosmiccore.bargain.soft_landing.dialogue.3": "What if every fall ended softly, no matter the height?", + "reflection.cosmiccore.bargain.soft_landing.dialogue.4": "You need never fear the drop again.", + "reflection.cosmiccore.bargain.soft_landing.name": "Soft Landing", + "reflection.cosmiccore.bargain.soft_landing.on_accept": "Your relationship with gravity shifts. It still pulls, but gently now.", + "reflection.cosmiccore.bargain.soft_landing.on_defy": "Weight crashes back into your bones. Every fall matters again.", + "reflection.cosmiccore.bargain.soft_landing.question": "Will you let the earth catch you?", + "reflection.cosmiccore.bargain.stride.answer.accept.drawback.0": "Cannot crouch-walk off edges", + "reflection.cosmiccore.bargain.stride.answer.accept.power.0": "Auto step-up to 1 block height", + "reflection.cosmiccore.bargain.stride.answer.accept.power.1": "Smooth terrain traversal", + "reflection.cosmiccore.bargain.stride.answer.accept.response": "Walk now. Feel how terrain reshapes itself for your convenience.", + "reflection.cosmiccore.bargain.stride.answer.accept.text": "Let the world flatten before me.", + "reflection.cosmiccore.bargain.stride.answer.refuse.response": "Such determination. It will erode. They always do.", + "reflection.cosmiccore.bargain.stride.answer.refuse.text": "I'll climb my own way.", + "reflection.cosmiccore.bargain.stride.description": "Walk over obstacles as if they were nothing", + "reflection.cosmiccore.bargain.stride.dialogue.0": "Every ledge. Every block. Every small obstacle.", + "reflection.cosmiccore.bargain.stride.dialogue.1": "They mock you with their need to be climbed.", + "reflection.cosmiccore.bargain.stride.dialogue.2": "What if the world simply... accommodated your stride?", + "reflection.cosmiccore.bargain.stride.dialogue.3": "Your feet need never leave the ground. The ground will rise to meet them.", + "reflection.cosmiccore.bargain.stride.name": "Stride", + "reflection.cosmiccore.bargain.stride.on_accept": "The earth seems to shift slightly, eager to smooth your path.", + "reflection.cosmiccore.bargain.stride.on_defy": "Gravity reasserts itself. Every ledge is a challenge again.", + "reflection.cosmiccore.bargain.stride.question": "Shall obstacles bow before your passage?", + "reflection.cosmiccore.bargain.swiftness.answer.accept.drawback.0": "Increased hunger when standing still", + "reflection.cosmiccore.bargain.swiftness.answer.accept.power.0": "+40% movement speed", + "reflection.cosmiccore.bargain.swiftness.answer.accept.power.1": "Sprint without hunger drain", + "reflection.cosmiccore.bargain.swiftness.answer.accept.response": "Your blood sings now. Feel it racing faster than any heart should allow.", + "reflection.cosmiccore.bargain.swiftness.answer.accept.text": "Make me swift beyond measure.", + "reflection.cosmiccore.bargain.swiftness.answer.refuse.response": "Content. Such a mortal sentiment. It will fade.", + "reflection.cosmiccore.bargain.swiftness.answer.refuse.text": "I am content with my pace.", + "reflection.cosmiccore.bargain.swiftness.description": "Supernatural speed courses through your veins", + "reflection.cosmiccore.bargain.swiftness.dialogue.0": "The world moves so slowly around you, doesn't it?", + "reflection.cosmiccore.bargain.swiftness.dialogue.1": "Everyone else trudging through molasses while you ache to run.", + "reflection.cosmiccore.bargain.swiftness.dialogue.2": "I can accelerate you. Make the world blur past like a fading dream.", + "reflection.cosmiccore.bargain.swiftness.name": "Swiftness", + "reflection.cosmiccore.bargain.swiftness.on_accept": "Lightning arcs through your muscles. You twitch with restless energy.", + "reflection.cosmiccore.bargain.swiftness.on_defy": "The world speeds up around you. You are merely human once more.", + "reflection.cosmiccore.bargain.swiftness.question": "Do you wish to leave the slow world behind?", + "reflection.cosmiccore.bargain.violence.answer.accept.drawback.0": "+20% damage taken from all sources", + "reflection.cosmiccore.bargain.violence.answer.accept.drawback.1": "Cannot use shields", + "reflection.cosmiccore.bargain.violence.answer.accept.power.0": "+30% melee damage dealt", + "reflection.cosmiccore.bargain.violence.answer.accept.power.1": "+15% attack speed", + "reflection.cosmiccore.bargain.violence.answer.accept.response": "Feel it now? The urge to destroy? Don't fight it. It's yours.", + "reflection.cosmiccore.bargain.violence.answer.accept.text": "Remove my restraints.", + "reflection.cosmiccore.bargain.violence.answer.refuse.response": "Restraint. A leash you put on yourself. How adorable.", + "reflection.cosmiccore.bargain.violence.answer.refuse.text": "Restraint is its own strength.", + "reflection.cosmiccore.bargain.violence.description": "Strike with the force of something terrible", + "reflection.cosmiccore.bargain.violence.dialogue.0": "Your blows are so... restrained. Hesitant.", + "reflection.cosmiccore.bargain.violence.dialogue.1": "You hold back. Every swing. Some part of you fears the damage.", + "reflection.cosmiccore.bargain.violence.dialogue.2": "I can remove that restraint. Let your violence flow freely.", + "reflection.cosmiccore.bargain.violence.dialogue.3": "Your enemies will shatter before you.", + "reflection.cosmiccore.bargain.violence.dialogue.4": "But violence is a river that flows both ways.", + "reflection.cosmiccore.bargain.violence.name": "Violence", + "reflection.cosmiccore.bargain.violence.on_accept": "Power surges through your arms. Everything looks so... breakable now.", + "reflection.cosmiccore.bargain.violence.on_defy": "The rage drains away. Your blows return to mortal weight.", + "reflection.cosmiccore.bargain.violence.question": "Will you embrace true, unrestrained violence?", + "reflection.cosmiccore.bargain.vitality.answer.accept.drawback.0": "-50% natural regeneration rate", + "reflection.cosmiccore.bargain.vitality.answer.accept.drawback.1": "Healing potions 30% less effective", + "reflection.cosmiccore.bargain.vitality.answer.accept.power.0": "+10 max health (5 extra hearts)", + "reflection.cosmiccore.bargain.vitality.answer.accept.power.1": "Increased damage absorption buffer", + "reflection.cosmiccore.bargain.vitality.answer.accept.response": "Your heart swells. Literally. It has more to pump now.", + "reflection.cosmiccore.bargain.vitality.answer.accept.text": "Give me more life to spend.", + "reflection.cosmiccore.bargain.vitality.answer.refuse.response": "Given. As if anyone gave you anything. You simply are. For now.", + "reflection.cosmiccore.bargain.vitality.answer.refuse.text": "I'll work with what I was given.", + "reflection.cosmiccore.bargain.vitality.description": "Life force beyond mortal limits", + "reflection.cosmiccore.bargain.vitality.dialogue.0": "Your body has limits. A fixed amount of life.", + "reflection.cosmiccore.bargain.vitality.dialogue.1": "When it empties, you die. Simple. Brutal. Final.", + "reflection.cosmiccore.bargain.vitality.dialogue.2": "I can give you more. Stretch your life force beyond its natural bounds.", + "reflection.cosmiccore.bargain.vitality.dialogue.3": "More blood. More breath. More heartbeats before the end.", + "reflection.cosmiccore.bargain.vitality.dialogue.4": "But maintaining excess takes effort. You will heal... slower.", + "reflection.cosmiccore.bargain.vitality.name": "Vitality", + "reflection.cosmiccore.bargain.vitality.on_accept": "Your veins surge with new vigor. Everything feels more... present.", + "reflection.cosmiccore.bargain.vitality.on_defy": "The excess drains away. You are mortal-sized once more.", + "reflection.cosmiccore.bargain.vitality.question": "Will you trade recovery for resilience?", + "reflection.cosmiccore.bargain.void_anchor.answer.anchor.drawback.0": "-25% damage in lit areas (sky access)", + "reflection.cosmiccore.bargain.void_anchor.answer.anchor.drawback.1": "Takes damage from direct sunlight exposure", + "reflection.cosmiccore.bargain.void_anchor.answer.anchor.power.0": "Void damage immunity (Y < 0)", + "reflection.cosmiccore.bargain.void_anchor.answer.anchor.power.1": "Teleport to surface when entering void", + "reflection.cosmiccore.bargain.void_anchor.answer.anchor.response": "Done. The void knows your name now. It will not harm what belongs to it.", + "reflection.cosmiccore.bargain.void_anchor.answer.anchor.text": "Mark me. Make me yours.", + "reflection.cosmiccore.bargain.void_anchor.answer.refuse.response": "The light. Yes. Such a thin shield against the endless dark. Good luck.", + "reflection.cosmiccore.bargain.void_anchor.answer.refuse.text": "I'll stay in the light, thank you.", + "reflection.cosmiccore.bargain.void_anchor.description": "The void cannot claim what is already its own", + "reflection.cosmiccore.bargain.void_anchor.dialogue.0": "You've felt it. The pull of the void beneath the world.", + "reflection.cosmiccore.bargain.void_anchor.dialogue.1": "That endless fall. That final darkness that swallows everything.", + "reflection.cosmiccore.bargain.void_anchor.dialogue.2": "I dwell there. In that space between existence and nothing.", + "reflection.cosmiccore.bargain.void_anchor.dialogue.3": "I can mark you. Make you mine. And what is mine, the void cannot destroy.", + "reflection.cosmiccore.bargain.void_anchor.dialogue.4": "Fall as far as you like. The darkness will recognize you. Welcome you.", + "reflection.cosmiccore.bargain.void_anchor.dialogue.5": "But being marked by the void... it changes how existence sees you.", + "reflection.cosmiccore.bargain.void_anchor.name": "Void Anchor", + "reflection.cosmiccore.bargain.void_anchor.on_accept": "Something cold touches your soul. Marks it. The void knows you now.", + "reflection.cosmiccore.bargain.void_anchor.on_defy": "The mark burns away. The void forgets you. It will not be merciful next time.", + "reflection.cosmiccore.bargain.void_anchor.question": "Will you become an anchor in the nothing?", + "reflection.cosmiccore.threshold.0.dialogue.0": "You took something that wasn't freely given.", + "reflection.cosmiccore.threshold.0.dialogue.1": "Did it feel good? The power flooding in?", + "reflection.cosmiccore.threshold.0.dialogue.2": "Of course it did. That's the point.", + "reflection.cosmiccore.threshold.0.dialogue.3": "I'll be watching now. We have business together.", + "reflection.cosmiccore.threshold.0.question": "Do you understand what you've started?", + "reflection.cosmiccore.threshold.0.response": "Good. Or not. It doesn't matter now.", + "reflection.cosmiccore.threshold.1.dialogue.0": "Already back for more. I'm not surprised.", + "reflection.cosmiccore.threshold.1.dialogue.1": "Your soul stretches thinner. Can you feel it?", + "reflection.cosmiccore.threshold.1.dialogue.2": "Like taffy. Like mist. Like a memory fading.", + "reflection.cosmiccore.threshold.1.dialogue.3": "Don't worry. You have plenty left. For now.", + "reflection.cosmiccore.threshold.1.question": "Still comfortable?", + "reflection.cosmiccore.threshold.1.response": "Comfort is overrated anyway.", + "reflection.cosmiccore.threshold.2.dialogue.0": "A third of you belongs to me now.", + "reflection.cosmiccore.threshold.2.dialogue.1": "That's not metaphor. I can see it. Taste it.", + "reflection.cosmiccore.threshold.2.dialogue.2": "Your edges blur. Your definition softens.", + "reflection.cosmiccore.threshold.2.dialogue.3": "Others might start to notice soon.", + "reflection.cosmiccore.threshold.2.question": "Having second thoughts?", + "reflection.cosmiccore.threshold.2.response": "Second thoughts require a first. You never had one.", + "reflection.cosmiccore.threshold.3.dialogue.0": "The dreams are starting, aren't they?", + "reflection.cosmiccore.threshold.3.dialogue.1": "The ones where you fall and never land.", + "reflection.cosmiccore.threshold.3.dialogue.2": "Where you look in a mirror and something else looks back.", + "reflection.cosmiccore.threshold.3.dialogue.3": "That's not a dream. That's prophecy.", + "reflection.cosmiccore.threshold.3.question": "Do you still know who you are?", + "reflection.cosmiccore.threshold.3.response": "Keep telling yourself that name means something.", + "reflection.cosmiccore.threshold.4.dialogue.0": "Halfway. The point of no return approaches.", + "reflection.cosmiccore.threshold.4.dialogue.1": "Half of you, gone. Given away for trinkets.", + "reflection.cosmiccore.threshold.4.dialogue.2": "Was it worth it? Don't answer. I don't care.", + "reflection.cosmiccore.threshold.4.dialogue.3": "What matters is what comes next.", + "reflection.cosmiccore.threshold.4.question": "Ready to see what's on the other side?", + "reflection.cosmiccore.threshold.4.response": "No one ever is. But they cross anyway.", + "reflection.cosmiccore.threshold.5.dialogue.0": "More of you is mine than yours now.", + "reflection.cosmiccore.threshold.5.dialogue.1": "Does that frighten you? It should.", + "reflection.cosmiccore.threshold.5.dialogue.2": "I know thoughts you haven't had yet.", + "reflection.cosmiccore.threshold.5.dialogue.3": "I feel feelings you've forgotten.", + "reflection.cosmiccore.threshold.5.question": "Who's really in control?", + "reflection.cosmiccore.threshold.5.response": "Keep pretending you still have choice.", + "reflection.cosmiccore.threshold.6.dialogue.0": "Your reflection doesn't quite match anymore.", + "reflection.cosmiccore.threshold.6.dialogue.1": "The delay is slight. Others might not notice.", + "reflection.cosmiccore.threshold.6.dialogue.2": "But you know. You feel it.", + "reflection.cosmiccore.threshold.6.question": "What stares back at you in mirrors?", + "reflection.cosmiccore.threshold.6.response": "Me. Always me now.", + "reflection.cosmiccore.threshold.7.dialogue.0": "So little left of what you were.", + "reflection.cosmiccore.threshold.7.dialogue.1": "Fragments. Echoes. Shadows of intention.", + "reflection.cosmiccore.threshold.7.dialogue.2": "The body walks. The mind calculates.", + "reflection.cosmiccore.threshold.7.dialogue.3": "But the soul? The soul is almost spent.", + "reflection.cosmiccore.threshold.7.question": "Can you remember your mother's face?", + "reflection.cosmiccore.threshold.7.response": "No. You can't. I took that already.", + "reflection.cosmiccore.threshold.8.dialogue.0": "One step from the edge now.", + "reflection.cosmiccore.threshold.8.dialogue.1": "Ten percent. A sliver. A thread.", + "reflection.cosmiccore.threshold.8.dialogue.2": "That's all that separates you from... me.", + "reflection.cosmiccore.threshold.8.dialogue.3": "One more bargain. Just one more.", + "reflection.cosmiccore.threshold.8.question": "Will you take that final step?", + "reflection.cosmiccore.threshold.8.response": "We both know you will. The question is when.", + "reflection.cosmiccore.threshold.9.dialogue.0": "Finally.", + "reflection.cosmiccore.threshold.9.dialogue.1": "You gave everything. Every last piece.", + "reflection.cosmiccore.threshold.9.dialogue.2": "There's nothing left of what walked in here.", + "reflection.cosmiccore.threshold.9.dialogue.3": "Only power. Only hunger. Only me.", + "reflection.cosmiccore.threshold.9.question": "What do you see when you look at yourself?", + "reflection.cosmiccore.threshold.9.response": "Nothing. Because there's nothing left to see.", + "reflection.cosmiccore.ui.acknowledge": "[I understand]", + "reflection.cosmiccore.ui.available_bargains": "Available Bargains", + "reflection.cosmiccore.ui.back": "[Back]", + "reflection.cosmiccore.ui.browse.interesting_choice": "An interesting choice. Let me show you.", + "reflection.cosmiccore.ui.browse_bargains": "[Browse %s available bargains]", + "reflection.cosmiccore.ui.cancel": "[Cancel]", + "reflection.cosmiccore.ui.click_to_bargain": "Click to bargain", + "reflection.cosmiccore.ui.click_to_defy": "Click to defy (%d erosion)", + "reflection.cosmiccore.ui.confirm_defiance": "[Confirm Defiance]", + "reflection.cosmiccore.ui.constellation_title": "The Constellation of Bargains", + "reflection.cosmiccore.ui.continue": "[Continue]", + "reflection.cosmiccore.ui.cost": "Cost: %d erosion", + "reflection.cosmiccore.ui.defiance": "Defiance", + "reflection.cosmiccore.ui.defiance.cancel": "[No, I've changed my mind]", + "reflection.cosmiccore.ui.defiance.cannot_undo": "This cannot be undone", + "reflection.cosmiccore.ui.defiance.confirm": "[Yes, I defy this bargain]", + "reflection.cosmiccore.ui.defiance.cost_amount": "This will cost you %d erosion", + "reflection.cosmiccore.ui.defiance.lose_power": "You will lose all powers from this bargain", + "reflection.cosmiccore.ui.defiance.question": "You wish to break this bargain?", + "reflection.cosmiccore.ui.defiance.scar_remains": "A scar will remain on your soul forever", + "reflection.cosmiccore.ui.defiance.so_be_it": "So be it. Feel the pain of reclamation.", + "reflection.cosmiccore.ui.defiance.warning1": "You would break the bargain of %s?", + "reflection.cosmiccore.ui.defiance.warning2": "The cost of defiance is %d erosion.", + "reflection.cosmiccore.ui.defiance.warning3": "The power will leave you. The scar will not.", + "reflection.cosmiccore.ui.defiance.warning4": "Are you certain?", + "reflection.cosmiccore.ui.defiance.will_lose": "You will lose: %s", + "reflection.cosmiccore.ui.defiance.wise": "Wise. The power is worth more than your principles.", + "reflection.cosmiccore.ui.defiance_cost": "Defiance will cost %d erosion", + "reflection.cosmiccore.ui.defiance_warning": "Defying a bargain will cost you power but restore some of your soul.", + "reflection.cosmiccore.ui.defy": "Defy", + "reflection.cosmiccore.ui.defy_bargain": "[Defy This Bargain]", + "reflection.cosmiccore.ui.dialogue_continue": "Click to continue...", + "reflection.cosmiccore.ui.drawback": "Drawback", + "reflection.cosmiccore.ui.drawbacks": "Drawbacks:", + "reflection.cosmiccore.ui.enter_defiance": "[Enter Defiance Mode]", + "reflection.cosmiccore.ui.erosion": "erosion", + "reflection.cosmiccore.ui.exit": "[Leave]", + "reflection.cosmiccore.ui.forever_scarred": "Forever Scarred", + "reflection.cosmiccore.ui.gaze_constellation": "[Gaze upon the constellation]", + "reflection.cosmiccore.ui.hub.browse.power": "See what the void offers", + "reflection.cosmiccore.ui.hub.browse.response": "So many choices... so little soul.", + "reflection.cosmiccore.ui.hub.browse.response_empty": "Nothing for you. Yet.", + "reflection.cosmiccore.ui.hub.greeting.erosion_no_bargains.0": "Erosion without bargains? Curious.", + "reflection.cosmiccore.ui.hub.greeting.erosion_no_bargains.1": "Something else has been taking from you.", + "reflection.cosmiccore.ui.hub.greeting.erosion_no_bargains.2": "Perhaps you should let me help instead.", + "reflection.cosmiccore.ui.hub.greeting.fresh.0": "A pristine soul. How rare.", + "reflection.cosmiccore.ui.hub.greeting.fresh.1": "Don't worry. That won't last.", + "reflection.cosmiccore.ui.hub.greeting.has_bargains.0": "Ah, you return. Hungry for more?", + "reflection.cosmiccore.ui.hub.greeting.has_bargains.1": "I have plenty left to offer.", + "reflection.cosmiccore.ui.hub.greeting.has_scars.0": "I see the scars of defiance.", + "reflection.cosmiccore.ui.hub.greeting.has_scars.1": "You took power, then threw it away.", + "reflection.cosmiccore.ui.hub.greeting.has_scars.2": "Was the cost of keeping it too high?", + "reflection.cosmiccore.ui.hub.greeting.many_bargains.0": "Back again. Of course you are.", + "reflection.cosmiccore.ui.hub.greeting.many_bargains.1": "Your soul grows thinner each time.", + "reflection.cosmiccore.ui.hub.greeting.many_bargains_high.0": "Look at you. So much given away.", + "reflection.cosmiccore.ui.hub.greeting.many_bargains_high.1": "Do you even remember what you were?", + "reflection.cosmiccore.ui.hub.greeting.question": "What brings you to my domain?", + "reflection.cosmiccore.ui.hub.leave_response": "Running away? How predictable.", + "reflection.cosmiccore.ui.hub.reflect.power": "Contemplate your existence", + "reflection.cosmiccore.ui.hub.reflect_response": "Gazing into the abyss, are we?", + "reflection.cosmiccore.ui.hub.review.drawback": "Consider defying a bargain", + "reflection.cosmiccore.ui.hub.review.power": "See what you've given away", + "reflection.cosmiccore.ui.hub.review_response": "Let's see what you've become.", + "reflection.cosmiccore.ui.just_look": "[Just... look at yourself]", + "reflection.cosmiccore.ui.leave": "[Leave this place]", + "reflection.cosmiccore.ui.no_available_bargains": "The void has nothing to offer you... for now.", + "reflection.cosmiccore.ui.no_bargains": "No bargains accepted yet.", + "reflection.cosmiccore.ui.of": "of", + "reflection.cosmiccore.ui.power": "Power", + "reflection.cosmiccore.ui.powers": "Powers:", + "reflection.cosmiccore.ui.reflection.extreme_erosion.0": "Almost nothing left. Almost.", + "reflection.cosmiccore.ui.reflection.extreme_erosion.1": "One more push and you're mine completely.", + "reflection.cosmiccore.ui.reflection.has_bargains.0": "I see you've made some... arrangements.", + "reflection.cosmiccore.ui.reflection.has_bargains.1": "Each one a piece of you given away.", + "reflection.cosmiccore.ui.reflection.high_erosion.0": "So much of you is gone now.", + "reflection.cosmiccore.ui.reflection.high_erosion.1": "Do you remember what you were?", + "reflection.cosmiccore.ui.reflection.low_erosion.0": "Just a taste. That's how it starts.", + "reflection.cosmiccore.ui.reflection.low_erosion.1": "You'll be back for more.", + "reflection.cosmiccore.ui.reflection.mid_erosion.0": "Getting comfortable with the darkness?", + "reflection.cosmiccore.ui.reflection.mid_erosion.1": "I can see it settling into you.", + "reflection.cosmiccore.ui.reflection.no_erosion.0": "Untouched. Pure. How boring.", + "reflection.cosmiccore.ui.reflection.no_erosion.1": "You come here with nothing to show?", + "reflection.cosmiccore.ui.reflection.no_erosion.2": "That will change. They always change.", + "reflection.cosmiccore.ui.review_bargains": "[Review your %s bargains]", + "reflection.cosmiccore.ui.scroll_down": "▼ Scroll down", + "reflection.cosmiccore.ui.scroll_up": "▲ Scroll up", + "reflection.cosmiccore.ui.select": "[Select]", + "reflection.cosmiccore.ui.select_to_view": "Select a bargain to view details", + "reflection.cosmiccore.ui.soul_erosion": "Soul Erosion: %d%%", + "reflection.cosmiccore.ui.soul_erosion_display": "Soul Erosion: %s%%", + "reflection.cosmiccore.ui.soul_label": "Soul", + "reflection.cosmiccore.ui.tooltip.no_details": "No additional details", + "reflection.cosmiccore.ui.unlock_cost": "Cost: %d soul erosion", + "reflection.cosmiccore.ui.view_active": "[View Your Bargains]", + "reflection.cosmiccore.ui.view_bargains": "[View Available Bargains]", + "reflection.cosmiccore.ui.void_title": "The Void Between", + "reflection.cosmiccore.ui.your_bargains": "Your Bargains", + "tagprefix.alve_foil_insulator": "%s Alve Insulator", "tagprefix.heavy_beam": "Heavy %s Beam", "tagprefix.leached_ore": "Leached %s Ore", "tagprefix.modular_shelling": "%s Modular Shelling", "tagprefix.plasmites": "%s Plasmites", "tagprefix.prisma_frothed_ore": "Prisma Frothed %s Ore", + "tagprefix.raw_ore_cubic": "Cubic %s Ore", + "tagprefix.shape_memory_foil": "%s Shaping Memory Foil", "tagprefix.ultradense_plate": "Ultradense %s Plate", "tagprefix.wire_spool": "%s Wire Spool", + "tooltip.cosmiccore.asteroid.tier": "Asteroid Size: %s Kilotons", + "tooltip.cosmiccore.asteroid.tiny": "Asteroid Size: Unknown", + "tooltip.cosmiccore.asteroid_chip.lock": "Lock Strength: %s%%", + "tooltip.cosmiccore.asteroid_chip.mode": "Mode: %s", + "tooltip.cosmiccore.asteroid_chip.sector": "Sector: %s", + "tooltip.cosmiccore.asteroid_chip.target": "Target ID: %s", + "tooltip.cosmiccore.asteroid_chip.tier": "Acquisition Tier: %s", + "tooltip.cosmiccore.asteroid_chip.type": "Type: %s", + "tooltip.cosmiccore.asteroid_chip.unprogrammed": "Unprogrammed — no target data", "tooltip.cosmiccore.ember_hatch.capacity": "§cMax Ember capacity§f:§6 %s", "tooltip.cosmiccore.ember_hatch.consumption": "§cMax Ember Consumption§f:§6 %s", "tooltip.cosmiccore.soul_hatch.input": "§cMax Recipe Input§f:§6 %s", @@ -743,4 +1955,4 @@ "tooltip.gt_scythe.energy": "Energy: %s / %s EU", "tooltip.gt_scythe.no_energy": "§cNot enough energy.", "tooltip.gt_scythe.per_hit": "Cost: %s EU / hit" -} \ No newline at end of file +} diff --git a/src/generated/resources/assets/cosmiccore/models/block/bolted_heavy_frame_casing.json b/src/generated/resources/assets/cosmiccore/models/block/bolted_heavy_frame_casing.json new file mode 100644 index 000000000..23d48229c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/bolted_heavy_frame_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/bolted_heavy_frame_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/diving_bell_escape_pad.json b/src/generated/resources/assets/cosmiccore/models/block/diving_bell_escape_pad.json new file mode 100644 index 000000000..3254ba99b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/diving_bell_escape_pad.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/diving_bell_escape_pad" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/ethersteel_plated_ash_tiles.json b/src/generated/resources/assets/cosmiccore/models/block/ethersteel_plated_ash_tiles.json new file mode 100644 index 000000000..d24432c9d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/ethersteel_plated_ash_tiles.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/ethersteel_plated_ash_tiles" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/iron_plated_deepslate_tile.json b/src/generated/resources/assets/cosmiccore/models/block/iron_plated_deepslate_tile.json new file mode 100644 index 000000000..18efcdd4d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/iron_plated_deepslate_tile.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/cosmetic/iron_plated_deepslate_tile" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/iron_plated_deepslate_tile_slab.json b/src/generated/resources/assets/cosmiccore/models/block/iron_plated_deepslate_tile_slab.json new file mode 100644 index 000000000..bb5cffec6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/iron_plated_deepslate_tile_slab.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "cosmiccore:block/casings/cosmetic/iron_plated_deepslate_tile", + "side": "cosmiccore:block/casings/cosmetic/iron_plated_deepslate_tile", + "top": "cosmiccore:block/casings/cosmetic/iron_plated_deepslate_tile" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/iron_plated_deepslate_tile_slab_top.json b/src/generated/resources/assets/cosmiccore/models/block/iron_plated_deepslate_tile_slab_top.json new file mode 100644 index 000000000..4c1379f49 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/iron_plated_deepslate_tile_slab_top.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab_top", + "textures": { + "bottom": "cosmiccore:block/casings/cosmetic/iron_plated_deepslate_tile", + "side": "cosmiccore:block/casings/cosmetic/iron_plated_deepslate_tile", + "top": "cosmiccore:block/casings/cosmetic/iron_plated_deepslate_tile" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/iron_plated_deepslate_tile_stairs.json b/src/generated/resources/assets/cosmiccore/models/block/iron_plated_deepslate_tile_stairs.json new file mode 100644 index 000000000..338f8292d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/iron_plated_deepslate_tile_stairs.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "cosmiccore:block/casings/cosmetic/iron_plated_deepslate_tile", + "side": "cosmiccore:block/casings/cosmetic/iron_plated_deepslate_tile", + "top": "cosmiccore:block/casings/cosmetic/iron_plated_deepslate_tile" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/iron_plated_deepslate_tile_stairs_inner.json b/src/generated/resources/assets/cosmiccore/models/block/iron_plated_deepslate_tile_stairs_inner.json new file mode 100644 index 000000000..e5197ff39 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/iron_plated_deepslate_tile_stairs_inner.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "cosmiccore:block/casings/cosmetic/iron_plated_deepslate_tile", + "side": "cosmiccore:block/casings/cosmetic/iron_plated_deepslate_tile", + "top": "cosmiccore:block/casings/cosmetic/iron_plated_deepslate_tile" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/iron_plated_deepslate_tile_stairs_outer.json b/src/generated/resources/assets/cosmiccore/models/block/iron_plated_deepslate_tile_stairs_outer.json new file mode 100644 index 000000000..1199def14 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/iron_plated_deepslate_tile_stairs_outer.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "cosmiccore:block/casings/cosmetic/iron_plated_deepslate_tile", + "side": "cosmiccore:block/casings/cosmetic/iron_plated_deepslate_tile", + "top": "cosmiccore:block/casings/cosmetic/iron_plated_deepslate_tile" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/light_dawnstone_casing.json b/src/generated/resources/assets/cosmiccore/models/block/light_dawnstone_casing.json new file mode 100644 index 000000000..07fcf4f97 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/light_dawnstone_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/livingrock_tiles.json b/src/generated/resources/assets/cosmiccore/models/block/livingrock_tiles.json new file mode 100644 index 000000000..8e9aacb4f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/livingrock_tiles.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/livingrock_tiles" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/arcane_crucible.json b/src/generated/resources/assets/cosmiccore/models/block/machine/arcane_crucible.json new file mode 100644 index 000000000..2f10e08a7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/arcane_crucible.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:arcane_crucible", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/soul_stained_steel_aluminium_plated_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_stained_steel_aluminium_plated_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_stained_steel_aluminium_plated_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_stained_steel_aluminium_plated_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_stained_steel_aluminium_plated_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_stained_steel_aluminium_plated_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_stained_steel_aluminium_plated_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_stained_steel_aluminium_plated_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_stained_steel_aluminium_plated_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/atomic_reconstructor.json b/src/generated/resources/assets/cosmiccore/models/block/machine/atomic_reconstructor.json new file mode 100644 index 000000000..a65011ad1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/atomic_reconstructor.json @@ -0,0 +1,98 @@ +{ + "parent": "minecraft:block/block", + "dynamic_renders": [ + { + "type": "cosmiccore:hellfire_foundry_parts", + "casing_block": { + "Name": "cosmiccore:highly_conductive_fission_casing" + } + } + ], + "loader": "gtceu:machine", + "machine": "cosmiccore:atomic_reconstructor", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/ethersteel_plated_ash_tiles" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_stained_steel_aluminium_plated_casing", + "overlay_front": "gtceu:block/multiblock/network_switch/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/network_switch/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_stained_steel_aluminium_plated_casing", + "overlay_front": "gtceu:block/multiblock/network_switch/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/network_switch/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_stained_steel_aluminium_plated_casing", + "overlay_front": "gtceu:block/multiblock/network_switch/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/network_switch/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_stained_steel_aluminium_plated_casing", + "overlay_front": "gtceu:block/multiblock/network_switch/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/network_switch/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_stained_steel_aluminium_plated_casing", + "overlay_front": "gtceu:block/multiblock/network_switch/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/network_switch/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_stained_steel_aluminium_plated_casing", + "overlay_front": "gtceu:block/multiblock/network_switch/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/network_switch/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_stained_steel_aluminium_plated_casing", + "overlay_front": "gtceu:block/multiblock/network_switch/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/network_switch/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_stained_steel_aluminium_plated_casing", + "overlay_front": "gtceu:block/multiblock/network_switch/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/network_switch/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/bee_holder.json b/src/generated/resources/assets/cosmiccore/models/block/machine/bee_holder.json new file mode 100644 index 000000000..8166102ff --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/bee_holder.json @@ -0,0 +1,80 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:bee_holder", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "gtceu:block/machines/object_holder/overlay_front" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "gtceu:block/machines/object_holder/overlay_front" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "gtceu:block/machines/object_holder/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/object_holder/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "gtceu:block/machines/object_holder/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/object_holder/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "gtceu:block/machines/object_holder/overlay_front" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "gtceu:block/machines/object_holder/overlay_front" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "gtceu:block/machines/object_holder/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/object_holder/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "gtceu:block/machines/object_holder/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/object_holder/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/cinder_hearth.json b/src/generated/resources/assets/cosmiccore/models/block/machine/cinder_hearth.json new file mode 100644 index 000000000..361fb25d4 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/cinder_hearth.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:cinder_hearth", + "texture_overrides": { + "all": "cosmiccore:block/embers/archaic_large_bricks" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/embers/archaic_large_bricks", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/embers/archaic_large_bricks", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/embers/archaic_large_bricks", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/embers/archaic_large_bricks", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/embers/archaic_large_bricks", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/embers/archaic_large_bricks", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/embers/archaic_large_bricks", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/embers/archaic_large_bricks", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/cosmic_me_assemblyline_bus.json b/src/generated/resources/assets/cosmiccore/models/block/machine/cosmic_me_assemblyline_bus.json new file mode 100644 index 000000000..1f18f6a2f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/cosmic_me_assemblyline_bus.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:cosmic_me_assemblyline_bus", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/item_me_assemblyline", + "textures": { + "bottom": "gtceu:block/casings/voltage/uv/bottom", + "side": "gtceu:block/casings/voltage/uv/side", + "top": "gtceu:block/casings/voltage/uv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/item_me_assemblyline", + "textures": { + "bottom": "gtceu:block/casings/voltage/uv/bottom", + "side": "gtceu:block/casings/voltage/uv/side", + "top": "gtceu:block/casings/voltage/uv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/cosmic_me_assemblyline_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/cosmic_me_assemblyline_hatch.json new file mode 100644 index 000000000..7ff74ffae --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/cosmic_me_assemblyline_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:cosmic_me_assemblyline_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/fluid_me_assemblyline", + "textures": { + "bottom": "gtceu:block/casings/voltage/uv/bottom", + "side": "gtceu:block/casings/voltage/uv/side", + "top": "gtceu:block/casings/voltage/uv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/fluid_me_assemblyline", + "textures": { + "bottom": "gtceu:block/casings/voltage/uv/bottom", + "side": "gtceu:block/casings/voltage/uv/side", + "top": "gtceu:block/casings/voltage/uv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/dawn_forge.json b/src/generated/resources/assets/cosmiccore/models/block/machine/dawn_forge.json new file mode 100644 index 000000000..ce57a93ee --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/dawn_forge.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:dawn_forge", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/dawnforge_eclipsed.json b/src/generated/resources/assets/cosmiccore/models/block/machine/dawnforge_eclipsed.json new file mode 100644 index 000000000..e7ca5722a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/dawnforge_eclipsed.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:dawnforge_eclipsed", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/ethersteel_plated_ash_tiles" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/ethersteel_plated_ash_tiles", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/ethersteel_plated_ash_tiles", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/ethersteel_plated_ash_tiles", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/ethersteel_plated_ash_tiles", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/ethersteel_plated_ash_tiles", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/ethersteel_plated_ash_tiles", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/ethersteel_plated_ash_tiles", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/ethersteel_plated_ash_tiles", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/diving_bell.json b/src/generated/resources/assets/cosmiccore/models/block/machine/diving_bell.json new file mode 100644 index 000000000..7116174fa --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/diving_bell.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:diving_bell", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/dreamers_basin.json b/src/generated/resources/assets/cosmiccore/models/block/machine/dreamers_basin.json new file mode 100644 index 000000000..074b682fb --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/dreamers_basin.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:dreamers_basin", + "texture_overrides": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/ember_tester.json b/src/generated/resources/assets/cosmiccore/models/block/machine/ember_tester.json deleted file mode 100644 index 580dd1880..000000000 --- a/src/generated/resources/assets/cosmiccore/models/block/machine/ember_tester.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "parent": "minecraft:block/block", - "loader": "gtceu:machine", - "machine": "cosmiccore:ember_tester", - "texture_overrides": { - "all": "gtceu:block/casings/solid/machine_casing_inert_ptfe" - }, - "variants": { - "is_formed=false,recipe_logic_status=idle": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "gtceu:block/casings/solid/machine_casing_inert_ptfe", - "overlay_front": "gtceu:block/multiblock/coke_oven/overlay_front", - "overlay_front_emissive": "gtceu:block/multiblock/coke_oven/overlay_front_emissive" - } - } - }, - "is_formed=false,recipe_logic_status=suspend": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "gtceu:block/casings/solid/machine_casing_inert_ptfe", - "overlay_front": "gtceu:block/multiblock/coke_oven/overlay_front", - "overlay_front_emissive": "gtceu:block/multiblock/coke_oven/overlay_front_emissive" - } - } - }, - "is_formed=false,recipe_logic_status=waiting": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "gtceu:block/casings/solid/machine_casing_inert_ptfe", - "overlay_front": "gtceu:block/multiblock/coke_oven/overlay_front_active", - "overlay_front_emissive": "gtceu:block/multiblock/coke_oven/overlay_front_active_emissive" - } - } - }, - "is_formed=false,recipe_logic_status=working": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "gtceu:block/casings/solid/machine_casing_inert_ptfe", - "overlay_front": "gtceu:block/multiblock/coke_oven/overlay_front_active", - "overlay_front_emissive": "gtceu:block/multiblock/coke_oven/overlay_front_active_emissive" - } - } - }, - "is_formed=true,recipe_logic_status=idle": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "gtceu:block/casings/solid/machine_casing_inert_ptfe", - "overlay_front": "gtceu:block/multiblock/coke_oven/overlay_front", - "overlay_front_emissive": "gtceu:block/multiblock/coke_oven/overlay_front_emissive" - } - } - }, - "is_formed=true,recipe_logic_status=suspend": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "gtceu:block/casings/solid/machine_casing_inert_ptfe", - "overlay_front": "gtceu:block/multiblock/coke_oven/overlay_front", - "overlay_front_emissive": "gtceu:block/multiblock/coke_oven/overlay_front_emissive" - } - } - }, - "is_formed=true,recipe_logic_status=waiting": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "gtceu:block/casings/solid/machine_casing_inert_ptfe", - "overlay_front": "gtceu:block/multiblock/coke_oven/overlay_front_active", - "overlay_front_emissive": "gtceu:block/multiblock/coke_oven/overlay_front_active_emissive" - } - } - }, - "is_formed=true,recipe_logic_status=working": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "gtceu:block/casings/solid/machine_casing_inert_ptfe", - "overlay_front": "gtceu:block/multiblock/coke_oven/overlay_front_active", - "overlay_front_emissive": "gtceu:block/multiblock/coke_oven/overlay_front_active_emissive" - } - } - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/ev_biolab.json b/src/generated/resources/assets/cosmiccore/models/block/machine/ev_biolab.json new file mode 100644 index 000000000..159c67b07 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/ev_biolab.json @@ -0,0 +1,51 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:ev_biolab", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "gtceu:block/machines/brewery/overlay_front", + "overlay_front_emissive": "gtceu:block/machines/brewery/overlay_front_emissive", + "overlay_side": "gtceu:block/machines/brewery/overlay_side", + "overlay_side_emissive": "gtceu:block/machines/brewery/overlay_side_emissive" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "gtceu:block/machines/brewery/overlay_front", + "overlay_front_emissive": "gtceu:block/machines/brewery/overlay_front_emissive", + "overlay_side": "gtceu:block/machines/brewery/overlay_side", + "overlay_side_emissive": "gtceu:block/machines/brewery/overlay_side_emissive" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "gtceu:block/machines/brewery/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/brewery/overlay_front_active_emissive", + "overlay_side": "gtceu:block/machines/brewery/overlay_side_active", + "overlay_side_emissive": "gtceu:block/machines/brewery/overlay_side_active_emissive" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "gtceu:block/machines/brewery/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/brewery/overlay_front_active_emissive", + "overlay_side": "gtceu:block/machines/brewery/overlay_side_active", + "overlay_side_emissive": "gtceu:block/machines/brewery/overlay_side_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/ev_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/block/machine/ev_calx_reactor.json new file mode 100644 index 000000000..a361c94d8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/ev_calx_reactor.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:ev_calx_reactor", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/ev_electric_apiary.json b/src/generated/resources/assets/cosmiccore/models/block/machine/ev_electric_apiary.json new file mode 100644 index 000000000..605d0c20f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/ev_electric_apiary.json @@ -0,0 +1,47 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:ev_electric_apiary", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_front", + "overlay_side": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_side", + "overlay_top": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_top" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_front", + "overlay_side": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_side", + "overlay_top": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_top" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_front", + "overlay_side": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_side", + "overlay_top": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_top" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_front", + "overlay_side": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_side", + "overlay_top": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/ev_ember_input_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/ev_ember_input_hatch.json new file mode 100644 index 000000000..4f9cbacaf --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/ev_ember_input_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:ev_ember_input_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/ember_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/ev/bottom", + "side": "gtceu:block/casings/voltage/ev/side", + "top": "gtceu:block/casings/voltage/ev/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/ember_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/ev/bottom", + "side": "gtceu:block/casings/voltage/ev/side", + "top": "gtceu:block/casings/voltage/ev/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/ev_ember_output_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/ev_ember_output_hatch.json new file mode 100644 index 000000000..ef72baad8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/ev_ember_output_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:ev_ember_output_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/ember_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/ev/bottom", + "side": "gtceu:block/casings/voltage/ev/side", + "top": "gtceu:block/casings/voltage/ev/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/ember_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/ev/bottom", + "side": "gtceu:block/casings/voltage/ev/side", + "top": "gtceu:block/casings/voltage/ev/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/ev_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/block/machine/ev_mana_leaching_tub.json new file mode 100644 index 000000000..db48bd4fd --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/ev_mana_leaching_tub.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:ev_mana_leaching_tub", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/ev_roaster.json b/src/generated/resources/assets/cosmiccore/models/block/machine/ev_roaster.json new file mode 100644 index 000000000..d87236075 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/ev_roaster.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:ev_roaster", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/ev_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/block/machine/ev_thermomagnitizer.json new file mode 100644 index 000000000..bda8c4086 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/ev_thermomagnitizer.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:ev_thermomagnitizer", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/ev_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/block/machine/ev_vacuum_bubbler.json new file mode 100644 index 000000000..53ee7d089 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/ev_vacuum_bubbler.json @@ -0,0 +1,27 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:ev_vacuum_bubbler", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/ev" + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/ev" + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/ev" + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/ev" + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/high_pressure_assembler.json b/src/generated/resources/assets/cosmiccore/models/block/machine/high_pressure_assembler.json index f4fadba24..611f115a4 100644 --- a/src/generated/resources/assets/cosmiccore/models/block/machine/high_pressure_assembler.json +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/high_pressure_assembler.json @@ -23,14 +23,14 @@ "loader": "gtceu:machine", "machine": "cosmiccore:high_pressure_assembler", "texture_overrides": { - "all": "gtceu:block/casings/solid/machine_casing_bronze_plated_bricks" + "all": "cosmiccore:block/casings/solid/steel_plated_bronze_casing" }, "variants": { "is_formed=false,recipe_logic_status=idle": { "model": { "parent": "gtceu:block/machine/template/cube_all/sided", "textures": { - "all": "gtceu:block/casings/solid/machine_casing_bronze_plated_bricks", + "all": "cosmiccore:block/casings/solid/steel_plated_bronze_casing", "overlay_front": "gtceu:block/multiblock/steam_oven/overlay_front", "overlay_front_emissive": "gtceu:block/multiblock/steam_oven/overlay_front_emissive" } @@ -40,7 +40,7 @@ "model": { "parent": "gtceu:block/machine/template/cube_all/sided", "textures": { - "all": "gtceu:block/casings/solid/machine_casing_bronze_plated_bricks", + "all": "cosmiccore:block/casings/solid/steel_plated_bronze_casing", "overlay_front": "gtceu:block/multiblock/steam_oven/overlay_front", "overlay_front_emissive": "gtceu:block/multiblock/steam_oven/overlay_front_emissive" } @@ -50,7 +50,7 @@ "model": { "parent": "gtceu:block/machine/template/cube_all/sided", "textures": { - "all": "gtceu:block/casings/solid/machine_casing_bronze_plated_bricks", + "all": "cosmiccore:block/casings/solid/steel_plated_bronze_casing", "overlay_front": "gtceu:block/multiblock/steam_oven/overlay_front_active", "overlay_front_emissive": "gtceu:block/multiblock/steam_oven/overlay_front_active_emissive" } @@ -60,7 +60,7 @@ "model": { "parent": "gtceu:block/machine/template/cube_all/sided", "textures": { - "all": "gtceu:block/casings/solid/machine_casing_bronze_plated_bricks", + "all": "cosmiccore:block/casings/solid/steel_plated_bronze_casing", "overlay_front": "gtceu:block/multiblock/steam_oven/overlay_front_active", "overlay_front_emissive": "gtceu:block/multiblock/steam_oven/overlay_front_active_emissive" } @@ -70,7 +70,7 @@ "model": { "parent": "gtceu:block/machine/template/cube_all/sided", "textures": { - "all": "gtceu:block/casings/solid/machine_casing_bronze_plated_bricks", + "all": "cosmiccore:block/casings/solid/steel_plated_bronze_casing", "overlay_front": "gtceu:block/multiblock/steam_oven/overlay_front", "overlay_front_emissive": "gtceu:block/multiblock/steam_oven/overlay_front_emissive" } @@ -80,7 +80,7 @@ "model": { "parent": "gtceu:block/machine/template/cube_all/sided", "textures": { - "all": "gtceu:block/casings/solid/machine_casing_bronze_plated_bricks", + "all": "cosmiccore:block/casings/solid/steel_plated_bronze_casing", "overlay_front": "gtceu:block/multiblock/steam_oven/overlay_front", "overlay_front_emissive": "gtceu:block/multiblock/steam_oven/overlay_front_emissive" } @@ -90,7 +90,7 @@ "model": { "parent": "gtceu:block/machine/template/cube_all/sided", "textures": { - "all": "gtceu:block/casings/solid/machine_casing_bronze_plated_bricks", + "all": "cosmiccore:block/casings/solid/steel_plated_bronze_casing", "overlay_front": "gtceu:block/multiblock/steam_oven/overlay_front_active", "overlay_front_emissive": "gtceu:block/multiblock/steam_oven/overlay_front_active_emissive" } @@ -100,7 +100,7 @@ "model": { "parent": "gtceu:block/machine/template/cube_all/sided", "textures": { - "all": "gtceu:block/casings/solid/machine_casing_bronze_plated_bricks", + "all": "cosmiccore:block/casings/solid/steel_plated_bronze_casing", "overlay_front": "gtceu:block/multiblock/steam_oven/overlay_front_active", "overlay_front_emissive": "gtceu:block/multiblock/steam_oven/overlay_front_active_emissive" } diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/honey_alveary.json b/src/generated/resources/assets/cosmiccore/models/block/machine/honey_alveary.json new file mode 100644 index 000000000..6676d9774 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/honey_alveary.json @@ -0,0 +1,86 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:honey_alveary", + "texture_overrides": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/power_substation/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/power_substation/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/power_substation/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/power_substation/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/hv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_calx_reactor.json new file mode 100644 index 000000000..403529da9 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_calx_reactor.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:hv_calx_reactor", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/hv_electric_apiary.json b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_electric_apiary.json new file mode 100644 index 000000000..345793581 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_electric_apiary.json @@ -0,0 +1,47 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:hv_electric_apiary", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_front", + "overlay_side": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_side", + "overlay_top": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_top" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_front", + "overlay_side": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_side", + "overlay_top": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_top" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_front", + "overlay_side": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_side", + "overlay_top": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_top" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_front", + "overlay_side": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_side", + "overlay_top": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/hv_ember_input_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_ember_input_hatch.json new file mode 100644 index 000000000..da6e67d96 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_ember_input_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:hv_ember_input_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/ember_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/hv/bottom", + "side": "gtceu:block/casings/voltage/hv/side", + "top": "gtceu:block/casings/voltage/hv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/ember_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/hv/bottom", + "side": "gtceu:block/casings/voltage/hv/side", + "top": "gtceu:block/casings/voltage/hv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/hv_ember_output_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_ember_output_hatch.json new file mode 100644 index 000000000..074d3b7aa --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_ember_output_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:hv_ember_output_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/ember_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/hv/bottom", + "side": "gtceu:block/casings/voltage/hv/side", + "top": "gtceu:block/casings/voltage/hv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/ember_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/hv/bottom", + "side": "gtceu:block/casings/voltage/hv/side", + "top": "gtceu:block/casings/voltage/hv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/hv_energy_output_hatch_16a.json b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_energy_output_hatch_16a.json new file mode 100644 index 000000000..5baa41300 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_energy_output_hatch_16a.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:hv_energy_output_hatch_16a", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/energy_output_hatch_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/hv/bottom", + "side": "gtceu:block/casings/voltage/hv/side", + "top": "gtceu:block/casings/voltage/hv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/energy_output_hatch_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/hv/bottom", + "side": "gtceu:block/casings/voltage/hv/side", + "top": "gtceu:block/casings/voltage/hv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/hv_energy_output_hatch_4a.json b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_energy_output_hatch_4a.json new file mode 100644 index 000000000..a010dfcfd --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_energy_output_hatch_4a.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:hv_energy_output_hatch_4a", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/energy_output_hatch_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/hv/bottom", + "side": "gtceu:block/casings/voltage/hv/side", + "top": "gtceu:block/casings/voltage/hv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/energy_output_hatch_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/hv/bottom", + "side": "gtceu:block/casings/voltage/hv/side", + "top": "gtceu:block/casings/voltage/hv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/hv_input_hatch_4x.json b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_input_hatch_4x.json new file mode 100644 index 000000000..ccc648783 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_input_hatch_4x.json @@ -0,0 +1,64 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:hv_input_hatch_4x", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false,is_painted=false": { + "model": { + "parent": "gtceu:block/machine/template/part/hatch_machine_emissive", + "textures": { + "bottom": "gtceu:block/casings/voltage/hv/bottom", + "overlay": "cosmiccore:block/overlay/machine/overlay_pipe_in_emissive", + "overlay_emissive": "cosmiccore:block/overlay/machine/overlay_fluid_hatch", + "overlay_pipe": "cosmiccore:block/overlay/machine/overlay_pipe_4x", + "side": "gtceu:block/casings/voltage/hv/side", + "top": "gtceu:block/casings/voltage/hv/top" + } + } + }, + "is_formed=false,is_painted=true": { + "model": { + "parent": "gtceu:block/machine/template/part/hatch_machine_emissive_color_ring", + "textures": { + "bottom": "gtceu:block/casings/voltage/hv/bottom", + "overlay": "cosmiccore:block/overlay/machine/overlay_pipe_in_emissive", + "overlay_emissive": "cosmiccore:block/overlay/machine/overlay_fluid_hatch", + "overlay_pipe": "cosmiccore:block/overlay/machine/overlay_pipe_4x", + "side": "gtceu:block/casings/voltage/hv/side", + "top": "gtceu:block/casings/voltage/hv/top" + } + } + }, + "is_formed=true,is_painted=false": { + "model": { + "parent": "gtceu:block/machine/template/part/hatch_machine_emissive", + "textures": { + "bottom": "gtceu:block/casings/voltage/hv/bottom", + "overlay": "cosmiccore:block/overlay/machine/overlay_pipe_in_emissive", + "overlay_emissive": "cosmiccore:block/overlay/machine/overlay_fluid_hatch", + "overlay_pipe": "cosmiccore:block/overlay/machine/overlay_pipe_4x", + "side": "gtceu:block/casings/voltage/hv/side", + "top": "gtceu:block/casings/voltage/hv/top" + } + } + }, + "is_formed=true,is_painted=true": { + "model": { + "parent": "gtceu:block/machine/template/part/hatch_machine_emissive_color_ring", + "textures": { + "bottom": "gtceu:block/casings/voltage/hv/bottom", + "overlay": "cosmiccore:block/overlay/machine/overlay_pipe_in_emissive", + "overlay_emissive": "cosmiccore:block/overlay/machine/overlay_fluid_hatch", + "overlay_pipe": "cosmiccore:block/overlay/machine/overlay_pipe_4x", + "side": "gtceu:block/casings/voltage/hv/side", + "top": "gtceu:block/casings/voltage/hv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/hv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_mana_leaching_tub.json new file mode 100644 index 000000000..2f552dd5f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_mana_leaching_tub.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:hv_mana_leaching_tub", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/hv_output_hatch_4x.json b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_output_hatch_4x.json new file mode 100644 index 000000000..a7fa71a1a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_output_hatch_4x.json @@ -0,0 +1,64 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:hv_output_hatch_4x", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false,is_painted=false": { + "model": { + "parent": "gtceu:block/machine/template/part/hatch_machine_emissive", + "textures": { + "bottom": "gtceu:block/casings/voltage/hv/bottom", + "overlay": "cosmiccore:block/overlay/machine/overlay_pipe_out_emissive", + "overlay_emissive": "cosmiccore:block/overlay/machine/overlay_fluid_hatch", + "overlay_pipe": "cosmiccore:block/overlay/machine/overlay_pipe_4x", + "side": "gtceu:block/casings/voltage/hv/side", + "top": "gtceu:block/casings/voltage/hv/top" + } + } + }, + "is_formed=false,is_painted=true": { + "model": { + "parent": "gtceu:block/machine/template/part/hatch_machine_emissive_color_ring", + "textures": { + "bottom": "gtceu:block/casings/voltage/hv/bottom", + "overlay": "cosmiccore:block/overlay/machine/overlay_pipe_out_emissive", + "overlay_emissive": "cosmiccore:block/overlay/machine/overlay_fluid_hatch", + "overlay_pipe": "cosmiccore:block/overlay/machine/overlay_pipe_4x", + "side": "gtceu:block/casings/voltage/hv/side", + "top": "gtceu:block/casings/voltage/hv/top" + } + } + }, + "is_formed=true,is_painted=false": { + "model": { + "parent": "gtceu:block/machine/template/part/hatch_machine_emissive", + "textures": { + "bottom": "gtceu:block/casings/voltage/hv/bottom", + "overlay": "cosmiccore:block/overlay/machine/overlay_pipe_out_emissive", + "overlay_emissive": "cosmiccore:block/overlay/machine/overlay_fluid_hatch", + "overlay_pipe": "cosmiccore:block/overlay/machine/overlay_pipe_4x", + "side": "gtceu:block/casings/voltage/hv/side", + "top": "gtceu:block/casings/voltage/hv/top" + } + } + }, + "is_formed=true,is_painted=true": { + "model": { + "parent": "gtceu:block/machine/template/part/hatch_machine_emissive_color_ring", + "textures": { + "bottom": "gtceu:block/casings/voltage/hv/bottom", + "overlay": "cosmiccore:block/overlay/machine/overlay_pipe_out_emissive", + "overlay_emissive": "cosmiccore:block/overlay/machine/overlay_fluid_hatch", + "overlay_pipe": "cosmiccore:block/overlay/machine/overlay_pipe_4x", + "side": "gtceu:block/casings/voltage/hv/side", + "top": "gtceu:block/casings/voltage/hv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/hv_roaster.json b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_roaster.json new file mode 100644 index 000000000..873c88287 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_roaster.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:hv_roaster", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/hv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_thermomagnitizer.json new file mode 100644 index 000000000..c749ebc49 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_thermomagnitizer.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:hv_thermomagnitizer", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/hv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_vacuum_bubbler.json new file mode 100644 index 000000000..0a1d0f621 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_vacuum_bubbler.json @@ -0,0 +1,27 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:hv_vacuum_bubbler", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/hv" + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/hv" + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/hv" + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/hv" + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/iv_biolab.json b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_biolab.json new file mode 100644 index 000000000..2a2bc96a4 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_biolab.json @@ -0,0 +1,51 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:iv_biolab", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "gtceu:block/machines/brewery/overlay_front", + "overlay_front_emissive": "gtceu:block/machines/brewery/overlay_front_emissive", + "overlay_side": "gtceu:block/machines/brewery/overlay_side", + "overlay_side_emissive": "gtceu:block/machines/brewery/overlay_side_emissive" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "gtceu:block/machines/brewery/overlay_front", + "overlay_front_emissive": "gtceu:block/machines/brewery/overlay_front_emissive", + "overlay_side": "gtceu:block/machines/brewery/overlay_side", + "overlay_side_emissive": "gtceu:block/machines/brewery/overlay_side_emissive" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "gtceu:block/machines/brewery/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/brewery/overlay_front_active_emissive", + "overlay_side": "gtceu:block/machines/brewery/overlay_side_active", + "overlay_side_emissive": "gtceu:block/machines/brewery/overlay_side_active_emissive" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "gtceu:block/machines/brewery/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/brewery/overlay_front_active_emissive", + "overlay_side": "gtceu:block/machines/brewery/overlay_side_active", + "overlay_side_emissive": "gtceu:block/machines/brewery/overlay_side_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/iv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_calx_reactor.json new file mode 100644 index 000000000..26b972b79 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_calx_reactor.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:iv_calx_reactor", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/iv_electric_apiary.json b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_electric_apiary.json new file mode 100644 index 000000000..e0daac4f2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_electric_apiary.json @@ -0,0 +1,47 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:iv_electric_apiary", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_front", + "overlay_side": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_side", + "overlay_top": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_top" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_front", + "overlay_side": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_side", + "overlay_top": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_top" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_front", + "overlay_side": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_side", + "overlay_top": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_top" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_front", + "overlay_side": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_side", + "overlay_top": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/iv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_mana_leaching_tub.json new file mode 100644 index 000000000..ab3705217 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_mana_leaching_tub.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:iv_mana_leaching_tub", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/iv_roaster.json b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_roaster.json new file mode 100644 index 000000000..45462a084 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_roaster.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:iv_roaster", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/iv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_thermomagnitizer.json new file mode 100644 index 000000000..36e933aab --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_thermomagnitizer.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:iv_thermomagnitizer", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/iv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_vacuum_bubbler.json new file mode 100644 index 000000000..676a9613f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_vacuum_bubbler.json @@ -0,0 +1,27 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:iv_vacuum_bubbler", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/iv" + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/iv" + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/iv" + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/iv" + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/large_roaster.json b/src/generated/resources/assets/cosmiccore/models/block/machine/large_roaster.json new file mode 100644 index 000000000..14489b930 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/large_roaster.json @@ -0,0 +1,74 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:large_roaster", + "texture_overrides": { + "all": "gtceu:block/casings/solid/machine_casing_heatproof" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_heatproof" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_heatproof" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_heatproof" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_heatproof" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_heatproof" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_heatproof" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_heatproof" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_heatproof" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/larva.json b/src/generated/resources/assets/cosmiccore/models/block/machine/larva.json new file mode 100644 index 000000000..cd0925405 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/larva.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:larva", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_paused", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_paused", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/link_test_station.json b/src/generated/resources/assets/cosmiccore/models/block/machine/link_test_station.json new file mode 100644 index 000000000..04cf89dc5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/link_test_station.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:link_test_station", + "texture_overrides": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/luv_biolab.json b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_biolab.json new file mode 100644 index 000000000..cdc4dea75 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_biolab.json @@ -0,0 +1,51 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:luv_biolab", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "gtceu:block/machines/brewery/overlay_front", + "overlay_front_emissive": "gtceu:block/machines/brewery/overlay_front_emissive", + "overlay_side": "gtceu:block/machines/brewery/overlay_side", + "overlay_side_emissive": "gtceu:block/machines/brewery/overlay_side_emissive" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "gtceu:block/machines/brewery/overlay_front", + "overlay_front_emissive": "gtceu:block/machines/brewery/overlay_front_emissive", + "overlay_side": "gtceu:block/machines/brewery/overlay_side", + "overlay_side_emissive": "gtceu:block/machines/brewery/overlay_side_emissive" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "gtceu:block/machines/brewery/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/brewery/overlay_front_active_emissive", + "overlay_side": "gtceu:block/machines/brewery/overlay_side_active", + "overlay_side_emissive": "gtceu:block/machines/brewery/overlay_side_active_emissive" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "gtceu:block/machines/brewery/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/brewery/overlay_front_active_emissive", + "overlay_side": "gtceu:block/machines/brewery/overlay_side_active", + "overlay_side_emissive": "gtceu:block/machines/brewery/overlay_side_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/luv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_calx_reactor.json new file mode 100644 index 000000000..716ba9dc0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_calx_reactor.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:luv_calx_reactor", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/luv_electric_apiary.json b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_electric_apiary.json new file mode 100644 index 000000000..639d36ee8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_electric_apiary.json @@ -0,0 +1,47 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:luv_electric_apiary", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_front", + "overlay_side": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_side", + "overlay_top": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_top" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_front", + "overlay_side": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_side", + "overlay_top": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_top" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_front", + "overlay_side": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_side", + "overlay_top": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_top" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_front", + "overlay_side": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_side", + "overlay_top": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/luv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_mana_leaching_tub.json new file mode 100644 index 000000000..d35c4bd22 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_mana_leaching_tub.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:luv_mana_leaching_tub", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/luv_roaster.json b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_roaster.json new file mode 100644 index 000000000..f73f92d9e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_roaster.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:luv_roaster", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/luv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_thermomagnitizer.json new file mode 100644 index 000000000..8e4ae2313 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_thermomagnitizer.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:luv_thermomagnitizer", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/luv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_vacuum_bubbler.json new file mode 100644 index 000000000..1f2a9bc4a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_vacuum_bubbler.json @@ -0,0 +1,27 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:luv_vacuum_bubbler", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/luv" + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/luv" + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/luv" + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/luv" + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/lv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/block/machine/lv_calx_reactor.json new file mode 100644 index 000000000..a8a1bb5c7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/lv_calx_reactor.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:lv_calx_reactor", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/lv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/lv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/lv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/lv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/lv_electric_apiary.json b/src/generated/resources/assets/cosmiccore/models/block/machine/lv_electric_apiary.json new file mode 100644 index 000000000..5ea8be8a9 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/lv_electric_apiary.json @@ -0,0 +1,47 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:lv_electric_apiary", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/lv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_front", + "overlay_side": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_side", + "overlay_top": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_top" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/lv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_front", + "overlay_side": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_side", + "overlay_top": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_top" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/lv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_front", + "overlay_side": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_side", + "overlay_top": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_top" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/lv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_front", + "overlay_side": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_side", + "overlay_top": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/lv_ember_input_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/lv_ember_input_hatch.json new file mode 100644 index 000000000..3c9f43354 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/lv_ember_input_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:lv_ember_input_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/ember_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/lv/bottom", + "side": "gtceu:block/casings/voltage/lv/side", + "top": "gtceu:block/casings/voltage/lv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/ember_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/lv/bottom", + "side": "gtceu:block/casings/voltage/lv/side", + "top": "gtceu:block/casings/voltage/lv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/lv_ember_output_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/lv_ember_output_hatch.json new file mode 100644 index 000000000..2b6d0edb0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/lv_ember_output_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:lv_ember_output_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/ember_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/lv/bottom", + "side": "gtceu:block/casings/voltage/lv/side", + "top": "gtceu:block/casings/voltage/lv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/ember_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/lv/bottom", + "side": "gtceu:block/casings/voltage/lv/side", + "top": "gtceu:block/casings/voltage/lv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/lv_energy_output_hatch_16a.json b/src/generated/resources/assets/cosmiccore/models/block/machine/lv_energy_output_hatch_16a.json new file mode 100644 index 000000000..88f825e82 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/lv_energy_output_hatch_16a.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:lv_energy_output_hatch_16a", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/energy_output_hatch_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/lv/bottom", + "side": "gtceu:block/casings/voltage/lv/side", + "top": "gtceu:block/casings/voltage/lv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/energy_output_hatch_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/lv/bottom", + "side": "gtceu:block/casings/voltage/lv/side", + "top": "gtceu:block/casings/voltage/lv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/lv_energy_output_hatch_4a.json b/src/generated/resources/assets/cosmiccore/models/block/machine/lv_energy_output_hatch_4a.json new file mode 100644 index 000000000..07a0d1cfa --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/lv_energy_output_hatch_4a.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:lv_energy_output_hatch_4a", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/energy_output_hatch_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/lv/bottom", + "side": "gtceu:block/casings/voltage/lv/side", + "top": "gtceu:block/casings/voltage/lv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/energy_output_hatch_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/lv/bottom", + "side": "gtceu:block/casings/voltage/lv/side", + "top": "gtceu:block/casings/voltage/lv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/lv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/block/machine/lv_mana_leaching_tub.json new file mode 100644 index 000000000..22be1cbb9 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/lv_mana_leaching_tub.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:lv_mana_leaching_tub", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/lv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/lv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/lv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/lv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/lv_roaster.json b/src/generated/resources/assets/cosmiccore/models/block/machine/lv_roaster.json new file mode 100644 index 000000000..a3e0e034b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/lv_roaster.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:lv_roaster", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/lv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/lv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/lv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/lv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/lv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/block/machine/lv_thermomagnitizer.json new file mode 100644 index 000000000..4dee1a14f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/lv_thermomagnitizer.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:lv_thermomagnitizer", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/lv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/lv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/lv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/lv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/lv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/block/machine/lv_vacuum_bubbler.json new file mode 100644 index 000000000..4f2b88b75 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/lv_vacuum_bubbler.json @@ -0,0 +1,27 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:lv_vacuum_bubbler", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/lv" + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/lv" + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/lv" + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/lv" + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/mana_etching_factory.json b/src/generated/resources/assets/cosmiccore/models/block/machine/mana_etching_factory.json new file mode 100644 index 000000000..15b0ea481 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/mana_etching_factory.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:mana_etching_factory", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/livingrock_tiles" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/livingrock_tiles", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/livingrock_tiles", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/livingrock_tiles", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/livingrock_tiles", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/livingrock_tiles", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/livingrock_tiles", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/livingrock_tiles", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/livingrock_tiles", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/mantle_bore.json b/src/generated/resources/assets/cosmiccore/models/block/machine/mantle_bore.json index a1f7673a5..6ef61d440 100644 --- a/src/generated/resources/assets/cosmiccore/models/block/machine/mantle_bore.json +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/mantle_bore.json @@ -16,8 +16,8 @@ "parent": "gtceu:block/machine/template/cube_all/sided", "textures": { "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_emissive" } } }, @@ -26,8 +26,8 @@ "parent": "gtceu:block/machine/template/cube_all/sided", "textures": { "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_paused", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_paused_emissive" } } }, @@ -36,8 +36,8 @@ "parent": "gtceu:block/machine/template/cube_all/sided", "textures": { "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active_emissive" } } }, @@ -46,8 +46,8 @@ "parent": "gtceu:block/machine/template/cube_all/sided", "textures": { "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active_emissive" } } }, @@ -56,8 +56,8 @@ "parent": "gtceu:block/machine/template/cube_all/sided", "textures": { "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_emissive" } } }, @@ -66,8 +66,8 @@ "parent": "gtceu:block/machine/template/cube_all/sided", "textures": { "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_paused", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_paused_emissive" } } }, @@ -76,8 +76,8 @@ "parent": "gtceu:block/machine/template/cube_all/sided", "textures": { "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active_emissive" } } }, @@ -86,8 +86,8 @@ "parent": "gtceu:block/machine/template/cube_all/sided", "textures": { "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active_emissive" } } } diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/moth_cargo_drop_off.json b/src/generated/resources/assets/cosmiccore/models/block/machine/moth_cargo_drop_off.json new file mode 100644 index 000000000..96b65ae3d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/moth_cargo_drop_off.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:moth_cargo_drop_off", + "texture_overrides": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/moth_cargo_station.json b/src/generated/resources/assets/cosmiccore/models/block/machine/moth_cargo_station.json new file mode 100644 index 000000000..be71977d4 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/moth_cargo_station.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:moth_cargo_station", + "texture_overrides": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/mv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/block/machine/mv_calx_reactor.json new file mode 100644 index 000000000..5f60c282a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/mv_calx_reactor.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:mv_calx_reactor", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/mv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/mv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/mv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/mv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/mv_electric_apiary.json b/src/generated/resources/assets/cosmiccore/models/block/machine/mv_electric_apiary.json new file mode 100644 index 000000000..08b9fc126 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/mv_electric_apiary.json @@ -0,0 +1,47 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:mv_electric_apiary", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/mv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_front", + "overlay_side": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_side", + "overlay_top": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_top" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/mv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_front", + "overlay_side": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_side", + "overlay_top": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_top" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/mv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_front", + "overlay_side": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_side", + "overlay_top": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_top" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/mv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_front", + "overlay_side": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_side", + "overlay_top": "cosmiccore:block/overlay/machine/industrial_apiary/overlay_top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/mv_ember_input_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/mv_ember_input_hatch.json new file mode 100644 index 000000000..0d4ba2454 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/mv_ember_input_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:mv_ember_input_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/ember_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/mv/bottom", + "side": "gtceu:block/casings/voltage/mv/side", + "top": "gtceu:block/casings/voltage/mv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/ember_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/mv/bottom", + "side": "gtceu:block/casings/voltage/mv/side", + "top": "gtceu:block/casings/voltage/mv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/mv_ember_output_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/mv_ember_output_hatch.json new file mode 100644 index 000000000..6f009e1c1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/mv_ember_output_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:mv_ember_output_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/ember_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/mv/bottom", + "side": "gtceu:block/casings/voltage/mv/side", + "top": "gtceu:block/casings/voltage/mv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/ember_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/mv/bottom", + "side": "gtceu:block/casings/voltage/mv/side", + "top": "gtceu:block/casings/voltage/mv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/mv_energy_output_hatch_16a.json b/src/generated/resources/assets/cosmiccore/models/block/machine/mv_energy_output_hatch_16a.json new file mode 100644 index 000000000..ed08a3079 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/mv_energy_output_hatch_16a.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:mv_energy_output_hatch_16a", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/energy_output_hatch_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/mv/bottom", + "side": "gtceu:block/casings/voltage/mv/side", + "top": "gtceu:block/casings/voltage/mv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/energy_output_hatch_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/mv/bottom", + "side": "gtceu:block/casings/voltage/mv/side", + "top": "gtceu:block/casings/voltage/mv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/mv_energy_output_hatch_4a.json b/src/generated/resources/assets/cosmiccore/models/block/machine/mv_energy_output_hatch_4a.json new file mode 100644 index 000000000..d2a4a53a1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/mv_energy_output_hatch_4a.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:mv_energy_output_hatch_4a", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/energy_output_hatch_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/mv/bottom", + "side": "gtceu:block/casings/voltage/mv/side", + "top": "gtceu:block/casings/voltage/mv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/energy_output_hatch_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/mv/bottom", + "side": "gtceu:block/casings/voltage/mv/side", + "top": "gtceu:block/casings/voltage/mv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/mv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/block/machine/mv_mana_leaching_tub.json new file mode 100644 index 000000000..6dfa12123 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/mv_mana_leaching_tub.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:mv_mana_leaching_tub", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/mv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/mv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/mv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/mv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/mv_roaster.json b/src/generated/resources/assets/cosmiccore/models/block/machine/mv_roaster.json new file mode 100644 index 000000000..457a94365 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/mv_roaster.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:mv_roaster", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/mv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/mv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/mv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/mv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/mv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/block/machine/mv_thermomagnitizer.json new file mode 100644 index 000000000..3990809ee --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/mv_thermomagnitizer.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:mv_thermomagnitizer", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/mv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/mv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/mv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/mv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/mv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/block/machine/mv_vacuum_bubbler.json new file mode 100644 index 000000000..75c56b7dd --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/mv_vacuum_bubbler.json @@ -0,0 +1,27 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:mv_vacuum_bubbler", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/mv" + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/mv" + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/mv" + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/mv" + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/opv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/block/machine/opv_calx_reactor.json new file mode 100644 index 000000000..76caf5c65 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/opv_calx_reactor.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:opv_calx_reactor", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/opv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/opv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/opv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/opv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/opv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/block/machine/opv_mana_leaching_tub.json new file mode 100644 index 000000000..3a8e4513b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/opv_mana_leaching_tub.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:opv_mana_leaching_tub", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/opv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/opv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/opv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/opv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/opv_roaster.json b/src/generated/resources/assets/cosmiccore/models/block/machine/opv_roaster.json new file mode 100644 index 000000000..8e862f0d7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/opv_roaster.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:opv_roaster", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/opv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/opv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/opv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/opv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/opv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/block/machine/opv_thermomagnitizer.json new file mode 100644 index 000000000..da15104e1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/opv_thermomagnitizer.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:opv_thermomagnitizer", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/opv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/opv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/opv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/opv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/opv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/block/machine/opv_vacuum_bubbler.json new file mode 100644 index 000000000..14631c8c4 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/opv_vacuum_bubbler.json @@ -0,0 +1,27 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:opv_vacuum_bubbler", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/opv" + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/opv" + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/opv" + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/opv" + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/pyrothermic_refinery.json b/src/generated/resources/assets/cosmiccore/models/block/machine/pyrothermic_refinery.json new file mode 100644 index 000000000..fd9082cb6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/pyrothermic_refinery.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:pyrothermic_refinery", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/star_ballast.json b/src/generated/resources/assets/cosmiccore/models/block/machine/star_ballast.json deleted file mode 100644 index e95f96db0..000000000 --- a/src/generated/resources/assets/cosmiccore/models/block/machine/star_ballast.json +++ /dev/null @@ -1,95 +0,0 @@ -{ - "parent": "minecraft:block/block", - "dynamic_renders": [ - { - "type": "cosmiccore:star_ballast" - } - ], - "loader": "gtceu:machine", - "machine": "cosmiccore:star_ballast", - "texture_overrides": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing" - }, - "variants": { - "is_formed=false,recipe_logic_status=idle": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" - } - } - }, - "is_formed=false,recipe_logic_status=suspend": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" - } - } - }, - "is_formed=false,recipe_logic_status=waiting": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" - } - } - }, - "is_formed=false,recipe_logic_status=working": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" - } - } - }, - "is_formed=true,recipe_logic_status=idle": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" - } - } - }, - "is_formed=true,recipe_logic_status=suspend": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" - } - } - }, - "is_formed=true,recipe_logic_status=waiting": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" - } - } - }, - "is_formed=true,recipe_logic_status=working": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" - } - } - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/star_ladder.json b/src/generated/resources/assets/cosmiccore/models/block/machine/star_ladder.json index 94db40d84..5887bff95 100644 --- a/src/generated/resources/assets/cosmiccore/models/block/machine/star_ladder.json +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/star_ladder.json @@ -1,18 +1,23 @@ { "parent": "minecraft:block/block", + "dynamic_renders": [ + { + "type": "cosmiccore:star_ladder_render" + } + ], "loader": "gtceu:machine", "machine": "cosmiccore:star_ladder", "texture_overrides": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing" + "all": "cosmiccore:block/casings/solid/rigid_high_speed_steel_casing" }, "variants": { "is_formed=false,recipe_logic_status=idle": { "model": { "parent": "gtceu:block/machine/template/cube_all/sided", "textures": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" + "all": "cosmiccore:block/casings/solid/rigid_high_speed_steel_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_emissive" } } }, @@ -20,9 +25,9 @@ "model": { "parent": "gtceu:block/machine/template/cube_all/sided", "textures": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" + "all": "cosmiccore:block/casings/solid/rigid_high_speed_steel_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused_emissive" } } }, @@ -30,9 +35,9 @@ "model": { "parent": "gtceu:block/machine/template/cube_all/sided", "textures": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" + "all": "cosmiccore:block/casings/solid/rigid_high_speed_steel_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" } } }, @@ -40,9 +45,9 @@ "model": { "parent": "gtceu:block/machine/template/cube_all/sided", "textures": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" + "all": "cosmiccore:block/casings/solid/rigid_high_speed_steel_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" } } }, @@ -50,9 +55,9 @@ "model": { "parent": "gtceu:block/machine/template/cube_all/sided", "textures": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" + "all": "cosmiccore:block/casings/solid/rigid_high_speed_steel_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_emissive" } } }, @@ -60,9 +65,9 @@ "model": { "parent": "gtceu:block/machine/template/cube_all/sided", "textures": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" + "all": "cosmiccore:block/casings/solid/rigid_high_speed_steel_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused_emissive" } } }, @@ -70,9 +75,9 @@ "model": { "parent": "gtceu:block/machine/template/cube_all/sided", "textures": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" + "all": "cosmiccore:block/casings/solid/rigid_high_speed_steel_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" } } }, @@ -80,9 +85,9 @@ "model": { "parent": "gtceu:block/machine/template/cube_all/sided", "textures": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" + "all": "cosmiccore:block/casings/solid/rigid_high_speed_steel_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" } } } diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/star_ladder_research_hub.json b/src/generated/resources/assets/cosmiccore/models/block/machine/star_ladder_research_hub.json new file mode 100644 index 000000000..096a7258d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/star_ladder_research_hub.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:star_ladder_research_hub", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/superheavy_steel_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/superheavy_steel_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/superheavy_steel_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_paused", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/superheavy_steel_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/superheavy_steel_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/superheavy_steel_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/superheavy_steel_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_paused", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/superheavy_steel_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/superheavy_steel_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/steam_fluid_input_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/steam_fluid_input_hatch.json index be353f06b..f4d832cc9 100644 --- a/src/generated/resources/assets/cosmiccore/models/block/machine/steam_fluid_input_hatch.json +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/steam_fluid_input_hatch.json @@ -8,7 +8,7 @@ "side" ], "variants": { - "is_painted=false": { + "is_formed=false,is_painted=false": { "model": { "parent": "gtceu:block/machine/template/part/hatch_machine_emissive", "textures": { @@ -21,7 +21,33 @@ } } }, - "is_painted=true": { + "is_formed=false,is_painted=true": { + "model": { + "parent": "gtceu:block/machine/template/part/hatch_machine_emissive_color_ring", + "textures": { + "bottom": "gtceu:block/casings/steam/bronze/bottom", + "overlay": "gtceu:block/overlay/machine/overlay_pipe", + "overlay_emissive": "gtceu:block/overlay/machine/overlay_fluid_hatch", + "overlay_pipe": "gtceu:block/overlay/machine/overlay_fluid_hatch", + "side": "gtceu:block/casings/steam/bronze/side", + "top": "gtceu:block/casings/steam/bronze/top" + } + } + }, + "is_formed=true,is_painted=false": { + "model": { + "parent": "gtceu:block/machine/template/part/hatch_machine_emissive", + "textures": { + "bottom": "gtceu:block/casings/steam/bronze/bottom", + "overlay": "gtceu:block/overlay/machine/overlay_pipe", + "overlay_emissive": "gtceu:block/overlay/machine/overlay_fluid_hatch", + "overlay_pipe": "gtceu:block/overlay/machine/overlay_fluid_hatch", + "side": "gtceu:block/casings/steam/bronze/side", + "top": "gtceu:block/casings/steam/bronze/top" + } + } + }, + "is_formed=true,is_painted=true": { "model": { "parent": "gtceu:block/machine/template/part/hatch_machine_emissive_color_ring", "textures": { diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/steam_fluid_output_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/steam_fluid_output_hatch.json index 50743b592..22f20c335 100644 --- a/src/generated/resources/assets/cosmiccore/models/block/machine/steam_fluid_output_hatch.json +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/steam_fluid_output_hatch.json @@ -8,7 +8,7 @@ "side" ], "variants": { - "is_painted=false": { + "is_formed=false,is_painted=false": { "model": { "parent": "gtceu:block/machine/template/part/hatch_machine_emissive", "textures": { @@ -21,7 +21,33 @@ } } }, - "is_painted=true": { + "is_formed=false,is_painted=true": { + "model": { + "parent": "gtceu:block/machine/template/part/hatch_machine_emissive_color_ring", + "textures": { + "bottom": "gtceu:block/casings/steam/bronze/bottom", + "overlay": "gtceu:block/overlay/machine/overlay_pipe", + "overlay_emissive": "gtceu:block/overlay/machine/overlay_fluid_hatch", + "overlay_pipe": "gtceu:block/overlay/machine/overlay_fluid_hatch", + "side": "gtceu:block/casings/steam/bronze/side", + "top": "gtceu:block/casings/steam/bronze/top" + } + } + }, + "is_formed=true,is_painted=false": { + "model": { + "parent": "gtceu:block/machine/template/part/hatch_machine_emissive", + "textures": { + "bottom": "gtceu:block/casings/steam/bronze/bottom", + "overlay": "gtceu:block/overlay/machine/overlay_pipe", + "overlay_emissive": "gtceu:block/overlay/machine/overlay_fluid_hatch", + "overlay_pipe": "gtceu:block/overlay/machine/overlay_fluid_hatch", + "side": "gtceu:block/casings/steam/bronze/side", + "top": "gtceu:block/casings/steam/bronze/top" + } + } + }, + "is_formed=true,is_painted=true": { "model": { "parent": "gtceu:block/machine/template/part/hatch_machine_emissive_color_ring", "textures": { diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/steam_large_turbine.json b/src/generated/resources/assets/cosmiccore/models/block/machine/steam_large_turbine.json new file mode 100644 index 000000000..af239e8f7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/steam_large_turbine.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:steam_large_turbine", + "texture_overrides": { + "all": "gtceu:block/casings/mechanic/machine_casing_turbine_steel" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/mechanic/machine_casing_turbine_steel", + "overlay_front": "gtceu:block/multiblock/generator/large_steam_turbine/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_steam_turbine/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/mechanic/machine_casing_turbine_steel", + "overlay_front": "gtceu:block/multiblock/generator/large_steam_turbine/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_steam_turbine/overlay_front_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/mechanic/machine_casing_turbine_steel", + "overlay_front": "gtceu:block/multiblock/generator/large_steam_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_steam_turbine/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/mechanic/machine_casing_turbine_steel", + "overlay_front": "gtceu:block/multiblock/generator/large_steam_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_steam_turbine/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/mechanic/machine_casing_turbine_steel", + "overlay_front": "gtceu:block/multiblock/generator/large_steam_turbine/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_steam_turbine/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/mechanic/machine_casing_turbine_steel", + "overlay_front": "gtceu:block/multiblock/generator/large_steam_turbine/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_steam_turbine/overlay_front_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/mechanic/machine_casing_turbine_steel", + "overlay_front": "gtceu:block/multiblock/generator/large_steam_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_steam_turbine/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/mechanic/machine_casing_turbine_steel", + "overlay_front": "gtceu:block/multiblock/generator/large_steam_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_steam_turbine/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/stellar_smelting_module.json b/src/generated/resources/assets/cosmiccore/models/block/machine/stellar_smelting_module.json new file mode 100644 index 000000000..6554305c6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/stellar_smelting_module.json @@ -0,0 +1,74 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:stellar_smelting_module", + "texture_overrides": { + "all": "gtceu:block/casings/gcym/high_temperature_smelting_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/gcym/high_temperature_smelting_casing" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/gcym/high_temperature_smelting_casing" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/gcym/high_temperature_smelting_casing" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/gcym/high_temperature_smelting_casing" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/gcym/high_temperature_smelting_casing" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/gcym/high_temperature_smelting_casing" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/gcym/high_temperature_smelting_casing" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/gcym/high_temperature_smelting_casing" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uev_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_calx_reactor.json new file mode 100644 index 000000000..99dfb1627 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_calx_reactor.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uev_calx_reactor", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uev_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_mana_leaching_tub.json new file mode 100644 index 000000000..72b9e800a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_mana_leaching_tub.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uev_mana_leaching_tub", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uev_module_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_module_hatch.json new file mode 100644 index 000000000..bfe4cd2da --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_module_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uev_module_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/module_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uev/bottom", + "side": "gtceu:block/casings/voltage/uev/side", + "top": "gtceu:block/casings/voltage/uev/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/module_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uev/bottom", + "side": "gtceu:block/casings/voltage/uev/side", + "top": "gtceu:block/casings/voltage/uev/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uev_roaster.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_roaster.json new file mode 100644 index 000000000..c5a89de8d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_roaster.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uev_roaster", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uev_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_thermomagnitizer.json new file mode 100644 index 000000000..7def272d3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_thermomagnitizer.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uev_thermomagnitizer", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uev_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_vacuum_bubbler.json new file mode 100644 index 000000000..3aaf1afbf --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_vacuum_bubbler.json @@ -0,0 +1,27 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uev_vacuum_bubbler", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uev" + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uev" + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uev" + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uev" + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_calx_reactor.json new file mode 100644 index 000000000..d42736859 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_calx_reactor.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uhv_calx_reactor", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_mana_leaching_tub.json new file mode 100644 index 000000000..de7acf0ae --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_mana_leaching_tub.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uhv_mana_leaching_tub", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_module_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_module_hatch.json new file mode 100644 index 000000000..783e472ac --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_module_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uhv_module_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/module_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uhv/bottom", + "side": "gtceu:block/casings/voltage/uhv/side", + "top": "gtceu:block/casings/voltage/uhv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/module_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uhv/bottom", + "side": "gtceu:block/casings/voltage/uhv/side", + "top": "gtceu:block/casings/voltage/uhv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_name.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_name.json deleted file mode 100644 index 46b7380db..000000000 --- a/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_name.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "parent": "minecraft:block/block", - "loader": "gtceu:machine", - "machine": "cosmiccore:uhv_name", - "texture_overrides": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing" - }, - "variants": { - "is_formed=false,recipe_logic_status=idle": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" - } - } - }, - "is_formed=false,recipe_logic_status=suspend": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" - } - } - }, - "is_formed=false,recipe_logic_status=waiting": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" - } - } - }, - "is_formed=false,recipe_logic_status=working": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" - } - } - }, - "is_formed=true,recipe_logic_status=idle": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" - } - } - }, - "is_formed=true,recipe_logic_status=suspend": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" - } - } - }, - "is_formed=true,recipe_logic_status=waiting": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" - } - } - }, - "is_formed=true,recipe_logic_status=working": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" - } - } - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_roaster.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_roaster.json new file mode 100644 index 000000000..9d3e5884a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_roaster.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uhv_roaster", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_thermomagnitizer.json new file mode 100644 index 000000000..a0499f251 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_thermomagnitizer.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uhv_thermomagnitizer", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_vacuum_bubbler.json new file mode 100644 index 000000000..942dab66f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_vacuum_bubbler.json @@ -0,0 +1,27 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uhv_vacuum_bubbler", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv" + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv" + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv" + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv" + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_calx_reactor.json new file mode 100644 index 000000000..b12e5017f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_calx_reactor.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uiv_calx_reactor", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_mana_leaching_tub.json new file mode 100644 index 000000000..1a8c3b8f4 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_mana_leaching_tub.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uiv_mana_leaching_tub", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_roaster.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_roaster.json new file mode 100644 index 000000000..53a53273c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_roaster.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uiv_roaster", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_thermomagnitizer.json new file mode 100644 index 000000000..f6b08b0ff --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_thermomagnitizer.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uiv_thermomagnitizer", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_vacuum_bubbler.json new file mode 100644 index 000000000..a64ce7409 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_vacuum_bubbler.json @@ -0,0 +1,27 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uiv_vacuum_bubbler", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv" + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv" + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv" + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv" + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/ulv_energy_output_hatch_16a.json b/src/generated/resources/assets/cosmiccore/models/block/machine/ulv_energy_output_hatch_16a.json new file mode 100644 index 000000000..774606569 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/ulv_energy_output_hatch_16a.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:ulv_energy_output_hatch_16a", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/energy_output_hatch_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/ulv/bottom", + "side": "gtceu:block/casings/voltage/ulv/side", + "top": "gtceu:block/casings/voltage/ulv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/energy_output_hatch_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/ulv/bottom", + "side": "gtceu:block/casings/voltage/ulv/side", + "top": "gtceu:block/casings/voltage/ulv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/ulv_energy_output_hatch_4a.json b/src/generated/resources/assets/cosmiccore/models/block/machine/ulv_energy_output_hatch_4a.json new file mode 100644 index 000000000..a8651f1c5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/ulv_energy_output_hatch_4a.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:ulv_energy_output_hatch_4a", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/energy_output_hatch_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/ulv/bottom", + "side": "gtceu:block/casings/voltage/ulv/side", + "top": "gtceu:block/casings/voltage/ulv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/energy_output_hatch_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/ulv/bottom", + "side": "gtceu:block/casings/voltage/ulv/side", + "top": "gtceu:block/casings/voltage/ulv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uv_biolab.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_biolab.json new file mode 100644 index 000000000..4702a4cd2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_biolab.json @@ -0,0 +1,51 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uv_biolab", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "gtceu:block/machines/brewery/overlay_front", + "overlay_front_emissive": "gtceu:block/machines/brewery/overlay_front_emissive", + "overlay_side": "gtceu:block/machines/brewery/overlay_side", + "overlay_side_emissive": "gtceu:block/machines/brewery/overlay_side_emissive" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "gtceu:block/machines/brewery/overlay_front", + "overlay_front_emissive": "gtceu:block/machines/brewery/overlay_front_emissive", + "overlay_side": "gtceu:block/machines/brewery/overlay_side", + "overlay_side_emissive": "gtceu:block/machines/brewery/overlay_side_emissive" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "gtceu:block/machines/brewery/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/brewery/overlay_front_active_emissive", + "overlay_side": "gtceu:block/machines/brewery/overlay_side_active", + "overlay_side_emissive": "gtceu:block/machines/brewery/overlay_side_active_emissive" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "gtceu:block/machines/brewery/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/brewery/overlay_front_active_emissive", + "overlay_side": "gtceu:block/machines/brewery/overlay_side_active", + "overlay_side_emissive": "gtceu:block/machines/brewery/overlay_side_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_calx_reactor.json new file mode 100644 index 000000000..c99665645 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_calx_reactor.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uv_calx_reactor", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_mana_leaching_tub.json new file mode 100644 index 000000000..7362eccf7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_mana_leaching_tub.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uv_mana_leaching_tub", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uv_module_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_module_hatch.json new file mode 100644 index 000000000..e56b39f94 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_module_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uv_module_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/module_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uv/bottom", + "side": "gtceu:block/casings/voltage/uv/side", + "top": "gtceu:block/casings/voltage/uv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/module_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uv/bottom", + "side": "gtceu:block/casings/voltage/uv/side", + "top": "gtceu:block/casings/voltage/uv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uv_name.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_name.json deleted file mode 100644 index 97986e2d5..000000000 --- a/src/generated/resources/assets/cosmiccore/models/block/machine/uv_name.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "parent": "minecraft:block/block", - "loader": "gtceu:machine", - "machine": "cosmiccore:uv_name", - "texture_overrides": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing" - }, - "variants": { - "is_formed=false,recipe_logic_status=idle": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" - } - } - }, - "is_formed=false,recipe_logic_status=suspend": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" - } - } - }, - "is_formed=false,recipe_logic_status=waiting": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" - } - } - }, - "is_formed=false,recipe_logic_status=working": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" - } - } - }, - "is_formed=true,recipe_logic_status=idle": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" - } - } - }, - "is_formed=true,recipe_logic_status=suspend": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" - } - } - }, - "is_formed=true,recipe_logic_status=waiting": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" - } - } - }, - "is_formed=true,recipe_logic_status=working": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" - } - } - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uv_roaster.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_roaster.json new file mode 100644 index 000000000..193d3b713 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_roaster.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uv_roaster", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_thermomagnitizer.json new file mode 100644 index 000000000..2eceeb875 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_thermomagnitizer.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uv_thermomagnitizer", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_vacuum_bubbler.json new file mode 100644 index 000000000..1e0b30027 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_vacuum_bubbler.json @@ -0,0 +1,27 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uv_vacuum_bubbler", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uv" + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uv" + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uv" + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uv" + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_calx_reactor.json new file mode 100644 index 000000000..64745b960 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_calx_reactor.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uxv_calx_reactor", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uxv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uxv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uxv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uxv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_mana_leaching_tub.json new file mode 100644 index 000000000..29ae86984 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_mana_leaching_tub.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uxv_mana_leaching_tub", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uxv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uxv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uxv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uxv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_roaster.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_roaster.json new file mode 100644 index 000000000..820311748 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_roaster.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uxv_roaster", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uxv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uxv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uxv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uxv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_thermomagnitizer.json new file mode 100644 index 000000000..8c8197fff --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_thermomagnitizer.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uxv_thermomagnitizer", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uxv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uxv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uxv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uxv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_vacuum_bubbler.json new file mode 100644 index 000000000..f5e267f37 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_vacuum_bubbler.json @@ -0,0 +1,27 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uxv_vacuum_bubbler", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uxv" + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uxv" + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uxv" + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uxv" + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/vile_fission.json b/src/generated/resources/assets/cosmiccore/models/block/machine/vile_fission.json new file mode 100644 index 000000000..4d35a1e42 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/vile_fission.json @@ -0,0 +1,82 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:vile_fission", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/high_temperature_fission_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_temperature_fission_casing", + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_temperature_fission_casing", + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_temperature_fission_casing", + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_temperature_fission_casing", + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_temperature_fission_casing", + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_temperature_fission_casing", + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_temperature_fission_casing", + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_temperature_fission_casing", + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/void_salt_fissiom.json b/src/generated/resources/assets/cosmiccore/models/block/machine/void_salt_fissiom.json new file mode 100644 index 000000000..20697305d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/void_salt_fissiom.json @@ -0,0 +1,82 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:void_salt_fissiom", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/high_temperature_fission_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_temperature_fission_casing", + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_temperature_fission_casing", + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_temperature_fission_casing", + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_temperature_fission_casing", + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_temperature_fission_casing", + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_temperature_fission_casing", + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_temperature_fission_casing", + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_temperature_fission_casing", + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/wasp.json b/src/generated/resources/assets/cosmiccore/models/block/machine/wasp.json new file mode 100644 index 000000000..dbfae17ad --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/wasp.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:wasp", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_paused", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_paused", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_biolab.json b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_biolab.json new file mode 100644 index 000000000..776bbf31a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_biolab.json @@ -0,0 +1,51 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:zpm_biolab", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "gtceu:block/machines/brewery/overlay_front", + "overlay_front_emissive": "gtceu:block/machines/brewery/overlay_front_emissive", + "overlay_side": "gtceu:block/machines/brewery/overlay_side", + "overlay_side_emissive": "gtceu:block/machines/brewery/overlay_side_emissive" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "gtceu:block/machines/brewery/overlay_front", + "overlay_front_emissive": "gtceu:block/machines/brewery/overlay_front_emissive", + "overlay_side": "gtceu:block/machines/brewery/overlay_side", + "overlay_side_emissive": "gtceu:block/machines/brewery/overlay_side_emissive" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "gtceu:block/machines/brewery/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/brewery/overlay_front_active_emissive", + "overlay_side": "gtceu:block/machines/brewery/overlay_side_active", + "overlay_side_emissive": "gtceu:block/machines/brewery/overlay_side_active_emissive" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "gtceu:block/machines/brewery/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/brewery/overlay_front_active_emissive", + "overlay_side": "gtceu:block/machines/brewery/overlay_side_active", + "overlay_side_emissive": "gtceu:block/machines/brewery/overlay_side_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_calx_reactor.json new file mode 100644 index 000000000..fd287347c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_calx_reactor.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:zpm_calx_reactor", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_mana_leaching_tub.json new file mode 100644 index 000000000..159a1ac10 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_mana_leaching_tub.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:zpm_mana_leaching_tub", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_name.json b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_name.json deleted file mode 100644 index da6db61b5..000000000 --- a/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_name.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "parent": "minecraft:block/block", - "loader": "gtceu:machine", - "machine": "cosmiccore:zpm_name", - "texture_overrides": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing" - }, - "variants": { - "is_formed=false,recipe_logic_status=idle": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" - } - } - }, - "is_formed=false,recipe_logic_status=suspend": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" - } - } - }, - "is_formed=false,recipe_logic_status=waiting": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" - } - } - }, - "is_formed=false,recipe_logic_status=working": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" - } - } - }, - "is_formed=true,recipe_logic_status=idle": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" - } - } - }, - "is_formed=true,recipe_logic_status=suspend": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" - } - } - }, - "is_formed=true,recipe_logic_status=waiting": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" - } - } - }, - "is_formed=true,recipe_logic_status=working": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", - "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", - "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" - } - } - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_roaster.json b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_roaster.json new file mode 100644 index 000000000..3b0021a08 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_roaster.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:zpm_roaster", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_thermomagnitizer.json new file mode 100644 index 000000000..00a6c18e2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_thermomagnitizer.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:zpm_thermomagnitizer", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_vacuum_bubbler.json new file mode 100644 index 000000000..abd877c23 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_vacuum_bubbler.json @@ -0,0 +1,27 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:zpm_vacuum_bubbler", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm" + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm" + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm" + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm" + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/moth_home_t1.json b/src/generated/resources/assets/cosmiccore/models/block/moth_home_t1.json new file mode 100644 index 000000000..01a95e183 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/moth_home_t1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/moth/moth_home_t1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/moth_home_t2.json b/src/generated/resources/assets/cosmiccore/models/block/moth_home_t2.json new file mode 100644 index 000000000..125c247eb --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/moth_home_t2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/moth/moth_home_t2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/moth_home_t3.json b/src/generated/resources/assets/cosmiccore/models/block/moth_home_t3.json new file mode 100644 index 000000000..b340afe8a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/moth_home_t3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/moth/moth_home_t3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/moth_home_t4.json b/src/generated/resources/assets/cosmiccore/models/block/moth_home_t4.json new file mode 100644 index 000000000..7e0f270d2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/moth_home_t4.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/moth/moth_home_t4" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/moth_station_casing.json b/src/generated/resources/assets/cosmiccore/models/block/moth_station_casing.json new file mode 100644 index 000000000..a18105fb7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/moth_station_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/moth_station_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/reinforced_dawnstone_casing.json b/src/generated/resources/assets/cosmiccore/models/block/reinforced_dawnstone_casing.json new file mode 100644 index 000000000..599362ab0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/reinforced_dawnstone_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/reinforced_dawnstone_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/rigid_high_speed_steel_casing.json b/src/generated/resources/assets/cosmiccore/models/block/rigid_high_speed_steel_casing.json new file mode 100644 index 000000000..87da781d3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/rigid_high_speed_steel_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/rigid_high_speed_steel_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/rust_stained_casing.json b/src/generated/resources/assets/cosmiccore/models/block/rust_stained_casing.json new file mode 100644 index 000000000..f1e342523 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/rust_stained_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/rust_stained_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/rust_weave_casing.json b/src/generated/resources/assets/cosmiccore/models/block/rust_weave_casing.json new file mode 100644 index 000000000..03fa02dec --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/rust_weave_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/rust_weave_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/somarust_casing.json b/src/generated/resources/assets/cosmiccore/models/block/somarust_casing.json new file mode 100644 index 000000000..06f6bb934 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/somarust_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/somarust_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/soul_muted_casing.json b/src/generated/resources/assets/cosmiccore/models/block/soul_muted_casing.json new file mode 100644 index 000000000..3aeea61df --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/soul_muted_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_muted_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/soul_stained_steel_aluminium_plated_casing.json b/src/generated/resources/assets/cosmiccore/models/block/soul_stained_steel_aluminium_plated_casing.json new file mode 100644 index 000000000..dcd283d5a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/soul_stained_steel_aluminium_plated_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_stained_steel_aluminium_plated_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/steel_rose_lantern.json b/src/generated/resources/assets/cosmiccore/models/block/steel_rose_lantern.json new file mode 100644 index 000000000..ae89c45cb --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/steel_rose_lantern.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/lantern", + "textures": { + "lantern": "cosmiccore:block/lanterns/steel_rose_lantern", + "particle": "cosmiccore:block/lanterns/steel_rose_lantern" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/steel_rose_lantern_hanging.json b/src/generated/resources/assets/cosmiccore/models/block/steel_rose_lantern_hanging.json new file mode 100644 index 000000000..7558a8e18 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/steel_rose_lantern_hanging.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/lantern_hanging", + "textures": { + "lantern": "cosmiccore:block/lanterns/steel_rose_lantern_hanging", + "particle": "cosmiccore:block/lanterns/steel_rose_lantern_hanging" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/steel_rose_light.json b/src/generated/resources/assets/cosmiccore/models/block/steel_rose_light.json new file mode 100644 index 000000000..43dfb7c23 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/steel_rose_light.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/cosmetic/steel_rose_light" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/steel_rose_light_slab.json b/src/generated/resources/assets/cosmiccore/models/block/steel_rose_light_slab.json new file mode 100644 index 000000000..da270cbdb --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/steel_rose_light_slab.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "cosmiccore:block/casings/cosmetic/steel_rose_light", + "side": "cosmiccore:block/casings/cosmetic/steel_rose_light", + "top": "cosmiccore:block/casings/cosmetic/steel_rose_light" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/steel_rose_light_slab_top.json b/src/generated/resources/assets/cosmiccore/models/block/steel_rose_light_slab_top.json new file mode 100644 index 000000000..92f389820 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/steel_rose_light_slab_top.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab_top", + "textures": { + "bottom": "cosmiccore:block/casings/cosmetic/steel_rose_light", + "side": "cosmiccore:block/casings/cosmetic/steel_rose_light", + "top": "cosmiccore:block/casings/cosmetic/steel_rose_light" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/steel_rose_light_stairs.json b/src/generated/resources/assets/cosmiccore/models/block/steel_rose_light_stairs.json new file mode 100644 index 000000000..16d775076 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/steel_rose_light_stairs.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "cosmiccore:block/casings/cosmetic/steel_rose_light", + "side": "cosmiccore:block/casings/cosmetic/steel_rose_light", + "top": "cosmiccore:block/casings/cosmetic/steel_rose_light" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/steel_rose_light_stairs_inner.json b/src/generated/resources/assets/cosmiccore/models/block/steel_rose_light_stairs_inner.json new file mode 100644 index 000000000..8baf6895a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/steel_rose_light_stairs_inner.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "cosmiccore:block/casings/cosmetic/steel_rose_light", + "side": "cosmiccore:block/casings/cosmetic/steel_rose_light", + "top": "cosmiccore:block/casings/cosmetic/steel_rose_light" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/steel_rose_light_stairs_outer.json b/src/generated/resources/assets/cosmiccore/models/block/steel_rose_light_stairs_outer.json new file mode 100644 index 000000000..f38638051 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/steel_rose_light_stairs_outer.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "cosmiccore:block/casings/cosmetic/steel_rose_light", + "side": "cosmiccore:block/casings/cosmetic/steel_rose_light", + "top": "cosmiccore:block/casings/cosmetic/steel_rose_light" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/superheavy_steel_casing.json b/src/generated/resources/assets/cosmiccore/models/block/superheavy_steel_casing.json new file mode 100644 index 000000000..d1fc5ebea --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/superheavy_steel_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/superheavy_steel_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/abrasive_rosin_millstones.json b/src/generated/resources/assets/cosmiccore/models/item/abrasive_rosin_millstones.json new file mode 100644 index 000000000..77c20f4e7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/abrasive_rosin_millstones.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/abrasive_rosin_millstones" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/advanced_gene_kit.json b/src/generated/resources/assets/cosmiccore/models/item/advanced_gene_kit.json new file mode 100644 index 000000000..527ee959f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/advanced_gene_kit.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/advanced_gene_kit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/arcane_crucible.json b/src/generated/resources/assets/cosmiccore/models/item/arcane_crucible.json new file mode 100644 index 000000000..ea3298d96 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/arcane_crucible.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/arcane_crucible" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/armored_freight_beetle_grade_1.json b/src/generated/resources/assets/cosmiccore/models/item/armored_freight_beetle_grade_1.json new file mode 100644 index 000000000..9ad786ef3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/armored_freight_beetle_grade_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/armored_freight_beetle_grade_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/armored_freight_beetle_grade_2.json b/src/generated/resources/assets/cosmiccore/models/item/armored_freight_beetle_grade_2.json new file mode 100644 index 000000000..d6dcda549 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/armored_freight_beetle_grade_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/armored_freight_beetle_grade_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/armored_freight_beetle_grade_3.json b/src/generated/resources/assets/cosmiccore/models/item/armored_freight_beetle_grade_3.json new file mode 100644 index 000000000..06fececb7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/armored_freight_beetle_grade_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/armored_freight_beetle_grade_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/armored_freight_beetle_grade_4.json b/src/generated/resources/assets/cosmiccore/models/item/armored_freight_beetle_grade_4.json new file mode 100644 index 000000000..a83c78feb --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/armored_freight_beetle_grade_4.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/armored_freight_beetle_grade_4" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/armored_freight_beetle_grade_5.json b/src/generated/resources/assets/cosmiccore/models/item/armored_freight_beetle_grade_5.json new file mode 100644 index 000000000..b5f157e40 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/armored_freight_beetle_grade_5.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/armored_freight_beetle_grade_5" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/asteroid_targeting_chip.json b/src/generated/resources/assets/cosmiccore/models/item/asteroid_targeting_chip.json new file mode 100644 index 000000000..494a660b4 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/asteroid_targeting_chip.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/asteroid_targeting_chip" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/atomic_reconstructor.json b/src/generated/resources/assets/cosmiccore/models/item/atomic_reconstructor.json new file mode 100644 index 000000000..fa5cc1307 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/atomic_reconstructor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/atomic_reconstructor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/auric_asteroid.json b/src/generated/resources/assets/cosmiccore/models/item/auric_asteroid.json new file mode 100644 index 000000000..9b73359bb --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/auric_asteroid.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/auric_asteroid" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/basic_gene_kit.json b/src/generated/resources/assets/cosmiccore/models/item/basic_gene_kit.json new file mode 100644 index 000000000..d49184a26 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/basic_gene_kit.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/basic_gene_kit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/bee_holder.json b/src/generated/resources/assets/cosmiccore/models/item/bee_holder.json new file mode 100644 index 000000000..714704206 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/bee_holder.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/bee_holder" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/bitumen_wax.json b/src/generated/resources/assets/cosmiccore/models/item/bitumen_wax.json new file mode 100644 index 000000000..ddb9f5a02 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/bitumen_wax.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/bitumen_wax" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/bolted_heavy_frame_casing.json b/src/generated/resources/assets/cosmiccore/models/item/bolted_heavy_frame_casing.json new file mode 100644 index 000000000..b4f2fef0c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/bolted_heavy_frame_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/bolted_heavy_frame_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/brimstone_asteroid.json b/src/generated/resources/assets/cosmiccore/models/item/brimstone_asteroid.json new file mode 100644 index 000000000..30e156f38 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/brimstone_asteroid.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/brimstone_asteroid" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/bronze_supply_tank.json b/src/generated/resources/assets/cosmiccore/models/item/bronze_supply_tank.json new file mode 100644 index 000000000..1c469b646 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/bronze_supply_tank.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/bronze_supply_tank" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/capacity_chip.json b/src/generated/resources/assets/cosmiccore/models/item/capacity_chip.json new file mode 100644 index 000000000..5451f2dc2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/capacity_chip.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/capacity_chip" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/carbon_asteroid_base.json b/src/generated/resources/assets/cosmiccore/models/item/carbon_asteroid_base.json new file mode 100644 index 000000000..d84cb5f63 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/carbon_asteroid_base.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/carbon_asteroid_base" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/cinder_hearth.json b/src/generated/resources/assets/cosmiccore/models/item/cinder_hearth.json new file mode 100644 index 000000000..03e937050 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/cinder_hearth.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/cinder_hearth" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/cosmic_me_assemblyline_bus.json b/src/generated/resources/assets/cosmiccore/models/item/cosmic_me_assemblyline_bus.json new file mode 100644 index 000000000..98d4af8d3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/cosmic_me_assemblyline_bus.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/cosmic_me_assemblyline_bus" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/cosmic_me_assemblyline_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/cosmic_me_assemblyline_hatch.json new file mode 100644 index 000000000..191ae2ed4 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/cosmic_me_assemblyline_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/cosmic_me_assemblyline_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/crucible_mantis_grade_1.json b/src/generated/resources/assets/cosmiccore/models/item/crucible_mantis_grade_1.json new file mode 100644 index 000000000..3aba07de7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/crucible_mantis_grade_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/crucible_mantis_grade_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/crusher_wasps_grade_1.json b/src/generated/resources/assets/cosmiccore/models/item/crusher_wasps_grade_1.json new file mode 100644 index 000000000..214748707 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/crusher_wasps_grade_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/crusher_wasps_grade_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/crusher_wasps_grade_2.json b/src/generated/resources/assets/cosmiccore/models/item/crusher_wasps_grade_2.json new file mode 100644 index 000000000..4095ce1b9 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/crusher_wasps_grade_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/crusher_wasps_grade_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/crusher_wasps_grade_3.json b/src/generated/resources/assets/cosmiccore/models/item/crusher_wasps_grade_3.json new file mode 100644 index 000000000..d1d2c2ff1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/crusher_wasps_grade_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/crusher_wasps_grade_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/crusher_wasps_grade_4.json b/src/generated/resources/assets/cosmiccore/models/item/crusher_wasps_grade_4.json new file mode 100644 index 000000000..b9b92f62a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/crusher_wasps_grade_4.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/crusher_wasps_grade_4" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/crusher_wasps_grade_5.json b/src/generated/resources/assets/cosmiccore/models/item/crusher_wasps_grade_5.json new file mode 100644 index 000000000..74c3a56c0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/crusher_wasps_grade_5.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/crusher_wasps_grade_5" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/dawn_forge.json b/src/generated/resources/assets/cosmiccore/models/item/dawn_forge.json new file mode 100644 index 000000000..7f928b6d5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/dawn_forge.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/dawn_forge" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/dawnforge_eclipsed.json b/src/generated/resources/assets/cosmiccore/models/item/dawnforge_eclipsed.json new file mode 100644 index 000000000..2d306f1b1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/dawnforge_eclipsed.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/dawnforge_eclipsed" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/diving_bell.json b/src/generated/resources/assets/cosmiccore/models/item/diving_bell.json new file mode 100644 index 000000000..cf11e9bdb --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/diving_bell.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/diving_bell" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/diving_bell_escape_pad.json b/src/generated/resources/assets/cosmiccore/models/item/diving_bell_escape_pad.json new file mode 100644 index 000000000..a01178684 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/diving_bell_escape_pad.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/diving_bell_escape_pad" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/dreamers_basin.json b/src/generated/resources/assets/cosmiccore/models/item/dreamers_basin.json new file mode 100644 index 000000000..d629103f0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/dreamers_basin.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/dreamers_basin" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/efficacy_chip.json b/src/generated/resources/assets/cosmiccore/models/item/efficacy_chip.json new file mode 100644 index 000000000..0662bea04 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/efficacy_chip.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/efficacy_chip" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ember_tester.json b/src/generated/resources/assets/cosmiccore/models/item/ember_tester.json deleted file mode 100644 index dac03ad02..000000000 --- a/src/generated/resources/assets/cosmiccore/models/item/ember_tester.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "cosmiccore:block/machine/ember_tester" -} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/empty_fuel_rod.json b/src/generated/resources/assets/cosmiccore/models/item/empty_fuel_rod.json new file mode 100644 index 000000000..c969abd85 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/empty_fuel_rod.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/empty_fuel_rod" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/energized_silk.json b/src/generated/resources/assets/cosmiccore/models/item/energized_silk.json new file mode 100644 index 000000000..209c7349e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/energized_silk.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/energized_silk" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/enthelic_processor.json b/src/generated/resources/assets/cosmiccore/models/item/enthelic_processor.json new file mode 100644 index 000000000..227a7209d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/enthelic_processor.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/enthelic_processor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/enthelic_processor_assembly.json b/src/generated/resources/assets/cosmiccore/models/item/enthelic_processor_assembly.json new file mode 100644 index 000000000..2ccdf918d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/enthelic_processor_assembly.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/enthelic_processor_assembly" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/enthelic_processor_mainframe.json b/src/generated/resources/assets/cosmiccore/models/item/enthelic_processor_mainframe.json new file mode 100644 index 000000000..e5c30bc82 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/enthelic_processor_mainframe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/enthelic_processor_mainframe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/enthelic_processor_supercomputer.json b/src/generated/resources/assets/cosmiccore/models/item/enthelic_processor_supercomputer.json new file mode 100644 index 000000000..f106caec5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/enthelic_processor_supercomputer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/enthelic_processor_supercomputer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ethersteel_plated_ash_tiles.json b/src/generated/resources/assets/cosmiccore/models/item/ethersteel_plated_ash_tiles.json new file mode 100644 index 000000000..bf0c50959 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ethersteel_plated_ash_tiles.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/ethersteel_plated_ash_tiles" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ev_biolab.json b/src/generated/resources/assets/cosmiccore/models/item/ev_biolab.json new file mode 100644 index 000000000..832e4aaa3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ev_biolab.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/ev_biolab" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ev_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/item/ev_calx_reactor.json new file mode 100644 index 000000000..4a178c20a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ev_calx_reactor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/ev_calx_reactor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ev_electric_apiary.json b/src/generated/resources/assets/cosmiccore/models/item/ev_electric_apiary.json new file mode 100644 index 000000000..f8b64b99b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ev_electric_apiary.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/ev_electric_apiary" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ev_ember_emitter.json b/src/generated/resources/assets/cosmiccore/models/item/ev_ember_emitter.json new file mode 100644 index 000000000..2c9923b21 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ev_ember_emitter.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/ev_ember_emitter" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ev_ember_input_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/ev_ember_input_hatch.json new file mode 100644 index 000000000..9ebb131a3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ev_ember_input_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/ev_ember_input_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ev_ember_output_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/ev_ember_output_hatch.json new file mode 100644 index 000000000..929e72e6a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ev_ember_output_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/ev_ember_output_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ev_ember_receptor.json b/src/generated/resources/assets/cosmiccore/models/item/ev_ember_receptor.json new file mode 100644 index 000000000..903820cd3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ev_ember_receptor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/ev_ember_receptor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ev_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/item/ev_mana_leaching_tub.json new file mode 100644 index 000000000..b40d7c553 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ev_mana_leaching_tub.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/ev_mana_leaching_tub" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ev_roaster.json b/src/generated/resources/assets/cosmiccore/models/item/ev_roaster.json new file mode 100644 index 000000000..8c88d816d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ev_roaster.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/ev_roaster" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ev_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/item/ev_thermomagnitizer.json new file mode 100644 index 000000000..a4eeb5fa7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ev_thermomagnitizer.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/ev_thermomagnitizer" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ev_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/item/ev_vacuum_bubbler.json new file mode 100644 index 000000000..ef639b1c2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ev_vacuum_bubbler.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/ev_vacuum_bubbler" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ev_wildfire_core.json b/src/generated/resources/assets/cosmiccore/models/item/ev_wildfire_core.json new file mode 100644 index 000000000..b09aa4835 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ev_wildfire_core.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/ev_wildfire_core" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ferric_asteroid.json b/src/generated/resources/assets/cosmiccore/models/item/ferric_asteroid.json new file mode 100644 index 000000000..2c677cbfe --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ferric_asteroid.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/ferric_asteroid" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/flesh_packed_neptunium_fuel.json b/src/generated/resources/assets/cosmiccore/models/item/flesh_packed_neptunium_fuel.json new file mode 100644 index 000000000..29c22892f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/flesh_packed_neptunium_fuel.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/flesh_packed_neptunium_fuel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/flesh_packed_plutonium_fuel.json b/src/generated/resources/assets/cosmiccore/models/item/flesh_packed_plutonium_fuel.json new file mode 100644 index 000000000..2d1ce9138 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/flesh_packed_plutonium_fuel.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/flesh_packed_plutonium_fuel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/flesh_packed_uranium_fuel.json b/src/generated/resources/assets/cosmiccore/models/item/flesh_packed_uranium_fuel.json new file mode 100644 index 000000000..d186bf861 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/flesh_packed_uranium_fuel.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/flesh_packed_uranium_fuel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/fleshy_neptunium_waste.json b/src/generated/resources/assets/cosmiccore/models/item/fleshy_neptunium_waste.json new file mode 100644 index 000000000..e5fe729f3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/fleshy_neptunium_waste.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/fleshy_neptunium_waste" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/fleshy_plutonium_waste.json b/src/generated/resources/assets/cosmiccore/models/item/fleshy_plutonium_waste.json new file mode 100644 index 000000000..9e7bd9466 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/fleshy_plutonium_waste.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/fleshy_plutonium_waste" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/fleshy_uranium_waste.json b/src/generated/resources/assets/cosmiccore/models/item/fleshy_uranium_waste.json new file mode 100644 index 000000000..5e331e157 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/fleshy_uranium_waste.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/fleshy_uranium_waste" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/freight_beetle_grade_1.json b/src/generated/resources/assets/cosmiccore/models/item/freight_beetle_grade_1.json new file mode 100644 index 000000000..05270f38c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/freight_beetle_grade_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/freight_beetle_grade_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/freight_beetle_grade_2.json b/src/generated/resources/assets/cosmiccore/models/item/freight_beetle_grade_2.json new file mode 100644 index 000000000..61b15964d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/freight_beetle_grade_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/freight_beetle_grade_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/freight_beetle_grade_3.json b/src/generated/resources/assets/cosmiccore/models/item/freight_beetle_grade_3.json new file mode 100644 index 000000000..b6653c6e5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/freight_beetle_grade_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/freight_beetle_grade_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/freight_beetle_grade_4.json b/src/generated/resources/assets/cosmiccore/models/item/freight_beetle_grade_4.json new file mode 100644 index 000000000..9e9f66569 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/freight_beetle_grade_4.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/freight_beetle_grade_4" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/freight_beetle_grade_5.json b/src/generated/resources/assets/cosmiccore/models/item/freight_beetle_grade_5.json new file mode 100644 index 000000000..08afaf0ef --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/freight_beetle_grade_5.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/freight_beetle_grade_5" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hex_processor.json b/src/generated/resources/assets/cosmiccore/models/item/hex_processor.json new file mode 100644 index 000000000..157ef9089 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hex_processor.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/hex_processor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hex_processor_assembly.json b/src/generated/resources/assets/cosmiccore/models/item/hex_processor_assembly.json new file mode 100644 index 000000000..2657c6631 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hex_processor_assembly.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/hex_processor_assembly" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hex_processor_mainframe.json b/src/generated/resources/assets/cosmiccore/models/item/hex_processor_mainframe.json new file mode 100644 index 000000000..3dcd4133b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hex_processor_mainframe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/hex_processor_mainframe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hex_processor_supercomputer.json b/src/generated/resources/assets/cosmiccore/models/item/hex_processor_supercomputer.json new file mode 100644 index 000000000..c29ffd79f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hex_processor_supercomputer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/hex_processor_supercomputer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/honey_alveary.json b/src/generated/resources/assets/cosmiccore/models/item/honey_alveary.json new file mode 100644 index 000000000..5305a4caa --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/honey_alveary.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/honey_alveary" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/item/hv_calx_reactor.json new file mode 100644 index 000000000..232bc8474 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hv_calx_reactor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/hv_calx_reactor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hv_electric_apiary.json b/src/generated/resources/assets/cosmiccore/models/item/hv_electric_apiary.json new file mode 100644 index 000000000..57493bad1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hv_electric_apiary.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/hv_electric_apiary" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hv_ember_emitter.json b/src/generated/resources/assets/cosmiccore/models/item/hv_ember_emitter.json new file mode 100644 index 000000000..721bab6bc --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hv_ember_emitter.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/hv_ember_emitter" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hv_ember_input_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/hv_ember_input_hatch.json new file mode 100644 index 000000000..1115eb1ff --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hv_ember_input_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/hv_ember_input_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hv_ember_output_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/hv_ember_output_hatch.json new file mode 100644 index 000000000..52cd066d6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hv_ember_output_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/hv_ember_output_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hv_ember_receptor.json b/src/generated/resources/assets/cosmiccore/models/item/hv_ember_receptor.json new file mode 100644 index 000000000..4855e2de1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hv_ember_receptor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/hv_ember_receptor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hv_energy_output_hatch_16a.json b/src/generated/resources/assets/cosmiccore/models/item/hv_energy_output_hatch_16a.json new file mode 100644 index 000000000..9cbbdbf8a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hv_energy_output_hatch_16a.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/hv_energy_output_hatch_16a" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hv_energy_output_hatch_4a.json b/src/generated/resources/assets/cosmiccore/models/item/hv_energy_output_hatch_4a.json new file mode 100644 index 000000000..fafdc1762 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hv_energy_output_hatch_4a.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/hv_energy_output_hatch_4a" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hv_input_hatch_4x.json b/src/generated/resources/assets/cosmiccore/models/item/hv_input_hatch_4x.json new file mode 100644 index 000000000..c817507af --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hv_input_hatch_4x.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/hv_input_hatch_4x" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/item/hv_mana_leaching_tub.json new file mode 100644 index 000000000..3d730b580 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hv_mana_leaching_tub.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/hv_mana_leaching_tub" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hv_output_hatch_4x.json b/src/generated/resources/assets/cosmiccore/models/item/hv_output_hatch_4x.json new file mode 100644 index 000000000..fdfdc3f87 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hv_output_hatch_4x.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/hv_output_hatch_4x" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hv_roaster.json b/src/generated/resources/assets/cosmiccore/models/item/hv_roaster.json new file mode 100644 index 000000000..775be72f1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hv_roaster.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/hv_roaster" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/item/hv_thermomagnitizer.json new file mode 100644 index 000000000..ede652e2d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hv_thermomagnitizer.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/hv_thermomagnitizer" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/item/hv_vacuum_bubbler.json new file mode 100644 index 000000000..19831d0a8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hv_vacuum_bubbler.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/hv_vacuum_bubbler" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hv_wildfire_core.json b/src/generated/resources/assets/cosmiccore/models/item/hv_wildfire_core.json new file mode 100644 index 000000000..b83d3f1a0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hv_wildfire_core.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/hv_wildfire_core" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hydraulic_boots.json b/src/generated/resources/assets/cosmiccore/models/item/hydraulic_boots.json new file mode 100644 index 000000000..239d3ec98 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hydraulic_boots.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/hydraulic_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/intermediate_gene_kit.json b/src/generated/resources/assets/cosmiccore/models/item/intermediate_gene_kit.json new file mode 100644 index 000000000..720729e41 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/intermediate_gene_kit.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/intermediate_gene_kit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/iron_plated_deepslate_tile.json b/src/generated/resources/assets/cosmiccore/models/item/iron_plated_deepslate_tile.json new file mode 100644 index 000000000..2ea13bf56 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/iron_plated_deepslate_tile.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/iron_plated_deepslate_tile" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/iron_plated_deepslate_tile_slab.json b/src/generated/resources/assets/cosmiccore/models/item/iron_plated_deepslate_tile_slab.json new file mode 100644 index 000000000..6753c391e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/iron_plated_deepslate_tile_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/iron_plated_deepslate_tile_slab" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/iron_plated_deepslate_tile_stairs.json b/src/generated/resources/assets/cosmiccore/models/item/iron_plated_deepslate_tile_stairs.json new file mode 100644 index 000000000..9aff18f54 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/iron_plated_deepslate_tile_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/iron_plated_deepslate_tile_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/iv_biolab.json b/src/generated/resources/assets/cosmiccore/models/item/iv_biolab.json new file mode 100644 index 000000000..568aeb378 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/iv_biolab.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/iv_biolab" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/iv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/item/iv_calx_reactor.json new file mode 100644 index 000000000..8c3f77f17 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/iv_calx_reactor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/iv_calx_reactor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/iv_electric_apiary.json b/src/generated/resources/assets/cosmiccore/models/item/iv_electric_apiary.json new file mode 100644 index 000000000..668e64245 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/iv_electric_apiary.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/iv_electric_apiary" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/iv_ember_emitter.json b/src/generated/resources/assets/cosmiccore/models/item/iv_ember_emitter.json new file mode 100644 index 000000000..6171a0dc9 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/iv_ember_emitter.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/iv_ember_emitter" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/iv_ember_receptor.json b/src/generated/resources/assets/cosmiccore/models/item/iv_ember_receptor.json new file mode 100644 index 000000000..17fce9098 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/iv_ember_receptor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/iv_ember_receptor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/iv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/item/iv_mana_leaching_tub.json new file mode 100644 index 000000000..e8f57b071 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/iv_mana_leaching_tub.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/iv_mana_leaching_tub" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/iv_roaster.json b/src/generated/resources/assets/cosmiccore/models/item/iv_roaster.json new file mode 100644 index 000000000..4d456a320 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/iv_roaster.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/iv_roaster" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/iv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/item/iv_thermomagnitizer.json new file mode 100644 index 000000000..e2645399a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/iv_thermomagnitizer.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/iv_thermomagnitizer" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/iv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/item/iv_vacuum_bubbler.json new file mode 100644 index 000000000..f47e68044 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/iv_vacuum_bubbler.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/iv_vacuum_bubbler" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/iv_wildfire_core.json b/src/generated/resources/assets/cosmiccore/models/item/iv_wildfire_core.json new file mode 100644 index 000000000..fb4e86351 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/iv_wildfire_core.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/iv_wildfire_core" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/large_roaster.json b/src/generated/resources/assets/cosmiccore/models/item/large_roaster.json new file mode 100644 index 000000000..8b15e2b53 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/large_roaster.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/large_roaster" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/larva.json b/src/generated/resources/assets/cosmiccore/models/item/larva.json new file mode 100644 index 000000000..b5eb269d5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/larva.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/larva" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/latent_capacity_wafer.json b/src/generated/resources/assets/cosmiccore/models/item/latent_capacity_wafer.json new file mode 100644 index 000000000..5d1d163ce --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/latent_capacity_wafer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/latent_capacity_wafer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/latent_efficacy_wafer.json b/src/generated/resources/assets/cosmiccore/models/item/latent_efficacy_wafer.json new file mode 100644 index 000000000..9f666ff09 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/latent_efficacy_wafer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/latent_efficacy_wafer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/latent_potency_wafer.json b/src/generated/resources/assets/cosmiccore/models/item/latent_potency_wafer.json new file mode 100644 index 000000000..ba677aaab --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/latent_potency_wafer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/latent_potency_wafer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/latent_verbosity_wafer.json b/src/generated/resources/assets/cosmiccore/models/item/latent_verbosity_wafer.json new file mode 100644 index 000000000..4e27f1ebe --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/latent_verbosity_wafer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/latent_verbosity_wafer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/light_dawnstone_casing.json b/src/generated/resources/assets/cosmiccore/models/item/light_dawnstone_casing.json new file mode 100644 index 000000000..3f1d1e057 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/light_dawnstone_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/light_dawnstone_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/link_test_station.json b/src/generated/resources/assets/cosmiccore/models/item/link_test_station.json new file mode 100644 index 000000000..b192604e1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/link_test_station.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/link_test_station" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/lith_asteroid.json b/src/generated/resources/assets/cosmiccore/models/item/lith_asteroid.json new file mode 100644 index 000000000..4beae39ab --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/lith_asteroid.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/lith_asteroid" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/livingrock_aluminate_boule.json b/src/generated/resources/assets/cosmiccore/models/item/livingrock_aluminate_boule.json new file mode 100644 index 000000000..bda25c3c5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/livingrock_aluminate_boule.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/livingrock_aluminate_boule" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/livingrock_tiles.json b/src/generated/resources/assets/cosmiccore/models/item/livingrock_tiles.json new file mode 100644 index 000000000..df48b0a37 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/livingrock_tiles.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/livingrock_tiles" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/livirock_aluminite_wafer.json b/src/generated/resources/assets/cosmiccore/models/item/livirock_aluminite_wafer.json new file mode 100644 index 000000000..9a33908b8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/livirock_aluminite_wafer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/livirock_aluminite_wafer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/lucidic_processor.json b/src/generated/resources/assets/cosmiccore/models/item/lucidic_processor.json new file mode 100644 index 000000000..d095e045f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/lucidic_processor.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/lucidic_processor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/lucidic_processor_assembly.json b/src/generated/resources/assets/cosmiccore/models/item/lucidic_processor_assembly.json new file mode 100644 index 000000000..ae1279033 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/lucidic_processor_assembly.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/lucidic_processor_assembly" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/lucidic_processor_mainframe.json b/src/generated/resources/assets/cosmiccore/models/item/lucidic_processor_mainframe.json new file mode 100644 index 000000000..f7ab0aebf --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/lucidic_processor_mainframe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/lucidic_processor_mainframe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/lucidic_processor_supercomputer.json b/src/generated/resources/assets/cosmiccore/models/item/lucidic_processor_supercomputer.json new file mode 100644 index 000000000..32be10a55 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/lucidic_processor_supercomputer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/lucidic_processor_supercomputer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/luv_biolab.json b/src/generated/resources/assets/cosmiccore/models/item/luv_biolab.json new file mode 100644 index 000000000..e409c20b1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/luv_biolab.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/luv_biolab" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/luv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/item/luv_calx_reactor.json new file mode 100644 index 000000000..9250f48f0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/luv_calx_reactor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/luv_calx_reactor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/luv_electric_apiary.json b/src/generated/resources/assets/cosmiccore/models/item/luv_electric_apiary.json new file mode 100644 index 000000000..05ccba769 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/luv_electric_apiary.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/luv_electric_apiary" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/luv_ember_emitter.json b/src/generated/resources/assets/cosmiccore/models/item/luv_ember_emitter.json new file mode 100644 index 000000000..902a574cd --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/luv_ember_emitter.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/luv_ember_emitter" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/luv_ember_receptor.json b/src/generated/resources/assets/cosmiccore/models/item/luv_ember_receptor.json new file mode 100644 index 000000000..e75ba7633 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/luv_ember_receptor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/luv_ember_receptor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/luv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/item/luv_mana_leaching_tub.json new file mode 100644 index 000000000..1aa0481cb --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/luv_mana_leaching_tub.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/luv_mana_leaching_tub" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/luv_roaster.json b/src/generated/resources/assets/cosmiccore/models/item/luv_roaster.json new file mode 100644 index 000000000..502d0bb66 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/luv_roaster.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/luv_roaster" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/luv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/item/luv_thermomagnitizer.json new file mode 100644 index 000000000..2dc4920f3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/luv_thermomagnitizer.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/luv_thermomagnitizer" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/luv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/item/luv_vacuum_bubbler.json new file mode 100644 index 000000000..57e7dafd0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/luv_vacuum_bubbler.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/luv_vacuum_bubbler" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/luv_wildfire_core.json b/src/generated/resources/assets/cosmiccore/models/item/luv_wildfire_core.json new file mode 100644 index 000000000..d52ce655f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/luv_wildfire_core.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/luv_wildfire_core" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/lv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/item/lv_calx_reactor.json new file mode 100644 index 000000000..0e4770752 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/lv_calx_reactor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/lv_calx_reactor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/lv_electric_apiary.json b/src/generated/resources/assets/cosmiccore/models/item/lv_electric_apiary.json new file mode 100644 index 000000000..6edafcdea --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/lv_electric_apiary.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/lv_electric_apiary" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/lv_ember_emitter.json b/src/generated/resources/assets/cosmiccore/models/item/lv_ember_emitter.json new file mode 100644 index 000000000..db919212a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/lv_ember_emitter.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/lv_ember_emitter" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/lv_ember_input_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/lv_ember_input_hatch.json new file mode 100644 index 000000000..d5d591e22 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/lv_ember_input_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/lv_ember_input_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/lv_ember_output_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/lv_ember_output_hatch.json new file mode 100644 index 000000000..103538bea --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/lv_ember_output_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/lv_ember_output_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/lv_ember_receptor.json b/src/generated/resources/assets/cosmiccore/models/item/lv_ember_receptor.json new file mode 100644 index 000000000..103b083dc --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/lv_ember_receptor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/lv_ember_receptor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/lv_energy_output_hatch_16a.json b/src/generated/resources/assets/cosmiccore/models/item/lv_energy_output_hatch_16a.json new file mode 100644 index 000000000..ead5324ca --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/lv_energy_output_hatch_16a.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/lv_energy_output_hatch_16a" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/lv_energy_output_hatch_4a.json b/src/generated/resources/assets/cosmiccore/models/item/lv_energy_output_hatch_4a.json new file mode 100644 index 000000000..ec8aaf2f4 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/lv_energy_output_hatch_4a.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/lv_energy_output_hatch_4a" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/lv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/item/lv_mana_leaching_tub.json new file mode 100644 index 000000000..6b8d2b3ba --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/lv_mana_leaching_tub.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/lv_mana_leaching_tub" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/lv_roaster.json b/src/generated/resources/assets/cosmiccore/models/item/lv_roaster.json new file mode 100644 index 000000000..ca87d40de --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/lv_roaster.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/lv_roaster" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/lv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/item/lv_thermomagnitizer.json new file mode 100644 index 000000000..be7328cdc --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/lv_thermomagnitizer.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/lv_thermomagnitizer" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/lv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/item/lv_vacuum_bubbler.json new file mode 100644 index 000000000..0a5bd859f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/lv_vacuum_bubbler.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/lv_vacuum_bubbler" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/lv_wildfire_core.json b/src/generated/resources/assets/cosmiccore/models/item/lv_wildfire_core.json new file mode 100644 index 000000000..1f2768ea4 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/lv_wildfire_core.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/lv_wildfire_core" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/mafic_asteroid.json b/src/generated/resources/assets/cosmiccore/models/item/mafic_asteroid.json new file mode 100644 index 000000000..1c4726cd6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/mafic_asteroid.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/mafic_asteroid" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/mana_etching_factory.json b/src/generated/resources/assets/cosmiccore/models/item/mana_etching_factory.json new file mode 100644 index 000000000..65409b6a0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/mana_etching_factory.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/mana_etching_factory" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/max_ember_emitter.json b/src/generated/resources/assets/cosmiccore/models/item/max_ember_emitter.json new file mode 100644 index 000000000..af1556868 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/max_ember_emitter.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/max_ember_emitter" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/max_ember_receptor.json b/src/generated/resources/assets/cosmiccore/models/item/max_ember_receptor.json new file mode 100644 index 000000000..c9960ec44 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/max_ember_receptor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/max_ember_receptor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/mossy_asteroid.json b/src/generated/resources/assets/cosmiccore/models/item/mossy_asteroid.json new file mode 100644 index 000000000..aa8a31bab --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/mossy_asteroid.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/mossy_asteroid" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/moth_cargo_drop_off.json b/src/generated/resources/assets/cosmiccore/models/item/moth_cargo_drop_off.json new file mode 100644 index 000000000..7af042c03 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/moth_cargo_drop_off.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/moth_cargo_drop_off" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/moth_cargo_station.json b/src/generated/resources/assets/cosmiccore/models/item/moth_cargo_station.json new file mode 100644 index 000000000..a894ef3fb --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/moth_cargo_station.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/moth_cargo_station" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/moth_home_t1.json b/src/generated/resources/assets/cosmiccore/models/item/moth_home_t1.json new file mode 100644 index 000000000..fb4583310 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/moth_home_t1.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/moth_home_t1" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/moth_home_t2.json b/src/generated/resources/assets/cosmiccore/models/item/moth_home_t2.json new file mode 100644 index 000000000..780bbbfcd --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/moth_home_t2.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/moth_home_t2" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/moth_home_t3.json b/src/generated/resources/assets/cosmiccore/models/item/moth_home_t3.json new file mode 100644 index 000000000..77b5ded2f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/moth_home_t3.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/moth_home_t3" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/moth_home_t4.json b/src/generated/resources/assets/cosmiccore/models/item/moth_home_t4.json new file mode 100644 index 000000000..e8403c04a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/moth_home_t4.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/moth_home_t4" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/moth_station_casing.json b/src/generated/resources/assets/cosmiccore/models/item/moth_station_casing.json new file mode 100644 index 000000000..d4e6e313c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/moth_station_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/moth_station_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/multilayered_enthel_circuit_board.json b/src/generated/resources/assets/cosmiccore/models/item/multilayered_enthel_circuit_board.json new file mode 100644 index 000000000..0b4749742 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/multilayered_enthel_circuit_board.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/multilayered_enthel_circuit_board" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/mv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/item/mv_calx_reactor.json new file mode 100644 index 000000000..55c8cf13d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/mv_calx_reactor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/mv_calx_reactor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/mv_electric_apiary.json b/src/generated/resources/assets/cosmiccore/models/item/mv_electric_apiary.json new file mode 100644 index 000000000..6998edf82 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/mv_electric_apiary.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/mv_electric_apiary" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/mv_ember_emitter.json b/src/generated/resources/assets/cosmiccore/models/item/mv_ember_emitter.json new file mode 100644 index 000000000..22f8c5f76 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/mv_ember_emitter.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/mv_ember_emitter" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/mv_ember_input_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/mv_ember_input_hatch.json new file mode 100644 index 000000000..db02deede --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/mv_ember_input_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/mv_ember_input_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/mv_ember_output_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/mv_ember_output_hatch.json new file mode 100644 index 000000000..2f1285229 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/mv_ember_output_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/mv_ember_output_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/mv_ember_receptor.json b/src/generated/resources/assets/cosmiccore/models/item/mv_ember_receptor.json new file mode 100644 index 000000000..3b4592cf8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/mv_ember_receptor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/mv_ember_receptor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/mv_energy_output_hatch_16a.json b/src/generated/resources/assets/cosmiccore/models/item/mv_energy_output_hatch_16a.json new file mode 100644 index 000000000..190062bed --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/mv_energy_output_hatch_16a.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/mv_energy_output_hatch_16a" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/mv_energy_output_hatch_4a.json b/src/generated/resources/assets/cosmiccore/models/item/mv_energy_output_hatch_4a.json new file mode 100644 index 000000000..d1b9a3a0b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/mv_energy_output_hatch_4a.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/mv_energy_output_hatch_4a" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/mv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/item/mv_mana_leaching_tub.json new file mode 100644 index 000000000..622e8dcb4 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/mv_mana_leaching_tub.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/mv_mana_leaching_tub" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/mv_roaster.json b/src/generated/resources/assets/cosmiccore/models/item/mv_roaster.json new file mode 100644 index 000000000..fb5ff08eb --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/mv_roaster.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/mv_roaster" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/mv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/item/mv_thermomagnitizer.json new file mode 100644 index 000000000..2270f9763 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/mv_thermomagnitizer.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/mv_thermomagnitizer" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/mv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/item/mv_vacuum_bubbler.json new file mode 100644 index 000000000..568b590df --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/mv_vacuum_bubbler.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/mv_vacuum_bubbler" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/mv_wildfire_core.json b/src/generated/resources/assets/cosmiccore/models/item/mv_wildfire_core.json new file mode 100644 index 000000000..31126f647 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/mv_wildfire_core.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/mv_wildfire_core" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/nano_boots.json b/src/generated/resources/assets/cosmiccore/models/item/nano_boots.json new file mode 100644 index 000000000..afd5bed3d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/nano_boots.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/nano_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/occult_asteroid.json b/src/generated/resources/assets/cosmiccore/models/item/occult_asteroid.json new file mode 100644 index 000000000..e57f493ee --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/occult_asteroid.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/occult_asteroid" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/opv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/item/opv_calx_reactor.json new file mode 100644 index 000000000..c3e29a4b9 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/opv_calx_reactor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/opv_calx_reactor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/opv_ember_emitter.json b/src/generated/resources/assets/cosmiccore/models/item/opv_ember_emitter.json new file mode 100644 index 000000000..b9293c98e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/opv_ember_emitter.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/opv_ember_emitter" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/opv_ember_receptor.json b/src/generated/resources/assets/cosmiccore/models/item/opv_ember_receptor.json new file mode 100644 index 000000000..7edda5112 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/opv_ember_receptor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/opv_ember_receptor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/opv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/item/opv_mana_leaching_tub.json new file mode 100644 index 000000000..551ea3b24 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/opv_mana_leaching_tub.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/opv_mana_leaching_tub" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/opv_roaster.json b/src/generated/resources/assets/cosmiccore/models/item/opv_roaster.json new file mode 100644 index 000000000..5a415f278 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/opv_roaster.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/opv_roaster" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/opv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/item/opv_thermomagnitizer.json new file mode 100644 index 000000000..3a4b74799 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/opv_thermomagnitizer.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/opv_thermomagnitizer" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/opv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/item/opv_vacuum_bubbler.json new file mode 100644 index 000000000..fe08e857f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/opv_vacuum_bubbler.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/opv_vacuum_bubbler" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/oxide_asteroid.json b/src/generated/resources/assets/cosmiccore/models/item/oxide_asteroid.json new file mode 100644 index 000000000..6edef723d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/oxide_asteroid.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/oxide_asteroid" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/pale_saw.json b/src/generated/resources/assets/cosmiccore/models/item/pale_saw.json new file mode 100644 index 000000000..5674bb2a0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/pale_saw.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/pale_saw" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/pale_scrap.json b/src/generated/resources/assets/cosmiccore/models/item/pale_scrap.json new file mode 100644 index 000000000..ac2c798c0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/pale_scrap.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/pale_scrap" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/plastic_circuit_board.json b/src/generated/resources/assets/cosmiccore/models/item/plastic_circuit_board.json new file mode 100644 index 000000000..fa7d14281 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/plastic_circuit_board.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/plastic_circuit_board" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/potency_chip.json b/src/generated/resources/assets/cosmiccore/models/item/potency_chip.json new file mode 100644 index 000000000..2a51b5d1c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/potency_chip.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/potency_chip" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/pressurized_rebreather.json b/src/generated/resources/assets/cosmiccore/models/item/pressurized_rebreather.json new file mode 100644 index 000000000..c05af766a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/pressurized_rebreather.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/pressurized_rebreather" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/pulverizing_beetle_grade_1.json b/src/generated/resources/assets/cosmiccore/models/item/pulverizing_beetle_grade_1.json new file mode 100644 index 000000000..17a5ea4ec --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/pulverizing_beetle_grade_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/pulverizing_beetle_grade_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/pulverizing_beetle_grade_2.json b/src/generated/resources/assets/cosmiccore/models/item/pulverizing_beetle_grade_2.json new file mode 100644 index 000000000..71a8efc7e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/pulverizing_beetle_grade_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/pulverizing_beetle_grade_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/pulverizing_beetle_grade_3.json b/src/generated/resources/assets/cosmiccore/models/item/pulverizing_beetle_grade_3.json new file mode 100644 index 000000000..b2f488e49 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/pulverizing_beetle_grade_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/pulverizing_beetle_grade_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/pulverizing_beetle_grade_4.json b/src/generated/resources/assets/cosmiccore/models/item/pulverizing_beetle_grade_4.json new file mode 100644 index 000000000..a2616faff --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/pulverizing_beetle_grade_4.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/pulverizing_beetle_grade_4" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/pulverizing_beetle_grade_5.json b/src/generated/resources/assets/cosmiccore/models/item/pulverizing_beetle_grade_5.json new file mode 100644 index 000000000..714ba9457 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/pulverizing_beetle_grade_5.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/pulverizing_beetle_grade_5" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/pyrothermic_refinery.json b/src/generated/resources/assets/cosmiccore/models/item/pyrothermic_refinery.json new file mode 100644 index 000000000..8be4204af --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/pyrothermic_refinery.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/pyrothermic_refinery" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/quark_boots.json b/src/generated/resources/assets/cosmiccore/models/item/quark_boots.json new file mode 100644 index 000000000..c73f065e5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/quark_boots.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/quark_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/rare_metals_asteroid.json b/src/generated/resources/assets/cosmiccore/models/item/rare_metals_asteroid.json new file mode 100644 index 000000000..0657a7dc3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/rare_metals_asteroid.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/rare_metals_asteroid" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/razor_hornet_grade_1.json b/src/generated/resources/assets/cosmiccore/models/item/razor_hornet_grade_1.json new file mode 100644 index 000000000..5931826c6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/razor_hornet_grade_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/razor_hornet_grade_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/razor_hornet_grade_2.json b/src/generated/resources/assets/cosmiccore/models/item/razor_hornet_grade_2.json new file mode 100644 index 000000000..d38b9ac93 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/razor_hornet_grade_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/razor_hornet_grade_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/razor_hornet_grade_3.json b/src/generated/resources/assets/cosmiccore/models/item/razor_hornet_grade_3.json new file mode 100644 index 000000000..f3c6e7414 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/razor_hornet_grade_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/razor_hornet_grade_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/razor_hornet_grade_4.json b/src/generated/resources/assets/cosmiccore/models/item/razor_hornet_grade_4.json new file mode 100644 index 000000000..744b5b945 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/razor_hornet_grade_4.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/razor_hornet_grade_4" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/razor_hornet_grade_5.json b/src/generated/resources/assets/cosmiccore/models/item/razor_hornet_grade_5.json new file mode 100644 index 000000000..b5e1299cb --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/razor_hornet_grade_5.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/razor_hornet_grade_5" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/reflection_mirror.json b/src/generated/resources/assets/cosmiccore/models/item/reflection_mirror.json new file mode 100644 index 000000000..4b8a6284e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/reflection_mirror.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/reflection_mirror" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/reinforced_dawnstone_casing.json b/src/generated/resources/assets/cosmiccore/models/item/reinforced_dawnstone_casing.json new file mode 100644 index 000000000..635382b65 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/reinforced_dawnstone_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/reinforced_dawnstone_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/rigid_high_speed_steel_casing.json b/src/generated/resources/assets/cosmiccore/models/item/rigid_high_speed_steel_casing.json new file mode 100644 index 000000000..4598e7b74 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/rigid_high_speed_steel_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/rigid_high_speed_steel_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/runewoven_plastic_circuit_board.json b/src/generated/resources/assets/cosmiccore/models/item/runewoven_plastic_circuit_board.json new file mode 100644 index 000000000..3fb740a56 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/runewoven_plastic_circuit_board.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/runewoven_plastic_circuit_board" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/runic_hex_cpu.json b/src/generated/resources/assets/cosmiccore/models/item/runic_hex_cpu.json new file mode 100644 index 000000000..2f0de414e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/runic_hex_cpu.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/runic_hex_cpu" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/runic_hex_cpu_wafer.json b/src/generated/resources/assets/cosmiccore/models/item/runic_hex_cpu_wafer.json new file mode 100644 index 000000000..82e2b0872 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/runic_hex_cpu_wafer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/runic_hex_cpu_wafer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/rust_stained_casing.json b/src/generated/resources/assets/cosmiccore/models/item/rust_stained_casing.json new file mode 100644 index 000000000..70a4a331c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/rust_stained_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/rust_stained_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/rust_weave_casing.json b/src/generated/resources/assets/cosmiccore/models/item/rust_weave_casing.json new file mode 100644 index 000000000..f5c2034c9 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/rust_weave_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/rust_weave_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/sanguine_asteroid.json b/src/generated/resources/assets/cosmiccore/models/item/sanguine_asteroid.json new file mode 100644 index 000000000..b1106d8d8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/sanguine_asteroid.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/sanguine_asteroid" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/sanguine_boots.json b/src/generated/resources/assets/cosmiccore/models/item/sanguine_boots.json new file mode 100644 index 000000000..bb6b8af25 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/sanguine_boots.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/sanguine_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/screwdriver_head_cast.json b/src/generated/resources/assets/cosmiccore/models/item/screwdriver_head_cast.json new file mode 100644 index 000000000..3ca72bee0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/screwdriver_head_cast.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/screwdriver_head_cast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/screwdriver_head_sand_cast.json b/src/generated/resources/assets/cosmiccore/models/item/screwdriver_head_sand_cast.json new file mode 100644 index 000000000..3253a1b79 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/screwdriver_head_sand_cast.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/screwdriver_head_sand_cast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/simple_rebreather.json b/src/generated/resources/assets/cosmiccore/models/item/simple_rebreather.json new file mode 100644 index 000000000..bbf4192bd --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/simple_rebreather.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/simple_rebreather" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/somarust_casing.json b/src/generated/resources/assets/cosmiccore/models/item/somarust_casing.json new file mode 100644 index 000000000..71d6c3009 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/somarust_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/somarust_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/soul_muted_casing.json b/src/generated/resources/assets/cosmiccore/models/item/soul_muted_casing.json new file mode 100644 index 000000000..f9ac38ab2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/soul_muted_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/soul_muted_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/soul_stained_steel_aluminium_plated_casing.json b/src/generated/resources/assets/cosmiccore/models/item/soul_stained_steel_aluminium_plated_casing.json new file mode 100644 index 000000000..e7b021328 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/soul_stained_steel_aluminium_plated_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/soul_stained_steel_aluminium_plated_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/spent_flesh_packed_neptunium_fuel.json b/src/generated/resources/assets/cosmiccore/models/item/spent_flesh_packed_neptunium_fuel.json new file mode 100644 index 000000000..443dbe19a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/spent_flesh_packed_neptunium_fuel.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/spent_flesh_packed_neptunium_fuel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/spent_flesh_packed_plutonium_fuel.json b/src/generated/resources/assets/cosmiccore/models/item/spent_flesh_packed_plutonium_fuel.json new file mode 100644 index 000000000..7402a7d24 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/spent_flesh_packed_plutonium_fuel.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/spent_flesh_packed_plutonium_fuel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/spent_flesh_packed_uranium_fuel.json b/src/generated/resources/assets/cosmiccore/models/item/spent_flesh_packed_uranium_fuel.json new file mode 100644 index 000000000..b0aec1624 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/spent_flesh_packed_uranium_fuel.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/spent_flesh_packed_uranium_fuel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/spirit_engraved_enthel_circuit_board.json b/src/generated/resources/assets/cosmiccore/models/item/spirit_engraved_enthel_circuit_board.json new file mode 100644 index 000000000..d315f6f59 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/spirit_engraved_enthel_circuit_board.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/spirit_engraved_enthel_circuit_board" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/spirit_runed_enthel_cpu.json b/src/generated/resources/assets/cosmiccore/models/item/spirit_runed_enthel_cpu.json new file mode 100644 index 000000000..ed06321db --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/spirit_runed_enthel_cpu.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/spirit_runed_enthel_cpu" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/spirit_runed_enthel_cpu_wafer.json b/src/generated/resources/assets/cosmiccore/models/item/spirit_runed_enthel_cpu_wafer.json new file mode 100644 index 000000000..851882a38 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/spirit_runed_enthel_cpu_wafer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/spirit_runed_enthel_cpu_wafer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/star_ballast.json b/src/generated/resources/assets/cosmiccore/models/item/star_ballast.json deleted file mode 100644 index 01a49bbf5..000000000 --- a/src/generated/resources/assets/cosmiccore/models/item/star_ballast.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "cosmiccore:block/machine/star_ballast" -} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/star_ladder_research_hub.json b/src/generated/resources/assets/cosmiccore/models/item/star_ladder_research_hub.json new file mode 100644 index 000000000..4ecafd7ed --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/star_ladder_research_hub.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/star_ladder_research_hub" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/steam_ember_emitter.json b/src/generated/resources/assets/cosmiccore/models/item/steam_ember_emitter.json new file mode 100644 index 000000000..024327e5d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/steam_ember_emitter.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/steam_ember_emitter" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/steam_ember_receptor.json b/src/generated/resources/assets/cosmiccore/models/item/steam_ember_receptor.json new file mode 100644 index 000000000..295502680 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/steam_ember_receptor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/steam_ember_receptor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/steam_large_turbine.json b/src/generated/resources/assets/cosmiccore/models/item/steam_large_turbine.json new file mode 100644 index 000000000..814d5754f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/steam_large_turbine.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/steam_large_turbine" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/steel_rose_lantern.json b/src/generated/resources/assets/cosmiccore/models/item/steel_rose_lantern.json new file mode 100644 index 000000000..469d7e715 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/steel_rose_lantern.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/steel_rose_lantern" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/steel_rose_light.json b/src/generated/resources/assets/cosmiccore/models/item/steel_rose_light.json new file mode 100644 index 000000000..91e9e925d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/steel_rose_light.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/steel_rose_light" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/steel_rose_light_slab.json b/src/generated/resources/assets/cosmiccore/models/item/steel_rose_light_slab.json new file mode 100644 index 000000000..ec769fb8d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/steel_rose_light_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/steel_rose_light_slab" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/steel_rose_light_stairs.json b/src/generated/resources/assets/cosmiccore/models/item/steel_rose_light_stairs.json new file mode 100644 index 000000000..7abc772b7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/steel_rose_light_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/steel_rose_light_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/steel_supply_tank.json b/src/generated/resources/assets/cosmiccore/models/item/steel_supply_tank.json new file mode 100644 index 000000000..5ced7268b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/steel_supply_tank.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/steel_supply_tank" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/stellar_smelting_module.json b/src/generated/resources/assets/cosmiccore/models/item/stellar_smelting_module.json new file mode 100644 index 000000000..1e4379e47 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/stellar_smelting_module.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/stellar_smelting_module" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/superheated_fuel_rod.json b/src/generated/resources/assets/cosmiccore/models/item/superheated_fuel_rod.json new file mode 100644 index 000000000..cbc93962a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/superheated_fuel_rod.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/superheated_fuel_rod" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/superheavy_steel_casing.json b/src/generated/resources/assets/cosmiccore/models/item/superheavy_steel_casing.json new file mode 100644 index 000000000..93ecbf9a4 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/superheavy_steel_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/superheavy_steel_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/trinavine_nanolattice_spool.json b/src/generated/resources/assets/cosmiccore/models/item/trinavine_nanolattice_spool.json new file mode 100644 index 000000000..ae1b60605 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/trinavine_nanolattice_spool.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/trinavine_nanolattice_spool" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/tungstensteel_nanolattice_spool.json b/src/generated/resources/assets/cosmiccore/models/item/tungstensteel_nanolattice_spool.json new file mode 100644 index 000000000..079ef998c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/tungstensteel_nanolattice_spool.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/tungstensteel_nanolattice_spool" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uev_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/item/uev_calx_reactor.json new file mode 100644 index 000000000..1fa85b084 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uev_calx_reactor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uev_calx_reactor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uev_ember_emitter.json b/src/generated/resources/assets/cosmiccore/models/item/uev_ember_emitter.json new file mode 100644 index 000000000..124a95ff3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uev_ember_emitter.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/uev_ember_emitter" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uev_ember_receptor.json b/src/generated/resources/assets/cosmiccore/models/item/uev_ember_receptor.json new file mode 100644 index 000000000..872ee8ce4 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uev_ember_receptor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/uev_ember_receptor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uev_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/item/uev_mana_leaching_tub.json new file mode 100644 index 000000000..a9fc75db7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uev_mana_leaching_tub.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uev_mana_leaching_tub" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uev_module_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uev_module_hatch.json new file mode 100644 index 000000000..866689d18 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uev_module_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uev_module_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uev_roaster.json b/src/generated/resources/assets/cosmiccore/models/item/uev_roaster.json new file mode 100644 index 000000000..aa58d76a3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uev_roaster.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uev_roaster" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uev_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/item/uev_thermomagnitizer.json new file mode 100644 index 000000000..2d634abee --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uev_thermomagnitizer.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uev_thermomagnitizer" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uev_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/item/uev_vacuum_bubbler.json new file mode 100644 index 000000000..31c91d8ed --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uev_vacuum_bubbler.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uev_vacuum_bubbler" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uhv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/item/uhv_calx_reactor.json new file mode 100644 index 000000000..0e070f825 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uhv_calx_reactor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uhv_calx_reactor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uhv_ember_emitter.json b/src/generated/resources/assets/cosmiccore/models/item/uhv_ember_emitter.json new file mode 100644 index 000000000..8f32249a5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uhv_ember_emitter.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/uhv_ember_emitter" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uhv_ember_receptor.json b/src/generated/resources/assets/cosmiccore/models/item/uhv_ember_receptor.json new file mode 100644 index 000000000..b4177f71b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uhv_ember_receptor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/uhv_ember_receptor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uhv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/item/uhv_mana_leaching_tub.json new file mode 100644 index 000000000..8abc2e7ce --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uhv_mana_leaching_tub.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uhv_mana_leaching_tub" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uhv_module_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uhv_module_hatch.json new file mode 100644 index 000000000..11f7c8c80 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uhv_module_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uhv_module_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uhv_name.json b/src/generated/resources/assets/cosmiccore/models/item/uhv_name.json deleted file mode 100644 index a337134af..000000000 --- a/src/generated/resources/assets/cosmiccore/models/item/uhv_name.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "cosmiccore:block/machine/uhv_name" -} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uhv_roaster.json b/src/generated/resources/assets/cosmiccore/models/item/uhv_roaster.json new file mode 100644 index 000000000..34ed886ee --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uhv_roaster.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uhv_roaster" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uhv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/item/uhv_thermomagnitizer.json new file mode 100644 index 000000000..62c3a0ca6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uhv_thermomagnitizer.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uhv_thermomagnitizer" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uhv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/item/uhv_vacuum_bubbler.json new file mode 100644 index 000000000..ee7d490fc --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uhv_vacuum_bubbler.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uhv_vacuum_bubbler" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uiv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/item/uiv_calx_reactor.json new file mode 100644 index 000000000..78415b2ec --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uiv_calx_reactor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uiv_calx_reactor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uiv_ember_emitter.json b/src/generated/resources/assets/cosmiccore/models/item/uiv_ember_emitter.json new file mode 100644 index 000000000..7e6446709 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uiv_ember_emitter.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/uiv_ember_emitter" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uiv_ember_receptor.json b/src/generated/resources/assets/cosmiccore/models/item/uiv_ember_receptor.json new file mode 100644 index 000000000..803d067c6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uiv_ember_receptor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/uiv_ember_receptor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uiv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/item/uiv_mana_leaching_tub.json new file mode 100644 index 000000000..5bcf76f51 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uiv_mana_leaching_tub.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uiv_mana_leaching_tub" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uiv_roaster.json b/src/generated/resources/assets/cosmiccore/models/item/uiv_roaster.json new file mode 100644 index 000000000..f02b4f746 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uiv_roaster.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uiv_roaster" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uiv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/item/uiv_thermomagnitizer.json new file mode 100644 index 000000000..2056ed782 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uiv_thermomagnitizer.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uiv_thermomagnitizer" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uiv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/item/uiv_vacuum_bubbler.json new file mode 100644 index 000000000..1bed874a7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uiv_vacuum_bubbler.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uiv_vacuum_bubbler" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ulv_energy_output_hatch_16a.json b/src/generated/resources/assets/cosmiccore/models/item/ulv_energy_output_hatch_16a.json new file mode 100644 index 000000000..cd4d30f79 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ulv_energy_output_hatch_16a.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/ulv_energy_output_hatch_16a" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ulv_energy_output_hatch_4a.json b/src/generated/resources/assets/cosmiccore/models/item/ulv_energy_output_hatch_4a.json new file mode 100644 index 000000000..b8b65e38a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ulv_energy_output_hatch_4a.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/ulv_energy_output_hatch_4a" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uv_biolab.json b/src/generated/resources/assets/cosmiccore/models/item/uv_biolab.json new file mode 100644 index 000000000..72615a0be --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uv_biolab.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uv_biolab" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/item/uv_calx_reactor.json new file mode 100644 index 000000000..80dd07bc8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uv_calx_reactor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uv_calx_reactor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uv_ember_emitter.json b/src/generated/resources/assets/cosmiccore/models/item/uv_ember_emitter.json new file mode 100644 index 000000000..e359493ce --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uv_ember_emitter.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/uv_ember_emitter" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uv_ember_receptor.json b/src/generated/resources/assets/cosmiccore/models/item/uv_ember_receptor.json new file mode 100644 index 000000000..c404aa79f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uv_ember_receptor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/uv_ember_receptor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/item/uv_mana_leaching_tub.json new file mode 100644 index 000000000..babf24aa1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uv_mana_leaching_tub.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uv_mana_leaching_tub" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uv_module_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uv_module_hatch.json new file mode 100644 index 000000000..0a1b47e25 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uv_module_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uv_module_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uv_name.json b/src/generated/resources/assets/cosmiccore/models/item/uv_name.json deleted file mode 100644 index a5c5f518b..000000000 --- a/src/generated/resources/assets/cosmiccore/models/item/uv_name.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "cosmiccore:block/machine/uv_name" -} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uv_roaster.json b/src/generated/resources/assets/cosmiccore/models/item/uv_roaster.json new file mode 100644 index 000000000..4d939abc5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uv_roaster.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uv_roaster" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/item/uv_thermomagnitizer.json new file mode 100644 index 000000000..c35587e92 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uv_thermomagnitizer.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uv_thermomagnitizer" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/item/uv_vacuum_bubbler.json new file mode 100644 index 000000000..473fa2f1b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uv_vacuum_bubbler.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uv_vacuum_bubbler" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uxv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/item/uxv_calx_reactor.json new file mode 100644 index 000000000..2369179e6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uxv_calx_reactor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uxv_calx_reactor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uxv_ember_emitter.json b/src/generated/resources/assets/cosmiccore/models/item/uxv_ember_emitter.json new file mode 100644 index 000000000..8467af98a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uxv_ember_emitter.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/uxv_ember_emitter" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uxv_ember_receptor.json b/src/generated/resources/assets/cosmiccore/models/item/uxv_ember_receptor.json new file mode 100644 index 000000000..29df168fa --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uxv_ember_receptor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/uxv_ember_receptor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uxv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/item/uxv_mana_leaching_tub.json new file mode 100644 index 000000000..76933a541 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uxv_mana_leaching_tub.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uxv_mana_leaching_tub" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uxv_roaster.json b/src/generated/resources/assets/cosmiccore/models/item/uxv_roaster.json new file mode 100644 index 000000000..c5eb4994d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uxv_roaster.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uxv_roaster" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uxv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/item/uxv_thermomagnitizer.json new file mode 100644 index 000000000..224128854 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uxv_thermomagnitizer.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uxv_thermomagnitizer" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uxv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/item/uxv_vacuum_bubbler.json new file mode 100644 index 000000000..bf16c42ca --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uxv_vacuum_bubbler.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uxv_vacuum_bubbler" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/verbosity_chip.json b/src/generated/resources/assets/cosmiccore/models/item/verbosity_chip.json new file mode 100644 index 000000000..5317a9f88 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/verbosity_chip.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/verbosity_chip" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/vile_fission.json b/src/generated/resources/assets/cosmiccore/models/item/vile_fission.json new file mode 100644 index 000000000..2599bcfc6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/vile_fission.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/vile_fission" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/void_salt_fissiom.json b/src/generated/resources/assets/cosmiccore/models/item/void_salt_fissiom.json new file mode 100644 index 000000000..1ff996052 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/void_salt_fissiom.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/void_salt_fissiom" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/wasp.json b/src/generated/resources/assets/cosmiccore/models/item/wasp.json new file mode 100644 index 000000000..8220db602 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/wasp.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/wasp" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/wasteland_asteroid.json b/src/generated/resources/assets/cosmiccore/models/item/wasteland_asteroid.json new file mode 100644 index 000000000..4bbd1b0be --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/wasteland_asteroid.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/wasteland_asteroid" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/wrench_head_cast.json b/src/generated/resources/assets/cosmiccore/models/item/wrench_head_cast.json new file mode 100644 index 000000000..d23d82633 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/wrench_head_cast.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/wrench_head_cast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/wrench_head_sand_cast.json b/src/generated/resources/assets/cosmiccore/models/item/wrench_head_sand_cast.json new file mode 100644 index 000000000..690622691 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/wrench_head_sand_cast.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/wrench_head_sand_cast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/zpm_biolab.json b/src/generated/resources/assets/cosmiccore/models/item/zpm_biolab.json new file mode 100644 index 000000000..be300d6ba --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/zpm_biolab.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/zpm_biolab" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/zpm_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/item/zpm_calx_reactor.json new file mode 100644 index 000000000..f2cadf6ec --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/zpm_calx_reactor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/zpm_calx_reactor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/zpm_ember_emitter.json b/src/generated/resources/assets/cosmiccore/models/item/zpm_ember_emitter.json new file mode 100644 index 000000000..cb3d9d30b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/zpm_ember_emitter.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/zpm_ember_emitter" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/zpm_ember_receptor.json b/src/generated/resources/assets/cosmiccore/models/item/zpm_ember_receptor.json new file mode 100644 index 000000000..e4689ca84 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/zpm_ember_receptor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/zpm_ember_receptor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/zpm_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/item/zpm_mana_leaching_tub.json new file mode 100644 index 000000000..3f4e06e6d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/zpm_mana_leaching_tub.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/zpm_mana_leaching_tub" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/zpm_name.json b/src/generated/resources/assets/cosmiccore/models/item/zpm_name.json deleted file mode 100644 index 00cb9d9ea..000000000 --- a/src/generated/resources/assets/cosmiccore/models/item/zpm_name.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "cosmiccore:block/machine/zpm_name" -} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/zpm_roaster.json b/src/generated/resources/assets/cosmiccore/models/item/zpm_roaster.json new file mode 100644 index 000000000..bfcdf4480 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/zpm_roaster.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/zpm_roaster" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/zpm_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/item/zpm_thermomagnitizer.json new file mode 100644 index 000000000..d67d367d5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/zpm_thermomagnitizer.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/zpm_thermomagnitizer" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/zpm_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/item/zpm_vacuum_bubbler.json new file mode 100644 index 000000000..252c0793b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/zpm_vacuum_bubbler.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/zpm_vacuum_bubbler" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/zpm_wildfire_core.json b/src/generated/resources/assets/cosmiccore/models/item/zpm_wildfire_core.json new file mode 100644 index 000000000..5b919d8e6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/zpm_wildfire_core.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/zpm_wildfire_core" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/sounds.json b/src/generated/resources/assets/cosmiccore/sounds.json index 39126ede1..db533c62a 100644 --- a/src/generated/resources/assets/cosmiccore/sounds.json +++ b/src/generated/resources/assets/cosmiccore/sounds.json @@ -17,6 +17,15 @@ ], "subtitle": "cosmiccore.subtitle.arcane_distil" }, + "dawnforge": { + "sounds": [ + { + "type": "file", + "name": "cosmiccore:dawnforge" + } + ], + "subtitle": "cosmiccore.subtitle.dawnforge" + }, "dying_star": { "sounds": [ { diff --git a/src/generated/resources/assets/cosmiccore/tinkering/materials/aluminium.json b/src/generated/resources/assets/cosmiccore/tinkering/materials/aluminium.json new file mode 100644 index 000000000..1905c4db1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/tinkering/materials/aluminium.json @@ -0,0 +1,37 @@ +{ + "color": "FF7DB9D8", + "fallbacks": [ + "silver", + "iron" + ], + "generator": { + "supported_stats": [ + "tconstruct:repair_kit", + "tconstruct:binding" + ], + "transformer": { + "type": "tconstruct:recolor_sprite", + "color_mapping": { + "type": "tconstruct:grey_to_color", + "palette": [ + { + "color": "FFFF66CC", + "grey": 0 + }, + { + "color": "FFFF99DD", + "grey": 85 + }, + { + "color": "FF99CCFF", + "grey": 170 + }, + { + "color": "FF66CCFF", + "grey": 255 + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/tinkering/materials/blue_steel.json b/src/generated/resources/assets/cosmiccore/tinkering/materials/blue_steel.json new file mode 100644 index 000000000..c6f6e5f16 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/tinkering/materials/blue_steel.json @@ -0,0 +1,37 @@ +{ + "color": "FF779AC6", + "fallbacks": [ + "silver", + "iron" + ], + "generator": { + "supported_stats": [ + "tconstruct:repair_kit", + "tconstruct:binding" + ], + "transformer": { + "type": "tconstruct:recolor_sprite", + "color_mapping": { + "type": "tconstruct:grey_to_color", + "palette": [ + { + "color": "FFFF66CC", + "grey": 0 + }, + { + "color": "FFFF99DD", + "grey": 85 + }, + { + "color": "FF99CCFF", + "grey": 170 + }, + { + "color": "FF66CCFF", + "grey": 255 + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/tinkering/materials/bronze.json b/src/generated/resources/assets/cosmiccore/tinkering/materials/bronze.json new file mode 100644 index 000000000..294abfb6c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/tinkering/materials/bronze.json @@ -0,0 +1,37 @@ +{ + "color": "FFFFC370", + "fallbacks": [ + "silver", + "iron" + ], + "generator": { + "supported_stats": [ + "tconstruct:repair_kit", + "tconstruct:binding" + ], + "transformer": { + "type": "tconstruct:recolor_sprite", + "color_mapping": { + "type": "tconstruct:grey_to_color", + "palette": [ + { + "color": "FFFF66CC", + "grey": 0 + }, + { + "color": "FFFF99DD", + "grey": 85 + }, + { + "color": "FF99CCFF", + "grey": 170 + }, + { + "color": "FF66CCFF", + "grey": 255 + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/tinkering/materials/cobalt_brass.json b/src/generated/resources/assets/cosmiccore/tinkering/materials/cobalt_brass.json new file mode 100644 index 000000000..b1d125b52 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/tinkering/materials/cobalt_brass.json @@ -0,0 +1,37 @@ +{ + "color": "FFBAA365", + "fallbacks": [ + "silver", + "iron" + ], + "generator": { + "supported_stats": [ + "tconstruct:repair_kit", + "tconstruct:binding" + ], + "transformer": { + "type": "tconstruct:recolor_sprite", + "color_mapping": { + "type": "tconstruct:grey_to_color", + "palette": [ + { + "color": "FFFF66CC", + "grey": 0 + }, + { + "color": "FFFF99DD", + "grey": 85 + }, + { + "color": "FF99CCFF", + "grey": 170 + }, + { + "color": "FF66CCFF", + "grey": 255 + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/tinkering/materials/damascus_steel.json b/src/generated/resources/assets/cosmiccore/tinkering/materials/damascus_steel.json new file mode 100644 index 000000000..a5742b0ec --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/tinkering/materials/damascus_steel.json @@ -0,0 +1,37 @@ +{ + "color": "FF6E6E6E", + "fallbacks": [ + "silver", + "iron" + ], + "generator": { + "supported_stats": [ + "tconstruct:repair_kit", + "tconstruct:binding" + ], + "transformer": { + "type": "tconstruct:recolor_sprite", + "color_mapping": { + "type": "tconstruct:grey_to_color", + "palette": [ + { + "color": "FFFF66CC", + "grey": 0 + }, + { + "color": "FFFF99DD", + "grey": 85 + }, + { + "color": "FF99CCFF", + "grey": 170 + }, + { + "color": "FF66CCFF", + "grey": 255 + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/tinkering/materials/duranium.json b/src/generated/resources/assets/cosmiccore/tinkering/materials/duranium.json new file mode 100644 index 000000000..8a11cef0f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/tinkering/materials/duranium.json @@ -0,0 +1,37 @@ +{ + "color": "FFF3E7A9", + "fallbacks": [ + "silver", + "iron" + ], + "generator": { + "supported_stats": [ + "tconstruct:repair_kit", + "tconstruct:binding" + ], + "transformer": { + "type": "tconstruct:recolor_sprite", + "color_mapping": { + "type": "tconstruct:grey_to_color", + "palette": [ + { + "color": "FFFF66CC", + "grey": 0 + }, + { + "color": "FFFF99DD", + "grey": 85 + }, + { + "color": "FF99CCFF", + "grey": 170 + }, + { + "color": "FF66CCFF", + "grey": 255 + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/tinkering/materials/hsse.json b/src/generated/resources/assets/cosmiccore/tinkering/materials/hsse.json new file mode 100644 index 000000000..398a232a4 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/tinkering/materials/hsse.json @@ -0,0 +1,37 @@ +{ + "color": "FF9D9CBE", + "fallbacks": [ + "silver", + "iron" + ], + "generator": { + "supported_stats": [ + "tconstruct:repair_kit", + "tconstruct:binding" + ], + "transformer": { + "type": "tconstruct:recolor_sprite", + "color_mapping": { + "type": "tconstruct:grey_to_color", + "palette": [ + { + "color": "FFFF66CC", + "grey": 0 + }, + { + "color": "FFFF99DD", + "grey": 85 + }, + { + "color": "FF99CCFF", + "grey": 170 + }, + { + "color": "FF66CCFF", + "grey": 255 + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/tinkering/materials/invar.json b/src/generated/resources/assets/cosmiccore/tinkering/materials/invar.json new file mode 100644 index 000000000..6e6166c58 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/tinkering/materials/invar.json @@ -0,0 +1,37 @@ +{ + "color": "FFE2E8E1", + "fallbacks": [ + "silver", + "iron" + ], + "generator": { + "supported_stats": [ + "tconstruct:repair_kit", + "tconstruct:binding" + ], + "transformer": { + "type": "tconstruct:recolor_sprite", + "color_mapping": { + "type": "tconstruct:grey_to_color", + "palette": [ + { + "color": "FFFF66CC", + "grey": 0 + }, + { + "color": "FFFF99DD", + "grey": 85 + }, + { + "color": "FF99CCFF", + "grey": 170 + }, + { + "color": "FF66CCFF", + "grey": 255 + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/tinkering/materials/iron.json b/src/generated/resources/assets/cosmiccore/tinkering/materials/iron.json new file mode 100644 index 000000000..3f3111882 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/tinkering/materials/iron.json @@ -0,0 +1,37 @@ +{ + "color": "FFEEEEEE", + "fallbacks": [ + "silver", + "iron" + ], + "generator": { + "supported_stats": [ + "tconstruct:repair_kit", + "tconstruct:binding" + ], + "transformer": { + "type": "tconstruct:recolor_sprite", + "color_mapping": { + "type": "tconstruct:grey_to_color", + "palette": [ + { + "color": "FFFF66CC", + "grey": 0 + }, + { + "color": "FFFF99DD", + "grey": 85 + }, + { + "color": "FF99CCFF", + "grey": 170 + }, + { + "color": "FF66CCFF", + "grey": 255 + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/tinkering/materials/naquadah_alloy.json b/src/generated/resources/assets/cosmiccore/tinkering/materials/naquadah_alloy.json new file mode 100644 index 000000000..e7437aa1c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/tinkering/materials/naquadah_alloy.json @@ -0,0 +1,37 @@ +{ + "color": "FF323232", + "fallbacks": [ + "silver", + "iron" + ], + "generator": { + "supported_stats": [ + "tconstruct:repair_kit", + "tconstruct:binding" + ], + "transformer": { + "type": "tconstruct:recolor_sprite", + "color_mapping": { + "type": "tconstruct:grey_to_color", + "palette": [ + { + "color": "FFFF66CC", + "grey": 0 + }, + { + "color": "FFFF99DD", + "grey": 85 + }, + { + "color": "FF99CCFF", + "grey": 170 + }, + { + "color": "FF66CCFF", + "grey": 255 + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/tinkering/materials/netherite.json b/src/generated/resources/assets/cosmiccore/tinkering/materials/netherite.json new file mode 100644 index 000000000..9fc83948a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/tinkering/materials/netherite.json @@ -0,0 +1,37 @@ +{ + "color": "FF4B4042", + "fallbacks": [ + "silver", + "iron" + ], + "generator": { + "supported_stats": [ + "tconstruct:repair_kit", + "tconstruct:binding" + ], + "transformer": { + "type": "tconstruct:recolor_sprite", + "color_mapping": { + "type": "tconstruct:grey_to_color", + "palette": [ + { + "color": "FFFF66CC", + "grey": 0 + }, + { + "color": "FFFF99DD", + "grey": 85 + }, + { + "color": "FF99CCFF", + "grey": 170 + }, + { + "color": "FF66CCFF", + "grey": 255 + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/tinkering/materials/neutronite.json b/src/generated/resources/assets/cosmiccore/tinkering/materials/neutronite.json new file mode 100644 index 000000000..1b1fb5c12 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/tinkering/materials/neutronite.json @@ -0,0 +1,36 @@ +{ + "fallbacks": [ + "silver", + "iron" + ], + "generator": { + "supported_stats": [ + "tconstruct:repair_kit", + "tconstruct:binding" + ], + "transformer": { + "type": "tconstruct:recolor_sprite", + "color_mapping": { + "type": "tconstruct:grey_to_color", + "palette": [ + { + "color": "FFFF66CC", + "grey": 0 + }, + { + "color": "FFFF99DD", + "grey": 85 + }, + { + "color": "FF99CCFF", + "grey": 170 + }, + { + "color": "FF66CCFF", + "grey": 255 + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/tinkering/materials/neutronium.json b/src/generated/resources/assets/cosmiccore/tinkering/materials/neutronium.json new file mode 100644 index 000000000..1b1fb5c12 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/tinkering/materials/neutronium.json @@ -0,0 +1,36 @@ +{ + "fallbacks": [ + "silver", + "iron" + ], + "generator": { + "supported_stats": [ + "tconstruct:repair_kit", + "tconstruct:binding" + ], + "transformer": { + "type": "tconstruct:recolor_sprite", + "color_mapping": { + "type": "tconstruct:grey_to_color", + "palette": [ + { + "color": "FFFF66CC", + "grey": 0 + }, + { + "color": "FFFF99DD", + "grey": 85 + }, + { + "color": "FF99CCFF", + "grey": 170 + }, + { + "color": "FF66CCFF", + "grey": 255 + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/tinkering/materials/polybenzimidazole.json b/src/generated/resources/assets/cosmiccore/tinkering/materials/polybenzimidazole.json new file mode 100644 index 000000000..33521440f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/tinkering/materials/polybenzimidazole.json @@ -0,0 +1,37 @@ +{ + "color": "FF464441", + "fallbacks": [ + "silver", + "iron" + ], + "generator": { + "supported_stats": [ + "tconstruct:repair_kit", + "tconstruct:binding" + ], + "transformer": { + "type": "tconstruct:recolor_sprite", + "color_mapping": { + "type": "tconstruct:grey_to_color", + "palette": [ + { + "color": "FFFF66CC", + "grey": 0 + }, + { + "color": "FFFF99DD", + "grey": 85 + }, + { + "color": "FF99CCFF", + "grey": 170 + }, + { + "color": "FF66CCFF", + "grey": 255 + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/tinkering/materials/polyethylene.json b/src/generated/resources/assets/cosmiccore/tinkering/materials/polyethylene.json new file mode 100644 index 000000000..5b8385f96 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/tinkering/materials/polyethylene.json @@ -0,0 +1,37 @@ +{ + "color": "FFC8C8C8", + "fallbacks": [ + "silver", + "iron" + ], + "generator": { + "supported_stats": [ + "tconstruct:repair_kit", + "tconstruct:binding" + ], + "transformer": { + "type": "tconstruct:recolor_sprite", + "color_mapping": { + "type": "tconstruct:grey_to_color", + "palette": [ + { + "color": "FFFF66CC", + "grey": 0 + }, + { + "color": "FFFF99DD", + "grey": 85 + }, + { + "color": "FF99CCFF", + "grey": 170 + }, + { + "color": "FF66CCFF", + "grey": 255 + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/tinkering/materials/polytetrafluoroethylene.json b/src/generated/resources/assets/cosmiccore/tinkering/materials/polytetrafluoroethylene.json new file mode 100644 index 000000000..a5742b0ec --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/tinkering/materials/polytetrafluoroethylene.json @@ -0,0 +1,37 @@ +{ + "color": "FF6E6E6E", + "fallbacks": [ + "silver", + "iron" + ], + "generator": { + "supported_stats": [ + "tconstruct:repair_kit", + "tconstruct:binding" + ], + "transformer": { + "type": "tconstruct:recolor_sprite", + "color_mapping": { + "type": "tconstruct:grey_to_color", + "palette": [ + { + "color": "FFFF66CC", + "grey": 0 + }, + { + "color": "FFFF99DD", + "grey": 85 + }, + { + "color": "FF99CCFF", + "grey": 170 + }, + { + "color": "FF66CCFF", + "grey": 255 + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/tinkering/materials/red_steel.json b/src/generated/resources/assets/cosmiccore/tinkering/materials/red_steel.json new file mode 100644 index 000000000..4bea3e38a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/tinkering/materials/red_steel.json @@ -0,0 +1,37 @@ +{ + "color": "FFA09191", + "fallbacks": [ + "silver", + "iron" + ], + "generator": { + "supported_stats": [ + "tconstruct:repair_kit", + "tconstruct:binding" + ], + "transformer": { + "type": "tconstruct:recolor_sprite", + "color_mapping": { + "type": "tconstruct:grey_to_color", + "palette": [ + { + "color": "FFFF66CC", + "grey": 0 + }, + { + "color": "FFFF99DD", + "grey": 85 + }, + { + "color": "FF99CCFF", + "grey": 170 + }, + { + "color": "FF66CCFF", + "grey": 255 + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/tinkering/materials/rose_gold.json b/src/generated/resources/assets/cosmiccore/tinkering/materials/rose_gold.json new file mode 100644 index 000000000..5cded3c87 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/tinkering/materials/rose_gold.json @@ -0,0 +1,37 @@ +{ + "color": "FFECD5B8", + "fallbacks": [ + "silver", + "iron" + ], + "generator": { + "supported_stats": [ + "tconstruct:repair_kit", + "tconstruct:binding" + ], + "transformer": { + "type": "tconstruct:recolor_sprite", + "color_mapping": { + "type": "tconstruct:grey_to_color", + "palette": [ + { + "color": "FFFF66CC", + "grey": 0 + }, + { + "color": "FFFF99DD", + "grey": 85 + }, + { + "color": "FF99CCFF", + "grey": 170 + }, + { + "color": "FF66CCFF", + "grey": 255 + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/tinkering/materials/rubber.json b/src/generated/resources/assets/cosmiccore/tinkering/materials/rubber.json new file mode 100644 index 000000000..e7374eb81 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/tinkering/materials/rubber.json @@ -0,0 +1,37 @@ +{ + "color": "FF353529", + "fallbacks": [ + "silver", + "iron" + ], + "generator": { + "supported_stats": [ + "tconstruct:repair_kit", + "tconstruct:binding" + ], + "transformer": { + "type": "tconstruct:recolor_sprite", + "color_mapping": { + "type": "tconstruct:grey_to_color", + "palette": [ + { + "color": "FFFF66CC", + "grey": 0 + }, + { + "color": "FFFF99DD", + "grey": 85 + }, + { + "color": "FF99CCFF", + "grey": 170 + }, + { + "color": "FF66CCFF", + "grey": 255 + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/tinkering/materials/silicone_rubber.json b/src/generated/resources/assets/cosmiccore/tinkering/materials/silicone_rubber.json new file mode 100644 index 000000000..ae4901b3d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/tinkering/materials/silicone_rubber.json @@ -0,0 +1,37 @@ +{ + "color": "FFF0F0F0", + "fallbacks": [ + "silver", + "iron" + ], + "generator": { + "supported_stats": [ + "tconstruct:repair_kit", + "tconstruct:binding" + ], + "transformer": { + "type": "tconstruct:recolor_sprite", + "color_mapping": { + "type": "tconstruct:grey_to_color", + "palette": [ + { + "color": "FFFF66CC", + "grey": 0 + }, + { + "color": "FFFF99DD", + "grey": 85 + }, + { + "color": "FF99CCFF", + "grey": 170 + }, + { + "color": "FF66CCFF", + "grey": 255 + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/tinkering/materials/stainless_steel.json b/src/generated/resources/assets/cosmiccore/tinkering/materials/stainless_steel.json new file mode 100644 index 000000000..631e1e6dc --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/tinkering/materials/stainless_steel.json @@ -0,0 +1,37 @@ +{ + "color": "FFEDEDFD", + "fallbacks": [ + "silver", + "iron" + ], + "generator": { + "supported_stats": [ + "tconstruct:repair_kit", + "tconstruct:binding" + ], + "transformer": { + "type": "tconstruct:recolor_sprite", + "color_mapping": { + "type": "tconstruct:grey_to_color", + "palette": [ + { + "color": "FFFF66CC", + "grey": 0 + }, + { + "color": "FFFF99DD", + "grey": 85 + }, + { + "color": "FF99CCFF", + "grey": 170 + }, + { + "color": "FF66CCFF", + "grey": 255 + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/tinkering/materials/steel.json b/src/generated/resources/assets/cosmiccore/tinkering/materials/steel.json new file mode 100644 index 000000000..439476b68 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/tinkering/materials/steel.json @@ -0,0 +1,37 @@ +{ + "color": "FFA7A7A7", + "fallbacks": [ + "silver", + "iron" + ], + "generator": { + "supported_stats": [ + "tconstruct:repair_kit", + "tconstruct:binding" + ], + "transformer": { + "type": "tconstruct:recolor_sprite", + "color_mapping": { + "type": "tconstruct:grey_to_color", + "palette": [ + { + "color": "FFFF66CC", + "grey": 0 + }, + { + "color": "FFFF99DD", + "grey": 85 + }, + { + "color": "FF99CCFF", + "grey": 170 + }, + { + "color": "FF66CCFF", + "grey": 255 + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/tinkering/materials/sterling_silver.json b/src/generated/resources/assets/cosmiccore/tinkering/materials/sterling_silver.json new file mode 100644 index 000000000..d5bae89a0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/tinkering/materials/sterling_silver.json @@ -0,0 +1,37 @@ +{ + "color": "FFFAF4DC", + "fallbacks": [ + "silver", + "iron" + ], + "generator": { + "supported_stats": [ + "tconstruct:repair_kit", + "tconstruct:binding" + ], + "transformer": { + "type": "tconstruct:recolor_sprite", + "color_mapping": { + "type": "tconstruct:grey_to_color", + "palette": [ + { + "color": "FFFF66CC", + "grey": 0 + }, + { + "color": "FFFF99DD", + "grey": 85 + }, + { + "color": "FF99CCFF", + "grey": 170 + }, + { + "color": "FF66CCFF", + "grey": 255 + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/tinkering/materials/styrene_butadiene_rubber.json b/src/generated/resources/assets/cosmiccore/tinkering/materials/styrene_butadiene_rubber.json new file mode 100644 index 000000000..39da66386 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/tinkering/materials/styrene_butadiene_rubber.json @@ -0,0 +1,37 @@ +{ + "color": "FF34312B", + "fallbacks": [ + "silver", + "iron" + ], + "generator": { + "supported_stats": [ + "tconstruct:repair_kit", + "tconstruct:binding" + ], + "transformer": { + "type": "tconstruct:recolor_sprite", + "color_mapping": { + "type": "tconstruct:grey_to_color", + "palette": [ + { + "color": "FFFF66CC", + "grey": 0 + }, + { + "color": "FFFF99DD", + "grey": 85 + }, + { + "color": "FF99CCFF", + "grey": 170 + }, + { + "color": "FF66CCFF", + "grey": 255 + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/tinkering/materials/titanium.json b/src/generated/resources/assets/cosmiccore/tinkering/materials/titanium.json new file mode 100644 index 000000000..70193914e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/tinkering/materials/titanium.json @@ -0,0 +1,37 @@ +{ + "color": "FFED8EEA", + "fallbacks": [ + "silver", + "iron" + ], + "generator": { + "supported_stats": [ + "tconstruct:repair_kit", + "tconstruct:binding" + ], + "transformer": { + "type": "tconstruct:recolor_sprite", + "color_mapping": { + "type": "tconstruct:grey_to_color", + "palette": [ + { + "color": "FFFF66CC", + "grey": 0 + }, + { + "color": "FFFF99DD", + "grey": 85 + }, + { + "color": "FF99CCFF", + "grey": 170 + }, + { + "color": "FF66CCFF", + "grey": 255 + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/tinkering/materials/trinavine.json b/src/generated/resources/assets/cosmiccore/tinkering/materials/trinavine.json new file mode 100644 index 000000000..b62d589e1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/tinkering/materials/trinavine.json @@ -0,0 +1,37 @@ +{ + "color": "FFFE2D2D", + "fallbacks": [ + "silver", + "iron" + ], + "generator": { + "supported_stats": [ + "tconstruct:repair_kit", + "tconstruct:binding" + ], + "transformer": { + "type": "tconstruct:recolor_sprite", + "color_mapping": { + "type": "tconstruct:grey_to_color", + "palette": [ + { + "color": "FFFF66CC", + "grey": 0 + }, + { + "color": "FFFF99DD", + "grey": 85 + }, + { + "color": "FF99CCFF", + "grey": 170 + }, + { + "color": "FF66CCFF", + "grey": 255 + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/tinkering/materials/tungsten_carbide.json b/src/generated/resources/assets/cosmiccore/tinkering/materials/tungsten_carbide.json new file mode 100644 index 000000000..7086e686d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/tinkering/materials/tungsten_carbide.json @@ -0,0 +1,37 @@ +{ + "color": "FF635480", + "fallbacks": [ + "silver", + "iron" + ], + "generator": { + "supported_stats": [ + "tconstruct:repair_kit", + "tconstruct:binding" + ], + "transformer": { + "type": "tconstruct:recolor_sprite", + "color_mapping": { + "type": "tconstruct:grey_to_color", + "palette": [ + { + "color": "FFFF66CC", + "grey": 0 + }, + { + "color": "FFFF99DD", + "grey": 85 + }, + { + "color": "FF99CCFF", + "grey": 170 + }, + { + "color": "FF66CCFF", + "grey": 255 + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/tinkering/materials/tungsten_steel.json b/src/generated/resources/assets/cosmiccore/tinkering/materials/tungsten_steel.json new file mode 100644 index 000000000..a415a340c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/tinkering/materials/tungsten_steel.json @@ -0,0 +1,37 @@ +{ + "color": "FF687ECE", + "fallbacks": [ + "silver", + "iron" + ], + "generator": { + "supported_stats": [ + "tconstruct:repair_kit", + "tconstruct:binding" + ], + "transformer": { + "type": "tconstruct:recolor_sprite", + "color_mapping": { + "type": "tconstruct:grey_to_color", + "palette": [ + { + "color": "FFFF66CC", + "grey": 0 + }, + { + "color": "FFFF99DD", + "grey": 85 + }, + { + "color": "FF99CCFF", + "grey": 170 + }, + { + "color": "FF66CCFF", + "grey": 255 + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/tinkering/materials/ultimet.json b/src/generated/resources/assets/cosmiccore/tinkering/materials/ultimet.json new file mode 100644 index 000000000..92eb16395 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/tinkering/materials/ultimet.json @@ -0,0 +1,37 @@ +{ + "color": "FF9F9FB1", + "fallbacks": [ + "silver", + "iron" + ], + "generator": { + "supported_stats": [ + "tconstruct:repair_kit", + "tconstruct:binding" + ], + "transformer": { + "type": "tconstruct:recolor_sprite", + "color_mapping": { + "type": "tconstruct:grey_to_color", + "palette": [ + { + "color": "FFFF66CC", + "grey": 0 + }, + { + "color": "FFFF99DD", + "grey": 85 + }, + { + "color": "FF99CCFF", + "grey": 170 + }, + { + "color": "FF66CCFF", + "grey": 255 + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/tinkering/materials/vanadium_steel.json b/src/generated/resources/assets/cosmiccore/tinkering/materials/vanadium_steel.json new file mode 100644 index 000000000..faeec0dfd --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/tinkering/materials/vanadium_steel.json @@ -0,0 +1,37 @@ +{ + "color": "FFB59FCC", + "fallbacks": [ + "silver", + "iron" + ], + "generator": { + "supported_stats": [ + "tconstruct:repair_kit", + "tconstruct:binding" + ], + "transformer": { + "type": "tconstruct:recolor_sprite", + "color_mapping": { + "type": "tconstruct:grey_to_color", + "palette": [ + { + "color": "FFFF66CC", + "grey": 0 + }, + { + "color": "FFFF99DD", + "grey": 85 + }, + { + "color": "FF99CCFF", + "grey": 170 + }, + { + "color": "FF66CCFF", + "grey": 255 + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/tinkering/materials/wrought_iron.json b/src/generated/resources/assets/cosmiccore/tinkering/materials/wrought_iron.json new file mode 100644 index 000000000..4090546ab --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/tinkering/materials/wrought_iron.json @@ -0,0 +1,37 @@ +{ + "color": "FFBCBCBC", + "fallbacks": [ + "silver", + "iron" + ], + "generator": { + "supported_stats": [ + "tconstruct:repair_kit", + "tconstruct:binding" + ], + "transformer": { + "type": "tconstruct:recolor_sprite", + "color_mapping": { + "type": "tconstruct:grey_to_color", + "palette": [ + { + "color": "FFFF66CC", + "grey": 0 + }, + { + "color": "FFFF99DD", + "grey": 85 + }, + { + "color": "FF99CCFF", + "grey": 170 + }, + { + "color": "FF66CCFF", + "grey": 255 + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/bolted_heavy_frame_casing.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/bolted_heavy_frame_casing.json new file mode 100644 index 000000000..31c035e66 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/bolted_heavy_frame_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:bolted_heavy_frame_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/bolted_heavy_frame_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/diving_bell_escape_pad.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/diving_bell_escape_pad.json new file mode 100644 index 000000000..a5a2fb8e1 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/diving_bell_escape_pad.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:diving_bell_escape_pad" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/diving_bell_escape_pad" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/ethersteel_plated_ash_tiles.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/ethersteel_plated_ash_tiles.json new file mode 100644 index 000000000..aeb5fb078 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/ethersteel_plated_ash_tiles.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:ethersteel_plated_ash_tiles" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/ethersteel_plated_ash_tiles" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/ev_ember_emitter.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/ev_ember_emitter.json new file mode 100644 index 000000000..67a1068e5 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/ev_ember_emitter.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:ev_ember_emitter" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/ev_ember_emitter" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/ev_ember_receptor.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/ev_ember_receptor.json new file mode 100644 index 000000000..216f4932d --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/ev_ember_receptor.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:ev_ember_receptor" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/ev_ember_receptor" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/hv_ember_emitter.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/hv_ember_emitter.json new file mode 100644 index 000000000..b09d7ed4a --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/hv_ember_emitter.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:hv_ember_emitter" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/hv_ember_emitter" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/hv_ember_receptor.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/hv_ember_receptor.json new file mode 100644 index 000000000..19397bcff --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/hv_ember_receptor.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:hv_ember_receptor" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/hv_ember_receptor" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/iron_plated_deepslate_tile.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/iron_plated_deepslate_tile.json new file mode 100644 index 000000000..cdd244abb --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/iron_plated_deepslate_tile.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:iron_plated_deepslate_tile" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/iron_plated_deepslate_tile" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/iron_plated_deepslate_tile_slab.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/iron_plated_deepslate_tile_slab.json new file mode 100644 index 000000000..c1b68616e --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/iron_plated_deepslate_tile_slab.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:iron_plated_deepslate_tile_slab" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/iron_plated_deepslate_tile_slab" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/iron_plated_deepslate_tile_stairs.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/iron_plated_deepslate_tile_stairs.json new file mode 100644 index 000000000..c226714e5 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/iron_plated_deepslate_tile_stairs.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:iron_plated_deepslate_tile_stairs" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/iron_plated_deepslate_tile_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/iv_ember_emitter.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/iv_ember_emitter.json new file mode 100644 index 000000000..cd8dfeb5a --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/iv_ember_emitter.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:iv_ember_emitter" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/iv_ember_emitter" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/iv_ember_receptor.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/iv_ember_receptor.json new file mode 100644 index 000000000..884a38dcc --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/iv_ember_receptor.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:iv_ember_receptor" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/iv_ember_receptor" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/light_dawnstone_casing.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/light_dawnstone_casing.json new file mode 100644 index 000000000..9f8ba03c9 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/light_dawnstone_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:light_dawnstone_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/light_dawnstone_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/livingrock_tiles.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/livingrock_tiles.json new file mode 100644 index 000000000..259de9a89 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/livingrock_tiles.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:livingrock_tiles" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/livingrock_tiles" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/luv_ember_emitter.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/luv_ember_emitter.json new file mode 100644 index 000000000..07dbe7ed1 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/luv_ember_emitter.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:luv_ember_emitter" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/luv_ember_emitter" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/luv_ember_receptor.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/luv_ember_receptor.json new file mode 100644 index 000000000..48b2c8278 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/luv_ember_receptor.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:luv_ember_receptor" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/luv_ember_receptor" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/lv_ember_emitter.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/lv_ember_emitter.json new file mode 100644 index 000000000..9af105d0a --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/lv_ember_emitter.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:lv_ember_emitter" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/lv_ember_emitter" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/lv_ember_receptor.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/lv_ember_receptor.json new file mode 100644 index 000000000..fbea97bad --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/lv_ember_receptor.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:lv_ember_receptor" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/lv_ember_receptor" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/max_ember_emitter.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/max_ember_emitter.json new file mode 100644 index 000000000..834110605 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/max_ember_emitter.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:max_ember_emitter" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/max_ember_emitter" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/max_ember_receptor.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/max_ember_receptor.json new file mode 100644 index 000000000..fc9a0656d --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/max_ember_receptor.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:max_ember_receptor" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/max_ember_receptor" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/moth_home_t1.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/moth_home_t1.json new file mode 100644 index 000000000..6208b348d --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/moth_home_t1.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:moth_home_t1" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/moth_home_t1" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/moth_home_t2.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/moth_home_t2.json new file mode 100644 index 000000000..de326048b --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/moth_home_t2.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:moth_home_t2" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/moth_home_t2" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/moth_home_t3.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/moth_home_t3.json new file mode 100644 index 000000000..34c38a51d --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/moth_home_t3.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:moth_home_t3" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/moth_home_t3" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/moth_home_t4.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/moth_home_t4.json new file mode 100644 index 000000000..6b0b0827f --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/moth_home_t4.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:moth_home_t4" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/moth_home_t4" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/moth_station_casing.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/moth_station_casing.json new file mode 100644 index 000000000..9296a0687 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/moth_station_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:moth_station_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/moth_station_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/mv_ember_emitter.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/mv_ember_emitter.json new file mode 100644 index 000000000..609791040 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/mv_ember_emitter.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:mv_ember_emitter" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/mv_ember_emitter" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/mv_ember_receptor.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/mv_ember_receptor.json new file mode 100644 index 000000000..25145b13a --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/mv_ember_receptor.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:mv_ember_receptor" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/mv_ember_receptor" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/opv_ember_emitter.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/opv_ember_emitter.json new file mode 100644 index 000000000..fad384383 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/opv_ember_emitter.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:opv_ember_emitter" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/opv_ember_emitter" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/opv_ember_receptor.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/opv_ember_receptor.json new file mode 100644 index 000000000..520a97a86 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/opv_ember_receptor.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:opv_ember_receptor" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/opv_ember_receptor" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/reinforced_dawnstone_casing.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/reinforced_dawnstone_casing.json new file mode 100644 index 000000000..35fa1ed85 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/reinforced_dawnstone_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:reinforced_dawnstone_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/reinforced_dawnstone_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/rigid_high_speed_steel_casing.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/rigid_high_speed_steel_casing.json new file mode 100644 index 000000000..97059c932 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/rigid_high_speed_steel_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:rigid_high_speed_steel_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/rigid_high_speed_steel_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/rust_stained_casing.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/rust_stained_casing.json new file mode 100644 index 000000000..e31cc4589 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/rust_stained_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:rust_stained_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/rust_stained_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/rust_weave_casing.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/rust_weave_casing.json new file mode 100644 index 000000000..fa1b18c6a --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/rust_weave_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:rust_weave_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/rust_weave_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/somarust_casing.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/somarust_casing.json new file mode 100644 index 000000000..797e0ab66 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/somarust_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:somarust_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/somarust_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/soul_muted_casing.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/soul_muted_casing.json new file mode 100644 index 000000000..407af7774 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/soul_muted_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:soul_muted_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/soul_muted_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/soul_stained_steel_aluminium_plated_casing.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/soul_stained_steel_aluminium_plated_casing.json new file mode 100644 index 000000000..c3a365ba1 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/soul_stained_steel_aluminium_plated_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:soul_stained_steel_aluminium_plated_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/soul_stained_steel_aluminium_plated_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/steam_ember_emitter.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/steam_ember_emitter.json new file mode 100644 index 000000000..24957a772 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/steam_ember_emitter.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:steam_ember_emitter" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/steam_ember_emitter" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/steam_ember_receptor.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/steam_ember_receptor.json new file mode 100644 index 000000000..0aa293286 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/steam_ember_receptor.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:steam_ember_receptor" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/steam_ember_receptor" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/steel_rose_lantern.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/steel_rose_lantern.json new file mode 100644 index 000000000..0ad5ee0a3 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/steel_rose_lantern.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:steel_rose_lantern" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/steel_rose_lantern" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/steel_rose_light.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/steel_rose_light.json new file mode 100644 index 000000000..aa1e4c8c8 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/steel_rose_light.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:steel_rose_light" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/steel_rose_light" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/steel_rose_light_slab.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/steel_rose_light_slab.json new file mode 100644 index 000000000..fb5a7c3a7 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/steel_rose_light_slab.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:steel_rose_light_slab" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/steel_rose_light_slab" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/steel_rose_light_stairs.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/steel_rose_light_stairs.json new file mode 100644 index 000000000..4a4d0503f --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/steel_rose_light_stairs.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:steel_rose_light_stairs" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/steel_rose_light_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/superheavy_steel_casing.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/superheavy_steel_casing.json new file mode 100644 index 000000000..3e742a26f --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/superheavy_steel_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:superheavy_steel_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/superheavy_steel_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/uev_ember_emitter.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/uev_ember_emitter.json new file mode 100644 index 000000000..2061f81ef --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/uev_ember_emitter.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:uev_ember_emitter" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/uev_ember_emitter" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/uev_ember_receptor.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/uev_ember_receptor.json new file mode 100644 index 000000000..b081bde7e --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/uev_ember_receptor.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:uev_ember_receptor" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/uev_ember_receptor" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/uhv_ember_emitter.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/uhv_ember_emitter.json new file mode 100644 index 000000000..d26189851 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/uhv_ember_emitter.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:uhv_ember_emitter" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/uhv_ember_emitter" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/uhv_ember_receptor.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/uhv_ember_receptor.json new file mode 100644 index 000000000..c0bd054f3 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/uhv_ember_receptor.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:uhv_ember_receptor" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/uhv_ember_receptor" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/uiv_ember_emitter.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/uiv_ember_emitter.json new file mode 100644 index 000000000..5862507a3 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/uiv_ember_emitter.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:uiv_ember_emitter" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/uiv_ember_emitter" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/uiv_ember_receptor.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/uiv_ember_receptor.json new file mode 100644 index 000000000..834921942 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/uiv_ember_receptor.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:uiv_ember_receptor" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/uiv_ember_receptor" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/uv_ember_emitter.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/uv_ember_emitter.json new file mode 100644 index 000000000..145afb5e0 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/uv_ember_emitter.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:uv_ember_emitter" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/uv_ember_emitter" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/uv_ember_receptor.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/uv_ember_receptor.json new file mode 100644 index 000000000..2ab21d813 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/uv_ember_receptor.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:uv_ember_receptor" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/uv_ember_receptor" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/uxv_ember_emitter.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/uxv_ember_emitter.json new file mode 100644 index 000000000..4837ccea6 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/uxv_ember_emitter.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:uxv_ember_emitter" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/uxv_ember_emitter" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/uxv_ember_receptor.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/uxv_ember_receptor.json new file mode 100644 index 000000000..0774a823b --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/uxv_ember_receptor.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:uxv_ember_receptor" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/uxv_ember_receptor" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/zpm_ember_emitter.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/zpm_ember_emitter.json new file mode 100644 index 000000000..edb7fe26e --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/zpm_ember_emitter.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:zpm_ember_emitter" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/zpm_ember_emitter" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/zpm_ember_receptor.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/zpm_ember_receptor.json new file mode 100644 index 000000000..b946ffbba --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/zpm_ember_receptor.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:zpm_ember_receptor" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/zpm_ember_receptor" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/aluminium.json b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/aluminium.json new file mode 100644 index 000000000..18ab9ab80 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/aluminium.json @@ -0,0 +1,9 @@ +{ + "type": "tconstruct:material", + "ingredient": { + "item": "gtceu:aluminium_ingot" + }, + "material": "cosmiccore:aluminium", + "needed": 2, + "value": 1 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/blue_steel.json b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/blue_steel.json new file mode 100644 index 000000000..ffc913349 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/blue_steel.json @@ -0,0 +1,9 @@ +{ + "type": "tconstruct:material", + "ingredient": { + "item": "gtceu:blue_steel_ingot" + }, + "material": "cosmiccore:blue_steel", + "needed": 2, + "value": 1 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/bronze.json b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/bronze.json new file mode 100644 index 000000000..656e9af31 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/bronze.json @@ -0,0 +1,9 @@ +{ + "type": "tconstruct:material", + "ingredient": { + "item": "gtceu:bronze_ingot" + }, + "material": "cosmiccore:bronze", + "needed": 2, + "value": 1 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/cobalt_brass.json b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/cobalt_brass.json new file mode 100644 index 000000000..80f39bd53 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/cobalt_brass.json @@ -0,0 +1,9 @@ +{ + "type": "tconstruct:material", + "ingredient": { + "item": "gtceu:cobalt_brass_ingot" + }, + "material": "cosmiccore:cobalt_brass", + "needed": 2, + "value": 1 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/damascus_steel.json b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/damascus_steel.json new file mode 100644 index 000000000..b56162e30 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/damascus_steel.json @@ -0,0 +1,9 @@ +{ + "type": "tconstruct:material", + "ingredient": { + "item": "gtceu:damascus_steel_ingot" + }, + "material": "cosmiccore:damascus_steel", + "needed": 2, + "value": 1 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/duranium.json b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/duranium.json new file mode 100644 index 000000000..699f71f90 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/duranium.json @@ -0,0 +1,9 @@ +{ + "type": "tconstruct:material", + "ingredient": { + "item": "gtceu:duranium_ingot" + }, + "material": "cosmiccore:duranium", + "needed": 2, + "value": 1 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/hsse.json b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/hsse.json new file mode 100644 index 000000000..9030f54a5 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/hsse.json @@ -0,0 +1,9 @@ +{ + "type": "tconstruct:material", + "ingredient": { + "item": "gtceu:hsse_ingot" + }, + "material": "cosmiccore:hsse", + "needed": 2, + "value": 1 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/invar.json b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/invar.json new file mode 100644 index 000000000..3c140043b --- /dev/null +++ b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/invar.json @@ -0,0 +1,9 @@ +{ + "type": "tconstruct:material", + "ingredient": { + "item": "gtceu:invar_ingot" + }, + "material": "cosmiccore:invar", + "needed": 2, + "value": 1 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/iron.json b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/iron.json new file mode 100644 index 000000000..86fced9b3 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/iron.json @@ -0,0 +1,9 @@ +{ + "type": "tconstruct:material", + "ingredient": { + "item": "minecraft:iron_ingot" + }, + "material": "cosmiccore:iron", + "needed": 2, + "value": 1 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/naquadah_alloy.json b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/naquadah_alloy.json new file mode 100644 index 000000000..f880356ec --- /dev/null +++ b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/naquadah_alloy.json @@ -0,0 +1,9 @@ +{ + "type": "tconstruct:material", + "ingredient": { + "item": "gtceu:naquadah_alloy_ingot" + }, + "material": "cosmiccore:naquadah_alloy", + "needed": 2, + "value": 1 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/netherite.json b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/netherite.json new file mode 100644 index 000000000..f4dda558c --- /dev/null +++ b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/netherite.json @@ -0,0 +1,9 @@ +{ + "type": "tconstruct:material", + "ingredient": { + "item": "minecraft:netherite_ingot" + }, + "material": "cosmiccore:netherite", + "needed": 2, + "value": 1 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/neutronite.json b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/neutronite.json new file mode 100644 index 000000000..78a582285 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/neutronite.json @@ -0,0 +1,9 @@ +{ + "type": "tconstruct:material", + "ingredient": { + "item": "cosmiccore:neutronite_ingot" + }, + "material": "cosmiccore:neutronite", + "needed": 2, + "value": 1 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/neutronium.json b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/neutronium.json new file mode 100644 index 000000000..798b6ebc8 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/neutronium.json @@ -0,0 +1,9 @@ +{ + "type": "tconstruct:material", + "ingredient": { + "item": "gtceu:neutronium_ingot" + }, + "material": "cosmiccore:neutronium", + "needed": 2, + "value": 1 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/polybenzimidazole.json b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/polybenzimidazole.json new file mode 100644 index 000000000..61285e4d0 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/polybenzimidazole.json @@ -0,0 +1,9 @@ +{ + "type": "tconstruct:material", + "ingredient": { + "item": "gtceu:polybenzimidazole_ingot" + }, + "material": "cosmiccore:polybenzimidazole", + "needed": 2, + "value": 1 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/polyethylene.json b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/polyethylene.json new file mode 100644 index 000000000..574621437 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/polyethylene.json @@ -0,0 +1,9 @@ +{ + "type": "tconstruct:material", + "ingredient": { + "item": "gtceu:polyethylene_ingot" + }, + "material": "cosmiccore:polyethylene", + "needed": 2, + "value": 1 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/polytetrafluoroethylene.json b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/polytetrafluoroethylene.json new file mode 100644 index 000000000..5a4a8b3ec --- /dev/null +++ b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/polytetrafluoroethylene.json @@ -0,0 +1,9 @@ +{ + "type": "tconstruct:material", + "ingredient": { + "item": "gtceu:polytetrafluoroethylene_ingot" + }, + "material": "cosmiccore:polytetrafluoroethylene", + "needed": 2, + "value": 1 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/red_steel.json b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/red_steel.json new file mode 100644 index 000000000..ab70000f0 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/red_steel.json @@ -0,0 +1,9 @@ +{ + "type": "tconstruct:material", + "ingredient": { + "item": "gtceu:red_steel_ingot" + }, + "material": "cosmiccore:red_steel", + "needed": 2, + "value": 1 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/rose_gold.json b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/rose_gold.json new file mode 100644 index 000000000..e470ac081 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/rose_gold.json @@ -0,0 +1,9 @@ +{ + "type": "tconstruct:material", + "ingredient": { + "item": "gtceu:rose_gold_ingot" + }, + "material": "cosmiccore:rose_gold", + "needed": 2, + "value": 1 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/rubber.json b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/rubber.json new file mode 100644 index 000000000..e081d3ac8 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/rubber.json @@ -0,0 +1,9 @@ +{ + "type": "tconstruct:material", + "ingredient": { + "item": "gtceu:rubber_ingot" + }, + "material": "cosmiccore:rubber", + "needed": 2, + "value": 1 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/silicone_rubber.json b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/silicone_rubber.json new file mode 100644 index 000000000..55c7bcce7 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/silicone_rubber.json @@ -0,0 +1,9 @@ +{ + "type": "tconstruct:material", + "ingredient": { + "item": "gtceu:silicone_rubber_ingot" + }, + "material": "cosmiccore:silicone_rubber", + "needed": 2, + "value": 1 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/stainless_steel.json b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/stainless_steel.json new file mode 100644 index 000000000..5926e60d6 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/stainless_steel.json @@ -0,0 +1,9 @@ +{ + "type": "tconstruct:material", + "ingredient": { + "item": "gtceu:stainless_steel_ingot" + }, + "material": "cosmiccore:stainless_steel", + "needed": 2, + "value": 1 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/steel.json b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/steel.json new file mode 100644 index 000000000..6f422443e --- /dev/null +++ b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/steel.json @@ -0,0 +1,9 @@ +{ + "type": "tconstruct:material", + "ingredient": { + "item": "gtceu:steel_ingot" + }, + "material": "cosmiccore:steel", + "needed": 2, + "value": 1 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/sterling_silver.json b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/sterling_silver.json new file mode 100644 index 000000000..d6297a386 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/sterling_silver.json @@ -0,0 +1,9 @@ +{ + "type": "tconstruct:material", + "ingredient": { + "item": "gtceu:sterling_silver_ingot" + }, + "material": "cosmiccore:sterling_silver", + "needed": 2, + "value": 1 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/styrene_butadiene_rubber.json b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/styrene_butadiene_rubber.json new file mode 100644 index 000000000..eac6d2b0a --- /dev/null +++ b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/styrene_butadiene_rubber.json @@ -0,0 +1,9 @@ +{ + "type": "tconstruct:material", + "ingredient": { + "item": "gtceu:styrene_butadiene_rubber_ingot" + }, + "material": "cosmiccore:styrene_butadiene_rubber", + "needed": 2, + "value": 1 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/titanium.json b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/titanium.json new file mode 100644 index 000000000..4d524e6cf --- /dev/null +++ b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/titanium.json @@ -0,0 +1,9 @@ +{ + "type": "tconstruct:material", + "ingredient": { + "item": "gtceu:titanium_ingot" + }, + "material": "cosmiccore:titanium", + "needed": 2, + "value": 1 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/trinavine.json b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/trinavine.json new file mode 100644 index 000000000..592e63d1e --- /dev/null +++ b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/trinavine.json @@ -0,0 +1,9 @@ +{ + "type": "tconstruct:material", + "ingredient": { + "item": "cosmiccore:trinavine_ingot" + }, + "material": "cosmiccore:trinavine", + "needed": 2, + "value": 1 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/tungsten_carbide.json b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/tungsten_carbide.json new file mode 100644 index 000000000..f494d5313 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/tungsten_carbide.json @@ -0,0 +1,9 @@ +{ + "type": "tconstruct:material", + "ingredient": { + "item": "gtceu:tungsten_carbide_ingot" + }, + "material": "cosmiccore:tungsten_carbide", + "needed": 2, + "value": 1 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/tungsten_steel.json b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/tungsten_steel.json new file mode 100644 index 000000000..be0674d97 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/tungsten_steel.json @@ -0,0 +1,9 @@ +{ + "type": "tconstruct:material", + "ingredient": { + "item": "gtceu:tungsten_steel_ingot" + }, + "material": "cosmiccore:tungsten_steel", + "needed": 2, + "value": 1 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/ultimet.json b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/ultimet.json new file mode 100644 index 000000000..b52bf5595 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/ultimet.json @@ -0,0 +1,9 @@ +{ + "type": "tconstruct:material", + "ingredient": { + "item": "gtceu:ultimet_ingot" + }, + "material": "cosmiccore:ultimet", + "needed": 2, + "value": 1 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/vanadium_steel.json b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/vanadium_steel.json new file mode 100644 index 000000000..292fd264f --- /dev/null +++ b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/vanadium_steel.json @@ -0,0 +1,9 @@ +{ + "type": "tconstruct:material", + "ingredient": { + "item": "gtceu:vanadium_steel_ingot" + }, + "material": "cosmiccore:vanadium_steel", + "needed": 2, + "value": 1 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/wrought_iron.json b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/wrought_iron.json new file mode 100644 index 000000000..fe727db8d --- /dev/null +++ b/src/generated/resources/data/cosmiccore/recipes/tinkers/tools/material/wrought_iron.json @@ -0,0 +1,9 @@ +{ + "type": "tconstruct:material", + "ingredient": { + "item": "gtceu:wrought_iron_ingot" + }, + "material": "cosmiccore:wrought_iron", + "needed": 2, + "value": 1 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tags/items/casts/multi_use/screwdriver_head_sand.json b/src/generated/resources/data/cosmiccore/tags/items/casts/multi_use/screwdriver_head_sand.json new file mode 100644 index 000000000..7c7eff2b2 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tags/items/casts/multi_use/screwdriver_head_sand.json @@ -0,0 +1,5 @@ +{ + "values": [ + "cosmiccore:screwdriver_head_cast" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tags/items/casts/multi_use/wrench_head.json b/src/generated/resources/data/cosmiccore/tags/items/casts/multi_use/wrench_head.json new file mode 100644 index 000000000..e0b332939 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tags/items/casts/multi_use/wrench_head.json @@ -0,0 +1,5 @@ +{ + "values": [ + "cosmiccore:wrench_head_cast" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tags/items/casts/single_use/screwdriver_head.json b/src/generated/resources/data/cosmiccore/tags/items/casts/single_use/screwdriver_head.json new file mode 100644 index 000000000..0e6ac1c16 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tags/items/casts/single_use/screwdriver_head.json @@ -0,0 +1,5 @@ +{ + "values": [ + "cosmiccore:screwdriver_head_sand_cast" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tags/items/casts/single_use/wrench_head.json b/src/generated/resources/data/cosmiccore/tags/items/casts/single_use/wrench_head.json new file mode 100644 index 000000000..f1940bdc8 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tags/items/casts/single_use/wrench_head.json @@ -0,0 +1,5 @@ +{ + "values": [ + "cosmiccore:wrench_head_sand_cast" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/definition/aluminium.json b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/aluminium.json new file mode 100644 index 000000000..7e74f6bf6 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/aluminium.json @@ -0,0 +1,6 @@ +{ + "craftable": true, + "hidden": false, + "sortOrder": 10, + "tier": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/definition/blue_steel.json b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/blue_steel.json new file mode 100644 index 000000000..7e74f6bf6 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/blue_steel.json @@ -0,0 +1,6 @@ +{ + "craftable": true, + "hidden": false, + "sortOrder": 10, + "tier": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/definition/bronze.json b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/bronze.json new file mode 100644 index 000000000..7e74f6bf6 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/bronze.json @@ -0,0 +1,6 @@ +{ + "craftable": true, + "hidden": false, + "sortOrder": 10, + "tier": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/definition/cobalt_brass.json b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/cobalt_brass.json new file mode 100644 index 000000000..7e74f6bf6 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/cobalt_brass.json @@ -0,0 +1,6 @@ +{ + "craftable": true, + "hidden": false, + "sortOrder": 10, + "tier": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/definition/damascus_steel.json b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/damascus_steel.json new file mode 100644 index 000000000..7e74f6bf6 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/damascus_steel.json @@ -0,0 +1,6 @@ +{ + "craftable": true, + "hidden": false, + "sortOrder": 10, + "tier": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/definition/duranium.json b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/duranium.json new file mode 100644 index 000000000..7e74f6bf6 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/duranium.json @@ -0,0 +1,6 @@ +{ + "craftable": true, + "hidden": false, + "sortOrder": 10, + "tier": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/definition/hsse.json b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/hsse.json new file mode 100644 index 000000000..7e74f6bf6 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/hsse.json @@ -0,0 +1,6 @@ +{ + "craftable": true, + "hidden": false, + "sortOrder": 10, + "tier": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/definition/invar.json b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/invar.json new file mode 100644 index 000000000..7e74f6bf6 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/invar.json @@ -0,0 +1,6 @@ +{ + "craftable": true, + "hidden": false, + "sortOrder": 10, + "tier": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/definition/iron.json b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/iron.json new file mode 100644 index 000000000..7e74f6bf6 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/iron.json @@ -0,0 +1,6 @@ +{ + "craftable": true, + "hidden": false, + "sortOrder": 10, + "tier": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/definition/naquadah_alloy.json b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/naquadah_alloy.json new file mode 100644 index 000000000..7e74f6bf6 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/naquadah_alloy.json @@ -0,0 +1,6 @@ +{ + "craftable": true, + "hidden": false, + "sortOrder": 10, + "tier": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/definition/netherite.json b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/netherite.json new file mode 100644 index 000000000..7e74f6bf6 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/netherite.json @@ -0,0 +1,6 @@ +{ + "craftable": true, + "hidden": false, + "sortOrder": 10, + "tier": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/definition/neutronite.json b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/neutronite.json new file mode 100644 index 000000000..7e74f6bf6 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/neutronite.json @@ -0,0 +1,6 @@ +{ + "craftable": true, + "hidden": false, + "sortOrder": 10, + "tier": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/definition/neutronium.json b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/neutronium.json new file mode 100644 index 000000000..7e74f6bf6 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/neutronium.json @@ -0,0 +1,6 @@ +{ + "craftable": true, + "hidden": false, + "sortOrder": 10, + "tier": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/definition/polybenzimidazole.json b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/polybenzimidazole.json new file mode 100644 index 000000000..7e74f6bf6 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/polybenzimidazole.json @@ -0,0 +1,6 @@ +{ + "craftable": true, + "hidden": false, + "sortOrder": 10, + "tier": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/definition/polyethylene.json b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/polyethylene.json new file mode 100644 index 000000000..7e74f6bf6 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/polyethylene.json @@ -0,0 +1,6 @@ +{ + "craftable": true, + "hidden": false, + "sortOrder": 10, + "tier": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/definition/polytetrafluoroethylene.json b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/polytetrafluoroethylene.json new file mode 100644 index 000000000..7e74f6bf6 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/polytetrafluoroethylene.json @@ -0,0 +1,6 @@ +{ + "craftable": true, + "hidden": false, + "sortOrder": 10, + "tier": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/definition/red_steel.json b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/red_steel.json new file mode 100644 index 000000000..7e74f6bf6 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/red_steel.json @@ -0,0 +1,6 @@ +{ + "craftable": true, + "hidden": false, + "sortOrder": 10, + "tier": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/definition/rose_gold.json b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/rose_gold.json new file mode 100644 index 000000000..7e74f6bf6 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/rose_gold.json @@ -0,0 +1,6 @@ +{ + "craftable": true, + "hidden": false, + "sortOrder": 10, + "tier": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/definition/rubber.json b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/rubber.json new file mode 100644 index 000000000..7e74f6bf6 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/rubber.json @@ -0,0 +1,6 @@ +{ + "craftable": true, + "hidden": false, + "sortOrder": 10, + "tier": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/definition/silicone_rubber.json b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/silicone_rubber.json new file mode 100644 index 000000000..7e74f6bf6 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/silicone_rubber.json @@ -0,0 +1,6 @@ +{ + "craftable": true, + "hidden": false, + "sortOrder": 10, + "tier": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/definition/stainless_steel.json b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/stainless_steel.json new file mode 100644 index 000000000..7e74f6bf6 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/stainless_steel.json @@ -0,0 +1,6 @@ +{ + "craftable": true, + "hidden": false, + "sortOrder": 10, + "tier": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/definition/steel.json b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/steel.json new file mode 100644 index 000000000..7e74f6bf6 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/steel.json @@ -0,0 +1,6 @@ +{ + "craftable": true, + "hidden": false, + "sortOrder": 10, + "tier": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/definition/sterling_silver.json b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/sterling_silver.json new file mode 100644 index 000000000..7e74f6bf6 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/sterling_silver.json @@ -0,0 +1,6 @@ +{ + "craftable": true, + "hidden": false, + "sortOrder": 10, + "tier": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/definition/styrene_butadiene_rubber.json b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/styrene_butadiene_rubber.json new file mode 100644 index 000000000..7e74f6bf6 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/styrene_butadiene_rubber.json @@ -0,0 +1,6 @@ +{ + "craftable": true, + "hidden": false, + "sortOrder": 10, + "tier": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/definition/titanium.json b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/titanium.json new file mode 100644 index 000000000..7e74f6bf6 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/titanium.json @@ -0,0 +1,6 @@ +{ + "craftable": true, + "hidden": false, + "sortOrder": 10, + "tier": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/definition/trinavine.json b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/trinavine.json new file mode 100644 index 000000000..7e74f6bf6 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/trinavine.json @@ -0,0 +1,6 @@ +{ + "craftable": true, + "hidden": false, + "sortOrder": 10, + "tier": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/definition/tungsten_carbide.json b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/tungsten_carbide.json new file mode 100644 index 000000000..7e74f6bf6 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/tungsten_carbide.json @@ -0,0 +1,6 @@ +{ + "craftable": true, + "hidden": false, + "sortOrder": 10, + "tier": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/definition/tungsten_steel.json b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/tungsten_steel.json new file mode 100644 index 000000000..7e74f6bf6 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/tungsten_steel.json @@ -0,0 +1,6 @@ +{ + "craftable": true, + "hidden": false, + "sortOrder": 10, + "tier": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/definition/ultimet.json b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/ultimet.json new file mode 100644 index 000000000..7e74f6bf6 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/ultimet.json @@ -0,0 +1,6 @@ +{ + "craftable": true, + "hidden": false, + "sortOrder": 10, + "tier": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/definition/vanadium_steel.json b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/vanadium_steel.json new file mode 100644 index 000000000..7e74f6bf6 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/vanadium_steel.json @@ -0,0 +1,6 @@ +{ + "craftable": true, + "hidden": false, + "sortOrder": 10, + "tier": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/definition/wrought_iron.json b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/wrought_iron.json new file mode 100644 index 000000000..7e74f6bf6 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/definition/wrought_iron.json @@ -0,0 +1,6 @@ +{ + "craftable": true, + "hidden": false, + "sortOrder": 10, + "tier": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/stats/aluminium.json b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/aluminium.json new file mode 100644 index 000000000..e50bd69c7 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/aluminium.json @@ -0,0 +1,24 @@ +{ + "stats": { + "tconstruct:binding": {}, + "tconstruct:bowstring": {}, + "tconstruct:grip": { + "accuracy": 10.0, + "durability": 3000.0, + "melee_damage": 20.0 + }, + "tconstruct:handle": { + "durability": 3000.0, + "melee_damage": 10.0, + "melee_speed": 4.0, + "mining_speed": 10.0 + }, + "tconstruct:head": { + "durability": 2200, + "melee_attack": 5.0, + "mining_speed": 10.0, + "mining_tier": "minecraft:iron" + }, + "tconstruct:repair_kit": {} + } +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/stats/blue_steel.json b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/blue_steel.json new file mode 100644 index 000000000..e50bd69c7 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/blue_steel.json @@ -0,0 +1,24 @@ +{ + "stats": { + "tconstruct:binding": {}, + "tconstruct:bowstring": {}, + "tconstruct:grip": { + "accuracy": 10.0, + "durability": 3000.0, + "melee_damage": 20.0 + }, + "tconstruct:handle": { + "durability": 3000.0, + "melee_damage": 10.0, + "melee_speed": 4.0, + "mining_speed": 10.0 + }, + "tconstruct:head": { + "durability": 2200, + "melee_attack": 5.0, + "mining_speed": 10.0, + "mining_tier": "minecraft:iron" + }, + "tconstruct:repair_kit": {} + } +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/stats/bronze.json b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/bronze.json new file mode 100644 index 000000000..e50bd69c7 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/bronze.json @@ -0,0 +1,24 @@ +{ + "stats": { + "tconstruct:binding": {}, + "tconstruct:bowstring": {}, + "tconstruct:grip": { + "accuracy": 10.0, + "durability": 3000.0, + "melee_damage": 20.0 + }, + "tconstruct:handle": { + "durability": 3000.0, + "melee_damage": 10.0, + "melee_speed": 4.0, + "mining_speed": 10.0 + }, + "tconstruct:head": { + "durability": 2200, + "melee_attack": 5.0, + "mining_speed": 10.0, + "mining_tier": "minecraft:iron" + }, + "tconstruct:repair_kit": {} + } +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/stats/cobalt_brass.json b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/cobalt_brass.json new file mode 100644 index 000000000..e50bd69c7 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/cobalt_brass.json @@ -0,0 +1,24 @@ +{ + "stats": { + "tconstruct:binding": {}, + "tconstruct:bowstring": {}, + "tconstruct:grip": { + "accuracy": 10.0, + "durability": 3000.0, + "melee_damage": 20.0 + }, + "tconstruct:handle": { + "durability": 3000.0, + "melee_damage": 10.0, + "melee_speed": 4.0, + "mining_speed": 10.0 + }, + "tconstruct:head": { + "durability": 2200, + "melee_attack": 5.0, + "mining_speed": 10.0, + "mining_tier": "minecraft:iron" + }, + "tconstruct:repair_kit": {} + } +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/stats/damascus_steel.json b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/damascus_steel.json new file mode 100644 index 000000000..e50bd69c7 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/damascus_steel.json @@ -0,0 +1,24 @@ +{ + "stats": { + "tconstruct:binding": {}, + "tconstruct:bowstring": {}, + "tconstruct:grip": { + "accuracy": 10.0, + "durability": 3000.0, + "melee_damage": 20.0 + }, + "tconstruct:handle": { + "durability": 3000.0, + "melee_damage": 10.0, + "melee_speed": 4.0, + "mining_speed": 10.0 + }, + "tconstruct:head": { + "durability": 2200, + "melee_attack": 5.0, + "mining_speed": 10.0, + "mining_tier": "minecraft:iron" + }, + "tconstruct:repair_kit": {} + } +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/stats/duranium.json b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/duranium.json new file mode 100644 index 000000000..e50bd69c7 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/duranium.json @@ -0,0 +1,24 @@ +{ + "stats": { + "tconstruct:binding": {}, + "tconstruct:bowstring": {}, + "tconstruct:grip": { + "accuracy": 10.0, + "durability": 3000.0, + "melee_damage": 20.0 + }, + "tconstruct:handle": { + "durability": 3000.0, + "melee_damage": 10.0, + "melee_speed": 4.0, + "mining_speed": 10.0 + }, + "tconstruct:head": { + "durability": 2200, + "melee_attack": 5.0, + "mining_speed": 10.0, + "mining_tier": "minecraft:iron" + }, + "tconstruct:repair_kit": {} + } +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/stats/hsse.json b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/hsse.json new file mode 100644 index 000000000..e50bd69c7 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/hsse.json @@ -0,0 +1,24 @@ +{ + "stats": { + "tconstruct:binding": {}, + "tconstruct:bowstring": {}, + "tconstruct:grip": { + "accuracy": 10.0, + "durability": 3000.0, + "melee_damage": 20.0 + }, + "tconstruct:handle": { + "durability": 3000.0, + "melee_damage": 10.0, + "melee_speed": 4.0, + "mining_speed": 10.0 + }, + "tconstruct:head": { + "durability": 2200, + "melee_attack": 5.0, + "mining_speed": 10.0, + "mining_tier": "minecraft:iron" + }, + "tconstruct:repair_kit": {} + } +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/stats/invar.json b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/invar.json new file mode 100644 index 000000000..e50bd69c7 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/invar.json @@ -0,0 +1,24 @@ +{ + "stats": { + "tconstruct:binding": {}, + "tconstruct:bowstring": {}, + "tconstruct:grip": { + "accuracy": 10.0, + "durability": 3000.0, + "melee_damage": 20.0 + }, + "tconstruct:handle": { + "durability": 3000.0, + "melee_damage": 10.0, + "melee_speed": 4.0, + "mining_speed": 10.0 + }, + "tconstruct:head": { + "durability": 2200, + "melee_attack": 5.0, + "mining_speed": 10.0, + "mining_tier": "minecraft:iron" + }, + "tconstruct:repair_kit": {} + } +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/stats/iron.json b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/iron.json new file mode 100644 index 000000000..e50bd69c7 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/iron.json @@ -0,0 +1,24 @@ +{ + "stats": { + "tconstruct:binding": {}, + "tconstruct:bowstring": {}, + "tconstruct:grip": { + "accuracy": 10.0, + "durability": 3000.0, + "melee_damage": 20.0 + }, + "tconstruct:handle": { + "durability": 3000.0, + "melee_damage": 10.0, + "melee_speed": 4.0, + "mining_speed": 10.0 + }, + "tconstruct:head": { + "durability": 2200, + "melee_attack": 5.0, + "mining_speed": 10.0, + "mining_tier": "minecraft:iron" + }, + "tconstruct:repair_kit": {} + } +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/stats/naquadah_alloy.json b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/naquadah_alloy.json new file mode 100644 index 000000000..e50bd69c7 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/naquadah_alloy.json @@ -0,0 +1,24 @@ +{ + "stats": { + "tconstruct:binding": {}, + "tconstruct:bowstring": {}, + "tconstruct:grip": { + "accuracy": 10.0, + "durability": 3000.0, + "melee_damage": 20.0 + }, + "tconstruct:handle": { + "durability": 3000.0, + "melee_damage": 10.0, + "melee_speed": 4.0, + "mining_speed": 10.0 + }, + "tconstruct:head": { + "durability": 2200, + "melee_attack": 5.0, + "mining_speed": 10.0, + "mining_tier": "minecraft:iron" + }, + "tconstruct:repair_kit": {} + } +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/stats/netherite.json b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/netherite.json new file mode 100644 index 000000000..e50bd69c7 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/netherite.json @@ -0,0 +1,24 @@ +{ + "stats": { + "tconstruct:binding": {}, + "tconstruct:bowstring": {}, + "tconstruct:grip": { + "accuracy": 10.0, + "durability": 3000.0, + "melee_damage": 20.0 + }, + "tconstruct:handle": { + "durability": 3000.0, + "melee_damage": 10.0, + "melee_speed": 4.0, + "mining_speed": 10.0 + }, + "tconstruct:head": { + "durability": 2200, + "melee_attack": 5.0, + "mining_speed": 10.0, + "mining_tier": "minecraft:iron" + }, + "tconstruct:repair_kit": {} + } +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/stats/neutronite.json b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/neutronite.json new file mode 100644 index 000000000..e50bd69c7 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/neutronite.json @@ -0,0 +1,24 @@ +{ + "stats": { + "tconstruct:binding": {}, + "tconstruct:bowstring": {}, + "tconstruct:grip": { + "accuracy": 10.0, + "durability": 3000.0, + "melee_damage": 20.0 + }, + "tconstruct:handle": { + "durability": 3000.0, + "melee_damage": 10.0, + "melee_speed": 4.0, + "mining_speed": 10.0 + }, + "tconstruct:head": { + "durability": 2200, + "melee_attack": 5.0, + "mining_speed": 10.0, + "mining_tier": "minecraft:iron" + }, + "tconstruct:repair_kit": {} + } +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/stats/neutronium.json b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/neutronium.json new file mode 100644 index 000000000..e50bd69c7 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/neutronium.json @@ -0,0 +1,24 @@ +{ + "stats": { + "tconstruct:binding": {}, + "tconstruct:bowstring": {}, + "tconstruct:grip": { + "accuracy": 10.0, + "durability": 3000.0, + "melee_damage": 20.0 + }, + "tconstruct:handle": { + "durability": 3000.0, + "melee_damage": 10.0, + "melee_speed": 4.0, + "mining_speed": 10.0 + }, + "tconstruct:head": { + "durability": 2200, + "melee_attack": 5.0, + "mining_speed": 10.0, + "mining_tier": "minecraft:iron" + }, + "tconstruct:repair_kit": {} + } +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/stats/polybenzimidazole.json b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/polybenzimidazole.json new file mode 100644 index 000000000..e50bd69c7 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/polybenzimidazole.json @@ -0,0 +1,24 @@ +{ + "stats": { + "tconstruct:binding": {}, + "tconstruct:bowstring": {}, + "tconstruct:grip": { + "accuracy": 10.0, + "durability": 3000.0, + "melee_damage": 20.0 + }, + "tconstruct:handle": { + "durability": 3000.0, + "melee_damage": 10.0, + "melee_speed": 4.0, + "mining_speed": 10.0 + }, + "tconstruct:head": { + "durability": 2200, + "melee_attack": 5.0, + "mining_speed": 10.0, + "mining_tier": "minecraft:iron" + }, + "tconstruct:repair_kit": {} + } +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/stats/polyethylene.json b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/polyethylene.json new file mode 100644 index 000000000..e50bd69c7 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/polyethylene.json @@ -0,0 +1,24 @@ +{ + "stats": { + "tconstruct:binding": {}, + "tconstruct:bowstring": {}, + "tconstruct:grip": { + "accuracy": 10.0, + "durability": 3000.0, + "melee_damage": 20.0 + }, + "tconstruct:handle": { + "durability": 3000.0, + "melee_damage": 10.0, + "melee_speed": 4.0, + "mining_speed": 10.0 + }, + "tconstruct:head": { + "durability": 2200, + "melee_attack": 5.0, + "mining_speed": 10.0, + "mining_tier": "minecraft:iron" + }, + "tconstruct:repair_kit": {} + } +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/stats/polytetrafluoroethylene.json b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/polytetrafluoroethylene.json new file mode 100644 index 000000000..e50bd69c7 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/polytetrafluoroethylene.json @@ -0,0 +1,24 @@ +{ + "stats": { + "tconstruct:binding": {}, + "tconstruct:bowstring": {}, + "tconstruct:grip": { + "accuracy": 10.0, + "durability": 3000.0, + "melee_damage": 20.0 + }, + "tconstruct:handle": { + "durability": 3000.0, + "melee_damage": 10.0, + "melee_speed": 4.0, + "mining_speed": 10.0 + }, + "tconstruct:head": { + "durability": 2200, + "melee_attack": 5.0, + "mining_speed": 10.0, + "mining_tier": "minecraft:iron" + }, + "tconstruct:repair_kit": {} + } +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/stats/red_steel.json b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/red_steel.json new file mode 100644 index 000000000..e50bd69c7 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/red_steel.json @@ -0,0 +1,24 @@ +{ + "stats": { + "tconstruct:binding": {}, + "tconstruct:bowstring": {}, + "tconstruct:grip": { + "accuracy": 10.0, + "durability": 3000.0, + "melee_damage": 20.0 + }, + "tconstruct:handle": { + "durability": 3000.0, + "melee_damage": 10.0, + "melee_speed": 4.0, + "mining_speed": 10.0 + }, + "tconstruct:head": { + "durability": 2200, + "melee_attack": 5.0, + "mining_speed": 10.0, + "mining_tier": "minecraft:iron" + }, + "tconstruct:repair_kit": {} + } +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/stats/rose_gold.json b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/rose_gold.json new file mode 100644 index 000000000..e50bd69c7 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/rose_gold.json @@ -0,0 +1,24 @@ +{ + "stats": { + "tconstruct:binding": {}, + "tconstruct:bowstring": {}, + "tconstruct:grip": { + "accuracy": 10.0, + "durability": 3000.0, + "melee_damage": 20.0 + }, + "tconstruct:handle": { + "durability": 3000.0, + "melee_damage": 10.0, + "melee_speed": 4.0, + "mining_speed": 10.0 + }, + "tconstruct:head": { + "durability": 2200, + "melee_attack": 5.0, + "mining_speed": 10.0, + "mining_tier": "minecraft:iron" + }, + "tconstruct:repair_kit": {} + } +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/stats/rubber.json b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/rubber.json new file mode 100644 index 000000000..e50bd69c7 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/rubber.json @@ -0,0 +1,24 @@ +{ + "stats": { + "tconstruct:binding": {}, + "tconstruct:bowstring": {}, + "tconstruct:grip": { + "accuracy": 10.0, + "durability": 3000.0, + "melee_damage": 20.0 + }, + "tconstruct:handle": { + "durability": 3000.0, + "melee_damage": 10.0, + "melee_speed": 4.0, + "mining_speed": 10.0 + }, + "tconstruct:head": { + "durability": 2200, + "melee_attack": 5.0, + "mining_speed": 10.0, + "mining_tier": "minecraft:iron" + }, + "tconstruct:repair_kit": {} + } +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/stats/silicone_rubber.json b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/silicone_rubber.json new file mode 100644 index 000000000..e50bd69c7 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/silicone_rubber.json @@ -0,0 +1,24 @@ +{ + "stats": { + "tconstruct:binding": {}, + "tconstruct:bowstring": {}, + "tconstruct:grip": { + "accuracy": 10.0, + "durability": 3000.0, + "melee_damage": 20.0 + }, + "tconstruct:handle": { + "durability": 3000.0, + "melee_damage": 10.0, + "melee_speed": 4.0, + "mining_speed": 10.0 + }, + "tconstruct:head": { + "durability": 2200, + "melee_attack": 5.0, + "mining_speed": 10.0, + "mining_tier": "minecraft:iron" + }, + "tconstruct:repair_kit": {} + } +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/stats/stainless_steel.json b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/stainless_steel.json new file mode 100644 index 000000000..e50bd69c7 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/stainless_steel.json @@ -0,0 +1,24 @@ +{ + "stats": { + "tconstruct:binding": {}, + "tconstruct:bowstring": {}, + "tconstruct:grip": { + "accuracy": 10.0, + "durability": 3000.0, + "melee_damage": 20.0 + }, + "tconstruct:handle": { + "durability": 3000.0, + "melee_damage": 10.0, + "melee_speed": 4.0, + "mining_speed": 10.0 + }, + "tconstruct:head": { + "durability": 2200, + "melee_attack": 5.0, + "mining_speed": 10.0, + "mining_tier": "minecraft:iron" + }, + "tconstruct:repair_kit": {} + } +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/stats/steel.json b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/steel.json new file mode 100644 index 000000000..e50bd69c7 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/steel.json @@ -0,0 +1,24 @@ +{ + "stats": { + "tconstruct:binding": {}, + "tconstruct:bowstring": {}, + "tconstruct:grip": { + "accuracy": 10.0, + "durability": 3000.0, + "melee_damage": 20.0 + }, + "tconstruct:handle": { + "durability": 3000.0, + "melee_damage": 10.0, + "melee_speed": 4.0, + "mining_speed": 10.0 + }, + "tconstruct:head": { + "durability": 2200, + "melee_attack": 5.0, + "mining_speed": 10.0, + "mining_tier": "minecraft:iron" + }, + "tconstruct:repair_kit": {} + } +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/stats/sterling_silver.json b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/sterling_silver.json new file mode 100644 index 000000000..e50bd69c7 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/sterling_silver.json @@ -0,0 +1,24 @@ +{ + "stats": { + "tconstruct:binding": {}, + "tconstruct:bowstring": {}, + "tconstruct:grip": { + "accuracy": 10.0, + "durability": 3000.0, + "melee_damage": 20.0 + }, + "tconstruct:handle": { + "durability": 3000.0, + "melee_damage": 10.0, + "melee_speed": 4.0, + "mining_speed": 10.0 + }, + "tconstruct:head": { + "durability": 2200, + "melee_attack": 5.0, + "mining_speed": 10.0, + "mining_tier": "minecraft:iron" + }, + "tconstruct:repair_kit": {} + } +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/stats/styrene_butadiene_rubber.json b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/styrene_butadiene_rubber.json new file mode 100644 index 000000000..e50bd69c7 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/styrene_butadiene_rubber.json @@ -0,0 +1,24 @@ +{ + "stats": { + "tconstruct:binding": {}, + "tconstruct:bowstring": {}, + "tconstruct:grip": { + "accuracy": 10.0, + "durability": 3000.0, + "melee_damage": 20.0 + }, + "tconstruct:handle": { + "durability": 3000.0, + "melee_damage": 10.0, + "melee_speed": 4.0, + "mining_speed": 10.0 + }, + "tconstruct:head": { + "durability": 2200, + "melee_attack": 5.0, + "mining_speed": 10.0, + "mining_tier": "minecraft:iron" + }, + "tconstruct:repair_kit": {} + } +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/stats/titanium.json b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/titanium.json new file mode 100644 index 000000000..e50bd69c7 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/titanium.json @@ -0,0 +1,24 @@ +{ + "stats": { + "tconstruct:binding": {}, + "tconstruct:bowstring": {}, + "tconstruct:grip": { + "accuracy": 10.0, + "durability": 3000.0, + "melee_damage": 20.0 + }, + "tconstruct:handle": { + "durability": 3000.0, + "melee_damage": 10.0, + "melee_speed": 4.0, + "mining_speed": 10.0 + }, + "tconstruct:head": { + "durability": 2200, + "melee_attack": 5.0, + "mining_speed": 10.0, + "mining_tier": "minecraft:iron" + }, + "tconstruct:repair_kit": {} + } +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/stats/trinavine.json b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/trinavine.json new file mode 100644 index 000000000..e50bd69c7 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/trinavine.json @@ -0,0 +1,24 @@ +{ + "stats": { + "tconstruct:binding": {}, + "tconstruct:bowstring": {}, + "tconstruct:grip": { + "accuracy": 10.0, + "durability": 3000.0, + "melee_damage": 20.0 + }, + "tconstruct:handle": { + "durability": 3000.0, + "melee_damage": 10.0, + "melee_speed": 4.0, + "mining_speed": 10.0 + }, + "tconstruct:head": { + "durability": 2200, + "melee_attack": 5.0, + "mining_speed": 10.0, + "mining_tier": "minecraft:iron" + }, + "tconstruct:repair_kit": {} + } +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/stats/tungsten_carbide.json b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/tungsten_carbide.json new file mode 100644 index 000000000..e50bd69c7 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/tungsten_carbide.json @@ -0,0 +1,24 @@ +{ + "stats": { + "tconstruct:binding": {}, + "tconstruct:bowstring": {}, + "tconstruct:grip": { + "accuracy": 10.0, + "durability": 3000.0, + "melee_damage": 20.0 + }, + "tconstruct:handle": { + "durability": 3000.0, + "melee_damage": 10.0, + "melee_speed": 4.0, + "mining_speed": 10.0 + }, + "tconstruct:head": { + "durability": 2200, + "melee_attack": 5.0, + "mining_speed": 10.0, + "mining_tier": "minecraft:iron" + }, + "tconstruct:repair_kit": {} + } +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/stats/tungsten_steel.json b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/tungsten_steel.json new file mode 100644 index 000000000..e50bd69c7 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/tungsten_steel.json @@ -0,0 +1,24 @@ +{ + "stats": { + "tconstruct:binding": {}, + "tconstruct:bowstring": {}, + "tconstruct:grip": { + "accuracy": 10.0, + "durability": 3000.0, + "melee_damage": 20.0 + }, + "tconstruct:handle": { + "durability": 3000.0, + "melee_damage": 10.0, + "melee_speed": 4.0, + "mining_speed": 10.0 + }, + "tconstruct:head": { + "durability": 2200, + "melee_attack": 5.0, + "mining_speed": 10.0, + "mining_tier": "minecraft:iron" + }, + "tconstruct:repair_kit": {} + } +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/stats/ultimet.json b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/ultimet.json new file mode 100644 index 000000000..e50bd69c7 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/ultimet.json @@ -0,0 +1,24 @@ +{ + "stats": { + "tconstruct:binding": {}, + "tconstruct:bowstring": {}, + "tconstruct:grip": { + "accuracy": 10.0, + "durability": 3000.0, + "melee_damage": 20.0 + }, + "tconstruct:handle": { + "durability": 3000.0, + "melee_damage": 10.0, + "melee_speed": 4.0, + "mining_speed": 10.0 + }, + "tconstruct:head": { + "durability": 2200, + "melee_attack": 5.0, + "mining_speed": 10.0, + "mining_tier": "minecraft:iron" + }, + "tconstruct:repair_kit": {} + } +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/stats/vanadium_steel.json b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/vanadium_steel.json new file mode 100644 index 000000000..e50bd69c7 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/vanadium_steel.json @@ -0,0 +1,24 @@ +{ + "stats": { + "tconstruct:binding": {}, + "tconstruct:bowstring": {}, + "tconstruct:grip": { + "accuracy": 10.0, + "durability": 3000.0, + "melee_damage": 20.0 + }, + "tconstruct:handle": { + "durability": 3000.0, + "melee_damage": 10.0, + "melee_speed": 4.0, + "mining_speed": 10.0 + }, + "tconstruct:head": { + "durability": 2200, + "melee_attack": 5.0, + "mining_speed": 10.0, + "mining_tier": "minecraft:iron" + }, + "tconstruct:repair_kit": {} + } +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/stats/wrought_iron.json b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/wrought_iron.json new file mode 100644 index 000000000..e50bd69c7 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/stats/wrought_iron.json @@ -0,0 +1,24 @@ +{ + "stats": { + "tconstruct:binding": {}, + "tconstruct:bowstring": {}, + "tconstruct:grip": { + "accuracy": 10.0, + "durability": 3000.0, + "melee_damage": 20.0 + }, + "tconstruct:handle": { + "durability": 3000.0, + "melee_damage": 10.0, + "melee_speed": 4.0, + "mining_speed": 10.0 + }, + "tconstruct:head": { + "durability": 2200, + "melee_attack": 5.0, + "mining_speed": 10.0, + "mining_tier": "minecraft:iron" + }, + "tconstruct:repair_kit": {} + } +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/traits/aluminium.json b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/aluminium.json new file mode 100644 index 000000000..71f7732a4 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/aluminium.json @@ -0,0 +1,8 @@ +{ + "default": [ + { + "level": 1, + "name": "cosmiccore:wrench_switch" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/traits/blue_steel.json b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/blue_steel.json new file mode 100644 index 000000000..71f7732a4 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/blue_steel.json @@ -0,0 +1,8 @@ +{ + "default": [ + { + "level": 1, + "name": "cosmiccore:wrench_switch" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/traits/bronze.json b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/bronze.json new file mode 100644 index 000000000..71f7732a4 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/bronze.json @@ -0,0 +1,8 @@ +{ + "default": [ + { + "level": 1, + "name": "cosmiccore:wrench_switch" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/traits/cobalt_brass.json b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/cobalt_brass.json new file mode 100644 index 000000000..71f7732a4 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/cobalt_brass.json @@ -0,0 +1,8 @@ +{ + "default": [ + { + "level": 1, + "name": "cosmiccore:wrench_switch" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/traits/damascus_steel.json b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/damascus_steel.json new file mode 100644 index 000000000..71f7732a4 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/damascus_steel.json @@ -0,0 +1,8 @@ +{ + "default": [ + { + "level": 1, + "name": "cosmiccore:wrench_switch" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/traits/duranium.json b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/duranium.json new file mode 100644 index 000000000..71f7732a4 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/duranium.json @@ -0,0 +1,8 @@ +{ + "default": [ + { + "level": 1, + "name": "cosmiccore:wrench_switch" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/traits/hsse.json b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/hsse.json new file mode 100644 index 000000000..71f7732a4 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/hsse.json @@ -0,0 +1,8 @@ +{ + "default": [ + { + "level": 1, + "name": "cosmiccore:wrench_switch" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/traits/invar.json b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/invar.json new file mode 100644 index 000000000..71f7732a4 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/invar.json @@ -0,0 +1,8 @@ +{ + "default": [ + { + "level": 1, + "name": "cosmiccore:wrench_switch" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/traits/iron.json b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/iron.json new file mode 100644 index 000000000..71f7732a4 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/iron.json @@ -0,0 +1,8 @@ +{ + "default": [ + { + "level": 1, + "name": "cosmiccore:wrench_switch" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/traits/naquadah_alloy.json b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/naquadah_alloy.json new file mode 100644 index 000000000..71f7732a4 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/naquadah_alloy.json @@ -0,0 +1,8 @@ +{ + "default": [ + { + "level": 1, + "name": "cosmiccore:wrench_switch" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/traits/netherite.json b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/netherite.json new file mode 100644 index 000000000..71f7732a4 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/netherite.json @@ -0,0 +1,8 @@ +{ + "default": [ + { + "level": 1, + "name": "cosmiccore:wrench_switch" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/traits/neutronite.json b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/neutronite.json new file mode 100644 index 000000000..71f7732a4 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/neutronite.json @@ -0,0 +1,8 @@ +{ + "default": [ + { + "level": 1, + "name": "cosmiccore:wrench_switch" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/traits/neutronium.json b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/neutronium.json new file mode 100644 index 000000000..71f7732a4 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/neutronium.json @@ -0,0 +1,8 @@ +{ + "default": [ + { + "level": 1, + "name": "cosmiccore:wrench_switch" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/traits/polybenzimidazole.json b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/polybenzimidazole.json new file mode 100644 index 000000000..71f7732a4 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/polybenzimidazole.json @@ -0,0 +1,8 @@ +{ + "default": [ + { + "level": 1, + "name": "cosmiccore:wrench_switch" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/traits/polyethylene.json b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/polyethylene.json new file mode 100644 index 000000000..71f7732a4 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/polyethylene.json @@ -0,0 +1,8 @@ +{ + "default": [ + { + "level": 1, + "name": "cosmiccore:wrench_switch" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/traits/polytetrafluoroethylene.json b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/polytetrafluoroethylene.json new file mode 100644 index 000000000..71f7732a4 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/polytetrafluoroethylene.json @@ -0,0 +1,8 @@ +{ + "default": [ + { + "level": 1, + "name": "cosmiccore:wrench_switch" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/traits/red_steel.json b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/red_steel.json new file mode 100644 index 000000000..71f7732a4 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/red_steel.json @@ -0,0 +1,8 @@ +{ + "default": [ + { + "level": 1, + "name": "cosmiccore:wrench_switch" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/traits/rose_gold.json b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/rose_gold.json new file mode 100644 index 000000000..71f7732a4 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/rose_gold.json @@ -0,0 +1,8 @@ +{ + "default": [ + { + "level": 1, + "name": "cosmiccore:wrench_switch" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/traits/rubber.json b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/rubber.json new file mode 100644 index 000000000..71f7732a4 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/rubber.json @@ -0,0 +1,8 @@ +{ + "default": [ + { + "level": 1, + "name": "cosmiccore:wrench_switch" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/traits/silicone_rubber.json b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/silicone_rubber.json new file mode 100644 index 000000000..71f7732a4 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/silicone_rubber.json @@ -0,0 +1,8 @@ +{ + "default": [ + { + "level": 1, + "name": "cosmiccore:wrench_switch" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/traits/stainless_steel.json b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/stainless_steel.json new file mode 100644 index 000000000..71f7732a4 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/stainless_steel.json @@ -0,0 +1,8 @@ +{ + "default": [ + { + "level": 1, + "name": "cosmiccore:wrench_switch" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/traits/steel.json b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/steel.json new file mode 100644 index 000000000..71f7732a4 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/steel.json @@ -0,0 +1,8 @@ +{ + "default": [ + { + "level": 1, + "name": "cosmiccore:wrench_switch" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/traits/sterling_silver.json b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/sterling_silver.json new file mode 100644 index 000000000..71f7732a4 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/sterling_silver.json @@ -0,0 +1,8 @@ +{ + "default": [ + { + "level": 1, + "name": "cosmiccore:wrench_switch" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/traits/styrene_butadiene_rubber.json b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/styrene_butadiene_rubber.json new file mode 100644 index 000000000..71f7732a4 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/styrene_butadiene_rubber.json @@ -0,0 +1,8 @@ +{ + "default": [ + { + "level": 1, + "name": "cosmiccore:wrench_switch" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/traits/titanium.json b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/titanium.json new file mode 100644 index 000000000..71f7732a4 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/titanium.json @@ -0,0 +1,8 @@ +{ + "default": [ + { + "level": 1, + "name": "cosmiccore:wrench_switch" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/traits/trinavine.json b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/trinavine.json new file mode 100644 index 000000000..71f7732a4 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/trinavine.json @@ -0,0 +1,8 @@ +{ + "default": [ + { + "level": 1, + "name": "cosmiccore:wrench_switch" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/traits/tungsten_carbide.json b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/tungsten_carbide.json new file mode 100644 index 000000000..71f7732a4 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/tungsten_carbide.json @@ -0,0 +1,8 @@ +{ + "default": [ + { + "level": 1, + "name": "cosmiccore:wrench_switch" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/traits/tungsten_steel.json b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/tungsten_steel.json new file mode 100644 index 000000000..71f7732a4 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/tungsten_steel.json @@ -0,0 +1,8 @@ +{ + "default": [ + { + "level": 1, + "name": "cosmiccore:wrench_switch" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/traits/ultimet.json b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/ultimet.json new file mode 100644 index 000000000..71f7732a4 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/ultimet.json @@ -0,0 +1,8 @@ +{ + "default": [ + { + "level": 1, + "name": "cosmiccore:wrench_switch" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/traits/vanadium_steel.json b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/vanadium_steel.json new file mode 100644 index 000000000..71f7732a4 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/vanadium_steel.json @@ -0,0 +1,8 @@ +{ + "default": [ + { + "level": 1, + "name": "cosmiccore:wrench_switch" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/materials/traits/wrought_iron.json b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/wrought_iron.json new file mode 100644 index 000000000..71f7732a4 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/materials/traits/wrought_iron.json @@ -0,0 +1,8 @@ +{ + "default": [ + { + "level": 1, + "name": "cosmiccore:wrench_switch" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/modifiers/wrenchModeBehavior.json b/src/generated/resources/data/cosmiccore/tinkering/modifiers/wrenchModeBehavior.json new file mode 100644 index 000000000..c042c4fea --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/modifiers/wrenchModeBehavior.json @@ -0,0 +1,4 @@ +{ + "level_display": "tconstruct:no_levels", + "tooltip_display": "always" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/tool_definitions/screwdriver.json b/src/generated/resources/data/cosmiccore/tinkering/tool_definitions/screwdriver.json new file mode 100644 index 000000000..42fa06d0f --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/tool_definitions/screwdriver.json @@ -0,0 +1,31 @@ +{ + "modules": [ + { + "type": "tconstruct:part_stats", + "parts": [ + "cosmiccore:screwdriver_head", + "tconstruct:tool_handle" + ], + "primary_part": 0 + }, + { + "type": "tconstruct:default_materials", + "materials": [ + { + "type": "tconstruct:random", + "tier": 1 + }, + { + "type": "tconstruct:random", + "tier": 1 + } + ] + }, + { + "type": "tconstruct:base_stats", + "stats": { + "tconstruct:attack_speed": 0.9 + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/tool_definitions/wire_cutter.json b/src/generated/resources/data/cosmiccore/tinkering/tool_definitions/wire_cutter.json new file mode 100644 index 000000000..aed429838 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/tool_definitions/wire_cutter.json @@ -0,0 +1,47 @@ +{ + "modules": [ + { + "type": "tconstruct:part_stats", + "parts": [ + "tconstruct:small_blade", + "tconstruct:small_blade", + "tconstruct:tool_binding", + "tconstruct:tool_handle", + "tconstruct:tool_handle" + ], + "primary_part": 0 + }, + { + "type": "tconstruct:default_materials", + "materials": [ + { + "type": "tconstruct:random", + "tier": 1 + }, + { + "type": "tconstruct:random", + "tier": 1 + }, + { + "type": "tconstruct:random", + "tier": 1 + }, + { + "type": "tconstruct:random", + "tier": 1 + } + ] + }, + { + "type": "tconstruct:base_stats", + "stats": { + "tconstruct:attack_speed": 0.9 + } + }, + { + "type": "tconstruct:is_effective", + "predicate_type": "mantle:tag", + "tag": "forge:mineable/wire_cutter" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/tool_definitions/wrench.json b/src/generated/resources/data/cosmiccore/tinkering/tool_definitions/wrench.json new file mode 100644 index 000000000..a5ca86ab3 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/tool_definitions/wrench.json @@ -0,0 +1,50 @@ +{ + "modules": [ + { + "type": "tconstruct:part_stats", + "parts": [ + "cosmiccore:wrench_head", + "tconstruct:tough_binding", + "tconstruct:tool_handle" + ], + "primary_part": 0 + }, + { + "type": "tconstruct:default_materials", + "materials": [ + { + "type": "tconstruct:random", + "tier": 1 + }, + { + "type": "tconstruct:random", + "tier": 1 + }, + { + "type": "tconstruct:random", + "tier": 1 + } + ] + }, + { + "type": "tconstruct:base_stats", + "stats": { + "tconstruct:attack_speed": 0.9 + } + }, + { + "type": "tconstruct:is_effective", + "predicate_type": "mantle:tag", + "tag": "forge:mineable/wrench" + }, + { + "type": "tconstruct:traits", + "traits": [ + { + "level": 1, + "name": "cosmiccore:wrench_switch" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/tools/screwdrivers.json b/src/generated/resources/data/forge/tags/items/tools/screwdrivers.json new file mode 100644 index 000000000..668f50863 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/tools/screwdrivers.json @@ -0,0 +1,5 @@ +{ + "values": [ + "cosmiccore:screwdriver" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/tools/wire_cutters.json b/src/generated/resources/data/forge/tags/items/tools/wire_cutters.json new file mode 100644 index 000000000..32acf3ab2 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/tools/wire_cutters.json @@ -0,0 +1,5 @@ +{ + "values": [ + "cosmiccore:wire_cutter" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/tools/wrenches.json b/src/generated/resources/data/forge/tags/items/tools/wrenches.json new file mode 100644 index 000000000..303d57f8b --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/tools/wrenches.json @@ -0,0 +1,5 @@ +{ + "values": [ + "cosmiccore:wrench" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/tags/blocks/mineable/pickaxe_or_wrench.json b/src/generated/resources/data/gtceu/tags/blocks/mineable/pickaxe_or_wrench.json index 7d3f647b4..ae665ec46 100644 --- a/src/generated/resources/data/gtceu/tags/blocks/mineable/pickaxe_or_wrench.json +++ b/src/generated/resources/data/gtceu/tags/blocks/mineable/pickaxe_or_wrench.json @@ -22,9 +22,13 @@ "cosmiccore:self_healing_pthanterum_casing", "cosmiccore:cryogenic_casing", "cosmiccore:heavy_frost_proof_casing", + "cosmiccore:soul_stained_steel_aluminium_plated_casing", + "cosmiccore:livingrock_tiles", "cosmiccore:neutronium_buoy", "cosmiccore:pthanterum_wave_breakers", "cosmiccore:cyclozine_high_rigidity_casing", + "cosmiccore:light_dawnstone_casing", + "cosmiccore:reinforced_dawnstone_casing", "cosmiccore:bichromal_nevramite_casing", "cosmiccore:fulgorinth_prime_casing", "cosmiccore:oscillating_gilded_pthanterum_casings", @@ -46,10 +50,18 @@ "cosmiccore:highly_conductive_fission_casing", "cosmiccore:machine_casing_gearbox_pthanterum", "cosmiccore:machine_casing_gearbox_naquadria", + "cosmiccore:rust_weave_casing", + "cosmiccore:rust_stained_casing", + "cosmiccore:somarust_casing", + "cosmiccore:soul_muted_casing", + "cosmiccore:superheavy_steel_casing", + "cosmiccore:rigid_high_speed_steel_casing", + "cosmiccore:bolted_heavy_frame_casing", "cosmiccore:heat_fan", "cosmiccore:ludicrious_intake", "cosmiccore:ultimate_intake", "cosmiccore:radioactive_filter_casing", - "cosmiccore:zblan_glass" + "cosmiccore:zblan_glass", + "cosmiccore:moth_station_casing" ] } \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/tags/items/circuits/ev.json b/src/generated/resources/data/gtceu/tags/items/circuits/ev.json index 56ae0fdf9..f3b41f8c9 100644 --- a/src/generated/resources/data/gtceu/tags/items/circuits/ev.json +++ b/src/generated/resources/data/gtceu/tags/items/circuits/ev.json @@ -1,5 +1,8 @@ { "values": [ + "cosmiccore:hex_processor_supercomputer", + "cosmiccore:enthelic_processor_assembly", + "cosmiccore:lucidic_processor", "cosmiccore:omnia_circuit_ev" ] } \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/tags/items/circuits/hv.json b/src/generated/resources/data/gtceu/tags/items/circuits/hv.json index cf6a8f6b4..c6f3eebe0 100644 --- a/src/generated/resources/data/gtceu/tags/items/circuits/hv.json +++ b/src/generated/resources/data/gtceu/tags/items/circuits/hv.json @@ -1,5 +1,7 @@ { "values": [ + "cosmiccore:hex_processor_assembly", + "cosmiccore:enthelic_processor", "cosmiccore:omnia_circuit_hv" ] } \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/tags/items/circuits/iv.json b/src/generated/resources/data/gtceu/tags/items/circuits/iv.json index 8c61ec6b4..43c916ef7 100644 --- a/src/generated/resources/data/gtceu/tags/items/circuits/iv.json +++ b/src/generated/resources/data/gtceu/tags/items/circuits/iv.json @@ -1,5 +1,8 @@ { "values": [ + "cosmiccore:hex_processor_mainframe", + "cosmiccore:enthelic_processor_supercomputer", + "cosmiccore:lucidic_processor_assembly", "cosmiccore:omnia_circuit_iv" ] } \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/tags/items/circuits/luv.json b/src/generated/resources/data/gtceu/tags/items/circuits/luv.json index 842328f32..e97da6616 100644 --- a/src/generated/resources/data/gtceu/tags/items/circuits/luv.json +++ b/src/generated/resources/data/gtceu/tags/items/circuits/luv.json @@ -1,5 +1,7 @@ { "values": [ + "cosmiccore:enthelic_processor_mainframe", + "cosmiccore:lucidic_processor_supercomputer", "cosmiccore:omnia_circuit_luv" ] } \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/tags/items/circuits/mv.json b/src/generated/resources/data/gtceu/tags/items/circuits/mv.json index a05b15817..d6bcb8516 100644 --- a/src/generated/resources/data/gtceu/tags/items/circuits/mv.json +++ b/src/generated/resources/data/gtceu/tags/items/circuits/mv.json @@ -1,5 +1,6 @@ { "values": [ + "cosmiccore:hex_processor", "cosmiccore:omnia_circuit_mv" ] } \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/tags/items/circuits/zpm.json b/src/generated/resources/data/gtceu/tags/items/circuits/zpm.json index 8f82fce13..ff1700a0a 100644 --- a/src/generated/resources/data/gtceu/tags/items/circuits/zpm.json +++ b/src/generated/resources/data/gtceu/tags/items/circuits/zpm.json @@ -1,5 +1,6 @@ { "values": [ + "cosmiccore:lucidic_processor_mainframe", "cosmiccore:omnia_circuit_zpm" ] } \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/tags/items/ppe_armor.json b/src/generated/resources/data/gtceu/tags/items/ppe_armor.json index f1443011c..a8fdc54be 100644 --- a/src/generated/resources/data/gtceu/tags/items/ppe_armor.json +++ b/src/generated/resources/data/gtceu/tags/items/ppe_armor.json @@ -2,6 +2,10 @@ "values": [ "cosmiccore:sanguine_warptech_helmet", "cosmiccore:sanguine_warptech_leggings", - "cosmiccore:sanguine_warptech_boots" + "cosmiccore:sanguine_warptech_boots", + "cosmiccore:hydraulic_boots", + "cosmiccore:nano_boots", + "cosmiccore:quark_boots", + "cosmiccore:sanguine_boots" ] } \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/tags/items/tools/crafting_screwdrivers.json b/src/generated/resources/data/gtceu/tags/items/tools/crafting_screwdrivers.json new file mode 100644 index 000000000..668f50863 --- /dev/null +++ b/src/generated/resources/data/gtceu/tags/items/tools/crafting_screwdrivers.json @@ -0,0 +1,5 @@ +{ + "values": [ + "cosmiccore:screwdriver" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/tags/items/tools/crafting_wire_cutters.json b/src/generated/resources/data/gtceu/tags/items/tools/crafting_wire_cutters.json new file mode 100644 index 000000000..32acf3ab2 --- /dev/null +++ b/src/generated/resources/data/gtceu/tags/items/tools/crafting_wire_cutters.json @@ -0,0 +1,5 @@ +{ + "values": [ + "cosmiccore:wire_cutter" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/tags/items/tools/crafting_wrenches.json b/src/generated/resources/data/gtceu/tags/items/tools/crafting_wrenches.json new file mode 100644 index 000000000..303d57f8b --- /dev/null +++ b/src/generated/resources/data/gtceu/tags/items/tools/crafting_wrenches.json @@ -0,0 +1,5 @@ +{ + "values": [ + "cosmiccore:wrench" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json new file mode 100644 index 000000000..3115ef3b9 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json @@ -0,0 +1,40 @@ +{ + "values": [ + "cosmiccore:ethersteel_plated_ash_tiles", + "cosmiccore:steel_rose_light", + "cosmiccore:steel_rose_light_stairs", + "cosmiccore:steel_rose_light_slab", + "cosmiccore:iron_plated_deepslate_tile", + "cosmiccore:iron_plated_deepslate_tile_stairs", + "cosmiccore:iron_plated_deepslate_tile_slab", + "cosmiccore:steam_ember_receptor", + "cosmiccore:lv_ember_receptor", + "cosmiccore:mv_ember_receptor", + "cosmiccore:hv_ember_receptor", + "cosmiccore:ev_ember_receptor", + "cosmiccore:iv_ember_receptor", + "cosmiccore:luv_ember_receptor", + "cosmiccore:zpm_ember_receptor", + "cosmiccore:uv_ember_receptor", + "cosmiccore:uhv_ember_receptor", + "cosmiccore:uev_ember_receptor", + "cosmiccore:uxv_ember_receptor", + "cosmiccore:opv_ember_receptor", + "cosmiccore:max_ember_receptor", + "cosmiccore:steam_ember_emitter", + "cosmiccore:lv_ember_emitter", + "cosmiccore:mv_ember_emitter", + "cosmiccore:hv_ember_emitter", + "cosmiccore:ev_ember_emitter", + "cosmiccore:iv_ember_emitter", + "cosmiccore:luv_ember_emitter", + "cosmiccore:zpm_ember_emitter", + "cosmiccore:uv_ember_emitter", + "cosmiccore:uhv_ember_emitter", + "cosmiccore:uev_ember_emitter", + "cosmiccore:uiv_ember_emitter", + "cosmiccore:uxv_ember_emitter", + "cosmiccore:opv_ember_emitter", + "cosmiccore:max_ember_emitter" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/shovel.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/shovel.json new file mode 100644 index 000000000..3bccf05a6 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/shovel.json @@ -0,0 +1,5 @@ +{ + "values": [ + "cosmiccore:steel_rose_lantern" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/items/cluster_max_harvestables.json b/src/generated/resources/data/minecraft/tags/items/cluster_max_harvestables.json new file mode 100644 index 000000000..46e488c48 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/items/cluster_max_harvestables.json @@ -0,0 +1,7 @@ +{ + "values": [ + "cosmiccore:wire_cutter", + "cosmiccore:wrench", + "cosmiccore:screwdriver" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/tconstruct/tags/items/modifiable/aoe.json b/src/generated/resources/data/tconstruct/tags/items/modifiable/aoe.json new file mode 100644 index 000000000..46e488c48 --- /dev/null +++ b/src/generated/resources/data/tconstruct/tags/items/modifiable/aoe.json @@ -0,0 +1,7 @@ +{ + "values": [ + "cosmiccore:wire_cutter", + "cosmiccore:wrench", + "cosmiccore:screwdriver" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/tconstruct/tags/items/modifiable/bonus_slots.json b/src/generated/resources/data/tconstruct/tags/items/modifiable/bonus_slots.json new file mode 100644 index 000000000..46e488c48 --- /dev/null +++ b/src/generated/resources/data/tconstruct/tags/items/modifiable/bonus_slots.json @@ -0,0 +1,7 @@ +{ + "values": [ + "cosmiccore:wire_cutter", + "cosmiccore:wrench", + "cosmiccore:screwdriver" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/tconstruct/tags/items/modifiable/durability.json b/src/generated/resources/data/tconstruct/tags/items/modifiable/durability.json new file mode 100644 index 000000000..46e488c48 --- /dev/null +++ b/src/generated/resources/data/tconstruct/tags/items/modifiable/durability.json @@ -0,0 +1,7 @@ +{ + "values": [ + "cosmiccore:wire_cutter", + "cosmiccore:wrench", + "cosmiccore:screwdriver" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/tconstruct/tags/items/modifiable/harvest/primary.json b/src/generated/resources/data/tconstruct/tags/items/modifiable/harvest/primary.json new file mode 100644 index 000000000..46e488c48 --- /dev/null +++ b/src/generated/resources/data/tconstruct/tags/items/modifiable/harvest/primary.json @@ -0,0 +1,7 @@ +{ + "values": [ + "cosmiccore:wire_cutter", + "cosmiccore:wrench", + "cosmiccore:screwdriver" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/tconstruct/tags/items/modifiable/interactable/right.json b/src/generated/resources/data/tconstruct/tags/items/modifiable/interactable/right.json new file mode 100644 index 000000000..46e488c48 --- /dev/null +++ b/src/generated/resources/data/tconstruct/tags/items/modifiable/interactable/right.json @@ -0,0 +1,7 @@ +{ + "values": [ + "cosmiccore:wire_cutter", + "cosmiccore:wrench", + "cosmiccore:screwdriver" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/tconstruct/tags/items/modifiable/melee/weapon.json b/src/generated/resources/data/tconstruct/tags/items/modifiable/melee/weapon.json new file mode 100644 index 000000000..46e488c48 --- /dev/null +++ b/src/generated/resources/data/tconstruct/tags/items/modifiable/melee/weapon.json @@ -0,0 +1,7 @@ +{ + "values": [ + "cosmiccore:wire_cutter", + "cosmiccore:wrench", + "cosmiccore:screwdriver" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/tconstruct/tags/items/modifiable/multipart.json b/src/generated/resources/data/tconstruct/tags/items/modifiable/multipart.json new file mode 100644 index 000000000..46e488c48 --- /dev/null +++ b/src/generated/resources/data/tconstruct/tags/items/modifiable/multipart.json @@ -0,0 +1,7 @@ +{ + "values": [ + "cosmiccore:wire_cutter", + "cosmiccore:wrench", + "cosmiccore:screwdriver" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/tconstruct/tags/items/modifiable/small.json b/src/generated/resources/data/tconstruct/tags/items/modifiable/small.json new file mode 100644 index 000000000..46e488c48 --- /dev/null +++ b/src/generated/resources/data/tconstruct/tags/items/modifiable/small.json @@ -0,0 +1,7 @@ +{ + "values": [ + "cosmiccore:wire_cutter", + "cosmiccore:wrench", + "cosmiccore:screwdriver" + ] +} \ No newline at end of file diff --git a/src/main/java/com/ghostipedia/cosmiccore/CosmicCore.java b/src/main/java/com/ghostipedia/cosmiccore/CosmicCore.java index b7795432f..928068b3a 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/CosmicCore.java +++ b/src/main/java/com/ghostipedia/cosmiccore/CosmicCore.java @@ -3,6 +3,7 @@ import com.ghostipedia.cosmiccore.api.capability.CosmicCapabilities; import com.ghostipedia.cosmiccore.api.item.LinkedTerminalBehavior; import com.ghostipedia.cosmiccore.api.pattern.CosmicPredicates; +import com.ghostipedia.cosmiccore.api.recipe.ingredient.TinkerIngredient; import com.ghostipedia.cosmiccore.api.recipe.lookup.MapEmberIngredient; import com.ghostipedia.cosmiccore.api.recipe.lookup.MapSoulIngredient; import com.ghostipedia.cosmiccore.api.registries.CosmicRegistration; @@ -11,7 +12,13 @@ import com.ghostipedia.cosmiccore.common.data.materials.CosmicMaterialSet; import com.ghostipedia.cosmiccore.common.data.materials.CosmicMaterials; import com.ghostipedia.cosmiccore.common.item.behavior.GravityCoreBehavior; +import com.ghostipedia.cosmiccore.common.item.tcon.*; +import com.ghostipedia.cosmiccore.common.item.tcon.CosmicTconBlockTagProvider; +import com.ghostipedia.cosmiccore.common.item.tcon.CosmicTconItemTagProvider; +import com.ghostipedia.cosmiccore.common.item.tcon.CosmicTinkerTools; +import com.ghostipedia.cosmiccore.common.item.tcon.CosmicToolDefinitionProvider; import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.modular.MultiblockInit; +import com.ghostipedia.cosmiccore.common.mob.DimensionMobScaling; import com.ghostipedia.cosmiccore.common.network.CCoreNetwork; import com.ghostipedia.cosmiccore.common.recipe.condition.CosmicConditions; import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; @@ -31,8 +38,13 @@ import com.lowdragmc.lowdraglib.Platform; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.PackOutput; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.common.capabilities.RegisterCapabilitiesEvent; +import net.minecraftforge.common.crafting.CraftingHelper; +import net.minecraftforge.common.data.ExistingFileHelper; +import net.minecraftforge.data.event.GatherDataEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; @@ -75,17 +87,37 @@ public static void init() { CosmicBlocks.init(); CosmicBlockEntities.init(); CosmicItems.init(); + CosmicTinkerTools.init(); + CosmicTinkerToolPart.init(); CosmicBotanyItemRegistration.init(); CosmicRegistration.REGISTRATE.registerRegistrate(); CosmicCoreDatagen.init(); CosmicPredicates.init(); CosmicMaterialSet.init(); + // Register bargains early so they're available on both client and server + CosmicBargains.init(); + CosmicCreativeModeTabs.init(); } public static ResourceLocation id(String path) { return new ResourceLocation(MOD_ID, path); } + @SubscribeEvent + public void gatherDataEvent(GatherDataEvent event) { + DataGenerator generator = event.getGenerator(); + PackOutput packOutput = generator.getPackOutput(); + ExistingFileHelper existingFileHelper = event.getExistingFileHelper(); + boolean server = event.includeServer(); + boolean client = event.includeClient(); + CosmicTconBlockTagProvider blockTags = new CosmicTconBlockTagProvider(packOutput, event.getLookupProvider(), + existingFileHelper); + generator.addProvider(server, blockTags); + generator.addProvider(server, new CosmicToolDefinitionProvider(packOutput)); + generator.addProvider(server, new CosmicTconItemTagProvider(packOutput, event.getLookupProvider(), + blockTags.contentsGetter(), existingFileHelper)); + } + @SubscribeEvent public void registerMaterialRegistry(MaterialRegistryEvent event) { MATERIAL_REGISTRY = GTCEuAPI.materialManager.createRegistry(CosmicCore.MOD_ID); @@ -104,10 +136,14 @@ public void modifyExistingMaterials(PostMaterialEvent event) { @SubscribeEvent public void commonSetup(FMLCommonSetupEvent event) { event.enqueueWork(() -> { + TinkersMaterials.init(); MapIngredientTypeManager.registerMapIngredient(Integer.class, MapSoulIngredient::convertToMapIngredient); MapIngredientTypeManager.registerMapIngredient(Double.class, MapEmberIngredient::convertToMapIngredient); GridLinkables.register(CosmicItems.LINKED_TERMINAL, LinkedTerminalBehavior.handler); + CraftingHelper.register(TinkerIngredient.TYPE, TinkerIngredient.SERIALIZER); CCoreNetwork.init(); + OxygenRules.registerAirRanges(); + DimensionMobScaling.registerScaling(); }); } diff --git a/src/main/java/com/ghostipedia/cosmiccore/CosmicCoreForestryAddon.java b/src/main/java/com/ghostipedia/cosmiccore/CosmicCoreForestryAddon.java new file mode 100644 index 000000000..5d09967bb --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/CosmicCoreForestryAddon.java @@ -0,0 +1,14 @@ +package com.ghostipedia.cosmiccore; + +import net.minecraft.resources.ResourceLocation; + +import forestry.api.modules.IForestryModule; +import org.jetbrains.annotations.NotNull; + +public class CosmicCoreForestryAddon implements IForestryModule { + + @Override + public @NotNull ResourceLocation getId() { + return CosmicCore.id("core/cosmicore"); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/CosmicCoreGTAddon.java b/src/main/java/com/ghostipedia/cosmiccore/CosmicCoreGTAddon.java index f0ef76da7..cdf2036b1 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/CosmicCoreGTAddon.java +++ b/src/main/java/com/ghostipedia/cosmiccore/CosmicCoreGTAddon.java @@ -7,6 +7,7 @@ import com.ghostipedia.cosmiccore.common.data.materials.CosmicElements; import com.ghostipedia.cosmiccore.common.data.recipe.CosmicCoreOreRecipeHandler; import com.ghostipedia.cosmiccore.common.data.recipe.CosmicMaterialRecipeHandlers; +import com.ghostipedia.cosmiccore.common.data.recipe.TinkersRecipeTest; import com.ghostipedia.cosmiccore.gtbridge.CosmicCoreRecipes; import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; @@ -65,6 +66,7 @@ public void addRecipes(Consumer provider) { CosmicCoreOreRecipeHandler.init(provider, material); CosmicMaterialRecipeHandlers.init(provider, material); } + TinkersRecipeTest.init(provider); } @Override diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/CosmicGuiTextures.java b/src/main/java/com/ghostipedia/cosmiccore/api/CosmicGuiTextures.java index a81846507..a274d622a 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/api/CosmicGuiTextures.java +++ b/src/main/java/com/ghostipedia/cosmiccore/api/CosmicGuiTextures.java @@ -6,8 +6,17 @@ public class CosmicGuiTextures { public static final ResourceTexture PLANT_OVERLAY = new ResourceTexture( "cosmiccore:textures/gui/overlay/crop_overlay.png"); + public static final ResourceTexture BEE_OVERLAY = new ResourceTexture( + "cosmiccore:textures/gui/overlay/bee_overlay.png"); + public static final ResourceTexture BEE_HOLDER_OVERLAY = new ResourceTexture( + "cosmiccore:textures/gui/overlay/overlay_bee_holder.png"); + public static final ResourceTexture SIGILI_PROGRESS_BAR = new ResourceTexture( "cosmiccore:textures/gui/overlay/sigil_overlay.png"); public static final ResourceTexture PROGRESS_BAR_HEAVY = new ResourceTexture( "cosmiccore:textures/gui/overlay/progress_bar_heavy_assembler.png"); + public static final ResourceTexture DAWN_FORGE = new ResourceTexture( + "cosmiccore:textures/gui/overlay/explosive_overlay.png"); + public static final ResourceTexture DAWN_FORGE_SLOT = new ResourceTexture( + "cosmiccore:textures/gui/overlay/dawnforge_slot.png"); } diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/capability/CosmicCapabilities.java b/src/main/java/com/ghostipedia/cosmiccore/api/capability/CosmicCapabilities.java index 615f7bc62..734aa683f 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/api/capability/CosmicCapabilities.java +++ b/src/main/java/com/ghostipedia/cosmiccore/api/capability/CosmicCapabilities.java @@ -10,7 +10,11 @@ public class CosmicCapabilities { public static Capability CAPABILITY_SOUL_CONTAINER = CapabilityManager .get(new CapabilityToken<>() {}); + public static Capability CAPABILITY_TELEPORT_ORIGIN = CapabilityManager + .get(new CapabilityToken<>() {}); + public static void register(RegisterCapabilitiesEvent event) { event.register(ISoulContainer.class); + event.register(ITeleportOrigin.class); } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/capability/ILinkedMultiblock.java b/src/main/java/com/ghostipedia/cosmiccore/api/capability/ILinkedMultiblock.java new file mode 100644 index 000000000..6b534d57b --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/capability/ILinkedMultiblock.java @@ -0,0 +1,107 @@ +package com.ghostipedia.cosmiccore.api.capability; + +import com.gregtechceu.gtceu.api.machine.feature.IDataStickInteractable; + +import net.minecraft.core.GlobalPos; + +import org.jetbrains.annotations.Nullable; + +import java.util.Set; +import java.util.UUID; + +/** + * Interface for multiblocks that support cross-dimensional linking. + * Extends GTCEu's IDataStickInteractable for datastick-based linking. + *

+ * SECURITY: Link validation MUST load and verify the partner machine. + * Never trust datastick NBT for ownership or compatibility checks. + */ +public interface ILinkedMultiblock extends IDataStickInteractable { + + /** + * Role this machine prefers in links it creates. + * Actual role is determined by negotiation with partner. + */ + enum LinkRole { + /** Bidirectional - both machines can query each other */ + PEER, + /** This machine controls partners - can query them, they cannot query us */ + CONTROLLER, + /** This machine is controlled by partners - they can query us, we cannot query them */ + REMOTE + } + + // ==================== Configuration ==================== + + /** + * Check if this machine can link to the given partner. + * Called AFTER partner machine is loaded and ownership is verified. + * Called AFTER role negotiation succeeds. + *

+ * Use for type compatibility, distance limits, dimension restrictions, etc. + * Ownership and role checks are handled by the linking system. + * + * @param partner The partner's position + * @param partnerMachine The actual loaded partner machine + */ + boolean canLinkTo(GlobalPos partner, ILinkedMultiblock partnerMachine); + + /** + * Get the role this machine prefers when linking. + * Actual effective role is determined by negotiation. + * + * @see com.ghostipedia.cosmiccore.common.machine.multiblock.LinkedMultiblockHelper#negotiateRoles + */ + LinkRole getLinkRole(); + + /** + * Maximum number of partners this machine can link to. + * Default: 4 + */ + default int getMaxPartners() { + return 4; + } + + // ==================== Lifecycle ==================== + + /** + * Called when a link is successfully established. + * May be called immediately (if partner loaded) or deferred (on this machine's load). + * + * @param partner The linked partner's position + */ + void onLinkEstablished(GlobalPos partner); + + /** + * Called when a link is broken. + * Reasons: partner destroyed, manual unlink, ownership change, etc. + * + * @param partner The unlinked partner's position + */ + void onLinkBroken(GlobalPos partner); + + /** + * Called during machine load to process deferred link notifications. + * Implementation should compare SavedData links vs known partners. + */ + void processLinkNotifications(); + + // ==================== Query ==================== + + /** + * Get all currently linked partners from SavedData. + */ + Set getLinkedPartners(); + + /** + * Get this machine's GlobalPos for link registration. + */ + GlobalPos getGlobalPos(); + + /** + * Get the owner UUID (team or player) for access control. + * Should use FTB Teams integration via existing getTeamUUID() pattern. + */ + @Nullable + UUID getTeamUUID(); +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/capability/ITeleportOrigin.java b/src/main/java/com/ghostipedia/cosmiccore/api/capability/ITeleportOrigin.java new file mode 100644 index 000000000..fb30e2e44 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/capability/ITeleportOrigin.java @@ -0,0 +1,27 @@ +package com.ghostipedia.cosmiccore.api.capability; + +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; + +// Capability for storing teleportation origin of a player. +public interface ITeleportOrigin { + + void setOriginDimension(ResourceKey dimension); // Set the origin dimension the player teleported from. + + ResourceKey getOriginDimension(); // Get the origin dimension, or null if not set. + + void setOriginPosition(Vec3 position); // Set the origin position the player teleported from. + + Vec3 getOriginPosition(); // Get the origin position, or null if not set. + + void setOriginRotation(float yaw, float pitch); // Set the player's rotation when they teleported. + + float getOriginYaw(); // Get the origin yaw rotation. + + float getOriginPitch(); // Get the origin pitch rotation. + + boolean hasValidOrigin(); // Check if this player has valid origin data. + + void clearOriginData(); // Clear all origin data. +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/capability/recipe/EmberRecipeCapability.java b/src/main/java/com/ghostipedia/cosmiccore/api/capability/recipe/EmberRecipeCapability.java index 173d0bb69..ad6ab3a5c 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/api/capability/recipe/EmberRecipeCapability.java +++ b/src/main/java/com/ghostipedia/cosmiccore/api/capability/recipe/EmberRecipeCapability.java @@ -1,7 +1,10 @@ package com.ghostipedia.cosmiccore.api.capability.recipe; +import com.ghostipedia.cosmiccore.api.machine.trait.NotifiableEmberContainer; import com.ghostipedia.cosmiccore.api.recipe.lookup.MapEmberIngredient; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.capability.recipe.IRecipeCapabilityHolder; import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.content.Content; @@ -52,6 +55,56 @@ public List compressIngredients(Collection ingredients) { return super.compressIngredients(ingredients); } + private static double getInputContents(IRecipeCapabilityHolder holder) { + var handlerLists = holder.getCapabilitiesForIO(IO.IN); + if (handlerLists.isEmpty()) return 0d; + + double total = 0d; + + for (var handlerList : handlerLists) { + if (!handlerList.hasCapability(EmberRecipeCapability.CAP)) continue; + var emberHandlers = handlerList.getCapability(EmberRecipeCapability.CAP); + for (var handler : emberHandlers) { + var emberHandler = (NotifiableEmberContainer) handler; + for (var content : handler.getContents()) { + // At most, an ember hatch can contribute the minimum of the max allowed consumption per tick, or + // the current amount stored + total += Math.min((double) content, emberHandler.getMaxConsumption()); + } + } + } + return total; + } + + @Override + public int getMaxParallelByInput(IRecipeCapabilityHolder holder, GTRecipe recipe, int limit, boolean tick) { + if (!holder.hasCapabilityProxies()) return 0; + + var inputs = (tick ? recipe.tickInputs : recipe.inputs).get(this); + if (inputs == null || inputs.isEmpty()) return limit; + + double totalEmberInHatches = getInputContents(holder); + if (totalEmberInHatches == 0) return 0; + + var nonConsumable = 0d; + var consumable = 0d; + for (Content content : inputs) { + double required = (double) content.content; + + if (content.chance == 0) { + nonConsumable += required; + } else { + consumable += required; + } + } + + if (consumable == 0 && nonConsumable == 0) return limit; + + if (nonConsumable > totalEmberInHatches) return 0; + if (consumable == 0) return limit; + return (int) Math.min(limit, (totalEmberInHatches - nonConsumable) / consumable); + } + @Override public boolean isRecipeSearchFilter() { return true; diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/data/CosmicCoreMaterialIconType.java b/src/main/java/com/ghostipedia/cosmiccore/api/data/CosmicCoreMaterialIconType.java index b822aa770..9bcb6cfbd 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/api/data/CosmicCoreMaterialIconType.java +++ b/src/main/java/com/ghostipedia/cosmiccore/api/data/CosmicCoreMaterialIconType.java @@ -4,6 +4,7 @@ public class CosmicCoreMaterialIconType { + public static final MaterialIconType rawOreCubic = new MaterialIconType("rawOreCubic"); public static final MaterialIconType crushedLeached = new MaterialIconType("crushedLeached"); public static final MaterialIconType prismaFrothed = new MaterialIconType("prismaFrothed"); public static final MaterialIconType ultraDense = new MaterialIconType("ultraDense"); diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/data/CosmicTagPrefix.java b/src/main/java/com/ghostipedia/cosmiccore/api/data/CosmicTagPrefix.java index 07f826bd2..b291c6892 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/api/data/CosmicTagPrefix.java +++ b/src/main/java/com/ghostipedia/cosmiccore/api/data/CosmicTagPrefix.java @@ -28,6 +28,7 @@ public class CosmicTagPrefix { public static TagPrefix largeWireSpool; public static TagPrefix alveFoilInsulator; public static TagPrefix shapeMemoryFoil; + public static TagPrefix rawOreCubic; public static final TagKey STAR_LADDER_BLOCKS = TagUtil.createBlockTag("starladder_blocks"); public static final TagKey STAR_LADDER_ITEMS = TagUtil.createItemTag("starladder_items"); @@ -41,6 +42,15 @@ public class CosmicTagPrefix { .hasFlag(MaterialFlags.GENERATE_FINE_WIRE); public static void initTagPrefixes() { + rawOreCubic = new TagPrefix("rawOreCubic") + .idPattern("raw_%s_cubic_ore") + .defaultTagPath("cubic_ores/%s") + .defaultTagPath("cubic_ores") + .materialIconType(CosmicCoreMaterialIconType.rawOreCubic) + .unificationEnabled(true) + .generateItem(true) + .generationCondition(hasOreProperty); + crushedLeached = new TagPrefix("leachedOre") .idPattern("leached_%s_ore") .defaultTagPath("leached_ores/%s") @@ -125,6 +135,6 @@ public static void initTagPrefixes() { .unificationEnabled(true) .generateItem(true) .maxStackSize(64) - .generationCondition(hasPlateProp.and(hasWireProp).and(hasBoltProp)); + .generationCondition(hasPlateProp.and(hasBoltProp)); } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/data/DebugBlockPattern.java b/src/main/java/com/ghostipedia/cosmiccore/api/data/DebugBlockPattern.java index 2e3ad66a4..aaeb92c00 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/api/data/DebugBlockPattern.java +++ b/src/main/java/com/ghostipedia/cosmiccore/api/data/DebugBlockPattern.java @@ -4,12 +4,15 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.registries.ForgeRegistries; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; @@ -19,9 +22,11 @@ public class DebugBlockPattern { public String[][] pattern; public int[][] aisleRepetitions; public Map> symbolMap; + public Map charToBlockMap; public DebugBlockPattern() { symbolMap = new HashMap<>(); + charToBlockMap = new LinkedHashMap<>(); structureDir = new RelativeDirection[] { RelativeDirection.LEFT, RelativeDirection.UP, RelativeDirection.FRONT }; @@ -39,6 +44,7 @@ public DebugBlockPattern( Map map = new HashMap<>(); map.put(Blocks.AIR.defaultBlockState(), ' '); + charToBlockMap.put(' ', ForgeRegistries.BLOCKS.getKey(Blocks.AIR)); char c = 'A'; // auto @@ -52,6 +58,8 @@ public DebugBlockPattern( map.put(state, c); String name = String.valueOf(c); symbolMap.computeIfAbsent(c, key -> new HashSet<>()).add(name); // any + ResourceLocation blockKey = ForgeRegistries.BLOCKS.getKey(state.getBlock()); + charToBlockMap.put(c, blockKey); c++; } builder.append(map.get(state)); @@ -207,6 +215,7 @@ public DebugBlockPattern copy() { } symbolMap.forEach((k, v) -> newPattern.symbolMap.put(k, new HashSet<>(v))); + newPattern.charToBlockMap.putAll(this.charToBlockMap); return newPattern; } diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/data/material/property/CCoreMaterialIconSet.java b/src/main/java/com/ghostipedia/cosmiccore/api/data/material/property/CCoreMaterialIconSet.java index c53138ecc..d4fcf789e 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/api/data/material/property/CCoreMaterialIconSet.java +++ b/src/main/java/com/ghostipedia/cosmiccore/api/data/material/property/CCoreMaterialIconSet.java @@ -55,6 +55,12 @@ public CCoreMaterialIconSet(String name, MaterialIconSet parentIconset, boolean true, false)); + public static final CCoreMaterialIconSet CHRONIC = new CCoreMaterialIconSet("chronic", CosmicMaterialSet.CHRONON, + false, + HaloItemRenderer.create(8, 0xFF1c1926, new ResourceLocation(CosmicCore.MOD_ID, "block/iris/rnd/time_halo"), + true, + false)); + public static final CCoreMaterialIconSet VOIDSPARKICO = new CCoreMaterialIconSet("voidspark_special", CosmicMaterialSet.VOIDSPARK, false, HaloItemRenderer.create(4, 0xFFFFFFFF, diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/data/savedData/LinkEntry.java b/src/main/java/com/ghostipedia/cosmiccore/api/data/savedData/LinkEntry.java new file mode 100644 index 000000000..742522fc7 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/data/savedData/LinkEntry.java @@ -0,0 +1,79 @@ +package com.ghostipedia.cosmiccore.api.data.savedData; + +import com.ghostipedia.cosmiccore.api.capability.ILinkedMultiblock.LinkRole; + +import net.minecraft.core.GlobalPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtOps; + +import java.util.Objects; + +/** + * Represents one end of a link from this machine's perspective. + * Stores the target position and this machine's EFFECTIVE role + * (after negotiation, not declared role). + */ +public final class LinkEntry { + + private static final String TAG_TARGET = "Target"; + private static final String TAG_ROLE = "Role"; + + private final GlobalPos target; + private final LinkRole effectiveRole; + + public LinkEntry(GlobalPos target, LinkRole effectiveRole) { + this.target = target; + this.effectiveRole = effectiveRole; + } + + public GlobalPos target() { + return target; + } + + public LinkRole effectiveRole() { + return effectiveRole; + } + + public CompoundTag save() { + CompoundTag tag = new CompoundTag(); + GlobalPos.CODEC.encodeStart(NbtOps.INSTANCE, target) + .result() + .ifPresent(encoded -> tag.put(TAG_TARGET, encoded)); + tag.putString(TAG_ROLE, effectiveRole.name()); + return tag; + } + + public static LinkEntry load(CompoundTag tag) { + GlobalPos target = GlobalPos.CODEC + .decode(NbtOps.INSTANCE, tag.get(TAG_TARGET)) + .result() + .map(pair -> pair.getFirst()) + .orElseThrow(() -> new IllegalStateException("Invalid LinkEntry: missing target")); + + LinkRole role = LinkRole.valueOf(tag.getString(TAG_ROLE)); + return new LinkEntry(target, role); + } + + /** + * Equality is based ONLY on target, not role. + * This ensures only one link per target in a Set, and re-linking + * with a different role will replace the existing entry. + */ + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + LinkEntry linkEntry = (LinkEntry) o; + return Objects.equals(target, linkEntry.target); + } + + @Override + public int hashCode() { + return Objects.hash(target); + } + + @Override + public String toString() { + return "LinkEntry{target=" + target + ", role=" + effectiveRole + "}"; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/data/savedData/LinkedMultiblockSavedData.java b/src/main/java/com/ghostipedia/cosmiccore/api/data/savedData/LinkedMultiblockSavedData.java new file mode 100644 index 000000000..44ae168c5 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/data/savedData/LinkedMultiblockSavedData.java @@ -0,0 +1,297 @@ +package com.ghostipedia.cosmiccore.api.data.savedData; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.capability.ILinkedMultiblock.LinkRole; + +import net.minecraft.core.GlobalPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.NbtOps; +import net.minecraft.nbt.Tag; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.saveddata.SavedData; + +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +/** + * Persists multiblock link relationships across server restarts. + * Links are keyed by team UUID for access control. + *

+ * Each machine stores its own perspective with EFFECTIVE role + * (result of negotiation, not declared role). + */ +public class LinkedMultiblockSavedData extends SavedData { + + private static final String DATA_NAME = "cosmiccore_linked_multiblocks"; + + // Owner UUID -> (Machine GlobalPos -> Set of LinkEntry) + private final Map>> links = new HashMap<>(); + + public LinkedMultiblockSavedData() {} + + public LinkedMultiblockSavedData(CompoundTag tag) { + load(tag); + } + + // ==================== Access ==================== + + /** + * Get or create the SavedData instance. + * Stored in overworld to ensure single source of truth. + */ + public static LinkedMultiblockSavedData getOrCreate(MinecraftServer server) { + ServerLevel overworld = server.overworld(); + return overworld.getDataStorage().computeIfAbsent( + LinkedMultiblockSavedData::new, + LinkedMultiblockSavedData::new, + DATA_NAME); + } + + public static LinkedMultiblockSavedData getOrCreate(ServerLevel level) { + return getOrCreate(level.getServer()); + } + + // ==================== Link Management ==================== + + /** + * Establish a link between two machines with pre-negotiated roles. + *

+ * If a link already exists between these machines, it will be replaced + * with the new roles. + *

+ * IMPORTANT: Roles should be the result of negotiateRoles(), not raw declared roles. + * + * @param owner Team/player UUID (must match for both machines) + * @param a First machine's position + * @param b Second machine's position + * @param aEffectiveRole A's effective role after negotiation + * @param bEffectiveRole B's effective role after negotiation + */ + public void link(UUID owner, GlobalPos a, GlobalPos b, + LinkRole aEffectiveRole, LinkRole bEffectiveRole) { + // A's perspective - remove existing then add (to handle role changes) + Set aLinks = links.computeIfAbsent(owner, k -> new HashMap<>()) + .computeIfAbsent(a, k -> new HashSet<>()); + aLinks.remove(new LinkEntry(b, null)); // equals only checks target + aLinks.add(new LinkEntry(b, aEffectiveRole)); + + // B's perspective + Set bLinks = links.get(owner) + .computeIfAbsent(b, k -> new HashSet<>()); + bLinks.remove(new LinkEntry(a, null)); // equals only checks target + bLinks.add(new LinkEntry(a, bEffectiveRole)); + + setDirty(); + } + + /** + * Remove a specific link between two machines. + * Removes both perspectives. + */ + public void unlink(UUID owner, GlobalPos a, GlobalPos b) { + Map> ownerLinks = links.get(owner); + if (ownerLinks == null) return; + + // Remove A -> B + Set aLinks = ownerLinks.get(a); + if (aLinks != null) { + aLinks.removeIf(entry -> entry.target().equals(b)); + if (aLinks.isEmpty()) { + ownerLinks.remove(a); + } + } + + // Remove B -> A + Set bLinks = ownerLinks.get(b); + if (bLinks != null) { + bLinks.removeIf(entry -> entry.target().equals(a)); + if (bLinks.isEmpty()) { + ownerLinks.remove(b); + } + } + + // Cleanup empty owner entry + if (ownerLinks.isEmpty()) { + links.remove(owner); + } + + setDirty(); + } + + /** + * Remove all links for a machine (called when multiblock is destroyed). + * Also removes reverse links from all partners. + */ + public void removeAllLinks(UUID owner, GlobalPos pos) { + Map> ownerLinks = links.get(owner); + if (ownerLinks == null) return; + + // Get partners before removal + Set myLinks = ownerLinks.remove(pos); + + // Remove reverse links from partners + if (myLinks != null) { + for (LinkEntry entry : myLinks) { + Set partnerLinks = ownerLinks.get(entry.target()); + if (partnerLinks != null) { + partnerLinks.removeIf(e -> e.target().equals(pos)); + if (partnerLinks.isEmpty()) { + ownerLinks.remove(entry.target()); + } + } + } + } + + if (ownerLinks.isEmpty()) { + links.remove(owner); + } + + setDirty(); + } + + // ==================== Queries ==================== + + /** + * Get all links for a machine. + * Returns an unmodifiable copy to prevent external mutation. + */ + public Set getLinks(UUID owner, GlobalPos pos) { + Set result = links.getOrDefault(owner, Collections.emptyMap()) + .getOrDefault(pos, Collections.emptySet()); + return Collections.unmodifiableSet(new HashSet<>(result)); + } + + /** + * Get just the partner positions (without role info). + */ + public Set getPartnerPositions(UUID owner, GlobalPos pos) { + Set result = new HashSet<>(); + for (LinkEntry entry : getLinks(owner, pos)) { + result.add(entry.target()); + } + return result; + } + + /** + * Get the specific link to a partner, if it exists. + */ + @Nullable + public LinkEntry getLinkTo(UUID owner, GlobalPos self, GlobalPos partner) { + for (LinkEntry entry : getLinks(owner, self)) { + if (entry.target().equals(partner)) { + return entry; + } + } + return null; + } + + /** + * Check if this machine can query the partner (based on effective role). + * PEER and CONTROLLER can query; REMOTE cannot. + */ + public boolean canQuery(UUID owner, GlobalPos self, GlobalPos partner) { + LinkEntry link = getLinkTo(owner, self, partner); + if (link == null) return false; + + return link.effectiveRole() == LinkRole.PEER || link.effectiveRole() == LinkRole.CONTROLLER; + } + + /** + * Check if this machine can be queried by the partner (based on effective role). + * PEER and REMOTE can be queried; CONTROLLER cannot. + */ + public boolean canBeQueriedBy(UUID owner, GlobalPos self, GlobalPos partner) { + LinkEntry link = getLinkTo(owner, self, partner); + if (link == null) return false; + + return link.effectiveRole() == LinkRole.PEER || link.effectiveRole() == LinkRole.REMOTE; + } + + /** + * Check if two machines are linked (regardless of role). + */ + public boolean isLinked(UUID owner, GlobalPos a, GlobalPos b) { + return getLinkTo(owner, a, b) != null; + } + + // ==================== Serialization ==================== + + @Override + public CompoundTag save(CompoundTag root) { + ListTag ownersList = new ListTag(); + + for (Map.Entry>> ownerEntry : links.entrySet()) { + CompoundTag ownerTag = new CompoundTag(); + ownerTag.putUUID("Owner", ownerEntry.getKey()); + + ListTag machinesList = new ListTag(); + for (Map.Entry> machineEntry : ownerEntry.getValue().entrySet()) { + CompoundTag machineTag = new CompoundTag(); + + GlobalPos.CODEC.encodeStart(NbtOps.INSTANCE, machineEntry.getKey()) + .result() + .ifPresent(encoded -> machineTag.put("Pos", encoded)); + + ListTag linksList = new ListTag(); + for (LinkEntry link : machineEntry.getValue()) { + linksList.add(link.save()); + } + machineTag.put("Links", linksList); + + machinesList.add(machineTag); + } + ownerTag.put("Machines", machinesList); + + ownersList.add(ownerTag); + } + + root.put("Owners", ownersList); + return root; + } + + private void load(CompoundTag root) { + links.clear(); + + ListTag ownersList = root.getList("Owners", Tag.TAG_COMPOUND); + for (int i = 0; i < ownersList.size(); i++) { + CompoundTag ownerTag = ownersList.getCompound(i); + UUID owner = ownerTag.getUUID("Owner"); + + Map> ownerLinks = new HashMap<>(); + + ListTag machinesList = ownerTag.getList("Machines", Tag.TAG_COMPOUND); + for (int j = 0; j < machinesList.size(); j++) { + CompoundTag machineTag = machinesList.getCompound(j); + + GlobalPos pos = GlobalPos.CODEC + .decode(NbtOps.INSTANCE, machineTag.get("Pos")) + .result() + .map(pair -> pair.getFirst()) + .orElse(null); + + if (pos == null) continue; + + Set machineLinks = new HashSet<>(); + ListTag linksList = machineTag.getList("Links", Tag.TAG_COMPOUND); + for (int k = 0; k < linksList.size(); k++) { + try { + machineLinks.add(LinkEntry.load(linksList.getCompound(k))); + } catch (Exception e) { + CosmicCore.LOGGER.warn("Failed to load link entry: {}", e.getMessage()); + } + } + + if (!machineLinks.isEmpty()) { + ownerLinks.put(pos, machineLinks); + } + } + + if (!ownerLinks.isEmpty()) { + links.put(owner, ownerLinks); + } + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/item/armor/ISpaceSuite.java b/src/main/java/com/ghostipedia/cosmiccore/api/item/armor/ISpaceSuite.java index 5ad15959a..d9b5ab06c 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/api/item/armor/ISpaceSuite.java +++ b/src/main/java/com/ghostipedia/cosmiccore/api/item/armor/ISpaceSuite.java @@ -1,9 +1,9 @@ package com.ghostipedia.cosmiccore.api.item.armor; +import com.ghostipedia.cosmiccore.common.airControl.IOxygenProvider; import com.ghostipedia.cosmiccore.common.data.tag.item.CosmicItemTags; import net.minecraft.network.chat.Component; -import net.minecraft.tags.FluidTags; import net.minecraft.tags.TagKey; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; @@ -12,7 +12,6 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; -import earth.terrarium.adastra.api.systems.OxygenApi; import earth.terrarium.adastra.common.constants.ConstantComponents; import earth.terrarium.adastra.common.registry.ModFluids; import earth.terrarium.adastra.common.utils.FluidUtils; @@ -22,20 +21,53 @@ import java.util.List; import java.util.stream.StreamSupport; -public interface ISpaceSuite { +/** + * Interface for CosmicCore space suits that integrate with our oxygen system. + * Oxygen consumption for breathing is now handled by OxygenLogic - this interface + * provides the oxygen and marks items as oxygen providers. + */ +public interface ISpaceSuite extends IOxygenProvider { - default void tickOxygen(Level Level, Player player, ItemStack itemStack) { - if (Level.isClientSide) return; + /** + * Tick handler for space suit - handles freezing prevention only. + * Oxygen consumption is handled by OxygenLogic via IOxygenProvider. + */ + default void tickOxygen(Level level, Player player, ItemStack itemStack) { + if (level.isClientSide) return; if (player.isCreative() || player.isSpectator()) return; - if (!(itemStack.getItem() instanceof SpaceArmorComponentItem suit)) return; + if (!(itemStack.getItem() instanceof SpaceArmorComponentItem)) return; + // Prevent freezing while wearing space suit player.setTicksFrozen(0); - if (player.tickCount % 12 == 0 && suit.hasOxygen(player)) { - if (!OxygenApi.API.hasOxygen(player)) suit.consumeOxygen(itemStack, 1); - if (player.isEyeInFluid(FluidTags.WATER)) { - suit.consumeOxygen(itemStack, 1); - player.setAirSupply(Math.min(player.getMaxAirSupply(), player.getAirSupply() + 4 * 10)); - } - } + // NOTE: Oxygen consumption is now handled by OxygenLogic.drainFromOxygenProviders() + } + + // --- IOxygenProvider implementation --- + + @Override + default boolean hasOxygen(ItemStack stack, Player player) { + if (!(stack.getItem() instanceof SpaceArmorComponentItem suit)) return false; + return suit.hasOxygen(player); + } + + @Override + default long consumeOxygen(ItemStack stack, Player player, long amount) { + if (!(stack.getItem() instanceof SpaceArmorComponentItem suit)) return 0; + long before = suit.getFluidContainer(stack).getFirstFluid().getFluidAmount(); + suit.consumeOxygen(stack, amount); + long after = suit.getFluidContainer(stack).getFirstFluid().getFluidAmount(); + return before - after; + } + + @Override + default long getOxygenAmount(ItemStack stack) { + if (!(stack.getItem() instanceof SpaceArmorComponentItem suit)) return 0; + return suit.getFluidContainer(stack).getFirstFluid().getFluidAmount(); + } + + @Override + default long getMaxOxygenCapacity(ItemStack stack) { + if (!(stack.getItem() instanceof SpaceArmorComponentItem suit)) return 0; + return suit.getFluidContainer(stack).getTankCapacity(0); } static boolean hasFullNanoSet(LivingEntity entity) { diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/machine/feature/IStellarIrisProvider.java b/src/main/java/com/ghostipedia/cosmiccore/api/machine/feature/IStellarIrisProvider.java new file mode 100644 index 000000000..6ec49974a --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/machine/feature/IStellarIrisProvider.java @@ -0,0 +1,54 @@ +package com.ghostipedia.cosmiccore.api.machine.feature; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine; + +import com.gregtechceu.gtceu.api.machine.feature.IMachineFeature; + +/** + * Interface for the Stellar Iris controller. + * Modules query this to get processing parameters and stage information. + */ +public interface IStellarIrisProvider extends IMachineFeature { + + /** + * @return the current stage of the stellar iris + */ + IrisMultiblockMachine.Stage getStage(); + + /** + * @return whether the iris multiblock is formed + */ + boolean isFormed(); + + /** + * @return maximum heat provided to modules (affects recipe availability) + */ + int getMaxHeat(); + + /** + * @return speed bonus multiplier for module recipes + */ + double getSpeedBonus(); + + /** + * @return energy discount multiplier for module recipes (1.0 = no discount) + */ + double getEnergyDiscount(); + + /** + * @return maximum parallel recipes for modules + */ + int getParallelLimit(); + + /** + * Check if the stage allows processing + * + * @return true if the current stage can run module recipes + */ + default boolean canProcess() { + IrisMultiblockMachine.Stage stage = getStage(); + return stage == IrisMultiblockMachine.Stage.STAR || + stage == IrisMultiblockMachine.Stage.SUPERSTAR || + stage == IrisMultiblockMachine.Stage.BLACK_HOLE; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/machine/feature/IStellarModuleReceiver.java b/src/main/java/com/ghostipedia/cosmiccore/api/machine/feature/IStellarModuleReceiver.java new file mode 100644 index 000000000..ccfba4072 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/machine/feature/IStellarModuleReceiver.java @@ -0,0 +1,32 @@ +package com.ghostipedia.cosmiccore.api.machine.feature; + +import org.jetbrains.annotations.Nullable; + +/** + * Interface for Stellar Iris modules. + * Modules receive connection from the Iris controller and processing parameters. + */ +public interface IStellarModuleReceiver { + + /** + * @return the stellar iris this module is connected to, or null if not connected + */ + @Nullable + IStellarIrisProvider getStellarIris(); + + /** + * Sets the stellar iris connection for this module. + * Called by the Iris controller when structure forms/invalidates. + * + * @param provider the iris provider to connect to, or null to disconnect + */ + void setStellarIris(@Nullable IStellarIrisProvider provider); + + /** + * @return true if this module is connected to a valid, formed Iris + */ + default boolean isConnectedToIris() { + IStellarIrisProvider iris = getStellarIris(); + return iris != null && iris.isFormed(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/DreamersBasinMachine.java b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/DreamersBasinMachine.java new file mode 100644 index 000000000..7d26735ab --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/DreamersBasinMachine.java @@ -0,0 +1,380 @@ +package com.ghostipedia.cosmiccore.api.machine.multiblock; + +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.MultithreadedMachine; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.MultithreadedRecipeLogic; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IDisplayUIMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockDisplayText; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.content.Content; +import com.gregtechceu.gtceu.utils.FormattingUtil; +import com.gregtechceu.gtceu.utils.GTUtil; + +import com.lowdragmc.lowdraglib.gui.widget.*; +import com.lowdragmc.lowdraglib.side.fluid.FluidStack; +import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.HoverEvent; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.Style; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; + +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +/** + * The Dreamer's Basin Machine - A multithreaded processing machine with custom UI. + *

+ * This machine extends MultithreadedMachine and provides a rich UI that displays: + * - Thread status with color-coded indicators + * - Per-thread recipe progress bars + * - Current recipe information for each thread + * - Energy consumption breakdown + * - Overclock levels per thread + */ +public class DreamersBasinMachine extends MultithreadedMachine implements IDisplayUIMachine { + + protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( + DreamersBasinMachine.class, MultithreadedMachine.MANAGED_FIELD_HOLDER); + + public DreamersBasinMachine(IMachineBlockEntity holder) { + super(holder); + } + + @Override + @NotNull + public ManagedFieldHolder getFieldHolder() { + return MANAGED_FIELD_HOLDER; + } + + // ===== Custom UI Implementation ===== + + @Override + public Widget createUIWidget() { + var group = new WidgetGroup(0, 0, 256, 200); + + // Main scrollable area + var scrollable = new DraggableScrollableWidgetGroup(4, 4, 248, 192) + .setBackground(getScreenTexture()); + + // Title + scrollable.addWidget(new LabelWidget(4, 5, self().getBlockState().getBlock().getDescriptionId())); + + // Component panel for dynamic text (status, energy, etc.) + scrollable.addWidget(new ComponentPanelWidget(4, 17, this::addDisplayText) + .textSupplier(this.getLevel().isClientSide ? null : this::addDisplayText) + .setMaxWidthLimit(240) + .clickHandler(this::handleDisplayClick)); + + group.addWidget(scrollable); + group.setBackground(GuiTextures.BACKGROUND_INVERSE); + + return group; + } + + @Override + public void addDisplayText(List textList) { + // Use MultiblockDisplayText builder for consistent formatting + var builder = MultiblockDisplayText.builder(textList, isFormed()) + .setWorkingStatus(isWorkingEnabled(), getRunningThreadCount() > 0); + + if (isFormed()) { + // Energy info first + builder.addEnergyUsageLine(energyContainer); + builder.addEnergyTierLine(tier); + + // Separator + builder.addCustom(tl -> tl.add(Component.empty())); + + // Thread Status Header + builder.addCustom(tl -> { + tl.add(Component.translatable("cosmiccore.machine.dreamers_basin.thread_header") + .withStyle(ChatFormatting.AQUA, ChatFormatting.BOLD)); + + // Summary line + int running = getRunningThreadCount(); + int total = getThreadLogics().size(); + int max = getMaxThreads(); + + MutableComponent summary = Component.literal(" ") + .append(Component.translatable("cosmiccore.machine.dreamers_basin.threads_summary", + running, total, max)); + + if (running == total && total > 0) { + summary = summary.withStyle(ChatFormatting.GREEN); + } else if (running > 0) { + summary = summary.withStyle(ChatFormatting.YELLOW); + } else { + summary = summary.withStyle(ChatFormatting.GRAY); + } + tl.add(summary); + }); + + // Per-thread detailed status + builder.addCustom(tl -> { + tl.add(Component.empty()); + + for (MultithreadedRecipeLogic logic : getThreadLogics().values()) { + addThreadStatusLine(tl, logic); + } + }); + + // EU Budget info + builder.addCustom(tl -> { + tl.add(Component.empty()); + tl.add(Component.translatable("cosmiccore.machine.dreamers_basin.eu_budget_header") + .withStyle(ChatFormatting.GOLD)); + + if (!getThreadLogics().isEmpty()) { + MultithreadedRecipeLogic firstThread = getThreadLogics().values().iterator().next(); + long euPerThread = firstThread.getMaxEUtPerThread(); + int voltageTier = GTUtil.getFloorTierByVoltage(euPerThread); + String tierName = GTValues.VNF[voltageTier]; + + tl.add(Component.literal(" ") + .append(Component.translatable("cosmiccore.machine.dreamers_basin.eu_per_thread", + FormattingUtil.formatNumbers(euPerThread), tierName)) + .withStyle(ChatFormatting.GRAY)); + } + }); + } + + // Additional display from definition + getDefinition().getAdditionalDisplay().accept(this, textList); + } + + /** + * Add a detailed status line for a single thread. + */ + private void addThreadStatusLine(List textList, MultithreadedRecipeLogic logic) { + int color = logic.getThreadColor(); + String colorName = getColorDisplayName(color); + ChatFormatting colorFormat = getColorChatFormatting(color); + + // Build the thread status line + MutableComponent line = Component.literal(" "); + + // Color indicator [COLOR] + line.append(Component.literal("[" + colorName + "] ").withStyle(colorFormat)); + + if (logic.isWorking()) { + // Thread is actively processing + GTRecipe recipe = logic.getCurrentRecipe(); + int progress = logic.getProgress(); + int duration = logic.getDuration(); + int percent = duration > 0 ? (progress * 100 / duration) : 0; + + // Progress bar visualization + String progressBar = createProgressBar(percent); + + // Build hover tooltip with recipe details + Component hoverTooltip = buildRecipeTooltip(recipe, duration); + + // Create the progress portion with hover event + MutableComponent progressComponent = Component.literal(progressBar + " ") + .withStyle(Style.EMPTY + .withColor(ChatFormatting.GREEN) + .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, hoverTooltip))); + + line.append(progressComponent); + line.append(Component.literal(percent + "%").withStyle(ChatFormatting.WHITE)); + + // Recipe EU/t info + if (recipe != null) { + long recipeEUt = recipe.getInputEUt().getTotalEU(); + if (recipeEUt > 0) { + line.append(Component.literal(" (") + .append(Component.literal(FormattingUtil.formatNumbers(recipeEUt) + " EU/t") + .withStyle(ChatFormatting.YELLOW)) + .append(Component.literal(")"))); + } + } + + textList.add(line); + + // Add time remaining on next line (also with hover) + if (duration > 0) { + int ticksRemaining = duration - progress; + float secondsRemaining = ticksRemaining / 20.0f; + MutableComponent timeLine = Component.literal(" ") + .append(Component.translatable("cosmiccore.machine.dreamers_basin.time_remaining", + String.format("%.1fs", secondsRemaining)) + .withStyle(Style.EMPTY + .withColor(ChatFormatting.DARK_GRAY) + .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, hoverTooltip)))); + textList.add(timeLine); + } + + } else if (logic.isIdle()) { + line.append(Component.translatable("cosmiccore.machine.dreamers_basin.status_idle") + .withStyle(ChatFormatting.GRAY)); + textList.add(line); + + } else if (logic.isWaiting()) { + line.append(Component.translatable("cosmiccore.machine.dreamers_basin.status_waiting") + .withStyle(ChatFormatting.YELLOW)); + textList.add(line); + + } else if (logic.isSuspend()) { + line.append(Component.translatable("cosmiccore.machine.dreamers_basin.status_suspended") + .withStyle(ChatFormatting.RED)); + textList.add(line); + + } else { + line.append(Component.translatable("cosmiccore.machine.dreamers_basin.status_unknown") + .withStyle(ChatFormatting.DARK_GRAY)); + textList.add(line); + } + } + + /** + * Build a hover tooltip showing the first recipe output and production rate. + * Due to Minecraft hover event limitations, this is kept to a single line. + */ + private Component buildRecipeTooltip(GTRecipe recipe, int duration) { + if (recipe == null) { + return Component.translatable("cosmiccore.machine.dreamers_basin.tooltip.no_recipe"); + } + + // Calculate rate (items per second) + float recipesPerSecond = duration > 0 ? 20.0f / duration : 0; + + MutableComponent tooltip = Component.translatable("cosmiccore.machine.dreamers_basin.tooltip.crafting") + .withStyle(ChatFormatting.GOLD) + .append(Component.literal(" ").withStyle(ChatFormatting.RESET)); + + // Try to find first item output + // Note: Content stores Ingredient (usually SizedIngredient), not raw ItemStack + List itemOutputs = recipe.getOutputContents(ItemRecipeCapability.CAP); + if (itemOutputs != null && !itemOutputs.isEmpty()) { + for (Content content : itemOutputs) { + Object contentObj = content.getContent(); + if (contentObj instanceof Ingredient ingredient) { + ItemStack[] items = ingredient.getItems(); + if (items.length > 0 && !items[0].isEmpty()) { + ItemStack stack = items[0]; + int count = stack.getCount(); + float perSecond = count * recipesPerSecond; + + tooltip.append(stack.getHoverName().copy().withStyle(ChatFormatting.WHITE)) + .append(Component.literal(" x" + count).withStyle(ChatFormatting.GRAY)); + + if (perSecond >= 0.1f) { + tooltip.append(Component.literal(String.format(" (%.1f/s)", perSecond)) + .withStyle(ChatFormatting.AQUA)); + } + return tooltip; + } + } + } + } + + // Try fluid outputs if no items + List fluidOutputs = recipe.getOutputContents(FluidRecipeCapability.CAP); + if (fluidOutputs != null && !fluidOutputs.isEmpty()) { + for (Content content : fluidOutputs) { + Object contentObj = content.getContent(); + if (contentObj instanceof FluidStack fluid && !fluid.isEmpty()) { + long amount = fluid.getAmount(); + float perSecond = amount * recipesPerSecond; + + tooltip.append(fluid.getDisplayName().copy().withStyle(ChatFormatting.BLUE)) + .append(Component.literal(" " + FormattingUtil.formatNumbers(amount) + "mB") + .withStyle(ChatFormatting.GRAY)); + + if (perSecond >= 1f) { + tooltip.append(Component.literal(String.format(" (%.0f mB/s)", perSecond)) + .withStyle(ChatFormatting.AQUA)); + } + return tooltip; + } + } + } + + // Generic fallback + return tooltip.append(Component.translatable("cosmiccore.machine.dreamers_basin.tooltip.processing") + .withStyle(ChatFormatting.GRAY)); + } + + /** + * Create a simple text-based progress bar. + */ + private String createProgressBar(int percent) { + int filled = percent / 10; + int empty = 10 - filled; + return "[" + "=".repeat(filled) + "-".repeat(empty) + "]"; + } + + /** + * Get a display-friendly color name. + * GTCEu stores painting color as dye.getMapColor().col + */ + private String getColorDisplayName(int color) { + if (color == -1) return "Default"; + + for (DyeColor dye : DyeColor.values()) { + // GTCEu uses getMapColor().col for painted colors + if (dye.getMapColor().col == color) { + // Capitalize first letter of each word + String name = dye.getName().replace("_", " "); + StringBuilder result = new StringBuilder(); + for (String word : name.split(" ")) { + if (!result.isEmpty()) result.append(" "); + result.append(word.substring(0, 1).toUpperCase()).append(word.substring(1)); + } + return result.toString(); + } + } + return "Custom"; + } + + /** + * Get the ChatFormatting color that best matches the thread color. + * GTCEu stores painting color as dye.getMapColor().col + */ + private ChatFormatting getColorChatFormatting(int color) { + if (color == -1) return ChatFormatting.WHITE; + + for (DyeColor dye : DyeColor.values()) { + // GTCEu uses getMapColor().col for painted colors + if (dye.getMapColor().col == color) { + return switch (dye) { + case WHITE -> ChatFormatting.WHITE; + case ORANGE -> ChatFormatting.GOLD; + case MAGENTA -> ChatFormatting.LIGHT_PURPLE; + case LIGHT_BLUE -> ChatFormatting.AQUA; + case YELLOW -> ChatFormatting.YELLOW; + case LIME -> ChatFormatting.GREEN; + case PINK -> ChatFormatting.LIGHT_PURPLE; + case GRAY -> ChatFormatting.DARK_GRAY; + case LIGHT_GRAY -> ChatFormatting.GRAY; + case CYAN -> ChatFormatting.DARK_AQUA; + case PURPLE -> ChatFormatting.DARK_PURPLE; + case BLUE -> ChatFormatting.BLUE; + case BROWN -> ChatFormatting.GOLD; + case GREEN -> ChatFormatting.DARK_GREEN; + case RED -> ChatFormatting.RED; + case BLACK -> ChatFormatting.DARK_GRAY; + }; + } + } + return ChatFormatting.WHITE; + } + + /** + * Get all thread logics for iteration. + */ + public Iterable getThreadLogicsIterable() { + return getThreadLogics().values(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/DroneStationMachine.java b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/DroneStationMachine.java index 056403110..6ee2ddd69 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/DroneStationMachine.java +++ b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/DroneStationMachine.java @@ -1,6 +1,5 @@ package com.ghostipedia.cosmiccore.api.machine.multiblock; -import com.ghostipedia.cosmiccore.CosmicCore; import com.ghostipedia.cosmiccore.api.machine.part.DroneMaintenanceInterfacePartMachine; import com.ghostipedia.cosmiccore.api.misc.DroneStationConnection; import com.ghostipedia.cosmiccore.common.data.CosmicItems; @@ -8,15 +7,16 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.capability.IControllable; import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.fancy.FancyMachineUIWidget; import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.RecipeHelper; +import com.gregtechceu.gtceu.data.recipe.builder.GTRecipeBuilder; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; @@ -31,7 +31,6 @@ import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.BlockHitResult; @@ -40,6 +39,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Optional; public class DroneStationMachine extends WorkableElectricMultiblockMachine { @@ -58,20 +58,20 @@ public enum DroneTier { // for the case of having multiple drones in a hatch // spotless:off - PLASMATIC( 4096, GTValues.V[GTValues.UV], 0f, CosmicItems.PLASMATIC_DRONE.asItem()), - SANGUINE( 2048, GTValues.V[GTValues.ZPM], 0.25f, CosmicItems.SANGUINE_DRONE.asItem()), - INDUSTRIAL( 1024, GTValues.V[GTValues.LuV], 0.5f, CosmicItems.INDUSTRIAL_DRONE.asItem()), - ROBUST( 512, GTValues.V[GTValues.IV], 0.75f, CosmicItems.ROBUST_DRONE.asItem()), - RUSTY( 256, GTValues.V[GTValues.EV], 1, CosmicItems.RUSTY_DRONE.asItem()), + PLASMATIC( 4096, GTValues.V[GTValues.UV], 0f, CosmicItems.PLASMATIC_DRONE.asStack(1)), + SANGUINE( 2048, GTValues.V[GTValues.ZPM], 0.25f, CosmicItems.SANGUINE_DRONE.asStack(1)), + INDUSTRIAL( 1024, GTValues.V[GTValues.LuV], 0.5f, CosmicItems.INDUSTRIAL_DRONE.asStack(1)), + ROBUST( 512, GTValues.V[GTValues.IV], 0.75f, CosmicItems.ROBUST_DRONE.asStack(1)), + RUSTY( 256, GTValues.V[GTValues.EV], 1, CosmicItems.RUSTY_DRONE.asStack(1)), // spotless:on ; - public long range; - public long EUt; - public float consumptionChance; - public Item item; + public final long range; + public final long EUt; + public final float consumptionChance; + public final ItemStack item; - DroneTier(long range, long EUt, float consumptionChance, Item item) { + DroneTier(long range, long EUt, float consumptionChance, ItemStack item) { this.range = range; this.EUt = EUt; this.consumptionChance = consumptionChance; @@ -79,6 +79,19 @@ public enum DroneTier { } } + static List droneTierRecipes = new ArrayList<>(); + static final String TIER_KEY = "drone_tier"; + static { + for (DroneTier tier : DroneTier.values()) { + + droneTierRecipes.add(GTRecipeBuilder.ofRaw() + .notConsumable(tier.item) // we need this so it doesn't match empty stuff + .chancedInput(tier.item, (int) (tier.consumptionChance * 10000), 0) + .addData(TIER_KEY, tier.ordinal()) + .buildRawRecipe()); + } + } + public DroneStationMachine(IMachineBlockEntity holder, Object... args) { super(holder, args); } @@ -119,21 +132,26 @@ public void updateDroneHatches() { // Update the multi's currentTier private void updateDroneTier() { // Find current highest drone in bus - var itemHandlers = getCapabilitiesFlat(IO.IN, ItemRecipeCapability.CAP); - boolean found = false; - for (DroneTier tier : DroneTier.values()) { - for (var handler : itemHandlers) { - if (!(handler instanceof NotifiableItemStackHandler itemHandler)) continue; - for (var content : itemHandler.getContents()) { - if (tier.item.equals(((ItemStack) content).getItem())) { - this.currentTier = tier; - found = true; - break; - } - } - } - if (found) break; - } + Optional maybeDroneRecipe = droneTierRecipes.stream().filter( + dr -> RecipeHelper.matchRecipe(this, dr).isSuccess()).findFirst(); + if (maybeDroneRecipe.isEmpty()) return; + GTRecipe droneRecipe = maybeDroneRecipe.get(); + currentTier = DroneTier.values()[droneRecipe.data.getInt(TIER_KEY)]; + // var itemHandlers = getCapabilitiesFlat(IO.IN, ItemRecipeCapability.CAP); + // boolean found = false; + // for (DroneTier tier : DroneTier.values()) { + // for (var handler : itemHandlers) { + // if (!(handler instanceof NotifiableItemStackHandler itemHandler)) continue; + // for (var content : itemHandler.getContents()) { + // if (tier.item.equals(((ItemStack) content).getItem())) { + // this.currentTier = tier; + // found = true; + // break; + // } + // } + // } + // if (found) break; + // } } public long getBlockLimit() { @@ -163,30 +181,31 @@ public boolean drainEnergy(boolean simulate) { public boolean fixMaintenanceIssue() { // Note that this tries to consume a drone of the currentTier, which is only updated once per second. if (currentTier == null) return false; - - var itemHandlers = getCapabilitiesFlat(IO.IN, ItemRecipeCapability.CAP); - for (var handler : itemHandlers) { - if (!(handler instanceof NotifiableItemStackHandler itemHandler)) continue; - for (int i = 0; i < itemHandler.getSlots(); i++) { - ItemStack stack = itemHandler.getStackInSlot(i); - if (stack.getItem().equals(currentTier.item)) { - // We have found the stack with the drone, try consuming and return true - if (currentTier.consumptionChance == 0) return true; - float randomValue = GTValues.RNG.nextFloat(); - if (randomValue < currentTier.consumptionChance) { - var stackTaken = itemHandler.extractItemInternal(i, 1, false); - if (!stackTaken.getItem().equals(currentTier.item) || stackTaken.getCount() != 1) { - CosmicCore.LOGGER.error("Something went wrong when extracting done for Drone Multi: " + - stackTaken.getDisplayName()); - return false; - } - } - return true; - } - } - - } - return false; + return RecipeHelper.handleRecipeIO(this, droneTierRecipes.get(currentTier.ordinal()), IO.IN, + getRecipeLogic().getChanceCaches()).isSuccess(); + // var itemHandlers = getCapabilitiesFlat(IO.IN, ItemRecipeCapability.CAP); + // for (var handler : itemHandlers) { + // if (!(handler instanceof NotifiableItemStackHandler itemHandler)) continue; + // for (int i = 0; i < itemHandler.getSlots(); i++) { + // ItemStack stack = itemHandler.getStackInSlot(i); + // if (stack.getItem().equals(currentTier.item)) { + // // We have found the stack with the drone, try consuming and return true + // if (currentTier.consumptionChance == 0) return true; + // float randomValue = GTValues.RNG.nextFloat(); + // if (randomValue < currentTier.consumptionChance) { + // var stackTaken = itemHandler.extractItemInternal(i, 1, false); + // if (!stackTaken.getItem().equals(currentTier.item) || stackTaken.getCount() != 1) { + // CosmicCore.LOGGER.error("Something went wrong when extracting done for Drone Multi: " + + // stackTaken.getDisplayName()); + // return false; + // } + // } + // return true; + // } + // } + // + // } + // return false; } @Override diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/IMultithreadedMachine.java b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/IMultithreadedMachine.java new file mode 100644 index 000000000..b84c5ead6 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/IMultithreadedMachine.java @@ -0,0 +1,33 @@ +package com.ghostipedia.cosmiccore.api.machine.multiblock; + +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.MultithreadedRecipeLogic; + +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; + +/** + * Interface for machines that can run multiple independent recipe threads. + */ +public interface IMultithreadedMachine { + + /** + * Get the map of thread color to recipe logic. + */ + Int2ObjectMap getThreadLogicsMap(); + + /** + * Get the maximum number of threads this machine can support. + * Determined by energy hatch amperage. + */ + int getMaxThreadCount(); + + /** + * Get the current number of configured threads. + * Limited by available color-coded input buses. + */ + int getCurrentThreadCount(); + + /** + * Get the number of threads currently running recipes. + */ + int getRunningThreadCount(); +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/IrisMultiblockMachine.java b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/IrisMultiblockMachine.java index 2c4b71254..d39e13d1b 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/IrisMultiblockMachine.java +++ b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/IrisMultiblockMachine.java @@ -1,11 +1,13 @@ package com.ghostipedia.cosmiccore.api.machine.multiblock; +import com.ghostipedia.cosmiccore.api.machine.feature.IStellarIrisProvider; +import com.ghostipedia.cosmiccore.api.machine.feature.IStellarModuleReceiver; +import com.ghostipedia.cosmiccore.client.gui.widget.stellar.StellarFancyUIWidget; +import com.ghostipedia.cosmiccore.client.gui.widget.stellar.StellarIrisWidget; +import com.ghostipedia.cosmiccore.common.data.CosmicItems; import com.ghostipedia.cosmiccore.common.data.CosmicSounds; import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.fancy.FancyMachineUIWidget; -import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; @@ -15,16 +17,16 @@ import com.gregtechceu.gtceu.api.sound.AutoReleasedSound; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; -import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; -import com.lowdragmc.lowdraglib.gui.texture.TextTexture; -import com.lowdragmc.lowdraglib.gui.widget.*; +import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; import com.lowdragmc.lowdraglib.syncdata.annotation.UpdateListener; import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -32,13 +34,17 @@ import lombok.Setter; import org.jetbrains.annotations.NotNull; +import java.util.ArrayList; +import java.util.Collections; +import java.util.EnumSet; import java.util.List; +import java.util.Set; import static com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine.Stage.BLACK_HOLE; import static com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine.Stage.DEATH; @Getter -public class IrisMultiblockMachine extends WorkableElectricMultiblockMachine { +public class IrisMultiblockMachine extends WorkableElectricMultiblockMachine implements IStellarIrisProvider { public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( IrisMultiblockMachine.class, WorkableElectricMultiblockMachine.MANAGED_FIELD_HOLDER); @@ -53,12 +59,89 @@ public class IrisMultiblockMachine extends WorkableElectricMultiblockMachine { protected boolean isFuelable; protected Object workingSound; - @Setter @Persisted @DescSynced - @UpdateListener(methodName = "onStatusSynced") + @UpdateListener(methodName = "onStageSynced") private Stage stage = Stage.EMPTY; + /** + * Called when the stage field is synced from server to client. + * Parameters must match the field type (Stage). + */ + @OnlyIn(Dist.CLIENT) + @SuppressWarnings("unused") + protected void onStageSynced(Stage newValue, Stage oldValue) { + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.warn( + "[IrisMultiblockMachine] CLIENT onStageSynced: {} -> {}", oldValue, newValue); + this.scheduleRenderUpdate(); + soundTick(); + } + + /** + * Custom setter with debug logging to track stage changes. + */ + public void setStage(Stage newStage) { + Stage oldStage = this.stage; + this.stage = newStage; + // Debug: log all stage changes with stack trace for unusual transitions + if (oldStage != newStage) { + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.warn( + "[IrisMultiblockMachine] setStage: {} -> {}", oldStage, newStage); + // If transitioning TO DEATH from EMPTY, log stack trace to find the culprit + if (oldStage == Stage.EMPTY && newStage == Stage.DEATH) { + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.warn( + "[IrisMultiblockMachine] SUSPICIOUS: EMPTY->DEATH transition! Stack trace:", + new Exception("Stack trace")); + } + } + } + + /** + * Custom star color (RGB, no alpha). -1 means use default stage-based color. + * Persisted and synced to client for rendering. + */ + @Setter + @Persisted + @DescSynced + private int customStarColor = -1; + + @Persisted + @DescSynced + private int lifetimePrestigePoints = 0; + + @Persisted + @DescSynced + private int spendablePoints = 0; + + @Persisted + @DescSynced + private int prestigeTier = 0; + + @Persisted + @DescSynced + private int ascensionLevel = 0; + + @Persisted + @DescSynced + private Set unlockedUpgrades = EnumSet.noneOf(StellarIrisUpgrade.class); + + @Persisted + @DescSynced + private int[] repeatableUpgradeLevels = new int[StellarIrisUpgrade.values().length]; + + @Persisted + @DescSynced + private int consecutivePrestiges = 0; + + @DescSynced + private boolean prestigeAnimationActive = false; + + @DescSynced + private int lastPrestigePointsEarned = 0; + + private List connectedModules = new ArrayList<>(); + private List moduleSlotPositions = new ArrayList<>(); + public enum Stage { EMPTY, GROWING, @@ -72,6 +155,9 @@ public enum Stage { public IrisMultiblockMachine(IMachineBlockEntity holder) { super(holder); this.inventory = new NotifiableItemStackHandler(this, 1, IO.NONE, IO.BOTH); + // Debug: log initial stage + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.warn( + "[IrisMultiblockMachine] Constructor: initial stage={}", stage); } @OnlyIn(Dist.CLIENT) @@ -89,6 +175,192 @@ protected void onStatusSynced(RecipeLogic.Status newValue, RecipeLogic.Status ol @Override public void onStructureFormed() { super.onStructureFormed(); + + // Clear old module connections + if (connectedModules != null) { + connectedModules.forEach(m -> m.setStellarIris(null)); + } + + // Get modules found during structure check (from moduleSlotPredicate) + Set modules = getMultiblockState().getMatchContext() + .getOrDefault("stellarModules", Collections.emptySet()); + + this.connectedModules = new ArrayList<>(modules); + + // Establish connections - tell each module about this Iris + for (IStellarModuleReceiver module : connectedModules) { + module.setStellarIris(this); + } + } + + /** + * Registers a module with this Iris. Called by modules when they form or detect a nearby Iris. + * + * @param module The module to register + * @return true if registration was successful + */ + public boolean registerModule(IStellarModuleReceiver module) { + if (!isFormed() || module == null) return false; + + if (!connectedModules.contains(module)) { + connectedModules.add(module); + module.setStellarIris(this); + + // Store position for tracking + if (module instanceof MetaMachine metaMachine) { + moduleSlotPositions.add(metaMachine.getPos().immutable()); + // Debug logging + if (getLevel() != null && !getLevel().isClientSide) { + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.info( + "[StellarIris] Module registered: {} at {}. Total modules: {}", + metaMachine.getBlockState().getBlock().getDescriptionId(), + metaMachine.getPos(), + connectedModules.size()); + } + } + return true; + } + return false; + } + + /** + * Unregisters a module from this Iris. Called when a module is broken or invalidated. + * + * @param module The module to unregister + */ + public void unregisterModule(IStellarModuleReceiver module) { + if (module == null) return; + + if (connectedModules.remove(module)) { + module.setStellarIris(null); + + // Remove position tracking + if (module instanceof MetaMachine metaMachine) { + moduleSlotPositions.remove(metaMachine.getPos()); + } + } + } + + /** + * Rescans for modules by triggering a structure recheck. + * This is a heavier operation but ensures consistency. + */ + public void rescanModules() { + if (!isFormed()) return; + + // Trigger structure recheck which will re-run the predicates + getMultiblockState().setError(null); + checkPatternWithLock(); + } + + @Override + public void onStructureInvalid() { + super.onStructureInvalid(); + + // Sever all module connections + if (connectedModules != null) { + connectedModules.forEach(m -> m.setStellarIris(null)); + connectedModules.clear(); + } + } + + // -------- IStellarIrisProvider Implementation -------- + + @Override + public int getMaxHeat() { + // Base heat increases with stage + return switch (stage) { + case STAR -> 3600; + case SUPERSTAR -> 7200; + case BLACK_HOLE -> 12000; + default -> 0; + }; + } + + @Override + public double getSpeedBonus() { + // Base speed multiplier from stage + double base = switch (stage) { + case STAR -> 1.0; + case SUPERSTAR -> 1.5; + case BLACK_HOLE -> 2.0; + default -> 0.0; + }; + + // Apply upgrade bonuses + if (hasUpgrade(StellarIrisUpgrade.TEMPORAL_ACCELERATION)) base += 0.15; + if (hasUpgrade(StellarIrisUpgrade.STELLAR_COMPRESSION) && + (stage == Stage.SUPERSTAR || stage == Stage.BLACK_HOLE)) + base += 0.25; + if (hasUpgrade(StellarIrisUpgrade.VOID_WHISPERS) && stage == Stage.BLACK_HOLE) base += 0.5; + + // Singularity Engine capstone doubles speed bonuses + if (hasUpgrade(StellarIrisUpgrade.SINGULARITY_ENGINE)) base *= 2.0; + + return base; + } + + @Override + public double getEnergyDiscount() { + // Base energy discount from stage (1.0 = no discount, lower = cheaper) + double discount = switch (stage) { + case STAR -> 1.0; + case SUPERSTAR -> 0.8; + case BLACK_HOLE -> 0.6; + default -> 1.0; + }; + + // Apply upgrade bonuses + if (hasUpgrade(StellarIrisUpgrade.SUPERCONDUCTING_GRID)) discount -= 0.10; + if (hasUpgrade(StellarIrisUpgrade.MASS_EFFICIENCY)) discount -= 0.15; + + // Singularity Engine capstone + if (hasUpgrade(StellarIrisUpgrade.SINGULARITY_ENGINE)) discount -= 0.40; + + return Math.max(0.1, discount); + } + + @Override + public int getParallelLimit() { + // Base parallel limit from stage + int base = switch (stage) { + case STAR -> 4; + case SUPERSTAR -> 8; + case BLACK_HOLE -> 16; + default -> 0; + }; + + // Graviton Lens: +1 parallel per stage + if (hasUpgrade(StellarIrisUpgrade.GRAVITON_LENS)) { + base += switch (stage) { + case STAR -> 1; + case SUPERSTAR -> 2; + case BLACK_HOLE -> 3; + default -> 0; + }; + } + + // Parallel Manifold: +2 base + if (hasUpgrade(StellarIrisUpgrade.PARALLEL_MANIFOLD)) base += 2; + + // Singularity Engine capstone doubles parallel + if (hasUpgrade(StellarIrisUpgrade.SINGULARITY_ENGINE)) base *= 2; + + return base; + } + + /** + * @return list of currently connected modules (read-only view) + */ + public List getConnectedModules() { + return Collections.unmodifiableList(connectedModules); + } + + /** + * @return number of connected modules + */ + public int getConnectedModuleCount() { + return connectedModules.size(); } public void setStarStage() { @@ -97,6 +369,255 @@ public void setStarStage() { setStage(values[nextVal]); } + // -------- Prestige System Methods -------- + + /** + * Checks if the item in the star seed slot is a prestige item (Programmable Mote). + * + * @return true if a prestige item is in the slot + */ + public boolean hasPrestigeItem() { + ItemStack stack = inventory.getStackInSlot(0); + return !stack.isEmpty() && stack.is(CosmicItems.PROGRAMMABLE_MOTE.asItem()); + } + + /** + * Checks if the iris has an active star (not EMPTY or DEATH states). + * Required for prestige to be triggered. + * + * @return true if there's an active star to consume + */ + public boolean hasActiveStar() { + return stage != Stage.EMPTY && stage != Stage.DEATH && stage != Stage.DEATH_GRACEFUL; + } + + /** + * Called when the prestige button is broken (after 3 cracks). + * Starts the prestige animation sequence - star consumption happens over time. + * The actual point award and stage reset happen when animation completes. + */ + public void triggerPrestige() { + if (!hasPrestigeItem() || !hasActiveStar()) { + return; + } + + // Consume the prestige item immediately + inventory.getStackInSlot(0).shrink(1); + + // Calculate points to award (50 per star for now) + lastPrestigePointsEarned = calculatePrestigePoints(); + + // Log the prestige event + if (getLevel() != null && !getLevel().isClientSide) { + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.info( + "[StellarIris] PRESTIGE TRIGGERED at {} - Stage: {}, Points: {}", + getPos(), stage, lastPrestigePointsEarned); + } + + // Start the animation - UI will handle the visual sequence + // Animation duration: 5s shrink + 3s fade = 8s total (160 ticks) + prestigeAnimationActive = true; + + // Note: Stage reset and point award happen when completePrestige() is called + // This is triggered by the UI after animation completes + } + + /** + * Called when the prestige animation completes (after ~8 seconds). + * Awards points and resets the star. + */ + public void completePrestige() { + if (!prestigeAnimationActive) return; + + // Award the points (both lifetime and spendable) + lifetimePrestigePoints += lastPrestigePointsEarned; + spendablePoints += lastPrestigePointsEarned; + + // Track consecutive prestiges for momentum bonus + consecutivePrestiges++; + + // Check for tier advancement + int newTier = calculatePrestigeTier(lifetimePrestigePoints); + if (newTier > prestigeTier) { + prestigeTier = newTier; + if (getLevel() != null && !getLevel().isClientSide) { + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.info( + "[StellarIris] PRESTIGE TIER UP! Now tier {} with {} total points", + prestigeTier, lifetimePrestigePoints); + } + } + + // Reset the star + setStage(Stage.EMPTY); + + // End animation state + prestigeAnimationActive = false; + + if (getLevel() != null && !getLevel().isClientSide) { + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.info( + "[StellarIris] Prestige complete. Lifetime: {}, Spendable: {}, Tier: {}", + lifetimePrestigePoints, spendablePoints, prestigeTier); + } + } + + /** + * Calculates prestige points for consuming the current star. + * Base points vary by stage, then multiplied by upgrades. + */ + private int calculatePrestigePoints() { + // Base points by stage + int base = switch (stage) { + case STAR -> 50; + case SUPERSTAR -> 100; + case BLACK_HOLE -> 200; + default -> 25; + }; + + // Resonant Sacrifice: SUPERSTAR gives BLACK_HOLE rewards + if (hasUpgrade(StellarIrisUpgrade.RESONANT_SACRIFICE) && stage == Stage.SUPERSTAR) { + base = 200; + } + + // Void Harvester: BLACK_HOLE gives 3x + if (hasUpgrade(StellarIrisUpgrade.VOID_HARVESTER) && stage == Stage.BLACK_HOLE) { + base *= 3; + } + + // Apply percentage bonuses + double multiplier = 1.0; + + // Shard Collector: +20% + if (hasUpgrade(StellarIrisUpgrade.SHARD_COLLECTOR)) multiplier += 0.20; + + // Point Amplifier: +30% + if (hasUpgrade(StellarIrisUpgrade.POINT_AMPLIFIER)) multiplier += 0.30; + + // Infinite Recursion capstone: 2x + if (hasUpgrade(StellarIrisUpgrade.INFINITE_RECURSION)) multiplier *= 2.0; + + // Prestige Momentum: +10% per consecutive prestige (max 50%) + if (hasUpgrade(StellarIrisUpgrade.PRESTIGE_MOMENTUM)) { + multiplier += Math.min(consecutivePrestiges * 0.10, 0.50); + } + + return (int) (base * multiplier); + } + + /** + * Determines prestige tier based on total accumulated points. + * Tiers unlock upgrade rows. + */ + private int calculatePrestigeTier(int totalPoints) { + if (totalPoints >= 1200) return 5; + if (totalPoints >= 600) return 4; + if (totalPoints >= 300) return 3; + if (totalPoints >= 150) return 2; + if (totalPoints >= 50) return 1; + return 0; + } + + // -------- Upgrade System Methods -------- + + /** + * Check if a non-repeatable upgrade is owned. + */ + public boolean hasUpgrade(StellarIrisUpgrade upgrade) { + if (upgrade.isRepeatable()) { + return getUpgradeLevel(upgrade) > 0; + } + return unlockedUpgrades.contains(upgrade); + } + + public int getUpgradeLevel(StellarIrisUpgrade upgrade) { + if (upgrade.isRepeatable()) { + int ordinal = upgrade.ordinal(); + return (ordinal >= 0 && ordinal < repeatableUpgradeLevels.length) ? repeatableUpgradeLevels[ordinal] : 0; + } + return unlockedUpgrades.contains(upgrade) ? 1 : 0; + } + + public Set getUnlockedUpgrades() { + return Collections.unmodifiableSet(unlockedUpgrades); + } + + public int[] getRepeatableUpgradeLevels() { + return repeatableUpgradeLevels.clone(); + } + + public boolean canUnlockUpgrade(StellarIrisUpgrade upgrade) { + if (upgrade.isRepeatable()) { + return getUpgradeLevel(upgrade) < upgrade.getMaxLevel(); + } + return upgrade.canUnlock(unlockedUpgrades, prestigeTier); + } + + public boolean tryUnlockUpgrade(StellarIrisUpgrade upgrade) { + if (upgrade.isRepeatable()) return tryLevelUpRepeatable(upgrade); + if (!canUnlockUpgrade(upgrade)) return false; + if (spendablePoints < upgrade.getCost()) return false; + + spendablePoints -= upgrade.getCost(); + unlockedUpgrades.add(upgrade); + return true; + } + + private boolean tryLevelUpRepeatable(StellarIrisUpgrade upgrade) { + if (!upgrade.isRepeatable()) return false; + + int currentLevel = getUpgradeLevel(upgrade); + if (currentLevel >= upgrade.getMaxLevel()) return false; + + int cost = upgrade.getCostForLevel(currentLevel + 1); + if (spendablePoints < cost) return false; + + spendablePoints -= cost; + int ordinal = upgrade.ordinal(); + if (ordinal >= 0 && ordinal < repeatableUpgradeLevels.length) { + repeatableUpgradeLevels[ordinal] = currentLevel + 1; + } + return true; + } + + public int getAscensionLevel() { + return ascensionLevel; + } + + public int getLifetimePrestigePoints() { + return lifetimePrestigePoints; + } + + public int getSpendablePoints() { + return spendablePoints; + } + + /** + * @return current prestige tier + */ + public int getPrestigeTier() { + return prestigeTier; + } + + /** + * @return true if prestige animation is currently playing + */ + public boolean isPrestigeAnimationActive() { + return prestigeAnimationActive; + } + + /** + * @return points earned in most recent prestige (for animation display) + */ + public int getLastPrestigePointsEarned() { + return lastPrestigePointsEarned; + } + + /** + * Manually set prestige animation state (for client sync). + */ + public void setPrestigeAnimationActive(boolean active) { + this.prestigeAnimationActive = active; + } + @Override public void clientTick() { super.clientTick(); @@ -139,26 +660,7 @@ public void soundTick() { @Override public Widget createUIWidget() { - var group = new WidgetGroup(0, 0, 182 + 8, 117 + 8); - group.addWidget(new DraggableScrollableWidgetGroup(4, 4, 182, 117).setBackground(getScreenTexture()) - .addWidget(new LabelWidget(4, 5, self().getBlockState().getBlock().getDescriptionId())) - .addWidget(new ComponentPanelWidget(4, 17, this::addDisplayText) - .textSupplier(this.getLevel().isClientSide ? null : this::addDisplayText) - .setMaxWidthLimit(150) - .clickHandler(this::handleDisplayClick))); - group.addWidget(new SlotWidget(inventory.storage, 0, 7, 101, true, true) - .setBackground(GuiTextures.SLOT, GuiTextures.ATOMIC_OVERLAY_1)); - group.setBackground(GuiTextures.BACKGROUND_INVERSE); - group.addWidget(new ButtonWidget( - 27, - 100, - 158, - 20, - new GuiTextureGroup( - GuiTextures.BUTTON, - new TextTexture("Change Stage")), - clickData -> setStarStage())); - return group; + return new StellarIrisWidget(() -> this); } @Override @@ -171,6 +673,7 @@ public void addDisplayText(List textList) { @Override public ModularUI createUI(Player entityPlayer) { - return new ModularUI(198, 208, this, entityPlayer).widget(new FancyMachineUIWidget(this, 198, 208)); + return new ModularUI(176, 166, this, entityPlayer) + .widget(new StellarFancyUIWidget(this, 176, 166, this::getStage)); } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/LinkedWorkableElectricMultiblockMachine.java b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/LinkedWorkableElectricMultiblockMachine.java new file mode 100644 index 000000000..a4c81daf2 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/LinkedWorkableElectricMultiblockMachine.java @@ -0,0 +1,621 @@ +package com.ghostipedia.cosmiccore.api.machine.multiblock; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.capability.ILinkedMultiblock; +import com.ghostipedia.cosmiccore.api.data.savedData.LinkEntry; +import com.ghostipedia.cosmiccore.api.data.savedData.LinkedMultiblockSavedData; +import com.ghostipedia.cosmiccore.common.machine.multiblock.LinkedMultiblockHelper; +import com.ghostipedia.cosmiccore.common.machine.multiblock.LinkedMultiblockHelper.RolePair; + +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.common.machine.owner.FTBOwner; + +import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.GlobalPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtOps; +import net.minecraft.network.chat.Component; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.fluids.FluidStack; + +import org.jetbrains.annotations.Nullable; + +import java.util.*; +import java.util.function.Predicate; + +/** + * Base class for multiblocks that support cross-dimensional linking. + *

+ * Subclasses should override: + *

    + *
  • {@link #canLinkTo(GlobalPos, ILinkedMultiblock)} - Type compatibility checks
  • + *
  • {@link #getLinkRole()} - Define role preference (PEER, CONTROLLER, REMOTE)
  • + *
  • {@link #getMaxPartners()} - Override if more/fewer than 4 partners needed
  • + *
  • {@link #onLinkEstablished(GlobalPos)} - React to new links
  • + *
  • {@link #onLinkBroken(GlobalPos)} - Cleanup when links break
  • + *
+ */ +public abstract class LinkedWorkableElectricMultiblockMachine extends WorkableElectricMultiblockMachine + implements ILinkedMultiblock, IMachineLife { + + protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( + LinkedWorkableElectricMultiblockMachine.class, + WorkableElectricMultiblockMachine.MANAGED_FIELD_HOLDER); + + private static final String DATASTICK_TAG_KEY = "cosmiccore:link_data"; + private static final String TAG_POS = "Pos"; + private static final String TAG_OWNER = "Owner"; + + /** + * Local cache of known partners, rebuilt from SavedData on structure form. + * Used to detect changes for lifecycle callbacks. + * NOT persisted - rebuilt from SavedData which is the source of truth. + */ + protected Set knownPartners = new HashSet<>(); + + public LinkedWorkableElectricMultiblockMachine(IMachineBlockEntity holder, Object... args) { + super(holder, args); + } + + @Override + public ManagedFieldHolder getFieldHolder() { + return MANAGED_FIELD_HOLDER; + } + + // ==================== ILinkedMultiblock Implementation ==================== + + @Override + public GlobalPos getGlobalPos() { + if (getLevel() instanceof ServerLevel serverLevel) { + return GlobalPos.of(serverLevel.dimension(), getPos()); + } + return null; + } + + @Override + @Nullable + public UUID getTeamUUID() { + var team = ((FTBOwner) getOwner()).getPlayerTeam(getOwnerUUID()); + return team != null ? team.getTeamId() : getOwnerUUID(); + } + + @Override + public Set getLinkedPartners() { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return Collections.emptySet(); + } + + UUID owner = getTeamUUID(); + if (owner == null) return Collections.emptySet(); + + LinkedMultiblockSavedData savedData = LinkedMultiblockSavedData.getOrCreate(serverLevel); + return savedData.getPartnerPositions(owner, getGlobalPos()); + } + + @Override + public void processLinkNotifications() { + if (!(getLevel() instanceof ServerLevel serverLevel)) return; + + UUID owner = getTeamUUID(); + if (owner == null) return; + + Set currentPartners = getLinkedPartners(); + + // Find new partners (in SavedData but not in our cache) + for (GlobalPos partner : currentPartners) { + if (!knownPartners.contains(partner)) { + onLinkEstablished(partner); + } + } + + // Find removed partners (in our cache but not in SavedData) + Set removed = new HashSet<>(knownPartners); + removed.removeAll(currentPartners); + for (GlobalPos partner : removed) { + onLinkBroken(partner); + } + + // Update cache + knownPartners = new HashSet<>(currentPartners); + } + + // ==================== Lifecycle ==================== + + @Override + public void onStructureFormed() { + super.onStructureFormed(); + // Process any pending link notifications from when we were unloaded + processLinkNotifications(); + } + + @Override + public void onStructureInvalid() { + super.onStructureInvalid(); + // Don't remove links when structure breaks - links persist to SavedData + // They'll be cleaned up when the machine is actually destroyed + } + + @Override + public void onMachineRemoved() { + IMachineLife.super.onMachineRemoved(); + + if (getLevel() instanceof ServerLevel serverLevel) { + UUID owner = getTeamUUID(); + GlobalPos myPos = getGlobalPos(); + + if (owner != null && myPos != null) { + // Release any force-loaded chunks + LinkedMultiblockHelper.releaseAllTickets(serverLevel.getServer(), myPos); + + // Remove all links from SavedData + LinkedMultiblockSavedData savedData = LinkedMultiblockSavedData.getOrCreate(serverLevel); + savedData.removeAllLinks(owner, myPos); + + // Notify partners (if loaded) + for (GlobalPos partner : knownPartners) { + ILinkedMultiblock partnerMachine = LinkedMultiblockHelper.getLinkedMachine( + serverLevel.getServer(), partner); + if (partnerMachine != null) { + partnerMachine.onLinkBroken(myPos); + } + } + } + } + } + + // ==================== Datastick Handling ==================== + + @Override + public InteractionResult onDataStickShiftUse(Player player, ItemStack dataStick) { + if (isRemote()) { + return InteractionResult.SUCCESS; + } + + GlobalPos myPos = getGlobalPos(); + UUID owner = getTeamUUID(); + + if (myPos == null || owner == null) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.not_ready") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + // Write link data to datastick + CompoundTag linkData = new CompoundTag(); + GlobalPos.CODEC.encodeStart(NbtOps.INSTANCE, myPos) + .result() + .ifPresent(encoded -> linkData.put(TAG_POS, encoded)); + linkData.putUUID(TAG_OWNER, owner); + + // Store in namespaced tag to preserve other datastick data + CompoundTag rootTag = dataStick.getOrCreateTag(); + rootTag.put(DATASTICK_TAG_KEY, linkData); + + // Update datastick name + String machineName = getDefinition().getName(); + dataStick.setHoverName(Component.translatable("cosmiccore.datastick.link_copied", machineName)); + + // Feedback + player.sendSystemMessage(Component.translatable("cosmiccore.link.copied", machineName) + .withStyle(ChatFormatting.GREEN)); + + return InteractionResult.SUCCESS; + } + + @Override + public InteractionResult onDataStickUse(Player player, ItemStack dataStick) { + if (isRemote()) { + return InteractionResult.sidedSuccess(true); + } + + CompoundTag rootTag = dataStick.getTag(); + if (rootTag == null || !rootTag.contains(DATASTICK_TAG_KEY)) { + return InteractionResult.PASS; // Not our data, let other handlers try + } + + CompoundTag linkData = rootTag.getCompound(DATASTICK_TAG_KEY); + + // Parse partner info from datastick + GlobalPos partnerPos = GlobalPos.CODEC + .decode(NbtOps.INSTANCE, linkData.get(TAG_POS)) + .result() + .map(pair -> pair.getFirst()) + .orElse(null); + + if (partnerPos == null) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.invalid_data") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + UUID partnerOwner = linkData.getUUID(TAG_OWNER); + + // Attempt to establish link + return tryLink(player, partnerPos, partnerOwner); + } + + /** + * Attempt to establish a link with the partner machine. + * Handles all validation, negotiation, and persistence. + */ + protected InteractionResult tryLink(Player player, GlobalPos partnerPos, UUID partnerOwner) { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return InteractionResult.FAIL; + } + + MinecraftServer server = serverLevel.getServer(); + GlobalPos myPos = getGlobalPos(); + UUID myOwner = getTeamUUID(); + + // === Validation === + + // Self-link check + if (myPos.equals(partnerPos)) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.cannot_self_link") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + // NOTE: We intentionally do NOT check partnerOwner from datastick NBT here. + // The datastick may be stale (team changed since it was written). + // Ownership is verified at runtime after loading the partner machine. + + // Partner limit check (this machine) + Set currentPartners = getLinkedPartners(); + if (currentPartners.size() >= getMaxPartners() && !currentPartners.contains(partnerPos)) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.limit_reached_self") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + // Already linked check + if (currentPartners.contains(partnerPos)) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.already_linked") + .withStyle(ChatFormatting.YELLOW)); + return InteractionResult.FAIL; + } + + // === Load and verify partner === + // SECURITY: Always load partner to verify ownership and compatibility + boolean needsUnload = false; + if (!LinkedMultiblockHelper.isPartnerOnline(server, partnerPos)) { + // Try to force-load partner temporarily + if (!LinkedMultiblockHelper.forceLoadPartnerChunk(server, myPos, partnerPos)) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.partner_not_loaded") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + needsUnload = true; + } + + try { + MetaMachine rawPartner = LinkedMultiblockHelper.getMachine(server, partnerPos); + if (rawPartner == null) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.partner_missing") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + if (!(rawPartner instanceof ILinkedMultiblock partnerMachine)) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.not_linkable") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + // Verify ownership matches at runtime + UUID actualPartnerOwner = partnerMachine.getTeamUUID(); + if (!Objects.equals(myOwner, actualPartnerOwner)) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.different_owner") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + // === Partner capacity check === + Set partnerLinks = partnerMachine.getLinkedPartners(); + if (partnerLinks.size() >= partnerMachine.getMaxPartners() && !partnerLinks.contains(myPos)) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.limit_reached_partner") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + // === Role Negotiation === + RolePair roles = LinkedMultiblockHelper.negotiateRoles(getLinkRole(), partnerMachine.getLinkRole()); + if (roles == null) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.incompatible_roles", + getLinkRole().name(), partnerMachine.getLinkRole().name()) + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + // === Type compatibility check === + if (!canLinkTo(partnerPos, partnerMachine)) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.incompatible_self") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + if (!partnerMachine.canLinkTo(myPos, this)) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.incompatible_partner") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + // === Persist link === + LinkedMultiblockSavedData savedData = LinkedMultiblockSavedData.getOrCreate(serverLevel); + savedData.link(myOwner, myPos, partnerPos, roles.aRole(), roles.bRole()); + + // === Notify both machines === + onLinkEstablished(partnerPos); + knownPartners.add(partnerPos); + + partnerMachine.onLinkEstablished(myPos); + + // Success feedback + String myName = getDefinition().getName(); + String partnerName = rawPartner.getDefinition().getName(); + player.sendSystemMessage(Component.translatable("cosmiccore.link.established", myName, partnerName) + .withStyle(ChatFormatting.GREEN)); + + return InteractionResult.SUCCESS; + + } finally { + // Release temporary chunk load + if (needsUnload) { + LinkedMultiblockHelper.releasePartnerChunk(server, myPos, partnerPos); + } + } + } + + // ==================== Default Implementations ==================== + + @Override + public boolean canLinkTo(GlobalPos partner, ILinkedMultiblock partnerMachine) { + // Default: allow linking to any ILinkedMultiblock + // Subclasses should override for type-specific restrictions + return true; + } + + @Override + public LinkRole getLinkRole() { + // Default: bidirectional peer + return LinkRole.PEER; + } + + @Override + public void onLinkEstablished(GlobalPos partner) { + // Default: just log + CosmicCore.LOGGER.debug("Link established: {} -> {}", getGlobalPos(), partner); + } + + @Override + public void onLinkBroken(GlobalPos partner) { + // Default: just log and update cache + CosmicCore.LOGGER.debug("Link broken: {} -> {}", getGlobalPos(), partner); + knownPartners.remove(partner); + } + + // ==================== Utility Methods ==================== + + /** + * Get a linked partner's machine instance. + * Does NOT force-load chunks - returns null if partner is unloaded. + */ + @Nullable + protected ILinkedMultiblock getPartnerMachine(GlobalPos partner) { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return null; + } + return LinkedMultiblockHelper.getLinkedMachine(serverLevel.getServer(), partner); + } + + /** + * Check if this machine can query the given partner (based on effective role). + */ + protected boolean canQueryPartner(GlobalPos partner) { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return false; + } + UUID owner = getTeamUUID(); + if (owner == null) return false; + return LinkedMultiblockHelper.canQuery(serverLevel.getServer(), owner, getGlobalPos(), partner); + } + + /** + * Get the effective role for this machine in relation to a specific partner. + */ + @Nullable + protected LinkRole getEffectiveRole(GlobalPos partner) { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return null; + } + UUID owner = getTeamUUID(); + if (owner == null) return null; + + LinkedMultiblockSavedData savedData = LinkedMultiblockSavedData.getOrCreate(serverLevel); + LinkEntry link = savedData.getLinkTo(owner, getGlobalPos(), partner); + return link != null ? link.effectiveRole() : null; + } + + // ==================== Partner Resource Queries ==================== + + /** + * Check if a partner has a specific item in its input handlers. + * Handles chunk loading automatically. + * + * @param partner The partner to query + * @param itemPredicate Predicate to test items (e.g., stack -> stack.is(Items.DIAMOND)) + * @return true if partner has matching item, false otherwise or if unavailable + */ + protected boolean partnerHasItem(GlobalPos partner, Predicate itemPredicate) { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return false; + } + UUID owner = getTeamUUID(); + if (owner == null) return false; + + return LinkedMultiblockHelper.partnerHasItem( + serverLevel.getServer(), owner, getGlobalPos(), partner, itemPredicate); + } + + /** + * Check if a partner has a specific fluid in its input handlers. + * Handles chunk loading automatically. + * + * @param partner The partner to query + * @param fluidPredicate Predicate to test fluids (e.g., stack -> stack.getFluid().is(Fluids.LAVA)) + * @return true if partner has matching fluid, false otherwise or if unavailable + */ + protected boolean partnerHasFluid(GlobalPos partner, Predicate fluidPredicate) { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return false; + } + UUID owner = getTeamUUID(); + if (owner == null) return false; + + return LinkedMultiblockHelper.partnerHasFluid( + serverLevel.getServer(), owner, getGlobalPos(), partner, fluidPredicate); + } + + /** + * Get total energy stored in a partner's energy containers. + * Handles chunk loading automatically. + * + * @param partner The partner to query + * @return Energy stored in EU, or 0 if unavailable + */ + protected long getPartnerEnergyStored(GlobalPos partner) { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return 0L; + } + UUID owner = getTeamUUID(); + if (owner == null) return 0L; + + return LinkedMultiblockHelper.getPartnerEnergyStored( + serverLevel.getServer(), owner, getGlobalPos(), partner); + } + + /** + * Check if a partner's multiblock is formed. + * Handles chunk loading automatically. + * + * @param partner The partner to query + * @return true if partner is formed, false otherwise or if unavailable + */ + protected boolean isPartnerFormed(GlobalPos partner) { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return false; + } + UUID owner = getTeamUUID(); + if (owner == null) return false; + + return LinkedMultiblockHelper.isPartnerFormed( + serverLevel.getServer(), owner, getGlobalPos(), partner); + } + + /** + * Check if a partner is currently running a recipe. + * Handles chunk loading automatically. + * + * @param partner The partner to query + * @return true if partner is working, false otherwise or if unavailable + */ + protected boolean isPartnerWorking(GlobalPos partner) { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return false; + } + UUID owner = getTeamUUID(); + if (owner == null) return false; + + return LinkedMultiblockHelper.isPartnerWorking( + serverLevel.getServer(), owner, getGlobalPos(), partner); + } + + /** + * Execute a custom query on a partner machine. + * Handles chunk loading and permission checks automatically. + * + * @param partner The partner to query + * @param query The query function + * @return Query result, or null if unavailable + */ + @Nullable + protected T queryPartner(GlobalPos partner, LinkedMultiblockHelper.PartnerQuery query) { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return null; + } + UUID owner = getTeamUUID(); + if (owner == null) return null; + + return LinkedMultiblockHelper.queryPartner( + serverLevel.getServer(), owner, getGlobalPos(), partner, query); + } + + /** + * Check if ANY linked partner has a specific item. + * Useful for recipe conditions that require "a linked partner has X". + * + * @param itemPredicate Predicate to test items + * @return true if any partner has the item + */ + protected boolean anyPartnerHasItem(Predicate itemPredicate) { + for (GlobalPos partner : getLinkedPartners()) { + if (partnerHasItem(partner, itemPredicate)) { + return true; + } + } + return false; + } + + /** + * Check if ANY linked partner has a specific fluid. + * + * @param fluidPredicate Predicate to test fluids + * @return true if any partner has the fluid + */ + protected boolean anyPartnerHasFluid(Predicate fluidPredicate) { + for (GlobalPos partner : getLinkedPartners()) { + if (partnerHasFluid(partner, fluidPredicate)) { + return true; + } + } + return false; + } + + /** + * Check if ANY linked partner is formed and working. + * + * @return true if any partner is actively working + */ + public boolean anyPartnerWorking() { + for (GlobalPos partner : getLinkedPartners()) { + if (isPartnerWorking(partner)) { + return true; + } + } + return false; + } + + /** + * Count how many linked partners are currently formed. + * + * @return Number of formed partners + */ + public int countFormedPartners() { + int count = 0; + for (GlobalPos partner : getLinkedPartners()) { + if (isPartnerFormed(partner)) { + count++; + } + } + return count; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/LinkedWorkableMultiblockMachine.java b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/LinkedWorkableMultiblockMachine.java new file mode 100644 index 000000000..c202e885b --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/LinkedWorkableMultiblockMachine.java @@ -0,0 +1,624 @@ +package com.ghostipedia.cosmiccore.api.machine.multiblock; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.capability.ILinkedMultiblock; +import com.ghostipedia.cosmiccore.api.data.savedData.LinkEntry; +import com.ghostipedia.cosmiccore.api.data.savedData.LinkedMultiblockSavedData; +import com.ghostipedia.cosmiccore.common.machine.multiblock.LinkedMultiblockHelper; +import com.ghostipedia.cosmiccore.common.machine.multiblock.LinkedMultiblockHelper.RolePair; + +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IDisplayUIMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; +import com.gregtechceu.gtceu.common.machine.owner.FTBOwner; + +import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.GlobalPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtOps; +import net.minecraft.network.chat.Component; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.fluids.FluidStack; + +import org.jetbrains.annotations.Nullable; + +import java.util.*; +import java.util.function.Predicate; + +/** + * Base class for non-electric multiblocks that support cross-dimensional linking. + *

+ * For electric multiblocks, use {@link LinkedWorkableElectricMultiblockMachine} instead. + *

+ * Subclasses should override: + *

    + *
  • {@link #canLinkTo(GlobalPos, ILinkedMultiblock)} - Type compatibility checks
  • + *
  • {@link #getLinkRole()} - Define role preference (PEER, CONTROLLER, REMOTE)
  • + *
  • {@link #getMaxPartners()} - Override if more/fewer than 4 partners needed
  • + *
  • {@link #onLinkEstablished(GlobalPos)} - React to new links
  • + *
  • {@link #onLinkBroken(GlobalPos)} - Cleanup when links break
  • + *
+ */ +public abstract class LinkedWorkableMultiblockMachine extends WorkableMultiblockMachine + implements ILinkedMultiblock, IMachineLife, IDisplayUIMachine { + + protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( + LinkedWorkableMultiblockMachine.class, + WorkableMultiblockMachine.MANAGED_FIELD_HOLDER); + + private static final String DATASTICK_TAG_KEY = "cosmiccore:link_data"; + private static final String TAG_POS = "Pos"; + private static final String TAG_OWNER = "Owner"; + + /** + * Local cache of known partners, rebuilt from SavedData on structure form. + * Used to detect changes for lifecycle callbacks. + * NOT persisted - rebuilt from SavedData which is the source of truth. + */ + protected Set knownPartners = new HashSet<>(); + + public LinkedWorkableMultiblockMachine(IMachineBlockEntity holder, Object... args) { + super(holder, args); + } + + @Override + public ManagedFieldHolder getFieldHolder() { + return MANAGED_FIELD_HOLDER; + } + + // ==================== ILinkedMultiblock Implementation ==================== + + @Override + public GlobalPos getGlobalPos() { + if (getLevel() instanceof ServerLevel serverLevel) { + return GlobalPos.of(serverLevel.dimension(), getPos()); + } + return null; + } + + @Override + @Nullable + public UUID getTeamUUID() { + var team = ((FTBOwner) getOwner()).getPlayerTeam(getOwnerUUID()); + return team != null ? team.getTeamId() : getOwnerUUID(); + } + + @Override + public Set getLinkedPartners() { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return Collections.emptySet(); + } + + UUID owner = getTeamUUID(); + if (owner == null) return Collections.emptySet(); + + LinkedMultiblockSavedData savedData = LinkedMultiblockSavedData.getOrCreate(serverLevel); + return savedData.getPartnerPositions(owner, getGlobalPos()); + } + + @Override + public void processLinkNotifications() { + if (!(getLevel() instanceof ServerLevel serverLevel)) return; + + UUID owner = getTeamUUID(); + if (owner == null) return; + + Set currentPartners = getLinkedPartners(); + + // Find new partners (in SavedData but not in our cache) + for (GlobalPos partner : currentPartners) { + if (!knownPartners.contains(partner)) { + onLinkEstablished(partner); + } + } + + // Find removed partners (in our cache but not in SavedData) + Set removed = new HashSet<>(knownPartners); + removed.removeAll(currentPartners); + for (GlobalPos partner : removed) { + onLinkBroken(partner); + } + + // Update cache + knownPartners = new HashSet<>(currentPartners); + } + + // ==================== Lifecycle ==================== + + @Override + public void onStructureFormed() { + super.onStructureFormed(); + // Process any pending link notifications from when we were unloaded + processLinkNotifications(); + } + + @Override + public void onStructureInvalid() { + super.onStructureInvalid(); + // Don't remove links when structure breaks - links persist to SavedData + // They'll be cleaned up when the machine is actually destroyed + } + + @Override + public void onMachineRemoved() { + IMachineLife.super.onMachineRemoved(); + + if (getLevel() instanceof ServerLevel serverLevel) { + UUID owner = getTeamUUID(); + GlobalPos myPos = getGlobalPos(); + + if (owner != null && myPos != null) { + // Release any force-loaded chunks + LinkedMultiblockHelper.releaseAllTickets(serverLevel.getServer(), myPos); + + // Remove all links from SavedData + LinkedMultiblockSavedData savedData = LinkedMultiblockSavedData.getOrCreate(serverLevel); + savedData.removeAllLinks(owner, myPos); + + // Notify partners (if loaded) + for (GlobalPos partner : knownPartners) { + ILinkedMultiblock partnerMachine = LinkedMultiblockHelper.getLinkedMachine( + serverLevel.getServer(), partner); + if (partnerMachine != null) { + partnerMachine.onLinkBroken(myPos); + } + } + } + } + } + + // ==================== Datastick Handling ==================== + + @Override + public InteractionResult onDataStickShiftUse(Player player, ItemStack dataStick) { + if (isRemote()) { + return InteractionResult.SUCCESS; + } + + GlobalPos myPos = getGlobalPos(); + UUID owner = getTeamUUID(); + + if (myPos == null || owner == null) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.not_ready") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + // Write link data to datastick + CompoundTag linkData = new CompoundTag(); + GlobalPos.CODEC.encodeStart(NbtOps.INSTANCE, myPos) + .result() + .ifPresent(encoded -> linkData.put(TAG_POS, encoded)); + linkData.putUUID(TAG_OWNER, owner); + + // Store in namespaced tag to preserve other datastick data + CompoundTag rootTag = dataStick.getOrCreateTag(); + rootTag.put(DATASTICK_TAG_KEY, linkData); + + // Update datastick name + String machineName = getDefinition().getName(); + dataStick.setHoverName(Component.translatable("cosmiccore.datastick.link_copied", machineName)); + + // Feedback + player.sendSystemMessage(Component.translatable("cosmiccore.link.copied", machineName) + .withStyle(ChatFormatting.GREEN)); + + return InteractionResult.SUCCESS; + } + + @Override + public InteractionResult onDataStickUse(Player player, ItemStack dataStick) { + if (isRemote()) { + return InteractionResult.sidedSuccess(true); + } + + CompoundTag rootTag = dataStick.getTag(); + if (rootTag == null || !rootTag.contains(DATASTICK_TAG_KEY)) { + return InteractionResult.PASS; // Not our data, let other handlers try + } + + CompoundTag linkData = rootTag.getCompound(DATASTICK_TAG_KEY); + + // Parse partner info from datastick + GlobalPos partnerPos = GlobalPos.CODEC + .decode(NbtOps.INSTANCE, linkData.get(TAG_POS)) + .result() + .map(pair -> pair.getFirst()) + .orElse(null); + + if (partnerPos == null) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.invalid_data") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + UUID partnerOwner = linkData.getUUID(TAG_OWNER); + + // Attempt to establish link + return tryLink(player, partnerPos, partnerOwner); + } + + /** + * Attempt to establish a link with the partner machine. + * Handles all validation, negotiation, and persistence. + */ + protected InteractionResult tryLink(Player player, GlobalPos partnerPos, UUID partnerOwner) { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return InteractionResult.FAIL; + } + + MinecraftServer server = serverLevel.getServer(); + GlobalPos myPos = getGlobalPos(); + UUID myOwner = getTeamUUID(); + + // === Validation === + + // Self-link check + if (myPos.equals(partnerPos)) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.cannot_self_link") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + // NOTE: We intentionally do NOT check partnerOwner from datastick NBT here. + // The datastick may be stale (team changed since it was written). + // Ownership is verified at runtime after loading the partner machine. + + // Partner limit check (this machine) + Set currentPartners = getLinkedPartners(); + if (currentPartners.size() >= getMaxPartners() && !currentPartners.contains(partnerPos)) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.limit_reached_self") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + // Already linked check + if (currentPartners.contains(partnerPos)) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.already_linked") + .withStyle(ChatFormatting.YELLOW)); + return InteractionResult.FAIL; + } + + // === Load and verify partner === + // SECURITY: Always load partner to verify ownership and compatibility + boolean needsUnload = false; + if (!LinkedMultiblockHelper.isPartnerOnline(server, partnerPos)) { + // Try to force-load partner temporarily + if (!LinkedMultiblockHelper.forceLoadPartnerChunk(server, myPos, partnerPos)) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.partner_not_loaded") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + needsUnload = true; + } + + try { + MetaMachine rawPartner = LinkedMultiblockHelper.getMachine(server, partnerPos); + if (rawPartner == null) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.partner_missing") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + if (!(rawPartner instanceof ILinkedMultiblock partnerMachine)) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.not_linkable") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + // Verify ownership matches at runtime + UUID actualPartnerOwner = partnerMachine.getTeamUUID(); + if (!Objects.equals(myOwner, actualPartnerOwner)) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.different_owner") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + // === Partner capacity check === + Set partnerLinks = partnerMachine.getLinkedPartners(); + if (partnerLinks.size() >= partnerMachine.getMaxPartners() && !partnerLinks.contains(myPos)) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.limit_reached_partner") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + // === Role Negotiation === + RolePair roles = LinkedMultiblockHelper.negotiateRoles(getLinkRole(), partnerMachine.getLinkRole()); + if (roles == null) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.incompatible_roles", + getLinkRole().name(), partnerMachine.getLinkRole().name()) + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + // === Type compatibility check === + if (!canLinkTo(partnerPos, partnerMachine)) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.incompatible_self") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + if (!partnerMachine.canLinkTo(myPos, this)) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.incompatible_partner") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + // === Persist link === + LinkedMultiblockSavedData savedData = LinkedMultiblockSavedData.getOrCreate(serverLevel); + savedData.link(myOwner, myPos, partnerPos, roles.aRole(), roles.bRole()); + + // === Notify both machines === + onLinkEstablished(partnerPos); + knownPartners.add(partnerPos); + + partnerMachine.onLinkEstablished(myPos); + + // Success feedback + String myName = getDefinition().getName(); + String partnerName = rawPartner.getDefinition().getName(); + player.sendSystemMessage(Component.translatable("cosmiccore.link.established", myName, partnerName) + .withStyle(ChatFormatting.GREEN)); + + return InteractionResult.SUCCESS; + + } finally { + // Release temporary chunk load + if (needsUnload) { + LinkedMultiblockHelper.releasePartnerChunk(server, myPos, partnerPos); + } + } + } + + // ==================== Default Implementations ==================== + + @Override + public boolean canLinkTo(GlobalPos partner, ILinkedMultiblock partnerMachine) { + // Default: allow linking to any ILinkedMultiblock + // Subclasses should override for type-specific restrictions + return true; + } + + @Override + public LinkRole getLinkRole() { + // Default: bidirectional peer + return LinkRole.PEER; + } + + @Override + public void onLinkEstablished(GlobalPos partner) { + // Default: just log + CosmicCore.LOGGER.debug("Link established: {} -> {}", getGlobalPos(), partner); + } + + @Override + public void onLinkBroken(GlobalPos partner) { + // Default: just log and update cache + CosmicCore.LOGGER.debug("Link broken: {} -> {}", getGlobalPos(), partner); + knownPartners.remove(partner); + } + + // ==================== Utility Methods ==================== + + /** + * Get a linked partner's machine instance. + * Does NOT force-load chunks - returns null if partner is unloaded. + */ + @Nullable + protected ILinkedMultiblock getPartnerMachine(GlobalPos partner) { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return null; + } + return LinkedMultiblockHelper.getLinkedMachine(serverLevel.getServer(), partner); + } + + /** + * Check if this machine can query the given partner (based on effective role). + */ + protected boolean canQueryPartner(GlobalPos partner) { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return false; + } + UUID owner = getTeamUUID(); + if (owner == null) return false; + return LinkedMultiblockHelper.canQuery(serverLevel.getServer(), owner, getGlobalPos(), partner); + } + + /** + * Get the effective role for this machine in relation to a specific partner. + */ + @Nullable + protected LinkRole getEffectiveRole(GlobalPos partner) { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return null; + } + UUID owner = getTeamUUID(); + if (owner == null) return null; + + LinkedMultiblockSavedData savedData = LinkedMultiblockSavedData.getOrCreate(serverLevel); + LinkEntry link = savedData.getLinkTo(owner, getGlobalPos(), partner); + return link != null ? link.effectiveRole() : null; + } + + // ==================== Partner Resource Queries ==================== + + /** + * Check if a partner has a specific item in its input handlers. + * Handles chunk loading automatically. + * + * @param partner The partner to query + * @param itemPredicate Predicate to test items (e.g., stack -> stack.is(Items.DIAMOND)) + * @return true if partner has matching item, false otherwise or if unavailable + */ + protected boolean partnerHasItem(GlobalPos partner, Predicate itemPredicate) { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return false; + } + UUID owner = getTeamUUID(); + if (owner == null) return false; + + return LinkedMultiblockHelper.partnerHasItem( + serverLevel.getServer(), owner, getGlobalPos(), partner, itemPredicate); + } + + /** + * Check if a partner has a specific fluid in its input handlers. + * Handles chunk loading automatically. + * + * @param partner The partner to query + * @param fluidPredicate Predicate to test fluids (e.g., stack -> stack.getFluid().is(Fluids.LAVA)) + * @return true if partner has matching fluid, false otherwise or if unavailable + */ + protected boolean partnerHasFluid(GlobalPos partner, Predicate fluidPredicate) { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return false; + } + UUID owner = getTeamUUID(); + if (owner == null) return false; + + return LinkedMultiblockHelper.partnerHasFluid( + serverLevel.getServer(), owner, getGlobalPos(), partner, fluidPredicate); + } + + /** + * Get total energy stored in a partner's energy containers. + * Handles chunk loading automatically. + * + * @param partner The partner to query + * @return Energy stored in EU, or 0 if unavailable + */ + protected long getPartnerEnergyStored(GlobalPos partner) { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return 0L; + } + UUID owner = getTeamUUID(); + if (owner == null) return 0L; + + return LinkedMultiblockHelper.getPartnerEnergyStored( + serverLevel.getServer(), owner, getGlobalPos(), partner); + } + + /** + * Check if a partner's multiblock is formed. + * Handles chunk loading automatically. + * + * @param partner The partner to query + * @return true if partner is formed, false otherwise or if unavailable + */ + protected boolean isPartnerFormed(GlobalPos partner) { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return false; + } + UUID owner = getTeamUUID(); + if (owner == null) return false; + + return LinkedMultiblockHelper.isPartnerFormed( + serverLevel.getServer(), owner, getGlobalPos(), partner); + } + + /** + * Check if a partner is currently running a recipe. + * Handles chunk loading automatically. + * + * @param partner The partner to query + * @return true if partner is working, false otherwise or if unavailable + */ + protected boolean isPartnerWorking(GlobalPos partner) { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return false; + } + UUID owner = getTeamUUID(); + if (owner == null) return false; + + return LinkedMultiblockHelper.isPartnerWorking( + serverLevel.getServer(), owner, getGlobalPos(), partner); + } + + /** + * Execute a custom query on a partner machine. + * Handles chunk loading and permission checks automatically. + * + * @param partner The partner to query + * @param query The query function + * @return Query result, or null if unavailable + */ + @Nullable + protected T queryPartner(GlobalPos partner, LinkedMultiblockHelper.PartnerQuery query) { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return null; + } + UUID owner = getTeamUUID(); + if (owner == null) return null; + + return LinkedMultiblockHelper.queryPartner( + serverLevel.getServer(), owner, getGlobalPos(), partner, query); + } + + /** + * Check if ANY linked partner has a specific item. + * Useful for recipe conditions that require "a linked partner has X". + * + * @param itemPredicate Predicate to test items + * @return true if any partner has the item + */ + protected boolean anyPartnerHasItem(Predicate itemPredicate) { + for (GlobalPos partner : getLinkedPartners()) { + if (partnerHasItem(partner, itemPredicate)) { + return true; + } + } + return false; + } + + /** + * Check if ANY linked partner has a specific fluid. + * + * @param fluidPredicate Predicate to test fluids + * @return true if any partner has the fluid + */ + protected boolean anyPartnerHasFluid(Predicate fluidPredicate) { + for (GlobalPos partner : getLinkedPartners()) { + if (partnerHasFluid(partner, fluidPredicate)) { + return true; + } + } + return false; + } + + /** + * Check if ANY linked partner is formed and working. + * + * @return true if any partner is actively working + */ + public boolean anyPartnerWorking() { + for (GlobalPos partner : getLinkedPartners()) { + if (isPartnerWorking(partner)) { + return true; + } + } + return false; + } + + /** + * Count how many linked partners are currently formed. + * + * @return Number of formed partners + */ + public int countFormedPartners() { + int count = 0; + for (GlobalPos partner : getLinkedPartners()) { + if (isPartnerFormed(partner)) { + count++; + } + } + return count; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/MegaAlvearyMultiblockMachine.java b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/MegaAlvearyMultiblockMachine.java new file mode 100644 index 000000000..c644e54a8 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/MegaAlvearyMultiblockMachine.java @@ -0,0 +1,284 @@ +package com.ghostipedia.cosmiccore.api.machine.multiblock; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.materials.CosmicMaterials; +import com.ghostipedia.cosmiccore.common.machine.multiblock.part.BeeHolderPartMachine; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.chance.logic.ChanceLogic; +import com.gregtechceu.gtceu.data.recipe.builder.GTRecipeBuilder; + +import net.minecraft.core.Direction; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.material.Fluid; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.IFluidHandler; + +import forestry.api.ForestryCapabilities; +import forestry.api.apiculture.genetics.IBee; +import forestry.api.apiculture.genetics.IBeeSpecies; +import forestry.api.genetics.alleles.BeeChromosomes; +import it.unimi.dsi.fastutil.objects.Object2FloatOpenHashMap; +import lombok.Getter; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +public class MegaAlvearyMultiblockMachine extends WorkableElectricMultiblockMachine { + + @Getter + private List beeHolders; + + public MegaAlvearyMultiblockMachine(IMachineBlockEntity holder, Object... args) { + super(holder, args); + } + + @Override + public void onStructureFormed() { + super.onStructureFormed(); + this.beeHolders = new ArrayList<>(); + for (IMultiPart part : getParts()) { + if (part instanceof BeeHolderPartMachine beeHolder) { + beeHolders.add(beeHolder); + } + } + } + + @Override + public void onStructureInvalid() { + for (IMultiPart part : getParts()) { + if (part instanceof BeeHolderPartMachine beeHolder) { + beeHolder.setLocked(false); + } + } + beeHolders = null; + super.onStructureInvalid(); + } + + private void setHoldersLocked(boolean locked) { + beeHolders.forEach(holder -> holder.setLocked(locked)); + } + + @Override + protected RecipeLogic createRecipeLogic(Object... args) { + return new MegaAlvearyRecipeLogic(this); + } + + @Override + public boolean beforeWorking(@Nullable GTRecipe recipe) { + setHoldersLocked(true); + return super.beforeWorking(recipe); + } + + @Override + public void afterWorking() { + setHoldersLocked(false); + this.recipeLogic.markLastRecipeDirty(); + super.afterWorking(); + } + + public static class MegaAlvearyRecipeLogic extends RecipeLogic { + + public MegaAlvearyRecipeLogic(MegaAlvearyMultiblockMachine machine) { + super(machine); + } + + // Constant now, maybe change to be dependent on bee amount, etc. + private int productivityFluidConsumptionAmount = 10000; + + private Map productivityFluids = null; + + // Lazy getter for productivityFluids so we don't ever have issues with registration order etc. + private Map getProductivityFluids() { + if (productivityFluids == null) { + // To update the productivity values, edit these below. + productivityFluids = new Object2FloatOpenHashMap<>(); + productivityFluids.put(CosmicMaterials.basicNutrientProductionFluid.getFluid(), 8f); + productivityFluids.put(CosmicMaterials.advancedNutrientProductionFluid.getFluid(), 16f); + productivityFluids.put(CosmicMaterials.superNutrientProductionFluid.getFluid(), 32f); + productivityFluids.put(CosmicMaterials.perfectedNutrientProductionFluid.getFluid(), 64f); + + } + return productivityFluids; + } + + // Constant now, maybe change to be dependent on bee amount, etc. + private int overclockFluidConsumptionAmount = 1000; + + private Map overclockFluids = null; + + // Lazy getter for overclockFluids so we don't ever have issues with registration order etc. + private Map getOverclockFluids() { + if (overclockFluids == null) { + // To update the overclock values, edit these below. + overclockFluids = new Object2FloatOpenHashMap<>(); + // These are multipliers, so 0.7f would reduce the recipe time by 30% + overclockFluids.put(CosmicMaterials.basicNutrientOverclockFluid.getFluid(), 0.80f); + overclockFluids.put(CosmicMaterials.advancedNutrientOverclockFluid.getFluid(), 0.60f); + overclockFluids.put(CosmicMaterials.superNutrientOverclockFluid.getFluid(), 0.40f); + overclockFluids.put(CosmicMaterials.perfectedNutrientOverclockFluid.getFluid(), 0.25f); + + } + return overclockFluids; + } + + @Override + public @NotNull Iterator searchRecipe() { + if (!(machine instanceof MegaAlvearyMultiblockMachine)) { + CosmicCore.LOGGER + .error("MegaAlvearyRecipeLogic should only be ran in the MegaAlvearyMultiblockMachine"); + } + var builder = GTRecipeBuilder + .of(CosmicCore.id("bee_recipe"), CosmicRecipeTypes.BEES); + + // ====== Get and process Productivity Fluids ===== + var productivityFluids = getProductivityFluids(); + float productivityMultiplier = 1f; + FluidStack productivityFluid = null; + var fluidHandlers = machine.getCapabilitiesFlat(IO.IN, FluidRecipeCapability.CAP); + for (var handler : fluidHandlers) { + if (!(handler instanceof NotifiableFluidTank fluidHandler)) continue; + for (var content : fluidHandler.getContents()) { + if (!(content instanceof FluidStack stack)) continue; + + // See if this fluid is a Productivity Fluid + float potentialMult = productivityFluids.getOrDefault(stack.getFluid(), -1f); + + // If we don't have a fluid, or this isn't the highest mult, continue. + if (potentialMult == -1f || potentialMult < productivityMultiplier) continue; + + // See if we have enough fluid in this handler + int drained = fluidHandler + .drainInternal(new FluidStack(stack.getFluid(), productivityFluidConsumptionAmount), + IFluidHandler.FluidAction.SIMULATE) + .getAmount(); + if (drained == productivityFluidConsumptionAmount) { + productivityFluid = new FluidStack(stack.getFluid(), productivityFluidConsumptionAmount); + productivityMultiplier = potentialMult; + } + } + } + if (productivityFluid != null) { + // This drains in 1 go at the start. To drain per tick, add .perTick(true).....perTick(false) + builder.inputFluids(productivityFluid); + } + + // ====== Get and process Overclock Fluids ===== + var overclockFluids = getOverclockFluids(); + float overclockMultiplier = 1f; + FluidStack overclockFluid = null; + for (var handler : fluidHandlers) { + if (!(handler instanceof NotifiableFluidTank fluidHandler)) continue; + for (var content : fluidHandler.getContents()) { + if (!(content instanceof FluidStack stack)) continue; + + // See if this fluid is a Productivity Fluid + float potentialMult = overclockFluids.getOrDefault(stack.getFluid(), -1f); + + // If we don't have a fluid, or this isn't the lowest OC, continue. + if (potentialMult == -1f || potentialMult > overclockMultiplier) continue; + + // See if we have enough fluid in this handler + int drained = fluidHandler + .drainInternal(new FluidStack(stack.getFluid(), overclockFluidConsumptionAmount), + IFluidHandler.FluidAction.SIMULATE) + .getAmount(); + if (drained == overclockFluidConsumptionAmount) { + overclockFluid = new FluidStack(stack.getFluid(), overclockFluidConsumptionAmount); + overclockMultiplier = potentialMult; + } + } + } + if (overclockFluid != null) { + // This drains in 1 go at the start. To drain per tick, add .perTick(true).....perTick(false) + builder.inputFluids(overclockFluid); + } + builder.duration((int) (60 * 20 * overclockMultiplier)); + + // ====== Get and process Bees from holders ===== + var alveary = (MegaAlvearyMultiblockMachine) machine; + int totalbees = 0; + Map beeCounter = new HashMap<>(); + for (var holder : alveary.getBeeHolders()) { + for (var content : holder.getHeldBees().getContents()) { + if (!(content instanceof ItemStack stack)) continue; + + // Check if it's a Forestry Handler Item + var optionalCap = stack.getCapability(ForestryCapabilities.INDIVIDUAL_HANDLER_ITEM, + (Direction) null); + if (!optionalCap.isPresent()) continue; + var cap = optionalCap.resolve().get(); + + // Check if it's a bee + var individual = cap.getIndividual(); + if (!(individual instanceof IBee bee)) continue; + var genome = bee.getGenome(); + + IBeeSpecies primary = genome.getActiveValue(BeeChromosomes.SPECIES); + + beeCounter.put(primary, beeCounter.getOrDefault(primary, 0) + 1); + totalbees += 1; + } + } + + // ===== Add outputs from bee species counter ===== + for (var beeEntry : beeCounter.entrySet()) { + for (var product : beeEntry.getKey().getProducts()) { + builder.chancedOutput( + new ItemStack( + product.item(), + (int) (256 * productivityMultiplier * beeEntry.getValue())), + (int) (product.chance() * ChanceLogic.getMaxChancedValue()), + 0); + } + } + + builder.EUt(totalbees * GTValues.V[GTValues.ZPM]); + if (totalbees == 0) { + return Collections.emptyIterator(); + } else { + return Collections.singleton(builder.buildRawRecipe()).iterator(); + } + } + } +} + +// Machine logic rough draft + +// Lock Bee Holders to avoid duping/false caching bees +// Collect ALl bees into a list/map +// Deririve all products and the base yield from all bees contained in holders +// H.O.N.E.Y Runs on flat 5second intervals, No Overclocks +// Can insert fluid to 'boost' yield, similar to how we do it for our Custom ExoticCombustionEngineMachine +// Will consume X Nutrients at the start of the 5s cycle to 'boost' the yield, make sure this is extensible to +// like 4 or 5 fluids for now +// Runs 5 seconds +// Ejects all Products + +// More Info + +// Ignore all stats besides species, we'll assume Maximum Production speed is natively granted by the hive. +// Base Output (PER BEE) sould be 256, so 1 bee is 256 combs of X Type, 4 would be 1024 Combs, etc. +// Feeding Nutrient Fluid to bees at the start of a recipe will uh... Do stuff.. +// Some Nutrients Reduce Time +// Some Nutrients Boost Productivity (Flat Multiplier to all outputs) +// Each Bee Installed in a bee holder will cost 1 ZPM amp - meaning atm the Best In Slot HONEY will draw 64A ZPM +// until V8+ + +// Check out ResearchStationMachine as to how to make the BeeHolderPartMachine lock it's I/O in our custom logic +// I tried to Impl some of it, probably not sufficient. diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/StellarBaseModule.java b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/StellarBaseModule.java new file mode 100644 index 000000000..edb9964b3 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/StellarBaseModule.java @@ -0,0 +1,482 @@ +package com.ghostipedia.cosmiccore.api.machine.multiblock; + +import com.ghostipedia.cosmiccore.api.data.wireless.WirelessEnergySavedData; +import com.ghostipedia.cosmiccore.api.machine.feature.IStellarIrisProvider; +import com.ghostipedia.cosmiccore.api.machine.feature.IStellarModuleReceiver; +import com.ghostipedia.cosmiccore.client.gui.widget.stellar.StellarModuleContentWidget; +import com.ghostipedia.cosmiccore.client.gui.widget.stellar.StellarModuleUIWidget; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.capability.recipe.IRecipeHandler; +import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; +import com.gregtechceu.gtceu.api.machine.feature.IOverclockMachine; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IDisplayUIMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.RecipeHelper; +import com.gregtechceu.gtceu.common.machine.owner.FTBOwner; +import com.gregtechceu.gtceu.common.machine.owner.MachineOwner; +import com.gregtechceu.gtceu.utils.GTUtil; + +import com.lowdragmc.lowdraglib.gui.modular.ModularUI; +import com.lowdragmc.lowdraglib.gui.widget.Widget; +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.player.Player; + +import lombok.Getter; +import lombok.Setter; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +@Getter +public class StellarBaseModule extends WorkableMultiblockMachine + implements IStellarModuleReceiver, IDisplayUIMachine, IFancyUIMachine, + IOverclockMachine { + + public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( + StellarBaseModule.class, WorkableMultiblockMachine.MANAGED_FIELD_HOLDER); + + @Setter + private IStellarIrisProvider stellarIris; + + @DescSynced + private long energyConsumedPerTick = 0; + + @DescSynced + private boolean wirelessEnergyAvailable = false; + + @DescSynced + private boolean powerFailure = false; + + @Getter + @Setter + @Persisted + @DescSynced + private int configuredMaxParallel = 1; + + @Getter + @Setter + @Persisted + @DescSynced + private long configuredVoltagePerParallel = 32; + + private NotifiableEnergyContainer virtualEnergyContainer; + + public StellarBaseModule(IMachineBlockEntity holder) { + super(holder); + this.virtualEnergyContainer = new NotifiableEnergyContainer(this, + Long.MAX_VALUE, Long.MAX_VALUE, Long.MAX_VALUE, 0, 0); + this.virtualEnergyContainer.setSideInputCondition(side -> false); + this.virtualEnergyContainer.setSideOutputCondition(side -> false); + } + + @Override + public @NotNull ManagedFieldHolder getFieldHolder() { + return MANAGED_FIELD_HOLDER; + } + + protected UUID getTeamUUID() { + var owner = getOwner(); + var ownerUUID = getOwnerUUID(); + + if (owner == null) return MachineOwner.EMPTY; + if (ownerUUID == null) return MachineOwner.EMPTY; + + if (owner instanceof FTBOwner ftbOwner) { + var team = ftbOwner.getPlayerTeam(ownerUUID); + if (team != null) { + return team.getTeamId(); + } + } + return ownerUUID; + } + + protected boolean drainWirelessEnergy(long amount) { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return false; + } + + UUID owner = getTeamUUID(); + if (owner == MachineOwner.EMPTY) { + return false; + } + + WirelessEnergySavedData data = WirelessEnergySavedData.getOrCreate(serverLevel); + + if (!data.isActive(owner)) { + return false; + } + + BigInteger stored = data.getEnergyStored(owner); + if (stored.compareTo(BigInteger.valueOf(amount)) < 0) { + return false; + } + + BigInteger leftover = data.addEUToGlobalWirelessEnergy(owner, BigInteger.valueOf(-amount)); + if (leftover.equals(BigInteger.ZERO)) { + data.setEnergyOutput(owner, getPos(), amount); + return true; + } + return false; + } + + protected boolean checkWirelessEnergyAvailable() { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return false; + } + + UUID owner = getTeamUUID(); + if (owner == MachineOwner.EMPTY) { + return false; + } + + WirelessEnergySavedData data = WirelessEnergySavedData.getOrCreate(serverLevel); + return data.isActive(owner); + } + + protected BigInteger getWirelessEnergyStored() { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return BigInteger.ZERO; + } + + UUID owner = getTeamUUID(); + if (owner == MachineOwner.EMPTY) { + return BigInteger.ZERO; + } + + WirelessEnergySavedData data = WirelessEnergySavedData.getOrCreate(serverLevel); + return data.getEnergyStored(owner); + } + + @Override + public void onLoad() { + super.onLoad(); + if (isFormed() && stellarIris == null) { + findAndRegisterWithIris(); + } + virtualEnergyContainer.setEnergyStored(Long.MAX_VALUE / 2); + this.wirelessEnergyAvailable = checkWirelessEnergyAvailable(); + + if (isFormed() && getLevel() instanceof ServerLevel serverLevel) { + serverLevel.getServer().tell(new net.minecraft.server.TickTask( + serverLevel.getServer().getTickCount() + 20, + () -> { + if (isFormed() && stellarIris == null) { + findAndRegisterWithIris(); + } + getRecipeLogic().updateTickSubscription(); + })); + } + } + + @Override + public void onStructureFormed() { + super.onStructureFormed(); + this.wirelessEnergyAvailable = checkWirelessEnergyAvailable(); + findAndRegisterWithIris(); + virtualEnergyContainer.setEnergyStored(Long.MAX_VALUE / 2); + } + + @Override + public Map, List>>> getCapabilitiesFlat() { + Map, List>>> flat = super.getCapabilitiesFlat(); + Map, List>> inputCaps = flat.get(IO.IN); + boolean hasEnergy = inputCaps != null && inputCaps.containsKey(EURecipeCapability.CAP) && + !inputCaps.get(EURecipeCapability.CAP).isEmpty(); + if (!hasEnergy) { + flat.computeIfAbsent(IO.IN, k -> new HashMap<>()) + .computeIfAbsent(EURecipeCapability.CAP, k -> new ArrayList<>()) + .add(virtualEnergyContainer); + } + return flat; + } + + protected void findAndRegisterWithIris() { + if (getLevel() == null || stellarIris != null) return; + + BlockPos modulePos = getPos(); + int maxRadius = 80; + + for (int radius = 1; radius <= maxRadius; radius++) { + for (int x = -radius; x <= radius; x++) { + for (int z = -radius; z <= radius; z++) { + if (Math.abs(x) != radius && Math.abs(z) != radius) continue; + + for (int y = -10; y <= 10; y++) { + BlockPos checkPos = modulePos.offset(x, y, z); + var blockEntity = getLevel().getBlockEntity(checkPos); + + if (blockEntity instanceof IMachineBlockEntity machineBlockEntity) { + var machine = machineBlockEntity.getMetaMachine(); + if (machine instanceof IrisMultiblockMachine iris && iris.isFormed()) { + if (iris.registerModule(this)) { + return; + } + } + } + } + } + } + } + } + + @Override + public void onStructureInvalid() { + super.onStructureInvalid(); + + if (stellarIris instanceof IrisMultiblockMachine iris) { + iris.unregisterModule(this); + } + + this.stellarIris = null; + this.wirelessEnergyAvailable = false; + this.energyConsumedPerTick = 0; + clearEnergyOutput(); + } + + @Override + public boolean isRecipeLogicAvailable() { + if (!super.isRecipeLogicAvailable()) { + return false; + } + + IStellarIrisProvider iris = getStellarIris(); + if (iris == null) { + findAndRegisterWithIris(); + iris = getStellarIris(); + } + + if (iris == null || !iris.isFormed()) { + return false; + } + + if (!iris.canProcess()) { + return false; + } + + this.wirelessEnergyAvailable = checkWirelessEnergyAvailable(); + return wirelessEnergyAvailable; + } + + @Override + public boolean beforeWorking(@Nullable GTRecipe recipe) { + if (recipe == null) return false; + + long euPerTick = RecipeHelper.getRealEUt(recipe).getTotalEU(); + euPerTick = applyEnergyDiscount(euPerTick); + + if (!drainWirelessEnergy(euPerTick)) { + this.powerFailure = true; + return false; + } + + this.powerFailure = false; + this.energyConsumedPerTick = euPerTick; + return super.beforeWorking(recipe); + } + + @Override + public boolean onWorking() { + if (!super.onWorking()) { + return false; + } + + virtualEnergyContainer.setEnergyStored(Long.MAX_VALUE / 2); + + GTRecipe lastRecipe = getRecipeLogic().getLastRecipe(); + if (lastRecipe != null) { + long euPerTick = RecipeHelper.getRealEUt(lastRecipe).getTotalEU(); + euPerTick = applyEnergyDiscount(euPerTick); + this.energyConsumedPerTick = euPerTick; + + if (!drainWirelessEnergy(euPerTick)) { + this.powerFailure = true; + return false; + } + } + + this.powerFailure = false; + return true; + } + + private long applyEnergyDiscount(long baseEU) { + IStellarIrisProvider iris = getStellarIris(); + if (iris != null && iris.canProcess()) { + double discount = iris.getEnergyDiscount(); + baseEU = (long) (baseEU * discount); + } + return Math.max(1, baseEU); + } + + @Override + public void afterWorking() { + super.afterWorking(); + this.energyConsumedPerTick = 0; + this.powerFailure = false; + clearEnergyOutput(); + } + + private void clearEnergyOutput() { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return; + } + UUID owner = getTeamUUID(); + if (owner == MachineOwner.EMPTY) { + return; + } + WirelessEnergySavedData data = WirelessEnergySavedData.getOrCreate(serverLevel); + data.removeEnergyOutput(owner, getPos()); + } + + @Override + @Nullable + protected GTRecipe getRealRecipe(GTRecipe recipe) { + GTRecipe modified = super.getRealRecipe(recipe); + if (modified == null) { + return null; + } + + int recipeTier = RecipeHelper.getRecipeEUtTier(recipe); + if (recipeTier > getOverclockTier()) { + return null; + } + + IStellarIrisProvider iris = getStellarIris(); + if (iris == null || !iris.canProcess()) { + return modified; + } + + double speedBonus = iris.getSpeedBonus(); + if (speedBonus > 1.0) { + int newDuration = (int) Math.max(1, modified.duration / speedBonus); + modified = modified.copy(); + modified.duration = newDuration; + } + + return modified; + } + + public int getEffectiveParallelLimit() { + IStellarIrisProvider iris = getStellarIris(); + int irisLimit = (iris != null && iris.canProcess()) ? iris.getParallelLimit() : 1; + return Math.min(configuredMaxParallel, irisLimit); + } + + public int getIrisParallelLimit() { + IStellarIrisProvider iris = getStellarIris(); + if (iris == null || !iris.canProcess()) { + return 1; + } + return iris.getParallelLimit(); + } + + @Override + public int getOverclockTier() { + return GTUtil.getTierByVoltage(configuredVoltagePerParallel); + } + + @Override + public void setOverclockTier(int tier) { + tier = Math.max(getMinOverclockTier(), Math.min(tier, getMaxOverclockTier())); + this.configuredVoltagePerParallel = GTValues.V[tier]; + } + + @Override + public int getMaxOverclockTier() { + return GTValues.MAX; + } + + @Override + public int getMinOverclockTier() { + return GTValues.ULV; + } + + @Override + public long getOverclockVoltage() { + return configuredVoltagePerParallel * getEffectiveParallelLimit(); + } + + public long getMaxEUt() { + return configuredVoltagePerParallel * getEffectiveParallelLimit(); + } + + @Override + public Widget createUIWidget() { + return new StellarModuleContentWidget(() -> this); + } + + @Override + public ModularUI createUI(Player entityPlayer) { + return new ModularUI(198, 208, this, entityPlayer) + .widget(new StellarModuleUIWidget(this, 198, 208, () -> this)); + } + + @Override + public void addDisplayText(List textList) { + IDisplayUIMachine.super.addDisplayText(textList); + + if (isFormed()) { + if (powerFailure) { + textList.add(Component.translatable("cosmiccore.multiblock.stellar_module.power_failure") + .setStyle(Style.EMPTY.withColor(ChatFormatting.RED).withBold(true))); + } + + if (!wirelessEnergyAvailable) { + textList.add(Component.translatable("cosmiccore.multiblock.stellar_module.no_wireless") + .setStyle(Style.EMPTY.withColor(ChatFormatting.RED))); + } else if (energyConsumedPerTick > 0) { + textList.add(Component.translatable("cosmiccore.multiblock.stellar_module.energy_usage", + String.format("%,d", energyConsumedPerTick)) + .setStyle(Style.EMPTY.withColor(ChatFormatting.YELLOW))); + } + + String tierName = GTValues.VNF[getOverclockTier()]; + textList.add(Component.translatable("cosmiccore.multiblock.stellar_module.power_config", + tierName, getEffectiveParallelLimit()) + .setStyle(Style.EMPTY.withColor(ChatFormatting.AQUA))); + + IStellarIrisProvider iris = getStellarIris(); + if (iris == null) { + textList.add(Component.translatable("cosmiccore.multiblock.stellar_module.not_connected")); + } else if (!iris.isFormed()) { + textList.add(Component.translatable("cosmiccore.multiblock.stellar_module.iris_not_formed")); + } else if (!iris.canProcess()) { + textList.add(Component.translatable("cosmiccore.multiblock.stellar_module.iris_not_ready")); + textList.add(Component.translatable("cosmiccore.multiblock.stellar_module.stage", + iris.getStage().toString())); + } else { + textList.add(Component.translatable("cosmiccore.multiblock.stellar_module.connected")); + textList.add(Component.translatable("cosmiccore.multiblock.stellar_module.stage", + iris.getStage().toString())); + textList.add(Component.translatable("cosmiccore.multiblock.stellar_module.speed_bonus", + String.format("%.1fx", iris.getSpeedBonus()))); + textList.add(Component.translatable("cosmiccore.multiblock.stellar_module.parallel", + iris.getParallelLimit())); + } + } + } + + public boolean isPowerFailure() { + return powerFailure; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/StellarIrisUpgrade.java b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/StellarIrisUpgrade.java new file mode 100644 index 000000000..80a1a2ac3 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/StellarIrisUpgrade.java @@ -0,0 +1,236 @@ +package com.ghostipedia.cosmiccore.api.machine.multiblock; + +import java.util.EnumSet; +import java.util.Set; +import java.util.function.Supplier; + +public enum StellarIrisUpgrade { + + // IGNITION - Star Lifecycle + THERMAL_STABILIZER(Branch.IGNITION, 1, 15, 1, () -> Set.of()), + PLASMA_CONDUITS(Branch.IGNITION, 1, 15, 1, () -> Set.of()), + FUSION_CATALYST(Branch.IGNITION, 2, 25, 1, () -> Set.of(THERMAL_STABILIZER, PLASMA_CONDUITS)), + MAGNETIC_CONFINEMENT(Branch.IGNITION, 2, 25, 1, () -> Set.of(THERMAL_STABILIZER, PLASMA_CONDUITS)), + CORE_HARMONICS(Branch.IGNITION, 3, 40, 1, () -> Set.of(MAGNETIC_CONFINEMENT)), + PROTON_RECYCLER(Branch.IGNITION, 3, 40, 1, () -> Set.of(FUSION_CATALYST)), + STELLAR_REGENERATION(Branch.IGNITION, 4, 60, 1, () -> Set.of(CORE_HARMONICS, PROTON_RECYCLER)), + ETERNAL_EMBER(Branch.IGNITION, 4, 60, 1, () -> Set.of(CORE_HARMONICS, PROTON_RECYCLER)), + PHOENIX_PROTOCOL(Branch.IGNITION, 5, 80, 1, () -> Set.of(STELLAR_REGENERATION)), + SOLAR_DOMINION(Branch.IGNITION, 5, 80, 1, () -> Set.of(ETERNAL_EMBER)), + PERPETUAL_IGNITION(Branch.IGNITION, 6, 100, 1, () -> Set.of(PHOENIX_PROTOCOL, SOLAR_DOMINION)), + SUPERNOVA_CORE(Branch.IGNITION, 7, 130, 1, () -> Set.of(PERPETUAL_IGNITION)), + PLASMA_HURRICANE(Branch.IGNITION, 7, 130, 1, () -> Set.of(PERPETUAL_IGNITION)), + STELLAR_NURSERY(Branch.IGNITION, 8, 170, 1, () -> Set.of(SUPERNOVA_CORE)), + CORONA_EXPANSION(Branch.IGNITION, 8, 170, 1, () -> Set.of(PLASMA_HURRICANE)), + HELIOS_FORGE(Branch.IGNITION, 9, 220, 1, () -> Set.of(STELLAR_NURSERY, CORONA_EXPANSION)), + FUSION_OVERDRIVE(Branch.IGNITION, 9, 220, 1, () -> Set.of(STELLAR_NURSERY, CORONA_EXPANSION)), + DYSON_LATTICE(Branch.IGNITION, 10, 280, 1, () -> Set.of(HELIOS_FORGE)), + SOLAR_GENESIS(Branch.IGNITION, 10, 280, 1, () -> Set.of(FUSION_OVERDRIVE)), + PRIMORDIAL_FLAME(Branch.IGNITION, 11, 350, 1, () -> Set.of(DYSON_LATTICE, SOLAR_GENESIS)), + + // FUSION - Processing Power + GRAVITON_LENS(Branch.FUSION, 1, 15, 1, () -> Set.of()), + SUPERCONDUCTING_GRID(Branch.FUSION, 1, 15, 1, () -> Set.of()), + TEMPORAL_ACCELERATION(Branch.FUSION, 2, 25, 1, () -> Set.of(GRAVITON_LENS, SUPERCONDUCTING_GRID)), + PARALLEL_MANIFOLD(Branch.FUSION, 2, 25, 1, () -> Set.of(GRAVITON_LENS, SUPERCONDUCTING_GRID)), + STELLAR_COMPRESSION(Branch.FUSION, 3, 40, 1, () -> Set.of(TEMPORAL_ACCELERATION)), + MASS_EFFICIENCY(Branch.FUSION, 3, 40, 1, () -> Set.of(SUPERCONDUCTING_GRID, PARALLEL_MANIFOLD)), + RELATIVISTIC_PROCESSING(Branch.FUSION, 4, 60, 1, () -> Set.of(STELLAR_COMPRESSION)), + QUANTUM_TUNNELING(Branch.FUSION, 4, 60, 1, () -> Set.of(STELLAR_COMPRESSION, MASS_EFFICIENCY)), + HYPERDENSE_CORE(Branch.FUSION, 5, 80, 1, () -> Set.of(RELATIVISTIC_PROCESSING)), + TACHYON_WEAVE(Branch.FUSION, 5, 80, 1, () -> Set.of(QUANTUM_TUNNELING)), + SINGULARITY_ENGINE(Branch.FUSION, 6, 100, 1, () -> Set.of(HYPERDENSE_CORE, TACHYON_WEAVE)), + NEUTRON_CASCADE(Branch.FUSION, 7, 130, 1, () -> Set.of(SINGULARITY_ENGINE)), + WARP_FIELD_MATRIX(Branch.FUSION, 7, 130, 1, () -> Set.of(SINGULARITY_ENGINE)), + PARTICLE_STORM(Branch.FUSION, 8, 170, 1, () -> Set.of(NEUTRON_CASCADE)), + SUBSPACE_HARMONICS(Branch.FUSION, 8, 170, 1, () -> Set.of(WARP_FIELD_MATRIX)), + ANTIMATTER_INJECTION(Branch.FUSION, 9, 220, 1, () -> Set.of(PARTICLE_STORM, SUBSPACE_HARMONICS)), + ZERO_POINT_TAP(Branch.FUSION, 9, 220, 1, () -> Set.of(PARTICLE_STORM, SUBSPACE_HARMONICS)), + QUARK_GLUON_PLASMA(Branch.FUSION, 10, 280, 1, () -> Set.of(ANTIMATTER_INJECTION)), + PLANCK_RESONANCE(Branch.FUSION, 10, 280, 1, () -> Set.of(ZERO_POINT_TAP)), + OMEGA_COMPRESSION(Branch.FUSION, 11, 350, 1, () -> Set.of(QUARK_GLUON_PLASMA, PLANCK_RESONANCE)), + + // COLLAPSE - Prestige + SHARD_COLLECTOR(Branch.COLLAPSE, 1, 15, 1, () -> Set.of()), + RESONANT_SACRIFICE(Branch.COLLAPSE, 1, 15, 1, () -> Set.of()), + EARLY_HARVEST(Branch.COLLAPSE, 2, 25, 1, () -> Set.of(SHARD_COLLECTOR, RESONANT_SACRIFICE)), + EFFICIENT_CONSUMPTION(Branch.COLLAPSE, 2, 25, 1, () -> Set.of(SHARD_COLLECTOR, RESONANT_SACRIFICE)), + POINT_AMPLIFIER(Branch.COLLAPSE, 3, 40, 1, () -> Set.of(SHARD_COLLECTOR, EARLY_HARVEST)), + DUAL_SACRIFICE(Branch.COLLAPSE, 3, 40, 1, () -> Set.of(RESONANT_SACRIFICE, EFFICIENT_CONSUMPTION)), + PRESTIGE_MOMENTUM(Branch.COLLAPSE, 4, 60, 1, () -> Set.of(POINT_AMPLIFIER)), + ECHO_OF_COLLAPSE(Branch.COLLAPSE, 5, 80, 1, () -> Set.of(PRESTIGE_MOMENTUM)), + ENTROPY_HARVEST(Branch.COLLAPSE, 5, 80, 1, () -> Set.of(DUAL_SACRIFICE)), + INFINITE_RECURSION(Branch.COLLAPSE, 6, 100, 1, () -> Set.of(ECHO_OF_COLLAPSE, ENTROPY_HARVEST)), + CASCADING_COLLAPSE(Branch.COLLAPSE, 7, 130, 1, () -> Set.of(INFINITE_RECURSION)), + TEMPORAL_ECHO(Branch.COLLAPSE, 7, 130, 1, () -> Set.of(INFINITE_RECURSION)), + MASS_CONVERSION(Branch.COLLAPSE, 8, 170, 1, () -> Set.of(CASCADING_COLLAPSE)), + STELLAR_DEBT(Branch.COLLAPSE, 8, 170, 1, () -> Set.of(TEMPORAL_ECHO)), + ENTROPY_ENGINE(Branch.COLLAPSE, 9, 220, 1, () -> Set.of(MASS_CONVERSION, STELLAR_DEBT)), + SACRIFICE_AMPLIFIER(Branch.COLLAPSE, 9, 220, 1, () -> Set.of(MASS_CONVERSION, STELLAR_DEBT)), + COSMIC_TITHE(Branch.COLLAPSE, 10, 280, 1, () -> Set.of(ENTROPY_ENGINE)), + ANNIHILATION_YIELD(Branch.COLLAPSE, 10, 280, 1, () -> Set.of(SACRIFICE_AMPLIFIER)), + HEAT_DEATH(Branch.COLLAPSE, 11, 350, 1, () -> Set.of(COSMIC_TITHE, ANNIHILATION_YIELD)), + + // VOID - Black Hole + HAWKING_RADIATOR(Branch.VOID, 1, 15, 1, () -> Set.of()), + CHROMATIC_TUNING(Branch.VOID, 1, 15, 1, () -> Set.of()), + EXOTIC_MATTER_TAP(Branch.VOID, 2, 25, 1, () -> Set.of(HAWKING_RADIATOR, CHROMATIC_TUNING)), + VOID_WHISPERS(Branch.VOID, 2, 25, 1, () -> Set.of(HAWKING_RADIATOR)), + EVENT_HORIZON_LOCK(Branch.VOID, 3, 40, 1, () -> Set.of(VOID_WHISPERS)), + SINGULARITY_SIPHON(Branch.VOID, 3, 40, 1, () -> Set.of(EXOTIC_MATTER_TAP)), + GRAVITATIONAL_MASTERY(Branch.VOID, 4, 60, 1, () -> Set.of(SINGULARITY_SIPHON)), + VOID_HARVESTER(Branch.VOID, 4, 60, 1, () -> Set.of(EVENT_HORIZON_LOCK)), + ELDRITCH_INSIGHT(Branch.VOID, 5, 80, 1, () -> Set.of(GRAVITATIONAL_MASTERY)), + ABYSS_WALKER(Branch.VOID, 5, 80, 1, () -> Set.of(VOID_HARVESTER)), + ETERNAL_VOID(Branch.VOID, 6, 100, 1, () -> Set.of(ELDRITCH_INSIGHT, ABYSS_WALKER)), + DARK_MATTER_LENS(Branch.VOID, 7, 130, 1, () -> Set.of(ETERNAL_VOID)), + NEGATIVE_MASS(Branch.VOID, 7, 130, 1, () -> Set.of(ETERNAL_VOID)), + VACUUM_DECAY(Branch.VOID, 8, 170, 1, () -> Set.of(DARK_MATTER_LENS)), + PHOTON_SPHERE(Branch.VOID, 8, 170, 1, () -> Set.of(NEGATIVE_MASS)), + SCHWARZSCHILD_RADIUS(Branch.VOID, 9, 220, 1, () -> Set.of(VACUUM_DECAY, PHOTON_SPHERE)), + ERGOSPHERE_TAP(Branch.VOID, 9, 220, 1, () -> Set.of(VACUUM_DECAY, PHOTON_SPHERE)), + PENROSE_PROCESS(Branch.VOID, 10, 280, 1, () -> Set.of(SCHWARZSCHILD_RADIUS)), + KERR_EXTRACTION(Branch.VOID, 10, 280, 1, () -> Set.of(ERGOSPHERE_TAP)), + FALSE_VACUUM(Branch.VOID, 11, 350, 1, () -> Set.of(PENROSE_PROCESS, KERR_EXTRACTION)), + + // REPEATABLE + STELLAR_EFFICIENCY(Branch.REPEATABLE, 0, 10, 10, () -> Set.of()), + PARALLEL_THREADING(Branch.REPEATABLE, 0, 15, 8, () -> Set.of()), + ENERGY_OPTIMIZATION(Branch.REPEATABLE, 0, 12, 10, () -> Set.of()), + FUEL_EFFICIENCY(Branch.REPEATABLE, 0, 10, 10, () -> Set.of()), + PRESTIGE_AMPLIFIER(Branch.REPEATABLE, 0, 8, 10, () -> Set.of()), + DECAY_RESISTANCE(Branch.REPEATABLE, 0, 10, 10, () -> Set.of()), + GROWTH_CATALYST(Branch.REPEATABLE, 0, 10, 10, () -> Set.of()), + VOID_ATTUNEMENT(Branch.REPEATABLE, 0, 12, 10, () -> Set.of()); + + public enum Branch { + IGNITION, + FUSION, + COLLAPSE, + VOID, + REPEATABLE + } + + private final Branch branch; + private final int row; + private final int baseCost; + private final int maxLevel; + private final Supplier> prerequisitesSupplier; + private Set prerequisites; + + StellarIrisUpgrade(Branch branch, int row, int cost, int maxLevel, Supplier> prereqs) { + this.branch = branch; + this.row = row; + this.baseCost = cost; + this.maxLevel = maxLevel; + this.prerequisitesSupplier = prereqs; + } + + public Branch getBranch() { + return branch; + } + + public int getRow() { + return row; + } + + public int getCost() { + return baseCost; + } + + public int getCostForLevel(int level) { + if (!isRepeatable() || level <= 1) return baseCost; + return (int) Math.ceil(baseCost * Math.pow(1.5, level - 1)); + } + + public int getTotalCostForLevel(int targetLevel) { + int total = 0; + for (int i = 1; i <= targetLevel; i++) { + total += getCostForLevel(i); + } + return total; + } + + public int getMaxLevel() { + return maxLevel; + } + + public boolean isRepeatable() { + return branch == Branch.REPEATABLE; + } + + public Set getPrerequisites() { + if (prerequisites == null) { + prerequisites = prerequisitesSupplier.get(); + } + return prerequisites; + } + + public int getRequiredTier() { + return isRepeatable() ? 0 : Math.max(0, row - 1); + } + + public boolean isCapstone() { + return row == 11 && !isRepeatable(); + } + + public boolean canUnlock(Set owned, int currentTier) { + if (isRepeatable()) return true; + if (currentTier < getRequiredTier()) return false; + if (owned.contains(this)) return false; + + Set prereqs = getPrerequisites(); + if (prereqs.isEmpty()) return true; + + if (row <= 2) { + for (StellarIrisUpgrade prereq : prereqs) { + if (owned.contains(prereq)) return true; + } + return false; + } + return owned.containsAll(prereqs); + } + + public String getTranslationKey() { + return "cosmiccore.stellar.upgrade." + name().toLowerCase(); + } + + public String getDescriptionKey() { + return getTranslationKey() + ".desc"; + } + + public static Set getByBranch(Branch branch) { + EnumSet result = EnumSet.noneOf(StellarIrisUpgrade.class); + for (StellarIrisUpgrade upgrade : values()) { + if (upgrade.branch == branch) result.add(upgrade); + } + return result; + } + + public static Set getByRow(int row) { + EnumSet result = EnumSet.noneOf(StellarIrisUpgrade.class); + for (StellarIrisUpgrade upgrade : values()) { + if (upgrade.row == row && !upgrade.isRepeatable()) result.add(upgrade); + } + return result; + } + + public static StellarIrisUpgrade getCapstone(Branch branch) { + for (StellarIrisUpgrade upgrade : values()) { + if (upgrade.branch == branch && upgrade.isCapstone()) return upgrade; + } + return null; + } + + public static Set getRepeatables() { + return getByBranch(Branch.REPEATABLE); + } + + public static int getTotalCost() { + int total = 0; + for (StellarIrisUpgrade upgrade : values()) { + if (!upgrade.isRepeatable()) total += upgrade.baseCost; + } + return total; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/machine/part/CosmicPartAbility.java b/src/main/java/com/ghostipedia/cosmiccore/api/machine/part/CosmicPartAbility.java index 79843e100..2822f811f 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/api/machine/part/CosmicPartAbility.java +++ b/src/main/java/com/ghostipedia/cosmiccore/api/machine/part/CosmicPartAbility.java @@ -8,6 +8,7 @@ public class CosmicPartAbility { public static final PartAbility IMPORT_SOUL = new PartAbility("import_soul"); public static final PartAbility EXPORT_SOUL = new PartAbility("export_soul"); public static final PartAbility COSMIC_PARALLEL_HATCH = new PartAbility("cosmic_parallel_hatch"); + public static final PartAbility MODULE_HATCH = new PartAbility("module_hatch"); public static final PartAbility PSS_SENSORS = new PartAbility("pss_sensors"); public static final PartAbility STERILIZE_HATCH = new PartAbility("sterilization_hatch"); @@ -17,4 +18,7 @@ public class CosmicPartAbility { public static final PartAbility IMPORT_EMBER = new PartAbility("import_ember"); public static final PartAbility EXPORT_EMBER = new PartAbility("export_ember"); + public static final PartAbility BEE_HOLDER = new PartAbility("bee_holder"); + public static final PartAbility ME_ASSEMBLY_PARTS = new PartAbility("me_assembly_parts"); + public static final PartAbility ME_ASSEMBLY_PARTS_FLUID = new PartAbility("me_assembly_parts_fluid"); } diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/machine/part/SteamFluidHatchPartMachine.java b/src/main/java/com/ghostipedia/cosmiccore/api/machine/part/SteamFluidHatchPartMachine.java index 332632c42..8f916fdb0 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/api/machine/part/SteamFluidHatchPartMachine.java +++ b/src/main/java/com/ghostipedia/cosmiccore/api/machine/part/SteamFluidHatchPartMachine.java @@ -1,13 +1,48 @@ package com.ghostipedia.cosmiccore.api.machine.part; +import com.ghostipedia.cosmiccore.common.data.CosmicMachines; + import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.common.machine.multiblock.part.FluidHatchPartMachine; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.state.BlockState; + public class SteamFluidHatchPartMachine extends FluidHatchPartMachine { public SteamFluidHatchPartMachine(IMachineBlockEntity holder, IO io, long initialCapacity, int slots, Object... args) { super(holder, 1, io, 2000, 1, args); } + + @Override + public boolean swapIO() { + BlockPos blockPos = getHolder().pos(); + MachineDefinition newDefinition = null; + + if (io == IO.IN) { + newDefinition = CosmicMachines.STEAM_EXPORT_HATCH; + } else if (io == IO.OUT) { + newDefinition = CosmicMachines.STEAM_IMPORT_HATCH; + } + if (newDefinition == null) return false; + + BlockState newBlockState = newDefinition.getBlock().defaultBlockState(); + + getLevel().setBlockAndUpdate(blockPos, newBlockState); + + if (getLevel().getBlockEntity(blockPos) instanceof IMachineBlockEntity newHolder) { + if (newHolder.getMetaMachine() instanceof SteamFluidHatchPartMachine newMachine) { + newMachine.setFrontFacing(this.getFrontFacing()); + newMachine.setUpwardsFacing(this.getUpwardsFacing()); + newMachine.setPaintingColor(this.getPaintingColor()); + for (int i = 0; i < this.tank.getTanks(); i++) { + newMachine.tank.setFluidInTank(i, this.tank.getFluidInTank(i)); + } + } + } + return true; + } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/machine/trait/NotifiableEmberContainer.java b/src/main/java/com/ghostipedia/cosmiccore/api/machine/trait/NotifiableEmberContainer.java index f539e922f..18e097a7b 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/api/machine/trait/NotifiableEmberContainer.java +++ b/src/main/java/com/ghostipedia/cosmiccore/api/machine/trait/NotifiableEmberContainer.java @@ -16,6 +16,7 @@ import com.rekindled.embers.api.power.IEmberCapability; import com.rekindled.embers.power.DefaultEmberCapability; +import lombok.Getter; import org.jetbrains.annotations.NotNull; import java.util.Collections; @@ -67,9 +68,11 @@ public void loadCustomPersistedData(@NotNull CompoundTag tag) { private final IO handlerIO; @Persisted + @Getter private double maxCapacity; @Persisted + @Getter private double maxConsumption; public NotifiableEmberContainer(MetaMachine machine, IO io, double maxCapacity, double maxConsumption) { @@ -96,6 +99,7 @@ public List handleRecipeInner(IO io, GTRecipe recipe, List left, ember -= canOutput; } else if (io == IO.OUT) { var canInput = maxCapacity - capability.getEmber(); + if (canInput <= 0) return Collections.singletonList(ember); if (!simulate) ember = capability.addAmount(Math.min(canInput, ember), true); ember -= canInput; } diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/misc/IMetaMachineMixin.java b/src/main/java/com/ghostipedia/cosmiccore/api/misc/IMetaMachineMixin.java new file mode 100644 index 000000000..ac9f49175 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/misc/IMetaMachineMixin.java @@ -0,0 +1,15 @@ +package com.ghostipedia.cosmiccore.api.misc; + +import net.minecraft.world.InteractionResult; +import net.minecraft.world.item.context.UseOnContext; + +import com.mojang.datafixers.util.Pair; +import slimeknights.tconstruct.library.tools.definition.ToolDefinition; +import slimeknights.tconstruct.library.tools.item.ModifiableItem; + +public interface IMetaMachineMixin { + + default Pair ccore$onToolClick(ModifiableItem ticonItem, UseOnContext context) { + return Pair.of(null, InteractionResult.PASS); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/misc/IPipeBlockEntityMixin.java b/src/main/java/com/ghostipedia/cosmiccore/api/misc/IPipeBlockEntityMixin.java new file mode 100644 index 000000000..876f5bec7 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/misc/IPipeBlockEntityMixin.java @@ -0,0 +1,16 @@ +package com.ghostipedia.cosmiccore.api.misc; + +import net.minecraft.world.InteractionResult; +import net.minecraft.world.item.context.UseOnContext; + +import com.mojang.datafixers.util.Pair; +import slimeknights.tconstruct.library.tools.definition.ToolDefinition; +import slimeknights.tconstruct.library.tools.item.ModifiableItem; + +public interface IPipeBlockEntityMixin { + + default Pair ccore$onToolClick(ModifiableItem ticonItem, + UseOnContext context) { + return Pair.of(null, InteractionResult.PASS); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/misc/ae2/BlockingMode.java b/src/main/java/com/ghostipedia/cosmiccore/api/misc/ae2/BlockingMode.java deleted file mode 100644 index c147a91cc..000000000 --- a/src/main/java/com/ghostipedia/cosmiccore/api/misc/ae2/BlockingMode.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.ghostipedia.cosmiccore.api.misc.ae2; - -public enum BlockingMode { - ALL, - CONTAINS, - CONTAINS_SIMILAR -} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/misc/ae2/CosmicBlockingSettings.java b/src/main/java/com/ghostipedia/cosmiccore/api/misc/ae2/CosmicBlockingSettings.java deleted file mode 100644 index c405d4080..000000000 --- a/src/main/java/com/ghostipedia/cosmiccore/api/misc/ae2/CosmicBlockingSettings.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.ghostipedia.cosmiccore.api.misc.ae2; - -import appeng.api.config.Setting; - -public final class CosmicBlockingSettings { - - public static Setting BLOCKING_MODE; -} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/misc/ae2/IPatternProviderLogic.java b/src/main/java/com/ghostipedia/cosmiccore/api/misc/ae2/IPatternProviderLogic.java deleted file mode 100644 index 659044eb4..000000000 --- a/src/main/java/com/ghostipedia/cosmiccore/api/misc/ae2/IPatternProviderLogic.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.ghostipedia.cosmiccore.api.misc.ae2; - -public interface IPatternProviderLogic { - - BlockingMode cosmicCore$getBlockingMode(); -} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/misc/ae2/IPatternProviderMenu.java b/src/main/java/com/ghostipedia/cosmiccore/api/misc/ae2/IPatternProviderMenu.java deleted file mode 100644 index 62cb20fbe..000000000 --- a/src/main/java/com/ghostipedia/cosmiccore/api/misc/ae2/IPatternProviderMenu.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.ghostipedia.cosmiccore.api.misc.ae2; - -public interface IPatternProviderMenu { - - BlockingMode cosmicCore$getBlockingMode(); -} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/misc/ae2/PatternProviderTargetCache.java b/src/main/java/com/ghostipedia/cosmiccore/api/misc/ae2/PatternProviderTargetCache.java deleted file mode 100644 index bb564f62a..000000000 --- a/src/main/java/com/ghostipedia/cosmiccore/api/misc/ae2/PatternProviderTargetCache.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.ghostipedia.cosmiccore.api.misc.ae2; - -import com.gregtechceu.gtceu.common.data.GTItems; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.server.level.ServerLevel; - -import appeng.api.behaviors.ExternalStorageStrategy; -import appeng.api.config.Actionable; -import appeng.api.networking.security.IActionSource; -import appeng.api.stacks.AEItemKey; -import appeng.api.stacks.AEKey; -import appeng.api.stacks.AEKeyType; -import appeng.api.storage.MEStorage; -import appeng.capabilities.Capabilities; -import appeng.helpers.patternprovider.PatternProviderTarget; -import appeng.me.storage.CompositeStorage; -import appeng.parts.automation.StackWorldBehaviors; -import appeng.util.BlockApiCache; -import org.jetbrains.annotations.Nullable; - -import java.util.IdentityHashMap; -import java.util.Map; -import java.util.Set; - -public class PatternProviderTargetCache { - - private final IPatternProviderLogic logic; - private final BlockApiCache cache; - private final Direction direction; - private final IActionSource src; - private final Map strategies; - - public PatternProviderTargetCache(IPatternProviderLogic logic, ServerLevel l, BlockPos pos, Direction direction, - IActionSource src) { - this.logic = logic; - this.cache = BlockApiCache.create(Capabilities.STORAGE, l, pos); - this.direction = direction; - this.src = src; - this.strategies = StackWorldBehaviors.createExternalStorageStrategies(l, pos, direction); - } - - @Nullable - public PatternProviderTarget find() { - var meStorage = cache.find(direction); - if (meStorage != null) { - return new WrapMeStorage(meStorage, src, logic); - } - var externalStorages = new IdentityHashMap(2); - for (var entry : strategies.entrySet()) { - var wrapper = entry.getValue().createWrapper(false, () -> {}); - if (wrapper != null) { - externalStorages.put(entry.getKey(), wrapper); - } - } - if (!externalStorages.isEmpty()) { - return new WrapMeStorage(new CompositeStorage(externalStorages), src, logic); - } - return null; - } - - private record WrapMeStorage(MEStorage storage, IActionSource src, IPatternProviderLogic logic) - implements PatternProviderTarget { - - @Override - public long insert(AEKey what, long amount, Actionable type) { - return storage.insert(what, amount, type, src); - } - - @Override - public boolean containsPatternInput(Set patternInputs) { - switch (logic.cosmicCore$getBlockingMode()) { - case ALL: - for (var stack : storage.getAvailableStacks()) { - if (stack.getKey() instanceof AEItemKey itemKey && - itemKey.getItem() == GTItems.PROGRAMMED_CIRCUIT.asItem()) - continue; - return true; - } - break; - case CONTAINS: - for (var stack : storage.getAvailableStacks()) { - if (patternInputs.contains(stack.getKey().dropSecondary())) continue; - return true; - } - break; - case CONTAINS_SIMILAR: - for (var stack : storage.getAvailableStacks()) { - if (patternInputs.contains(stack.getKey().dropSecondary())) return true; - } - } - return false; - } - } -} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/pattern/CosmicPredicates.java b/src/main/java/com/ghostipedia/cosmiccore/api/pattern/CosmicPredicates.java index dffb6f0fe..aac478362 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/api/pattern/CosmicPredicates.java +++ b/src/main/java/com/ghostipedia/cosmiccore/api/pattern/CosmicPredicates.java @@ -2,24 +2,53 @@ import com.ghostipedia.cosmiccore.api.CosmicCoreAPI; import com.ghostipedia.cosmiccore.api.block.IMagnetType; +import com.ghostipedia.cosmiccore.api.machine.feature.IStellarModuleReceiver; import com.ghostipedia.cosmiccore.common.block.MagnetBlock; +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.MothCargoStation; +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.pattern.TraceabilityPredicate; import com.gregtechceu.gtceu.api.pattern.error.PatternStringError; import com.gregtechceu.gtceu.api.pattern.util.PatternMatchContext; import com.lowdragmc.lowdraglib.utils.BlockInfo; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; import java.util.Comparator; +import java.util.HashSet; import java.util.Map; +import java.util.Set; import java.util.function.Supplier; +import static com.gregtechceu.gtceu.common.data.GTBlocks.*; + public class CosmicPredicates { + private static Block[] researchHubRingTiers; + + public static Block[] getResearchHubRingTiers() { + if (researchHubRingTiers == null) { + researchHubRingTiers = new Block[] { + CASING_STEEL_SOLID.get(), // T1 + CASING_ALUMINIUM_FROSTPROOF.get(), // T2 + CASING_STAINLESS_CLEAN.get(), // T3 + CASING_TITANIUM_STABLE.get(), // T4 + CASING_TUNGSTENSTEEL_ROBUST.get() // T5 + }; + } + return researchHubRingTiers; + } + public static TraceabilityPredicate magnetCoils() { return new TraceabilityPredicate(blockWorldState -> { var blockState = blockWorldState.getBlockState(); @@ -63,5 +92,250 @@ public static TraceabilityPredicate starLadderModules() { .addTooltips(Component.translatable("gtceu.multiblock.pattern.error.filters")); } + public static TraceabilityPredicate mothHomes() { + return new TraceabilityPredicate(blockWorldState -> { + var blockState = blockWorldState.getBlockState(); + // Check if it's steel casing (always allowed as placeholder) + if (blockState.is(CASING_STEEL_SOLID.get())) { + return true; + } + // Check if it's a valid Forestry beehive + return MothCargoStation.isMothHome(blockState); + }, () -> { + // Provide block previews for JEI - look up Forestry blocks at render time + return new BlockInfo[] { + BlockInfo.fromBlockState(getBlockOrFallback(MothCargoStation.BEEHIVE_FOREST)), + BlockInfo.fromBlockState(getBlockOrFallback(MothCargoStation.BEEHIVE_LUSH)), + BlockInfo.fromBlockState(getBlockOrFallback(MothCargoStation.BEEHIVE_DESERT)), + BlockInfo.fromBlockState(getBlockOrFallback(MothCargoStation.BEEHIVE_END)), + BlockInfo.fromBlockState(CASING_STEEL_SOLID.get().defaultBlockState()) + }; + }).addTooltips(Component.literal("Forestry Beehive or Steel Casing")); + } + + private static net.minecraft.world.level.block.state.BlockState getBlockOrFallback(ResourceLocation loc) { + Block block = BuiltInRegistries.BLOCK.get(loc); + return (block != Blocks.AIR ? block : Blocks.BEEHIVE).defaultBlockState(); + } + + public static TraceabilityPredicate stellarModuleSlot() { + return new TraceabilityPredicate(blockWorldState -> { + var blockState = blockWorldState.getBlockState(); + if (blockState.isAir()) return true; + + var blockEntity = blockWorldState.getTileEntity(); + if (blockEntity instanceof IMachineBlockEntity machineBlockEntity) { + MetaMachine machine = machineBlockEntity.getMetaMachine(); + if (machine instanceof IMultiController && machine instanceof IStellarModuleReceiver moduleReceiver) { + Set modules = blockWorldState.getMatchContext() + .getOrCreate("stellarModules", HashSet::new); + modules.add(moduleReceiver); + return true; + } + } + return false; + }, () -> new BlockInfo[] { BlockInfo.fromBlockState(Blocks.AIR.defaultBlockState()) }) + .addTooltips(Component.translatable("cosmiccore.multiblock.pattern.stellar_module_slot")); + } + + public static TraceabilityPredicate researchHubRing(int ringIndex) { + return new TraceabilityPredicate(blockWorldState -> { + var blockState = blockWorldState.getBlockState(); + PatternMatchContext ctx = blockWorldState.getMatchContext(); + + if (blockState.isAir()) { + ctx.getOrCreate("ResearchHubRingsWithAir", HashSet::new).add(ringIndex); + return true; + } + + Block requiredBlock = getResearchHubRingTiers()[ringIndex - 1]; + if (blockState.is(requiredBlock)) { + ctx.getOrCreate("ResearchHubRingsWithBlocks", HashSet::new).add(ringIndex); + return true; + } + return false; + }, () -> { + Block requiredBlock = getResearchHubRingTiers()[ringIndex - 1]; + return new BlockInfo[] { + BlockInfo.fromBlockState(requiredBlock.defaultBlockState()), + BlockInfo.fromBlockState(Blocks.AIR.defaultBlockState()) + }; + }).addTooltips(Component.translatable("cosmiccore.multiblock.pattern.research_hub_ring")); + } + + public static int validateResearchHubRings(PatternMatchContext ctx) { + Set ringsWithBlocks = ctx.get("ResearchHubRingsWithBlocks"); + Set ringsWithAir = ctx.get("ResearchHubRingsWithAir"); + + if (ringsWithBlocks == null || ringsWithBlocks.isEmpty()) { + return 0; + } + + int highestCompleteRing = 0; + for (int ring = 1; ring <= 4; ring++) { + boolean hasBlocks = ringsWithBlocks.contains(ring); + boolean hasAir = ringsWithAir != null && ringsWithAir.contains(ring); + + if (hasBlocks && !hasAir) { + if (ring == highestCompleteRing + 1) { + highestCompleteRing = ring; + } else { + return -1; + } + } else if (hasBlocks && hasAir) { + for (int higherRing = ring + 1; higherRing <= 4; higherRing++) { + boolean higherHasBlocks = ringsWithBlocks.contains(higherRing); + boolean higherHasAir = ringsWithAir != null && ringsWithAir.contains(higherRing); + if (higherHasBlocks && !higherHasAir) { + return -1; + } + } + break; + } else { + for (int higherRing = ring + 1; higherRing <= 4; higherRing++) { + if (ringsWithBlocks.contains(higherRing)) { + return -1; + } + } + break; + } + } + + return highestCompleteRing; + } + + public static int getPartialRingIndex(PatternMatchContext ctx) { + Set ringsWithBlocks = ctx.get("ResearchHubRingsWithBlocks"); + Set ringsWithAir = ctx.get("ResearchHubRingsWithAir"); + + if (ringsWithBlocks == null || ringsWithAir == null) { + return 0; + } + + for (int ring = 1; ring <= 4; ring++) { + boolean hasBlocks = ringsWithBlocks.contains(ring); + boolean hasAir = ringsWithAir.contains(ring); + if (hasBlocks && hasAir) { + return ring; + } + } + return 0; + } + + // SLRH tier predicates - accept air or tier block, track in context + + public static TraceabilityPredicate slrhTier0BlockA() { + return slrhTierBlock(CosmicBlocks.SUPERHEAVY_STEEL_CASING.get(), 0); + } + + public static TraceabilityPredicate slrhTier0BlockB() { + return slrhTierBlock(CosmicBlocks.BOLTED_HEAVY_FRAME_CASING.get(), 0); + } + + public static TraceabilityPredicate slrhTier0BlockC() { + return slrhTierBlock(CosmicBlocks.SOMARUST_CASING.get(), 0); + } + + public static TraceabilityPredicate slrhTier0BlockD() { + return slrhTierBlock(CosmicBlocks.SOUL_MUTED_CASING.get(), 0); + } + + public static TraceabilityPredicate slrhTier1Block() { + return slrhTierBlock(CosmicBlocks.BICHROMAL_NEVRAMITE_CASING.get(), 1); + } + + public static TraceabilityPredicate slrhTier2BlockF() { + return slrhTierBlock(CosmicBlocks.OSCILLATING_GILDED_PTHANTERUM_CASING.get(), 2); + } + + public static TraceabilityPredicate slrhTier2BlockG() { + return slrhTierBlock(CosmicBlocks.HIGHLY_FLEXIBLE_REINFORCED_TRINAVINE_CASING.get(), 2); + } + + public static TraceabilityPredicate slrhTier3BlockH() { + return slrhTierBlock(CosmicBlocks.ROYAL_ICHORIUM_CASING.get(), 3); + } + + public static TraceabilityPredicate slrhTier3BlockI() { + return slrhTierBlock(CosmicBlocks.MULTIPURPOSE_INTERSTELLAR_GRADE_CASING.get(), 3); + } + + public static TraceabilityPredicate slrhTier3BlockJ() { + return slrhTierBlock(CosmicBlocks.ULTRA_POWERED_CASING.get(), 3); + } + + private static TraceabilityPredicate slrhTierBlock(Block requiredBlock, int tier) { + return new TraceabilityPredicate(blockWorldState -> { + var blockState = blockWorldState.getBlockState(); + PatternMatchContext ctx = blockWorldState.getMatchContext(); + + if (blockState.isAir()) { + ctx.getOrCreate("SLRHTiersWithAir", HashSet::new).add(tier); + return true; + } + + if (blockState.is(requiredBlock)) { + ctx.getOrCreate("SLRHTiersWithBlocks", HashSet::new).add(tier); + return true; + } + return false; + }, () -> new BlockInfo[] { + BlockInfo.fromBlockState(requiredBlock.defaultBlockState()), + BlockInfo.fromBlockState(Blocks.AIR.defaultBlockState()) + }).addTooltips(Component.translatable("cosmiccore.multiblock.pattern.slrh_tier_block")); + } + + public static int validateSLRHTier(PatternMatchContext ctx) { + Set tiersWithBlocks = ctx.get("SLRHTiersWithBlocks"); + Set tiersWithAir = ctx.get("SLRHTiersWithAir"); + + if (tiersWithBlocks == null || tiersWithBlocks.isEmpty()) { + return -1; + } + + boolean t0HasBlocks = tiersWithBlocks.contains(0); + boolean t0HasAir = tiersWithAir != null && tiersWithAir.contains(0); + + if (!t0HasBlocks || t0HasAir) { + return -1; + } + + int highestCompleteTier = 0; + for (int tier = 1; tier <= 3; tier++) { + boolean hasBlocks = tiersWithBlocks.contains(tier); + boolean hasAir = tiersWithAir != null && tiersWithAir.contains(tier); + + if (hasBlocks && !hasAir && tier == highestCompleteTier + 1) { + highestCompleteTier = tier; + } + } + + return highestCompleteTier; + } + + public static int getSLRHPartialTierIndex(PatternMatchContext ctx) { + Set tiersWithBlocks = ctx.get("SLRHTiersWithBlocks"); + Set tiersWithAir = ctx.get("SLRHTiersWithAir"); + + if (tiersWithAir == null) { + return 0; + } + + boolean t0HasBlocks = tiersWithBlocks != null && tiersWithBlocks.contains(0); + boolean t0HasAir = tiersWithAir.contains(0); + if (t0HasAir) { + return t0HasBlocks ? 0 : -1; + } + + for (int tier = 1; tier <= 3; tier++) { + boolean hasBlocks = tiersWithBlocks != null && tiersWithBlocks.contains(tier); + boolean hasAir = tiersWithAir.contains(tier); + if (hasBlocks && hasAir) { + return tier; + } + } + return 0; + } + public static void init() {} } diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/plugins/CosmicEMIPlugin.java b/src/main/java/com/ghostipedia/cosmiccore/api/plugins/CosmicEMIPlugin.java new file mode 100644 index 000000000..4bb53bbf1 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/plugins/CosmicEMIPlugin.java @@ -0,0 +1,35 @@ +package com.ghostipedia.cosmiccore.api.plugins; + +import net.minecraft.core.Holder; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; + +import dev.emi.emi.api.EmiEntrypoint; +import dev.emi.emi.api.EmiPlugin; +import dev.emi.emi.api.EmiRegistry; +import dev.emi.emi.api.stack.EmiStack; +import slimeknights.tconstruct.common.TinkerTags; +import slimeknights.tconstruct.library.tools.part.IMaterialItem; + +import java.util.ArrayList; +import java.util.List; + +@EmiEntrypoint +public class CosmicEMIPlugin implements EmiPlugin { + + @Override + public void register(EmiRegistry registry) { + // Show all material variants for every TCon tool part + for (Holder holder : BuiltInRegistries.ITEM.getTagOrEmpty(TinkerTags.Items.TOOL_PARTS)) { + Item item = holder.value(); + if (item instanceof IMaterialItem materialItem) { + List variants = new ArrayList<>(); + materialItem.addVariants(variants::add, ""); + for (ItemStack stack : variants) { + registry.addEmiStack(EmiStack.of(stack)); + } + } + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/recipe/ingredient/TinkerIngredient.java b/src/main/java/com/ghostipedia/cosmiccore/api/recipe/ingredient/TinkerIngredient.java new file mode 100644 index 000000000..f089eedad --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/recipe/ingredient/TinkerIngredient.java @@ -0,0 +1,110 @@ +package com.ghostipedia.cosmiccore.api.recipe.ingredient; + +import com.ghostipedia.cosmiccore.CosmicCore; + +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraftforge.common.crafting.IIngredientSerializer; + +import com.google.common.base.Preconditions; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import lombok.Getter; +import org.jetbrains.annotations.Nullable; +import slimeknights.tconstruct.library.tools.definition.ToolDefinition; +import slimeknights.tconstruct.library.tools.definition.ToolDefinitionLoader; +import slimeknights.tconstruct.library.tools.item.ModifiableItem; +import slimeknights.tconstruct.library.tools.nbt.ToolStack; + +import java.util.stream.Stream; + +public class TinkerIngredient extends Ingredient { + + public static final ResourceLocation TYPE = CosmicCore.id("tool_ingredient"); + + @Getter + private final ToolDefinition definition; + + private ItemStack[] cacheStacks; + + public TinkerIngredient(ToolDefinition definition) { + super(Stream.empty()); + Preconditions.checkNotNull(definition); + this.definition = definition; + } + + @Override + public JsonElement toJson() { + JsonObject json = new JsonObject(); + json.addProperty("type", TYPE.toString()); + json.addProperty("definition", definition.getId().toString()); + return json; + } + + @Override + public boolean test(@Nullable ItemStack stack) { + if (stack == null || stack.isEmpty()) return false; + if (!(stack.getItem() instanceof ModifiableItem)) return false; + ToolStack toolStack = ToolStack.from(stack); + + if (toolStack.isBroken()) return false; + + return super.test(stack); + } + + @Override + public boolean isSimple() { + return false; + } + + @Override + public ItemStack[] getItems() { + if (cacheStacks == null) { + cacheStacks = new ItemStack[] { BuiltInRegistries.ITEM.get(definition.getId()).getDefaultInstance() }; + } + return cacheStacks; + } + + @Override + public boolean isEmpty() { + return false; + } + + @Override + public IIngredientSerializer getSerializer() { + return SERIALIZER; + } + + public static final IIngredientSerializer SERIALIZER = new IIngredientSerializer() { + + @Override + public TinkerIngredient parse(FriendlyByteBuf friendlyByteBuf) { + ResourceLocation resLoc = friendlyByteBuf.readResourceLocation(); + var toolDef = ToolDefinitionLoader.getInstance(); + ToolDefinition def = toolDef.getRegisteredToolDefinitions().stream() + .filter(d -> d.getId().equals(resLoc)) + .findFirst() + .orElse(null); + return new TinkerIngredient(def); + } + + @Override + public TinkerIngredient parse(JsonObject jsonObject) { + ResourceLocation resLoc = new ResourceLocation(jsonObject.get("definition").getAsString()); + var toolDef = ToolDefinitionLoader.getInstance(); + ToolDefinition def = toolDef.getRegisteredToolDefinitions().stream() + .filter(d -> d.getId().equals(resLoc)) + .findFirst() + .orElse(null); + return new TinkerIngredient(def); + } + + @Override + public void write(FriendlyByteBuf friendlyByteBuf, TinkerIngredient tinkerIngredient) { + friendlyByteBuf.writeResourceLocation(tinkerIngredient.definition.getId()); + } + }; +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/bee/CosmicBeesDefinition.java b/src/main/java/com/ghostipedia/cosmiccore/bee/CosmicBeesDefinition.java new file mode 100644 index 000000000..a837b94dd --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/bee/CosmicBeesDefinition.java @@ -0,0 +1,340 @@ +package com.ghostipedia.cosmiccore.bee; + +import com.ghostipedia.cosmiccore.bee.feature.CosmicBeesItems; +import com.ghostipedia.cosmiccore.common.data.CosmicItems; +import com.ghostipedia.cosmiccore.common.item.CosmicBeesHoneyComb; + +import net.minecraft.network.chat.TextColor; + +import forestry.api.apiculture.ForestryBeeSpecies; +import forestry.api.plugin.IApicultureRegistration; + +public class CosmicBeesDefinition { + + public static void defineBees(IApicultureRegistration apicultureRegistration) { + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.LOFTY_OXYGEN, CosmicBeesTaxa.GENUS_LOFTY, + CosmicBeesTaxa.SPECIES_OXYGEN, + true, TextColor.fromRgb(0x8080FF)) + .setBody(TextColor.fromRgb(0x4242FF)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.LOFTY_OXYGEN), 1) + .addMutations(mutations -> { + mutations.add(ForestryBeeSpecies.ABYSSAL, ForestryBeeSpecies.IMPERIAL, 10); + }) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.LOFTY_HYDROGEN, CosmicBeesTaxa.GENUS_LOFTY, + CosmicBeesTaxa.SPECIES_HYDROGEN, + true, TextColor.fromRgb(0x80FFE1)) + .setBody(TextColor.fromRgb(0x4242FF)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.LOFTY_HYDROGEN), 1) + .addMutations(mutations -> { + mutations.add(ForestryBeeSpecies.ABYSSAL, ForestryBeeSpecies.AGRARIAN, 10); + }) + .setAuthority("Ghostipedia"); + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.LOFTY_NITROGEN, CosmicBeesTaxa.GENUS_LOFTY, + CosmicBeesTaxa.SPECIES_NITROGEN, + true, TextColor.fromRgb(0xFF80F9)) + .setBody(TextColor.fromRgb(0x4242FF)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.LOFTY_NITROGEN), 1) + .addMutations(mutations -> { + mutations.add(ForestryBeeSpecies.ABYSSAL, ForestryBeeSpecies.CULTIVATED, 10); + }) + .setAuthority("Ghostipedia"); + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.LOFTY_ARGON, CosmicBeesTaxa.GENUS_LOFTY, + CosmicBeesTaxa.SPECIES_ARGON, + true, TextColor.fromRgb(0x97FF80)) + .setBody(TextColor.fromRgb(0x4242FF)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.LOFTY_ARGON), 1) + .addMutations(mutations -> { + mutations.add(ForestryBeeSpecies.ABYSSAL, ForestryBeeSpecies.COMMON, 10); + }) + .setAuthority("Ghostipedia"); + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.ROSE_POLYMER, CosmicBeesTaxa.GENUS_PLASTID, + CosmicBeesTaxa.SPECIES_ROSE_POLYMER, + true, TextColor.fromRgb(0xFF4E6F)) + .setBody(TextColor.fromRgb(0x5D5D5D)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.ROSE_POLYMER), 1) + .addMutations(mutations -> { + mutations.add(ForestryBeeSpecies.SCULK, ForestryBeeSpecies.COMMON, 10); + }) + .setAuthority("Ghostipedia"); + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.CITRUS_POLYMER, CosmicBeesTaxa.GENUS_PLASTID, + CosmicBeesTaxa.SPECIES_CITRUS_POLYMER, + true, TextColor.fromRgb(0xFF9900)) + .setBody(TextColor.fromRgb(0x5D5D5D)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.CITRUS_POLYMER), 1) + .addMutations(mutations -> { + mutations.add(ForestryBeeSpecies.ICY, CosmicBeesSpecies.ROSE_POLYMER, 35); + }) + .setAuthority("Ghostipedia"); + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.WAXY_POLYMER, CosmicBeesTaxa.GENUS_PLASTID, + CosmicBeesTaxa.SPECIES_WAXY_POLYMER, + true, TextColor.fromRgb(0xA100FF)) + .setBody(TextColor.fromRgb(0x5D5D5D)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.WAXY_POLYMER), 1) + .addMutations(mutations -> { + mutations.add(ForestryBeeSpecies.ICY, CosmicBeesSpecies.ROSE_POLYMER, 35); + }) + .setAuthority("Ghostipedia"); + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.BIOHAZARD, CosmicBeesTaxa.GENUS_ESOTERIC, + CosmicBeesTaxa.SPECIES_WAXY_POLYMER, + true, TextColor.fromRgb(0x00FF33)) + .setBody(TextColor.fromRgb(0x082C00)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.BIOHAZARD), 1) + .addMutations(mutations -> { + mutations.add(ForestryBeeSpecies.EMBITTERED, ForestryBeeSpecies.MARSHY, 35); + }) + .setAuthority("Ghostipedia"); + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.PALE, CosmicBeesTaxa.GENUS_ESOTERIC, + CosmicBeesTaxa.SPECIES_PALE, + true, TextColor.fromRgb(0xC8E7F1)) + .setBody(TextColor.fromRgb(0x3F3F3F)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.PALE), 1) + .addProduct(CosmicItems.PALE_SAW.asStack(), 0.35f) + .addMutations(mutations -> { + mutations.add(ForestryBeeSpecies.PHANTASMAL, ForestryBeeSpecies.EDENIC, 35); + }) + .setGlint(true) + .setAuthority("Ghostipedia"); + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.SOUL, CosmicBeesTaxa.GENUS_ESOTERIC, + CosmicBeesTaxa.SPECIES_SOUL, + true, TextColor.fromRgb(0x3FEBF1)) + .setBody(TextColor.fromRgb(0x3A3A3A)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.SOUL), 1) + .addMutations(mutations -> { + mutations.add(ForestryBeeSpecies.PHANTASMAL, ForestryBeeSpecies.DEMONIC, 35); + }) + .setAuthority("Ghostipedia"); + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.RUNIC, CosmicBeesTaxa.GENUS_ESOTERIC, + CosmicBeesTaxa.SPECIES_SOUL, + true, TextColor.fromRgb(0xA68941)) + .setBody(TextColor.fromRgb(0xA2A2A2)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.SOUL), 1) + .addMutations(mutations -> { + mutations.add(ForestryBeeSpecies.PHANTASMAL, ForestryBeeSpecies.DEMONIC, 35); + }) + .setAuthority("Ghostipedia"); + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.AMBROSIC, CosmicBeesTaxa.GENUS_ESOTERIC, + CosmicBeesTaxa.SPECIES_AMBROSIC, + true, TextColor.fromRgb(0xD7C238)) + .setBody(TextColor.fromRgb(0x314234)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.AMBROSIC), 1) + .addMutations(mutations -> { + mutations.add(ForestryBeeSpecies.UNWEARY, ForestryBeeSpecies.TIPSY, 35); + }) + .setAuthority("Ghostipedia"); + + // TODO - MUTATIONS + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.ABRASIVE, CosmicBeesTaxa.GENUS_INDUSTRIAL, + CosmicBeesTaxa.SPECIES_ABRASIVE, + true, TextColor.fromRgb(0x834500)) + .setBody(TextColor.fromRgb(0x312E2B)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.ABRASIVE), 0.75f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.ENERGIZED, CosmicBeesTaxa.GENUS_INDUSTRIAL, + CosmicBeesTaxa.SPECIES_ENERGIZED, + true, TextColor.fromRgb(0xD7C238)) + .setBody(TextColor.fromRgb(0x312E2B)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.ENERGIZED), 0.75f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.SLICK, CosmicBeesTaxa.GENUS_INDUSTRIAL, + CosmicBeesTaxa.SPECIES_SLICK, + true, TextColor.fromRgb(0x251531)) + .setBody(TextColor.fromRgb(0x312E2B)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.SLICK), 0.75f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.PYROLYTIC, CosmicBeesTaxa.GENUS_INDUSTRIAL, + CosmicBeesTaxa.SPECIES_PYROLYTIC, + true, TextColor.fromRgb(0x5B4B3F)) + .setBody(TextColor.fromRgb(0x312E2B)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.PYROLYTIC), 0.75f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.LUNAR, CosmicBeesTaxa.GENUS_SOLAR, + CosmicBeesTaxa.SPECIES_LUNAR, + true, TextColor.fromRgb(0x10735F)) + .setBody(TextColor.fromRgb(0x223149)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.LUNAR), 0.75f) + .setAuthority("Ghostipedia"); + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.SOLAR, CosmicBeesTaxa.GENUS_SOLAR, + CosmicBeesTaxa.SPECIES_SOLAR, + true, TextColor.fromRgb(0xF3DC4C)) + .setBody(TextColor.fromRgb(0x223149)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.SOLAR), 0.75f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.COSMOS, CosmicBeesTaxa.GENUS_SOLAR, + CosmicBeesTaxa.SPECIES_COSMOS, + true, TextColor.fromRgb(0xA276CB)) + .setBody(TextColor.fromRgb(0x223149)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.COSMOS), 0.75f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.HADAL, CosmicBeesTaxa.GENUS_ESOTERIC, + CosmicBeesTaxa.SPECIES_HADAL, + true, TextColor.fromRgb(0xE0099B)) + .setBody(TextColor.fromRgb(0x720303)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.HADAL), 0.75f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.SHAMAN, CosmicBeesTaxa.GENUS_ESOTERIC, + CosmicBeesTaxa.SPECIES_SHAMAN, + true, TextColor.fromRgb(0xE0099B)) + .setBody(TextColor.fromRgb(0x720303)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.SHAMAN), 0.75f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.ASHEN, CosmicBeesTaxa.GENUS_INDUSTRIAL, + CosmicBeesTaxa.SPECIES_ASHEN, + true, TextColor.fromRgb(0x6D6872)) + .setBody(TextColor.fromRgb(0x223149)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.HADAL), 0.75f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.FRACKING, CosmicBeesTaxa.GENUS_INDUSTRIAL, + CosmicBeesTaxa.SPECIES_FRACKING, + true, TextColor.fromRgb(0xDAD3B8)) + .setBody(TextColor.fromRgb(0x223149)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.FRACKING), 0.75f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.FATE, CosmicBeesTaxa.GENUS_ESOTERIC, + CosmicBeesTaxa.SPECIES_FATE, + true, TextColor.fromRgb(0x06B64D)) + .setBody(TextColor.fromRgb(0x193D05)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.HADAL), 0.75f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.GRAND_GARDEN, CosmicBeesTaxa.GENUS_LOFTY, + CosmicBeesTaxa.SPECIES_HADAL, + true, TextColor.fromRgb(0x42801D)) + .setBody(TextColor.fromRgb(0x1D5703)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.GRAND_GARDEN), 0.9f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.ARCHITECT, CosmicBeesTaxa.GENUS_FORGE_KIN, + CosmicBeesTaxa.SPECIES_ARCHITECT, + true, TextColor.fromRgb(0xD0FFE9)) + .setBody(TextColor.fromRgb(0x003588)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.ARCHITECT), 0.9f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.INQUISITIVE, CosmicBeesTaxa.GENUS_FORGE_KIN, + CosmicBeesTaxa.SPECIES_INQUISITIVE, + true, TextColor.fromRgb(0xDCA260)) + .setBody(TextColor.fromRgb(0x666C77)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.INQUISITIVE), 0.9f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.HELLSMITH, CosmicBeesTaxa.GENUS_FORGE_KIN, + CosmicBeesTaxa.SPECIES_HELLSMITH, + true, TextColor.fromRgb(0xEA5555)) + .setBody(TextColor.fromRgb(0x640529)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.HELLSMITH), 0.9f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.RADOXIA, CosmicBeesTaxa.GENUS_FORGE_KIN, + CosmicBeesTaxa.SPECIES_RADOXIA, + true, TextColor.fromRgb(0x4D0E88)) + .setBody(TextColor.fromRgb(0x55647E)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.RADOXIA), 0.9f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.ABSENT, CosmicBeesTaxa.GENUS_ESOTERIC, + CosmicBeesTaxa.SPECIES_ABSENT, + true, TextColor.fromRgb(0xE1E1E1)) + .setBody(TextColor.fromRgb(0x9A9A9A)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.ABSENT), 0.9f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.ILLUSIVE, CosmicBeesTaxa.GENUS_ESOTERIC, + CosmicBeesTaxa.SPECIES_ILLUSIVE, + true, TextColor.fromRgb(0xEFFAAC)) + .setBody(TextColor.fromRgb(0x7C92B6)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.ILLUSIVE), 0.9f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.CONSTRUCTIVE, CosmicBeesTaxa.GENUS_INDUSTRIAL, + CosmicBeesTaxa.SPECIES_CONSTRUCTIVE, + true, TextColor.fromRgb(0xCBA676)) + .setBody(TextColor.fromRgb(0x464922)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.CONSTRUCTIVE), 0.9f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.PRISMATIC, CosmicBeesTaxa.GENUS_ESOTERIC, + CosmicBeesTaxa.SPECIES_PRISMATIC, + true, TextColor.fromRgb(0x76CB87)) + .setBody(TextColor.fromRgb(0x436CAD)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.PRISMATIC), 0.9f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.HYDRAULIC, CosmicBeesTaxa.GENUS_INDUSTRIAL, + CosmicBeesTaxa.SPECIES_HYDRAULIC, + true, TextColor.fromRgb(0x715F81)) + .setBody(TextColor.fromRgb(0x0F521F)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.HYDRAULIC), 0.9f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.COBBLED, CosmicBeesTaxa.GENUS_INDUSTRIAL, + CosmicBeesTaxa.SPECIES_COBBLED, + true, TextColor.fromRgb(0x6A6272)) + .setBody(TextColor.fromRgb(0x323741)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.COBBLED), 0.9f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.EXHAUSTIVE, CosmicBeesTaxa.GENUS_ESOTERIC, + CosmicBeesTaxa.SPECIES_EXHAUSTIVE, + true, TextColor.fromRgb(0x4F625B)) + .setBody(TextColor.fromRgb(0x3A4350)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.EXHAUSTIVE), 0.9f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.VIRTUE, CosmicBeesTaxa.GENUS_ESOTERIC, + CosmicBeesTaxa.SPECIES_VIRTUE, + true, TextColor.fromRgb(0x6BD1D5)) + .setBody(TextColor.fromRgb(0x223149)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.VIRTUE), 0.9f) + .setAuthority("Ghostipedia"); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/bee/CosmicBeesSpecies.java b/src/main/java/com/ghostipedia/cosmiccore/bee/CosmicBeesSpecies.java new file mode 100644 index 000000000..48e819f90 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/bee/CosmicBeesSpecies.java @@ -0,0 +1,51 @@ +package com.ghostipedia.cosmiccore.bee; + +import com.ghostipedia.cosmiccore.CosmicCore; + +import net.minecraft.resources.ResourceLocation; + +public class CosmicBeesSpecies { + + public static final ResourceLocation LOFTY_OXYGEN = CosmicCore.id("bee_oxygen"); + public static final ResourceLocation LOFTY_HYDROGEN = CosmicCore.id("bee_hydrogen"); + public static final ResourceLocation LOFTY_NITROGEN = CosmicCore.id("bee_nitrogen"); + public static final ResourceLocation LOFTY_ARGON = CosmicCore.id("bee_argon"); + + public static final ResourceLocation ROSE_POLYMER = CosmicCore.id("bee_rose_polymer"); + public static final ResourceLocation CITRUS_POLYMER = CosmicCore.id("bee_citrus_polymer"); + public static final ResourceLocation WAXY_POLYMER = CosmicCore.id("bee_waxy_polymer"); + + public static final ResourceLocation BIOHAZARD = CosmicCore.id("bee_biohazard"); + public static final ResourceLocation PALE = CosmicCore.id("bee_pale"); + public static final ResourceLocation SOUL = CosmicCore.id("bee_soul"); + public static final ResourceLocation RUNIC = CosmicCore.id("bee_runic"); + public static final ResourceLocation AMBROSIC = CosmicCore.id("bee_ambrosic"); + + public static final ResourceLocation ABRASIVE = CosmicCore.id("bee_abrasive"); + public static final ResourceLocation ENERGIZED = CosmicCore.id("bee_energized"); + public static final ResourceLocation SLICK = CosmicCore.id("bee_slick"); + public static final ResourceLocation PYROLYTIC = CosmicCore.id("bee_pyrolytic"); + + public static final ResourceLocation LUNAR = CosmicCore.id("bee_lunar"); + public static final ResourceLocation SOLAR = CosmicCore.id("bee_solar"); + public static final ResourceLocation COSMOS = CosmicCore.id("bee_cosmos"); + + public static final ResourceLocation HADAL = CosmicCore.id("bee_hadal"); + public static final ResourceLocation SHAMAN = CosmicCore.id("bee_shaman"); + public static final ResourceLocation ASHEN = CosmicCore.id("bee_ashen"); + public static final ResourceLocation FRACKING = CosmicCore.id("bee_fracking"); + public static final ResourceLocation FATE = CosmicCore.id("bee_fate"); + public static final ResourceLocation GRAND_GARDEN = CosmicCore.id("bee_grand_garden"); + public static final ResourceLocation ARCHITECT = CosmicCore.id("bee_architect"); + public static final ResourceLocation INQUISITIVE = CosmicCore.id("bee_inquisitive"); + public static final ResourceLocation HELLSMITH = CosmicCore.id("bee_hellsmith"); + public static final ResourceLocation RADOXIA = CosmicCore.id("bee_radoxia"); + public static final ResourceLocation ABSENT = CosmicCore.id("bee_absent"); + public static final ResourceLocation ILLUSIVE = CosmicCore.id("bee_illusive"); + public static final ResourceLocation CONSTRUCTIVE = CosmicCore.id("bee_constructive"); + public static final ResourceLocation PRISMATIC = CosmicCore.id("bee_prismatic"); + public static final ResourceLocation HYDRAULIC = CosmicCore.id("bee_hydraulic"); + public static final ResourceLocation COBBLED = CosmicCore.id("bee_cobbled"); + public static final ResourceLocation EXHAUSTIVE = CosmicCore.id("bee_exhaustive"); + public static final ResourceLocation VIRTUE = CosmicCore.id("bee_virtue"); +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/bee/CosmicBeesTaxa.java b/src/main/java/com/ghostipedia/cosmiccore/bee/CosmicBeesTaxa.java new file mode 100644 index 000000000..5b0d8b382 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/bee/CosmicBeesTaxa.java @@ -0,0 +1,62 @@ +package com.ghostipedia.cosmiccore.bee; + +public class CosmicBeesTaxa { + + public static final String SPECIES_WEIGHTY = "Weighty"; + public static final String SPECIES_OXYGEN = "Lofty Oxygen"; + public static final String SPECIES_HYDROGEN = "Lofty Hydrogen"; + public static final String SPECIES_NITROGEN = "Lofty Nitrogen"; + public static final String SPECIES_ARGON = "Lofty Argon"; + public static final String SPECIES_NATURAL_GAS = "Lofty Natural Gas"; + + // Propolyn-W Bees + public static final String SPECIES_ROSE_POLYMER = "Rose Polymer"; + public static final String SPECIES_CITRUS_POLYMER = "Citrus Polymer"; + public static final String SPECIES_WAXY_POLYMER = "Waxy Polymer"; + + // Funny and Misc Bees + public static final String SPECIES_BIOHAZARD = "Biohazad"; // Optional for SGM products + public static final String SPECIES_PALE = "Pale"; // Pale Steel Source - Required Bee + public static final String SPECIES_SOUL = "Soul"; // Malum Spirit Forging Stuff - Required + public static final String SPECIES_RUNIC = "Runic"; // Advanced Botania Nano Runes - Required + public static final String SPECIES_AMBROSIC = "Ambrosic"; // IDK YET LOL Probably ICHOR/ICHORIUM prod - Required + + public static final String SPECIES_HADAL = "Hadal"; + public static final String SPECIES_SHAMAN = "Shaman"; + public static final String SPECIES_ASHEN = "Ashen"; + public static final String SPECIES_FRACKING = "Fracking"; + public static final String SPECIES_FATE = "Fate"; + public static final String SPECIES_GRAND_GARDEN = "Grand Garden"; + public static final String SPECIES_ARCHITECT = "Architect"; + public static final String SPECIES_INQUISITIVE = "Inquisitive"; + public static final String SPECIES_HELLSMITH = "Hellsmith"; + public static final String SPECIES_RADOXIA = "Radoxia"; + public static final String SPECIES_ABSENT = "Absent"; + public static final String SPECIES_ILLUSIVE = "Illusive"; + public static final String SPECIES_CONSTRUCTIVE = "Constructive"; + public static final String SPECIES_PRISMATIC = "Prismatic"; + public static final String SPECIES_HYDRAULIC = "Hydraulic"; + public static final String SPECIES_COBBLED = "Cobbled"; + public static final String SPECIES_EXHAUSTIVE = "Exhaustive"; + public static final String SPECIES_VIRTUE = "Virtue"; + + // Industry Bees + public static final String SPECIES_ABRASIVE = "Abrasive"; // OreProc Bee + public static final String SPECIES_ENERGIZED = "Energized"; // Booster T3 Bee + public static final String SPECIES_SLICK = "Slick"; // Sulfuric Oil Products, the Bee + public static final String SPECIES_PYROLYTIC = "Pyrolytic"; // Charcoal Byproducts, the bee + + // Stellar Bees + public static final String SPECIES_LUNAR = "Lunar"; // Early planet dusts for processing en masse + public static final String SPECIES_SOLAR = "Solar"; // Mid planet dusts for processing en masse + public static final String SPECIES_COSMOS = "Cosmos"; // IDK - Probably for something relating to deep space + + // GENUS + public static final String GENUS_STONY = "Stony"; + public static final String GENUS_LOFTY = "Lofty"; + public static final String GENUS_ESOTERIC = "Esoteric"; + public static final String GENUS_PLASTID = "Plastid"; + public static final String GENUS_SOLAR = "Plastid"; + public static final String GENUS_INDUSTRIAL = "Industrial"; + public static final String GENUS_FORGE_KIN = "Forge Kin"; +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/bee/CosmicBeesTaxonomy.java b/src/main/java/com/ghostipedia/cosmiccore/bee/CosmicBeesTaxonomy.java new file mode 100644 index 000000000..8b66726c7 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/bee/CosmicBeesTaxonomy.java @@ -0,0 +1,67 @@ +package com.ghostipedia.cosmiccore.bee; + +import forestry.api.genetics.ForestryTaxa; +import forestry.api.genetics.alleles.BeeChromosomes; +import forestry.api.genetics.alleles.ForestryAlleles; +import forestry.api.plugin.IGeneticRegistration; + +public class CosmicBeesTaxonomy { + + public static void defineTaxa(IGeneticRegistration genetics) { + genetics.defineTaxon(ForestryTaxa.CLASS_INSECTS, ForestryTaxa.ORDER_HYMNOPTERA, order -> { + order.defineSubTaxon(ForestryTaxa.FAMILY_BEES, family -> { + family.defineSubTaxon(CosmicBeesTaxa.GENUS_STONY, genus -> { + genus.setDefaultChromosome(BeeChromosomes.CAVE_DWELLING, ForestryAlleles.TRUE); + genus.setDefaultChromosome(BeeChromosomes.LIFESPAN, ForestryAlleles.LIFESPAN_LONG); + genus.setDefaultChromosome(BeeChromosomes.FERTILITY, ForestryAlleles.FERTILITY_3); + genus.setDefaultChromosome(BeeChromosomes.ACTIVITY, ForestryAlleles.ACTIVITY_CATHEMERAL); + genus.setDefaultChromosome(BeeChromosomes.HUMIDITY_TOLERANCE, ForestryAlleles.TOLERANCE_UP_2); + genus.setDefaultChromosome(BeeChromosomes.FLOWER_TYPE, ForestryAlleles.FLOWER_TYPE_CORAL); + }); + family.defineSubTaxon(CosmicBeesTaxa.GENUS_LOFTY, genus -> { + genus.setDefaultChromosome(BeeChromosomes.CAVE_DWELLING, ForestryAlleles.FALSE); + genus.setDefaultChromosome(BeeChromosomes.LIFESPAN, ForestryAlleles.LIFESPAN_SHORT); + genus.setDefaultChromosome(BeeChromosomes.FERTILITY, ForestryAlleles.FERTILITY_3); + genus.setDefaultChromosome(BeeChromosomes.ACTIVITY, ForestryAlleles.ACTIVITY_DIURNAL); + genus.setDefaultChromosome(BeeChromosomes.HUMIDITY_TOLERANCE, ForestryAlleles.TOLERANCE_UP_2); + genus.setDefaultChromosome(BeeChromosomes.FLOWER_TYPE, ForestryAlleles.FLOWER_TYPE_CORAL); + }); + family.defineSubTaxon(CosmicBeesTaxa.GENUS_PLASTID, genus -> { + genus.setDefaultChromosome(BeeChromosomes.POLLINATION, ForestryAlleles.POLLINATION_FAST); + genus.setDefaultChromosome(BeeChromosomes.SPEED, ForestryAlleles.SPEED_NORMAL); + genus.setDefaultChromosome(BeeChromosomes.LIFESPAN, ForestryAlleles.LIFESPAN_SHORTENED); + genus.setDefaultChromosome(BeeChromosomes.FERTILITY, ForestryAlleles.FERTILITY_2); + genus.setDefaultChromosome(BeeChromosomes.ACTIVITY, ForestryAlleles.ACTIVITY_NOCTURNAL); + genus.setDefaultChromosome(BeeChromosomes.HUMIDITY_TOLERANCE, ForestryAlleles.TOLERANCE_UP_1); + genus.setDefaultChromosome(BeeChromosomes.TEMPERATURE_TOLERANCE, ForestryAlleles.TOLERANCE_UP_1); + }); + family.defineSubTaxon(CosmicBeesTaxa.GENUS_ESOTERIC, genus -> { + genus.setDefaultChromosome(BeeChromosomes.POLLINATION, ForestryAlleles.POLLINATION_SLOWEST); + genus.setDefaultChromosome(BeeChromosomes.LIFESPAN, ForestryAlleles.LIFESPAN_LONGER); + genus.setDefaultChromosome(BeeChromosomes.SPEED, ForestryAlleles.SPEED_FASTEST); + genus.setDefaultChromosome(BeeChromosomes.FERTILITY, ForestryAlleles.FERTILITY_1); + genus.setDefaultChromosome(BeeChromosomes.TOLERATES_RAIN, ForestryAlleles.FALSE); + genus.setDefaultChromosome(BeeChromosomes.ACTIVITY, ForestryAlleles.ACTIVITY_CATHEMERAL); + }); + family.defineSubTaxon(CosmicBeesTaxa.GENUS_INDUSTRIAL, genus -> { + genus.setDefaultChromosome(BeeChromosomes.POLLINATION, ForestryAlleles.POLLINATION_FAST); + genus.setDefaultChromosome(BeeChromosomes.LIFESPAN, ForestryAlleles.LIFESPAN_NORMAL); + genus.setDefaultChromosome(BeeChromosomes.SPEED, ForestryAlleles.SPEED_FASTEST); + genus.setDefaultChromosome(BeeChromosomes.FERTILITY, ForestryAlleles.FERTILITY_2); + genus.setDefaultChromosome(BeeChromosomes.TOLERATES_RAIN, ForestryAlleles.TRUE); + genus.setDefaultChromosome(BeeChromosomes.ACTIVITY, ForestryAlleles.ACTIVITY_METATURNAL); + }); + family.defineSubTaxon(CosmicBeesTaxa.GENUS_FORGE_KIN, genus -> { + genus.setDefaultChromosome(BeeChromosomes.POLLINATION, ForestryAlleles.POLLINATION_SLOWEST); + genus.setDefaultChromosome(BeeChromosomes.LIFESPAN, ForestryAlleles.LIFESPAN_SHORT); + genus.setDefaultChromosome(BeeChromosomes.SPEED, ForestryAlleles.SPEED_FASTEST); + genus.setDefaultChromosome(BeeChromosomes.FERTILITY, ForestryAlleles.FERTILITY_5); + genus.setDefaultChromosome(BeeChromosomes.TOLERATES_RAIN, ForestryAlleles.TRUE); + genus.setDefaultChromosome(BeeChromosomes.CAVE_DWELLING, ForestryAlleles.TRUE); + genus.setDefaultChromosome(BeeChromosomes.ACTIVITY, ForestryAlleles.ACTIVITY_DIURNAL); + }); + }); + + }); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/bee/feature/CosmicBeesItems.java b/src/main/java/com/ghostipedia/cosmiccore/bee/feature/CosmicBeesItems.java new file mode 100644 index 000000000..439febaf6 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/bee/feature/CosmicBeesItems.java @@ -0,0 +1,32 @@ +package com.ghostipedia.cosmiccore.bee.feature; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.CosmicBeesItemHiveFraming; +import com.ghostipedia.cosmiccore.common.data.CosmicGendustryUpgradeType; +import com.ghostipedia.cosmiccore.common.item.CosmicBeesHoneyComb; +import com.ghostipedia.cosmiccore.common.item.CosmicBeesItemHoneyComb; + +import forestry.modules.features.*; +import thedarkcolour.gendustry.item.GendustryUpgradeItem; + +@FeatureProvider +public class CosmicBeesItems { + + public static final IFeatureRegistry REGISTRY = ModFeatureRegistry.get(CosmicCore.id("core/cosmicore")); + public static final FeatureItemGroup BEE_COMBS = REGISTRY + .itemGroup(CosmicBeesItemHoneyComb::new, "bee_comb", CosmicBeesHoneyComb.VALUES); + + public static final FeatureItemGroup COSMIC_UPGRADES = REGISTRY + .itemGroup(GendustryUpgradeItem::new, CosmicGendustryUpgradeType.values()) + .identifier("cosmic_upgrade", FeatureGroup.IdentifierType.SUFFIX).create(); + + public static final FeatureItem FRAME_DECAYING = REGISTRY + .item(() -> new CosmicBeesItemHiveFraming.CosmicBeesItemHiveFrameBuilder(2048) + .setAgeMult(-1000f) + .build(), "frame_decaying"); + + public static final FeatureItem FRAME_WAILING = REGISTRY + .item(() -> new CosmicBeesItemHiveFraming.CosmicBeesItemHiveFrameBuilder(2048) + .setMutationMult(1000f) + .build(), "frame_wailing"); +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/CosmicBeesPlugin.java b/src/main/java/com/ghostipedia/cosmiccore/client/CosmicBeesPlugin.java new file mode 100644 index 000000000..499504650 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/CosmicBeesPlugin.java @@ -0,0 +1,46 @@ +package com.ghostipedia.cosmiccore.client; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.bee.CosmicBeesDefinition; +import com.ghostipedia.cosmiccore.bee.CosmicBeesTaxonomy; +import com.ghostipedia.cosmiccore.bee.feature.CosmicBeesItems; +import com.ghostipedia.cosmiccore.common.item.CosmicBeesHoneyComb; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; + +import forestry.api.client.plugin.IClientRegistration; +import forestry.api.plugin.IApicultureRegistration; +import forestry.api.plugin.IForestryPlugin; +import forestry.api.plugin.IGeneticRegistration; + +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Supplier; + +public class CosmicBeesPlugin implements IForestryPlugin { + + @Override + public ResourceLocation id() { + return CosmicCore.id("core/cosmicore"); + } + + @Override + public void registerApiculture(IApicultureRegistration apiculture) { + CosmicBeesDefinition.defineBees(apiculture); + } + + @Override + public void registerGenetics(IGeneticRegistration genetics) { + CosmicBeesTaxonomy.defineTaxa(genetics); + } + + @Override + public void registerClient(Consumer> registrar) { + registrar.accept(new CosmicCoreClient.CosmicBeesClientRegistration()); + } + + private static Supplier> getHoneyComb(CosmicBeesHoneyComb type) { + return () -> List.of(CosmicBeesItems.BEE_COMBS.stack(type)); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/CosmicCoreClient.java b/src/main/java/com/ghostipedia/cosmiccore/client/CosmicCoreClient.java index 8239ff22c..daf7879df 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/client/CosmicCoreClient.java +++ b/src/main/java/com/ghostipedia/cosmiccore/client/CosmicCoreClient.java @@ -1,21 +1,33 @@ package com.ghostipedia.cosmiccore.client; import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.bee.CosmicBeesSpecies; +import com.ghostipedia.cosmiccore.client.keybind.BootsKeybinds; import com.ghostipedia.cosmiccore.client.renderer.machine.*; import com.gregtechceu.gtceu.client.renderer.machine.DynamicRenderManager; import net.minecraft.client.renderer.ShaderInstance; +import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.ModelEvent; import net.minecraftforge.client.event.RegisterGuiOverlaysEvent; +import net.minecraftforge.client.event.RegisterKeyMappingsEvent; import net.minecraftforge.client.event.RegisterShadersEvent; +import net.minecraftforge.client.event.RenderGuiOverlayEvent; +import net.minecraftforge.client.gui.overlay.VanillaGuiOverlay; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import forestry.api.apiculture.genetics.BeeLifeStage; +import forestry.api.client.plugin.IClientRegistration; import lombok.Getter; import java.io.IOException; +import java.util.function.Consumer; + +import static dev.ftb.mods.ftblibrary.util.KnownServerRegistries.client; public class CosmicCoreClient { @@ -35,16 +47,35 @@ public static void init(IEventBus modBus) { DynamicRenderManager.register(CosmicCore.id("spirit_crucible"), SpiritCrucibleRender.TYPE); DynamicRenderManager.register(CosmicCore.id("biovat_render"), BioVatRender.TYPE); DynamicRenderManager.register(CosmicCore.id("tester_render"), RenderTesterHelper.TYPE); + DynamicRenderManager.register(CosmicCore.id("star_ladder_render"), StarLadderRender.TYPE); } @Getter private static ShaderInstance nebulaeShader; + @Getter + private static ShaderInstance soulAuraShader; + + @Getter + private static ShaderInstance voidBgShader; + + @Getter + private static ShaderInstance galaxyBgShader; + @SubscribeEvent public static void shaderRegistry(RegisterShadersEvent event) { try { event.registerShader(new ShaderInstance(event.getResourceProvider(), CosmicCore.id("rendertype_nebulae"), DefaultVertexFormat.POSITION), (shaderInstance) -> nebulaeShader = shaderInstance); + + event.registerShader(new ShaderInstance(event.getResourceProvider(), CosmicCore.id("soul_aura"), + DefaultVertexFormat.POSITION_TEX), (shaderInstance) -> soulAuraShader = shaderInstance); + + event.registerShader(new ShaderInstance(event.getResourceProvider(), CosmicCore.id("void_bg"), + DefaultVertexFormat.POSITION_TEX), (shaderInstance) -> voidBgShader = shaderInstance); + + event.registerShader(new ShaderInstance(event.getResourceProvider(), CosmicCore.id("galaxy_bg"), + DefaultVertexFormat.POSITION_TEX), (shaderInstance) -> galaxyBgShader = shaderInstance); } catch (IOException e) { throw new RuntimeException(e); } @@ -55,6 +86,11 @@ public static void onGUIRegisterUIOverlays(RegisterGuiOverlaysEvent event) { event.registerAboveAll("cosmichud", new CosmicHudGuiOverlay()); } + @SubscribeEvent + public static void registerKeyMappings(RegisterKeyMappingsEvent event) { + BootsKeybinds.registerKeyMappings(event); + } + @SubscribeEvent public static void registerAdditionalModels(ModelEvent.RegisterAdditional event) { event.register(StellarIrisRender.IRIS_MODEL_CORE); @@ -73,4 +109,293 @@ public static void registerAdditionalModels(ModelEvent.RegisterAdditional event) event.register(StarBallastRender.STAR_MODEL_INNER); event.register(StarBallastRender.STAR_MODEL_BEAM); } + + public static class CosmicBeesClientRegistration implements Consumer { + + @Override + public void accept(IClientRegistration client) { + registerApiculture(client); + } + + // Spotless: off + private static void registerApiculture(IClientRegistration client) { + client.setCustomBeeModel(CosmicBeesSpecies.LOFTY_OXYGEN, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.LOFTY_OXYGEN, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.LOFTY_OXYGEN, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.LOFTY_HYDROGEN, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.LOFTY_HYDROGEN, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.LOFTY_HYDROGEN, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.LOFTY_NITROGEN, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.LOFTY_NITROGEN, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.LOFTY_NITROGEN, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.LOFTY_ARGON, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.LOFTY_ARGON, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.LOFTY_ARGON, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.ROSE_POLYMER, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.ROSE_POLYMER, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.ROSE_POLYMER, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.CITRUS_POLYMER, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.CITRUS_POLYMER, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.CITRUS_POLYMER, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.WAXY_POLYMER, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.WAXY_POLYMER, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.WAXY_POLYMER, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.BIOHAZARD, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.BIOHAZARD, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.BIOHAZARD, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.PALE, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.PALE, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.PALE, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.SOUL, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.SOUL, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.SOUL, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.RUNIC, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.RUNIC, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.RUNIC, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.AMBROSIC, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.AMBROSIC, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.AMBROSIC, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.ABRASIVE, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.ABRASIVE, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.ABRASIVE, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.ENERGIZED, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.ENERGIZED, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.ENERGIZED, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.SLICK, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.SLICK, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.SLICK, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.PYROLYTIC, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.PYROLYTIC, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.PYROLYTIC, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.LUNAR, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.LUNAR, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.LUNAR, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.SOLAR, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.SOLAR, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.SOLAR, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.COSMOS, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.COSMOS, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.COSMOS, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + // NEW BEES + client.setCustomBeeModel(CosmicBeesSpecies.HADAL, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.HADAL, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.HADAL, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.SHAMAN, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.SHAMAN, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.SHAMAN, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.COSMOS, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.COSMOS, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.COSMOS, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.ASHEN, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.ASHEN, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.ASHEN, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.FRACKING, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.FRACKING, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.FRACKING, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.FATE, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.FATE, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.FATE, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.GRAND_GARDEN, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.GRAND_GARDEN, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.GRAND_GARDEN, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.ARCHITECT, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.ARCHITECT, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.ARCHITECT, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.INQUISITIVE, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.INQUISITIVE, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.INQUISITIVE, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.HELLSMITH, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.HELLSMITH, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.HELLSMITH, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.RADOXIA, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.RADOXIA, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.RADOXIA, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.ABSENT, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.ABSENT, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.ABSENT, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.ILLUSIVE, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.ILLUSIVE, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.ILLUSIVE, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.CONSTRUCTIVE, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.CONSTRUCTIVE, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.CONSTRUCTIVE, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.PRISMATIC, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.PRISMATIC, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.PRISMATIC, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.HYDRAULIC, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.HYDRAULIC, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.HYDRAULIC, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.COBBLED, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.COBBLED, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.COBBLED, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.EXHAUSTIVE, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.EXHAUSTIVE, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.EXHAUSTIVE, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.VIRTUE, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.VIRTUE, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.VIRTUE, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + } + } + + @Mod.EventBusSubscriber(modid = CosmicCore.MOD_ID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.FORGE) + public static final class HideVanillaOverlays { + + @SubscribeEvent + public static void onOverlayPre(RenderGuiOverlayEvent.Pre event) { + if (event.getOverlay() == VanillaGuiOverlay.AIR_LEVEL.type()) { + event.setCanceled(true); + } + } + } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/CosmicFluidTooltipAddon.java b/src/main/java/com/ghostipedia/cosmiccore/client/CosmicFluidTooltipAddon.java new file mode 100644 index 000000000..2a6727b45 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/CosmicFluidTooltipAddon.java @@ -0,0 +1,93 @@ +package com.ghostipedia.cosmiccore.client; + +public class CosmicFluidTooltipAddon { + // + // private static final String modid = CosmicCore.MOD_ID; + // static String prefix = ".tooltip.prefix"; + // public static HashMap> data = new HashMap<>(); + // + // public static void appendFluidTooltip(ItemStack itemStack) { + // if (itemStack.getItem() instanceof BucketItem bucketItem) { + // Fluid fluid = bucketItem.getFluid(); + // String fluidID = ForgeRegistries.FLUIDS.getKey(fluid).toString(); + // if (data.isEmpty()) { + // hashMapInit(data); + // } + // Set keySet = data.keySet(); + // for (String i : keySet) { + // if (data.get(i).containsKey(fluidID)) { + // HashMap tmp = data.get(i); + // ResourceLocation fluidResource = new ResourceLocation(fluidID); + // if (fluid instanceof GTFluid attributeFluid) { + // FluidAttribute attribute; + // if (".calorific".equals(i)) { + // attribute = new FluidAttribute( + // fluidResource, + // list -> list.accept(Component.translatable(modid + i + prefix, + // NumberUtils.formatThousandsSeparators(tmp.get(fluidID)) + " EU/mB")), + // list -> {}); + // } else { + // attribute = new FluidAttribute( + // fluidResource, + // list -> list.accept(Component.translatable(modid + i + prefix, + // tmp.get(fluidID).intValue())), + // list -> {}); + // } + // attributeFluid.addAttribute(attribute); + // } + // } + // } + // } + // } + // + // public static void hashMapInit(HashMap> hashMap) { + // hashMap.put(".calorific", getFuelEnergy()); + // hashMap.put(".lubricant", getLubricantTier()); + // hashMap.put(".booster", getBoosterTier()); + // CosmicCore.LOGGER.info("Cosmic Additional Fluid Tooltip Init Finished!"); + // } + // + // public static HashMap getFuelEnergy() { + // GTRecipeType[] gtRecipeTypes = { + // GTRecipeTypes.STEAM_TURBINE_FUELS, + // GTRecipeTypes.GAS_TURBINE_FUELS, + // GTRecipeTypes.COMBUSTION_GENERATOR_FUELS, + // CosmicRecipeTypes.NAQUAHINE_REACTOR + // }; + // ArrayList recipes = new ArrayList<>(); + // for (GTRecipeType i : gtRecipeTypes) { + // recipes.addAll(i.getRecipesInCategory(i.getCategory())); + // } + // HashMap calorificValue = new HashMap<>(); + // for (GTRecipe i : recipes) { + // int fluidInputAmount = RecipeHelper.getInputFluids(i).get(0).getAmount(); + // String fluidInputID = ForgeRegistries.FLUIDS + // .getKey(RecipeHelper.getInputFluids(i).get(0).getFluid()).toString(); + // long EUt = i.getOutputEUt().getTotalEU(); + // int duration = i.duration; + // long EUTotal = EUt * duration; + // double EUPer = (double) EUTotal / (double) fluidInputAmount; + // calorificValue.put(fluidInputID, EUPer); + // } + // calorificValue.putIfAbsent("gtceu:steam", calorificValue.get("embers:steam")); + // return calorificValue; // Why default steam is embers steam??? + // } + // + // public static HashMap getLubricantTier() { + // HashMap lubricantTier = new HashMap<>(); + // var tier = ExoticCombustionEngineMachine.getLubricantTiers(); + // for (FluidStack i : tier.keySet()) { + // lubricantTier.put(ForgeRegistries.FLUIDS.getKey(i.getFluid()).toString(), (double) tier.getInt(i) - 1); + // } // Lubricant Tier from 2 to 4? + // return lubricantTier; + // } + // + // public static HashMap getBoosterTier() { + // HashMap boosterTier = new HashMap<>(); + // var tier = ExoticCombustionEngineMachine.getBoostingTiers(); + // for (FluidStack i : tier.keySet()) { + // boosterTier.put(ForgeRegistries.FLUIDS.getKey(i.getFluid()).toString(), (double) tier.getInt(i)); + // } + // return boosterTier; + // } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/CosmicHudGuiOverlay.java b/src/main/java/com/ghostipedia/cosmiccore/client/CosmicHudGuiOverlay.java index 4dcc85591..c90c1c5b4 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/client/CosmicHudGuiOverlay.java +++ b/src/main/java/com/ghostipedia/cosmiccore/client/CosmicHudGuiOverlay.java @@ -1,5 +1,6 @@ package com.ghostipedia.cosmiccore.client; +import com.ghostipedia.cosmiccore.CosmicCore; import com.ghostipedia.cosmiccore.common.item.behavior.WirelessPDABehavior; import com.gregtechceu.gtceu.api.item.ComponentItem; @@ -8,32 +9,78 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import net.minecraftforge.client.gui.overlay.ForgeGui; import net.minecraftforge.client.gui.overlay.IGuiOverlay; +import com.mojang.blaze3d.systems.RenderSystem; import lombok.NoArgsConstructor; import org.jetbrains.annotations.NotNull; @NoArgsConstructor public class CosmicHudGuiOverlay implements IGuiOverlay { + // Oxygen bar textures + private static final ResourceLocation OXY_BG = CosmicCore.id("textures/gui/oxygen_bg.png"); + private static final ResourceLocation OXY_FILL = CosmicCore.id("textures/gui/oxygen_fill.png"); + private static final int TEX_W = 64, TEX_H = 12; + + // Time bar state private static long timeTicksLeft = -1; private static long timeMaxTicks = 0; + // Oxygen bar state + private static long oxygenTicksLeft = -1; + private static long oxygenMaxTicks = 0; + private static boolean oxygenShow = true; + private static double lastRateTicksPerSecond = Double.NaN; + + // Track displayed value to prevent visual jitter (bar only moves in direction of rate) + private static long displayedOxygen = -1; + + // Colors for oxygen bar text + private static final int COLOR_DRAIN = 0x000000; // Black for draining (no shadow) + private static final int COLOR_REGEN = 0x00ff66; + private static final int COLOR_IDLE = 0xAAAAAA; + public static void setTimeBar(ResourceLocation dim, long left, long max) { timeTicksLeft = left; timeMaxTicks = max; } + public static void setOxygenBar(long left, long max, boolean show, double ratePerSecond) { + oxygenTicksLeft = left; + oxygenMaxTicks = max; + oxygenShow = show; + lastRateTicksPerSecond = ratePerSecond; + + // Update displayed value with monotonic constraint based on rate direction + // This prevents visual jitter from server-side fluctuations + if (displayedOxygen < 0) { + // First sync - just use the value + displayedOxygen = left; + } else if (ratePerSecond < -0.1) { + // Draining: bar can only decrease or stay same + displayedOxygen = Math.min(displayedOxygen, left); + } else if (ratePerSecond > 0.1) { + // Regenerating: bar can only increase or stay same + displayedOxygen = Math.max(displayedOxygen, left); + } else { + // Idle/neutral: snap to actual value + displayedOxygen = left; + } + } + @Override public void render(ForgeGui forgeGui, GuiGraphics guiGraphics, float partialTick, int screenWidth, int screenHeight) { Minecraft mc = Minecraft.getInstance(); - if (mc.isWindowActive() && mc.level != null && !mc.options.renderDebug && !mc.options.hideGui) { + if (mc.level != null && !mc.options.renderDebug && !mc.options.hideGui) { renderHUDWirelessPDA(WirelessPDABehavior.CosmicCuriosUtils.getPDACurio(mc.player), guiGraphics); renderTimeBudgetBar(guiGraphics, screenWidth, screenHeight); + renderOxygenBar(guiGraphics, screenWidth, screenHeight); } } @@ -69,5 +116,102 @@ private static void renderTimeBudgetBar(GuiGraphics gg, int sw, int sh) { x + w / 2 - Minecraft.getInstance().font.width(txt) / 2, y - 10, 0xFFFFFF, true); } + + // ------------------------------------------------------------------------- + // Oxygen Bar Rendering + // Uses matrix scaling to render at 81px wide (matching hunger bar) without texture stretching // ------------------------------------------------------------------------- + + // Scale factor to match vanilla hunger bar width (81px target / 64px texture) + private static final float BAR_SCALE = 81f / TEX_W; // ~1.265625 + + private static void renderOxygenBar(GuiGraphics gg, int screenWidth, int screenHeight) { + if (!oxygenShow || oxygenTicksLeft < 0 || oxygenMaxTicks <= 0) return; + + // Final rendered dimensions after scaling + int renderedWidth = (int) (TEX_W * BAR_SCALE); + int renderedHeight = (int) (TEX_H * BAR_SCALE); + + // Position to match vanilla hunger bar (right edge at screenWidth/2 + 91) + int x = screenWidth / 2 + 10; + int y = screenHeight - 39 - renderedHeight; + + // Use displayedOxygen for visual (has monotonic constraint to prevent jitter) + long visualOxygen = displayedOxygen >= 0 ? displayedOxygen : oxygenTicksLeft; + double frac = Math.max(0d, Math.min(1d, (double) visualOxygen / (double) oxygenMaxTicks)); + + // Calculate filled width in texture pixels (before scaling) + int filledTexW = (int) (TEX_W * frac); + filledTexW = Math.max(0, Math.min(TEX_W, filledTexW)); + + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + RenderSystem.setShaderColor(1f, 1f, 1f, 1f); + + // Push matrix and apply scale transform + var pose = gg.pose(); + pose.pushPose(); + pose.translate(x, y, 0); + pose.scale(BAR_SCALE, BAR_SCALE, 1f); + + // Background - render at native texture size (scaling handled by matrix) + gg.blit(OXY_BG, 0, 0, 0, 0, TEX_W, TEX_H, TEX_W, TEX_H); + + // Fill bar - clip horizontally based on fill amount + if (filledTexW > 0) { + gg.blit(OXY_FILL, 0, 0, 0, 0, filledTexW, TEX_H, TEX_W, TEX_H); + } + + pose.popPose(); + + // ETA text - render outside the scaled context for crisp text + var font = Minecraft.getInstance().font; + var comp = computeOxygenETA(); + int tx = x + renderedWidth / 2 - font.width(comp) / 2; + int ty = y + (renderedHeight - 8) / 2 + 1; // +1 to nudge down for better centering + // Disable shadow for draining (black text), enable for others + boolean useShadow = !isDraining(); + gg.drawString(font, comp, tx, ty, 0xFFFFFF, useShadow); + + RenderSystem.setShaderColor(1f, 1f, 1f, 1f); + } + + private static boolean isDraining() { + if (oxygenTicksLeft <= 0) return true; // Suffocating + if (oxygenTicksLeft >= oxygenMaxTicks) return false; // Full + double r = lastRateTicksPerSecond; + return Double.isFinite(r) && r < -0.01; // Negative rate = draining + } + + private static Component computeOxygenETA() { + if (oxygenTicksLeft <= 0) { + return Component.literal("SUFFOCATING").withStyle(s -> s.withColor(COLOR_DRAIN)); + } + if (oxygenTicksLeft >= oxygenMaxTicks) { + return Component.literal("--:--").withStyle(s -> s.withColor(COLOR_IDLE)); + } + + double r = lastRateTicksPerSecond; + if (!Double.isFinite(r) || Math.abs(r) < 0.01) { + return Component.literal("--:--").withStyle(s -> s.withColor(COLOR_IDLE)); + } + + if (r < 0) { + // Draining + long etaSec = (long) Math.ceil(oxygenTicksLeft / (-r)); + return Component.literal("<- " + formatSeconds(etaSec) + " >").withStyle(s -> s.withColor(COLOR_DRAIN)); + } else { + // Regenerating + long ticksNeeded = oxygenMaxTicks - oxygenTicksLeft; + long etaSec = (long) Math.ceil(ticksNeeded / r); + return Component.literal("< " + formatSeconds(etaSec) + " ->").withStyle(s -> s.withColor(COLOR_REGEN)); + } + } + + private static String formatSeconds(long sec) { + if (sec < 0) sec = 0; + long m = sec / 60; + long s = sec % 60; + return m + ":" + String.format("%02d", s); + } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/ForgeClientEventHandler.java b/src/main/java/com/ghostipedia/cosmiccore/client/ForgeClientEventHandler.java index 05207be07..730b1a7a2 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/client/ForgeClientEventHandler.java +++ b/src/main/java/com/ghostipedia/cosmiccore/client/ForgeClientEventHandler.java @@ -2,12 +2,14 @@ import com.ghostipedia.cosmiccore.CosmicCore; import com.ghostipedia.cosmiccore.CosmicUtils; +import com.ghostipedia.cosmiccore.client.renderer.RingUpgradePreviewRenderer; import com.ghostipedia.cosmiccore.client.renderer.StructureBoundingBox; import net.minecraft.client.renderer.FogRenderer; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.RenderLevelStageEvent; import net.minecraftforge.client.event.ViewportEvent; +import net.minecraftforge.event.level.LevelEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; @@ -22,6 +24,15 @@ public static void onRenderWorldLast(RenderLevelStageEvent event) { var stage = event.getStage(); if (stage == RenderLevelStageEvent.Stage.AFTER_TRIPWIRE_BLOCKS) { StructureBoundingBox.renderStructureSelect(event.getPoseStack(), event.getCamera()); + RingUpgradePreviewRenderer.renderPreviews(event.getPoseStack(), event.getCamera()); + } + } + + @SubscribeEvent + public static void onWorldUnload(LevelEvent.Unload event) { + // Clear all previews when world unloads to prevent stale data + if (event.getLevel().isClientSide()) { + RingUpgradePreviewRenderer.clearAllPreviews(); } } @@ -52,4 +63,9 @@ public static void onComputeFogColor(ViewportEvent.ComputeFogColor event) { event.setBlue(0.855F); } } + + // @SubscribeEvent + // public static void onTooltipEvent(ItemTooltipEvent event) { + // CosmicFluidTooltipAddon.appendFluidTooltip(event.getItemStack()); + // } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/ModifyIcon.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/ModifyIcon.java deleted file mode 100644 index ee90b7781..000000000 --- a/src/main/java/com/ghostipedia/cosmiccore/client/gui/ModifyIcon.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.ghostipedia.cosmiccore.client.gui; - -import com.ghostipedia.cosmiccore.CosmicCore; - -import net.minecraft.resources.ResourceLocation; - -import appeng.client.gui.style.Blitter; - -public enum ModifyIcon { - - MULTIPLY_2(0, 0), - MULTIPLY_3(16, 0), - MULTIPLY_8(32, 0), - DIVISION_2(0, 16), - DIVISION_3(16, 16), - DIVISION_8(32, 16), - TOOLBAR_BUTTON_BACKGROUND(32, 32); - - private final int x; - private final int y; - private final int width; - private final int height; - private static final ResourceLocation TEXTURE = CosmicCore.id("textures/gui/states.png"); - private static final int TEXTURE_WIDTH = 48; - private static final int TEXTURE_HEIGHT = 48; - - ModifyIcon(int x, int y) { - this.x = x; - this.y = y; - width = 16; - height = 16; - } - - public Blitter getBlitter() { - return Blitter.texture(TEXTURE, TEXTURE_WIDTH, TEXTURE_HEIGHT).src(x, y, width, height); - } -} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/ModifyIconButton.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/ModifyIconButton.java deleted file mode 100644 index e344143b9..000000000 --- a/src/main/java/com/ghostipedia/cosmiccore/client/gui/ModifyIconButton.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.ghostipedia.cosmiccore.client.gui; - -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.gui.components.Button; -import net.minecraft.client.renderer.Rect2i; -import net.minecraft.network.chat.Component; - -import appeng.client.gui.Icon; -import appeng.client.gui.style.Blitter; -import appeng.client.gui.widgets.ITooltip; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; -import org.jetbrains.annotations.NotNull; - -import java.util.Collections; -import java.util.List; - -public final class ModifyIconButton extends Button implements ITooltip { - - private final ModifyIcon icon; - - private final Component displayName; - private final Component displayValue; - - public ModifyIconButton(Button.OnPress onPress, ModifyIcon icon, Component displayName, Component displayValue) { - super(0, 0, 8, 8, Component.empty(), onPress, DEFAULT_NARRATION); - this.icon = icon; - this.displayName = displayName; - this.displayValue = displayValue; - } - - public void setVisibility(boolean vis) { - visible = vis; - active = vis; - } - - @Override - public void renderWidget(@NotNull GuiGraphics guiGraphics, int mouseX, int mouseY, float partial) { - if (visible) { - Blitter blitter = icon.getBlitter(); - if (!active) { - blitter.opacity(0.5F); - } - - RenderSystem.disableDepthTest(); - RenderSystem.enableBlend(); - if (isFocused()) { - guiGraphics.fill(getX() - 1, getY() - 1, getX() + width + 1, getY(), -1); - guiGraphics.fill(getX() - 1, getY(), getX(), getY() + height, -1); - guiGraphics.fill(getX() + width, getY(), getX() + width + 1, getY() + height, -1); - guiGraphics.fill(getX() - 1, getY() + height, getX() + width + 1, getY() + height + 1, -1); - } - - PoseStack pose = guiGraphics.pose(); - pose.pushPose(); - pose.translate(getX(), getY(), 0.0F); - pose.scale(0.5F, 0.5F, 1.0F); - Icon.TOOLBAR_BUTTON_BACKGROUND.getBlitter().dest(0, 0).blit(guiGraphics); - blitter.dest(0, 0).blit(guiGraphics); - pose.popPose(); - RenderSystem.enableDepthTest(); - } - } - - @Override - public Rect2i getTooltipArea() { - return new Rect2i(getX(), getY(), 8, 8); - } - - @Override - public boolean isTooltipAreaVisible() { - return visible; - } - - @Override - public List getTooltipMessage() { - return Collections.singletonList(Component.empty().append(displayName).append("\n").append(displayValue)); - } -} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/screen/StellarConvergenceScreen.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/screen/StellarConvergenceScreen.java new file mode 100644 index 000000000..db05bde03 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/screen/StellarConvergenceScreen.java @@ -0,0 +1,932 @@ +package com.ghostipedia.cosmiccore.client.gui.screen; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine; +import com.ghostipedia.cosmiccore.api.machine.multiblock.StellarIrisUpgrade; +import com.ghostipedia.cosmiccore.client.renderer.BackgroundRenderer; +import com.ghostipedia.cosmiccore.common.network.CCoreNetwork; +import com.ghostipedia.cosmiccore.common.network.packet.StellarUpgradePacket; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.util.Mth; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import java.util.*; + +/** + * Full-screen cosmic upgrade tree for the Stellar IRIS. + * Inspired by constellation/skill tree designs with organic node layouts. + */ +@OnlyIn(Dist.CLIENT) +public class StellarConvergenceScreen extends Screen { + + // Machine reference + private final BlockPos machinePos; + private int spendablePoints; + private int lifetimePoints; + private int tier; + private int ascensionLevel; + private Set unlockedUpgrades; + private Map repeatableLevels; + + // Node system + private final List nodes = new ArrayList<>(); + private final Map nodeMap = new HashMap<>(); + + // Visual state + private float fadeAlpha = 0f; + private int ticks = 0; + + // Interaction + private UpgradeNode hoveredNode = null; + private UpgradeNode selectedNode = null; + private float panelSlide = 0f; + + // Pan and zoom + private float viewOffsetX = 0f; + private float viewOffsetY = 0f; + private float zoom = 1.0f; + private boolean isDragging = false; + private double lastDragX, lastDragY; + + // Particles + private final List particles = new ArrayList<>(); + private final Random random = new Random(); + + // Constants + private static final float MIN_ZOOM = 0.3f; + private static final float MAX_ZOOM = 1.8f; + private static final int PARTICLE_COUNT = 60; + + public StellarConvergenceScreen(BlockPos machinePos, int spendablePoints, int lifetimePoints, + int tier, int ascensionLevel, Set unlockedUpgrades, + int[] repeatableLevels) { + super(Component.literal("Stellar Convergence")); + this.machinePos = machinePos; + this.spendablePoints = spendablePoints; + this.lifetimePoints = lifetimePoints; + this.tier = tier; + this.ascensionLevel = ascensionLevel; + this.unlockedUpgrades = unlockedUpgrades != null ? + EnumSet.copyOf(unlockedUpgrades) : EnumSet.noneOf(StellarIrisUpgrade.class); + // Convert int[] to Map for internal use + this.repeatableLevels = new HashMap<>(); + if (repeatableLevels != null) { + for (int i = 0; i < repeatableLevels.length; i++) { + if (repeatableLevels[i] > 0) { + this.repeatableLevels.put(i, repeatableLevels[i]); + } + } + } + } + + public static void open(IrisMultiblockMachine machine) { + if (machine == null) return; + + Set upgrades = machine.getUnlockedUpgrades(); + StellarConvergenceScreen screen = new StellarConvergenceScreen( + machine.getPos(), + machine.getSpendablePoints(), + machine.getLifetimePrestigePoints(), + machine.getPrestigeTier(), + machine.getAscensionLevel(), + upgrades.isEmpty() ? null : upgrades, + machine.getRepeatableUpgradeLevels()); + Minecraft.getInstance().setScreen(screen); + } + + @Override + protected void init() { + super.init(); + buildNodeLayout(); + initParticles(); + } + + private void buildNodeLayout() { + nodes.clear(); + nodeMap.clear(); + + int cx = width / 2; + int cy = height / 2; + + // Create organic tree layout + // Central core with 4 main branches spiraling outward + + for (StellarIrisUpgrade upgrade : StellarIrisUpgrade.values()) { + float[] pos = calculateNodePosition(upgrade, cx, cy); + UpgradeNode node = new UpgradeNode(upgrade, pos[0], pos[1]); + nodes.add(node); + nodeMap.put(upgrade, node); + } + } + + private float[] calculateNodePosition(StellarIrisUpgrade upgrade, int cx, int cy) { + StellarIrisUpgrade.Branch branch = upgrade.getBranch(); + int row = upgrade.getRow(); + + // Repeatable upgrades go in a ring around the center + if (branch == StellarIrisUpgrade.Branch.REPEATABLE) { + List repeatables = new ArrayList<>(StellarIrisUpgrade.getRepeatables()); + repeatables.sort(Comparator.comparingInt(Enum::ordinal)); + int idx = repeatables.indexOf(upgrade); + int count = repeatables.size(); + + // Inner ring around center + float radius = 55; + float angleStep = (float) (2 * Math.PI / count); + float angle = idx * angleStep - (float) Math.PI / 2; // Start from top + + float x = cx + Mth.cos(angle) * radius; + float y = cy + Mth.sin(angle) * radius; + return new float[] { x, y }; + } + + // Each branch gets a quadrant, nodes spiral outward + float baseAngle = switch (branch) { + case IGNITION -> (float) (-Math.PI * 0.75); // Top-left + case FUSION -> (float) (-Math.PI * 0.25); // Top-right + case COLLAPSE -> (float) (Math.PI * 0.75); // Bottom-left + case VOID -> (float) (Math.PI * 0.25); // Bottom-right + case REPEATABLE -> 0; // Handled above + }; + + // Get upgrades in same branch/row for spreading + List sameRowBranch = new ArrayList<>(); + for (StellarIrisUpgrade u : StellarIrisUpgrade.values()) { + if (u.getBranch() == branch && u.getRow() == row) { + sameRowBranch.add(u); + } + } + sameRowBranch.sort(Comparator.comparingInt(Enum::ordinal)); + + int idx = sameRowBranch.indexOf(upgrade); + int count = sameRowBranch.size(); + + // Radial distance increases with row - much more spread out + float radius = 95 + row * 50; // Pushed out more to make room for repeatables + + // Spread nodes in same row - wider spread + float spreadAngle = 0.38f; // How much to spread within a row + float nodeAngle = baseAngle; + if (count > 1) { + nodeAngle += (idx - (count - 1) / 2.0f) * spreadAngle; + } + + // Add slight spiral effect + nodeAngle += row * 0.05f; + + float x = cx + Mth.cos(nodeAngle) * radius; + float y = cy + Mth.sin(nodeAngle) * radius; + + return new float[] { x, y }; + } + + private void initParticles() { + particles.clear(); + for (int i = 0; i < PARTICLE_COUNT; i++) { + particles.add(new CosmicParticle(width, height, random)); + } + } + + @Override + public void tick() { + super.tick(); + ticks++; + + if (fadeAlpha < 1f) { + fadeAlpha = Math.min(1f, fadeAlpha + 0.08f); + } + + // Update particles + for (CosmicParticle p : particles) { + p.tick(); + if (p.isDead()) { + p.reset(width, height, random); + } + } + + // Update nodes + for (UpgradeNode node : nodes) { + node.tick(); + } + + // Panel animation + if (selectedNode != null) { + panelSlide = Math.min(1f, panelSlide + 0.12f); + } else { + panelSlide = Math.max(0f, panelSlide - 0.15f); + } + } + + @Override + public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTick) { + // Cosmic background + BackgroundRenderer.render(graphics.pose(), BackgroundRenderer.BackgroundType.GALAXY, fadeAlpha, width, height); + + if (fadeAlpha < 0.1f) return; + + // Particles + for (CosmicParticle p : particles) { + p.render(graphics, fadeAlpha); + } + + // Vignette + renderVignette(graphics); + + // Update node positions with view offset + int cx = width / 2; + int cy = height / 2; + hoveredNode = null; + + for (UpgradeNode node : nodes) { + float[] basePos = calculateNodePosition(node.upgrade, cx, cy); + node.screenX = (basePos[0] - cx) * zoom + cx + viewOffsetX; + node.screenY = (basePos[1] - cy) * zoom + cy + viewOffsetY; + + if (node.isMouseOver(mouseX, mouseY, zoom)) { + hoveredNode = node; + } + } + + // Draw connections + renderConnections(graphics); + + // Draw central core + renderCentralCore(graphics, cx, cy); + + // Draw nodes + for (UpgradeNode node : nodes) { + StellarIrisUpgrade upgrade = node.upgrade; + boolean owned; + boolean available; + boolean tierLocked = tier < upgrade.getRequiredTier(); + + if (upgrade.isRepeatable()) { + int level = repeatableLevels.getOrDefault(upgrade.ordinal(), 0); + owned = level > 0; + available = level < upgrade.getMaxLevel() && + spendablePoints >= upgrade.getCostForLevel(level + 1); + } else { + owned = unlockedUpgrades.contains(upgrade); + available = !owned && upgrade.canUnlock(unlockedUpgrades, tier) && + spendablePoints >= upgrade.getCost(); + } + + node.render(graphics, font, fadeAlpha, zoom, ticks, partialTick, + owned, available, tierLocked, + node == hoveredNode, node == selectedNode); + } + + // Header + renderHeader(graphics); + + // Detail panel + if (panelSlide > 0.01f) { + renderDetailPanel(graphics, mouseX, mouseY); + } + + // Tooltip for non-selected hover + if (hoveredNode != null && hoveredNode != selectedNode) { + renderTooltip(graphics, mouseX, mouseY); + } + + // Controls hint + renderControlsHint(graphics); + } + + private void renderVignette(GuiGraphics graphics) { + int strength = (int) (fadeAlpha * 120); + for (int i = 0; i < 40; i += 2) { + int alpha = (int) (strength * (1f - (float) i / 40f)); + int color = (alpha << 24); + graphics.fill(0, i, width, i + 2, color); + graphics.fill(0, height - i - 2, width, height - i, color); + } + } + + private void renderConnections(GuiGraphics graphics) { + for (UpgradeNode node : nodes) { + for (StellarIrisUpgrade prereq : node.upgrade.getPrerequisites()) { + UpgradeNode prereqNode = nodeMap.get(prereq); + if (prereqNode == null) continue; + + boolean bothOwned = unlockedUpgrades.contains(node.upgrade) && + unlockedUpgrades.contains(prereq); + boolean prereqOwned = unlockedUpgrades.contains(prereq); + + int[] color = node.getColor(); + int alpha; + if (bothOwned) { + alpha = (int) (fadeAlpha * 180); + } else if (prereqOwned) { + alpha = (int) (fadeAlpha * 80); + } else { + alpha = (int) (fadeAlpha * 30); + } + + int lineColor = (alpha << 24) | (color[0] << 16) | (color[1] << 8) | color[2]; + drawConnection(graphics, prereqNode, node, lineColor, bothOwned); + } + } + } + + private void drawConnection(GuiGraphics graphics, UpgradeNode from, UpgradeNode to, int color, boolean animated) { + int x1 = (int) from.screenX; + int y1 = (int) from.screenY; + int x2 = (int) to.screenX; + int y2 = (int) to.screenY; + + // Draw dotted line + int dx = Math.abs(x2 - x1); + int dy = Math.abs(y2 - y1); + int steps = Math.max(dx, dy); + if (steps == 0) return; + + int dotSpacing = 6; + for (int i = 0; i <= steps; i += dotSpacing) { + int x = x1 + (x2 - x1) * i / steps; + int y = y1 + (y2 - y1) * i / steps; + graphics.fill(x, y, x + 2, y + 2, color); + } + + // Animated energy pulse on owned connections + if (animated) { + float t = (ticks % 40) / 40f; + int px = (int) Mth.lerp(t, x1, x2); + int py = (int) Mth.lerp(t, y1, y2); + int pulseAlpha = (int) (fadeAlpha * 220); + graphics.fill(px - 2, py - 2, px + 3, py + 3, (pulseAlpha << 24) | 0xFFFFFF); + } + } + + private void renderCentralCore(GuiGraphics graphics, int cx, int cy) { + int coreX = (int) (cx + viewOffsetX); + int coreY = (int) (cy + viewOffsetY); + int baseRadius = (int) (45 * zoom); + + // Pulsing + float pulse = (float) (Math.sin(ticks * 0.06) * 0.1 + 1.0); + int radius = (int) (baseRadius * pulse); + + // Outer glow + for (int r = radius + 25; r > radius; r -= 3) { + float p = (float) (r - radius) / 25f; + int alpha = (int) ((1f - p) * 40 * fadeAlpha); + int glowColor = (alpha << 24) | 0xFFCC44; + drawCircle(graphics, coreX, coreY, r, glowColor); + } + + // Core + int coreAlpha = (int) (fadeAlpha * 255); + for (int r = radius; r > 0; r -= 2) { + float p = (float) r / radius; + int alpha = (int) (coreAlpha * (0.5f + 0.5f * p)); + int cr = (int) (255 * p + 200 * (1 - p)); + int cg = (int) (200 * p + 150 * (1 - p)); + int cb = (int) (100 * p + 50 * (1 - p)); + drawCircle(graphics, coreX, coreY, r, (alpha << 24) | (cr << 16) | (cg << 8) | cb); + } + + // Ascension rings + if (ascensionLevel > 0) { + int ringAlpha = (int) (fadeAlpha * 150); + for (int i = 0; i < ascensionLevel; i++) { + int ringR = radius + 30 + i * 8; + float rotation = ticks * 0.02f + i * 0.5f; + for (int a = 0; a < 8; a++) { + float angle = rotation + a * Mth.PI / 4; + int rx = coreX + (int) (Mth.cos(angle) * ringR); + int ry = coreY + (int) (Mth.sin(angle) * ringR); + graphics.fill(rx - 1, ry - 1, rx + 2, ry + 2, (ringAlpha << 24) | 0xFFDD66); + } + } + } + } + + private void drawCircle(GuiGraphics graphics, int cx, int cy, int radius, int color) { + if (radius <= 0) return; + for (int y = -radius; y <= radius; y += 2) { + int halfWidth = (int) Math.sqrt(radius * radius - y * y); + graphics.fill(cx - halfWidth, cy + y, cx + halfWidth + 1, cy + y + 2, color); + } + } + + private void renderHeader(GuiGraphics graphics) { + int alpha = (int) (fadeAlpha * 255); + + // Points display + String pointsStr = "\u2726 " + spendablePoints; + int pointsColor = spendablePoints > 0 ? 0xFFCC44 : 0x808080; + graphics.drawString(font, pointsStr, 20, 20, (alpha << 24) | pointsColor, false); + + // Tier display + String tierStr = "Tier " + tier; + if (ascensionLevel > 0) { + tierStr = "\u2605".repeat(ascensionLevel) + " " + tierStr; + } + graphics.drawString(font, tierStr, 20, 34, (alpha << 24) | 0xAAAAAA, false); + + // Title + String title = "STELLAR CONVERGENCE"; + int titleW = font.width(title); + graphics.drawString(font, title, (width - titleW) / 2, 15, (alpha << 24) | 0xE0E0F0, false); + } + + private void renderDetailPanel(GuiGraphics graphics, int mouseX, int mouseY) { + if (selectedNode == null) return; + + StellarIrisUpgrade upgrade = selectedNode.upgrade; + int panelW = 220; + int panelH = 180; + int panelX = width - (int) (panelSlide * (panelW + 15)); + int panelY = (height - panelH) / 2; + + int bgAlpha = (int) (fadeAlpha * panelSlide * 230); + int borderAlpha = (int) (fadeAlpha * panelSlide * 255); + + // Background + graphics.fill(panelX, panelY, panelX + panelW, panelY + panelH, (bgAlpha << 24) | 0x0C0C14); + + // Border + int[] color = selectedNode.getColor(); + int borderColor = (borderAlpha << 24) | (color[0] << 16) | (color[1] << 8) | color[2]; + graphics.fill(panelX, panelY, panelX + panelW, panelY + 2, borderColor); + graphics.fill(panelX, panelY, panelX + 2, panelY + panelH, borderColor); + graphics.fill(panelX + panelW - 2, panelY, panelX + panelW, panelY + panelH, borderColor); + graphics.fill(panelX, panelY + panelH - 2, panelX + panelW, panelY + panelH, borderColor); + + int textAlpha = (int) (fadeAlpha * panelSlide * 255); + int textPadding = 10; + int maxTextWidth = panelW - textPadding * 2; + + // Name + String name = Component.translatable(upgrade.getTranslationKey()).getString(); + graphics.drawString(font, name, panelX + textPadding, panelY + 10, + (textAlpha << 24) | (color[0] << 16) | (color[1] << 8) | color[2], false); + + // Description with word wrapping + String desc = Component.translatable(upgrade.getDescriptionKey()).getString(); + int descY = panelY + 28; + List descLines = wrapText(desc, maxTextWidth); + for (String line : descLines) { + graphics.drawString(font, line, panelX + textPadding, descY, (textAlpha << 24) | 0x9090A0, false); + descY += 10; + } + + // Dynamic Y position after description + int infoY = descY + 6; + + // Handle repeatable vs non-repeatable differently + if (upgrade.isRepeatable()) { + int currentLevel = repeatableLevels.getOrDefault(upgrade.ordinal(), 0); + int maxLevel = upgrade.getMaxLevel(); + boolean isMaxed = currentLevel >= maxLevel; + + // Level display + String levelStr = isMaxed ? + "Level " + currentLevel + " / " + maxLevel + " (MAX)" : + "Level " + currentLevel + " / " + maxLevel; + int levelColor = isMaxed ? 0x44FF44 : 0xAAAAAA; + graphics.drawString(font, levelStr, panelX + textPadding, infoY, (textAlpha << 24) | levelColor, false); + infoY += 14; + + // Cost for next level + if (!isMaxed) { + int nextCost = upgrade.getCostForLevel(currentLevel + 1); + String costStr = "Next Level: " + nextCost + " pts"; + boolean canAfford = spendablePoints >= nextCost; + int costColor = canAfford ? 0xFFCC44 : 0xFF5544; + graphics.drawString(font, costStr, panelX + textPadding, infoY, (textAlpha << 24) | costColor, false); + infoY += 14; + + // Status + String status = canAfford ? "[Click to upgrade]" : "Not enough points"; + int statusColor = canAfford ? 0x88FF88 : 0xFF8844; + graphics.drawString(font, status, panelX + textPadding, panelY + panelH - 24, + (textAlpha << 24) | statusColor, false); + } else { + graphics.drawString(font, "MAX LEVEL", panelX + textPadding, panelY + panelH - 24, + (textAlpha << 24) | 0x44FF44, false); + } + } else { + // Non-repeatable upgrade + // Cost + String cost = "Cost: " + upgrade.getCost() + " pts"; + boolean canAfford = spendablePoints >= upgrade.getCost(); + int costColor = canAfford ? 0xFFCC44 : 0xFF5544; + graphics.drawString(font, cost, panelX + textPadding, infoY, (textAlpha << 24) | costColor, false); + infoY += 14; + + // Tier requirement + String tierReq = "Requires Tier " + upgrade.getRequiredTier(); + boolean tierMet = tier >= upgrade.getRequiredTier(); + int tierColor = tierMet ? 0x707080 : 0xFF5544; + graphics.drawString(font, tierReq, panelX + textPadding, infoY, (textAlpha << 24) | tierColor, false); + + // Status + boolean owned = unlockedUpgrades.contains(upgrade); + boolean available = !owned && upgrade.canUnlock(unlockedUpgrades, tier); + + String status; + int statusColor; + if (owned) { + status = "UNLOCKED"; + statusColor = 0x44FF44; + } else if (available && canAfford && tierMet) { + status = "[Click to unlock]"; + statusColor = 0x88FF88; + } else if (!tierMet) { + status = "Tier locked"; + statusColor = 0xFF5544; + } else if (!canAfford) { + status = "Not enough points"; + statusColor = 0xFF8844; + } else { + status = "Prerequisites needed"; + statusColor = 0x888888; + } + graphics.drawString(font, status, panelX + textPadding, panelY + panelH - 24, + (textAlpha << 24) | statusColor, false); + } + } + + private List wrapText(String text, int maxWidth) { + List lines = new ArrayList<>(); + if (text == null || text.isEmpty()) return lines; + + String[] words = text.split(" "); + StringBuilder currentLine = new StringBuilder(); + + for (String word : words) { + String testLine = currentLine.length() == 0 ? word : currentLine + " " + word; + if (font.width(testLine) <= maxWidth) { + if (currentLine.length() > 0) currentLine.append(" "); + currentLine.append(word); + } else { + if (currentLine.length() > 0) { + lines.add(currentLine.toString()); + currentLine = new StringBuilder(word); + } else { + // Word is too long, just add it + lines.add(word); + } + } + } + if (currentLine.length() > 0) { + lines.add(currentLine.toString()); + } + return lines; + } + + private void renderTooltip(GuiGraphics graphics, int mouseX, int mouseY) { + if (hoveredNode == null) return; + + String name = Component.translatable(hoveredNode.upgrade.getTranslationKey()).getString(); + int tw = font.width(name) + 12; + int th = 18; + int tx = mouseX + 12; + int ty = mouseY - th - 5; + + if (tx + tw > width - 10) tx = width - tw - 10; + if (ty < 10) ty = mouseY + 15; + + int alpha = (int) (fadeAlpha * 230); + graphics.fill(tx - 2, ty - 2, tx + tw + 2, ty + th + 2, (alpha << 24) | 0x0C0C14); + + int[] color = hoveredNode.getColor(); + int textColor = (255 << 24) | (color[0] << 16) | (color[1] << 8) | color[2]; + graphics.drawString(font, name, tx + 4, ty + 4, textColor, false); + } + + private void renderControlsHint(GuiGraphics graphics) { + int alpha = (int) (fadeAlpha * 100); + int color = (alpha << 24) | 0x606070; + + graphics.drawString(font, "[ESC] Close", 20, height - 25, color, false); + graphics.drawString(font, "Scroll: Zoom | Drag: Pan", width - font.width("Scroll: Zoom | Drag: Pan") - 20, + height - 25, color, false); + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (button == 0) { + // Left click + if (hoveredNode != null) { + if (selectedNode == hoveredNode) { + // Double-click to unlock + tryUnlock(hoveredNode.upgrade); + } else { + selectedNode = hoveredNode; + } + return true; + } + selectedNode = null; + return true; + } + + if (button == 1) { + // Right-click drag + isDragging = true; + lastDragX = mouseX; + lastDragY = mouseY; + return true; + } + + return super.mouseClicked(mouseX, mouseY, button); + } + + @Override + public boolean mouseReleased(double mouseX, double mouseY, int button) { + if (button == 1) { + isDragging = false; + return true; + } + return super.mouseReleased(mouseX, mouseY, button); + } + + @Override + public boolean mouseDragged(double mouseX, double mouseY, int button, double dragX, double dragY) { + if (isDragging) { + viewOffsetX += (float) (mouseX - lastDragX); + viewOffsetY += (float) (mouseY - lastDragY); + lastDragX = mouseX; + lastDragY = mouseY; + return true; + } + return super.mouseDragged(mouseX, mouseY, button, dragX, dragY); + } + + @Override + public boolean mouseScrolled(double mouseX, double mouseY, double delta) { + float oldZoom = zoom; + zoom = Mth.clamp(zoom + (float) delta * 0.15f, MIN_ZOOM, MAX_ZOOM); + + // Zoom toward mouse + if (oldZoom != zoom) { + float ratio = zoom / oldZoom; + float mx = (float) mouseX - width / 2f; + float my = (float) mouseY - height / 2f; + viewOffsetX = (viewOffsetX - mx) * ratio + mx; + viewOffsetY = (viewOffsetY - my) * ratio + my; + } + return true; + } + + @Override + public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + if (keyCode == 256) { // ESC + if (selectedNode != null) { + selectedNode = null; + return true; + } + onClose(); + return true; + } + + return super.keyPressed(keyCode, scanCode, modifiers); + } + + private void tryUnlock(StellarIrisUpgrade upgrade) { + if (upgrade.isRepeatable()) { + tryLevelUpRepeatable(upgrade); + return; + } + + if (unlockedUpgrades.contains(upgrade)) return; + if (!upgrade.canUnlock(unlockedUpgrades, tier)) return; + if (spendablePoints < upgrade.getCost()) return; + + // Send packet to server + CCoreNetwork.sendToServer(new StellarUpgradePacket(machinePos, upgrade, false)); + + // Optimistic update + unlockedUpgrades.add(upgrade); + spendablePoints -= upgrade.getCost(); + } + + private void tryLevelUpRepeatable(StellarIrisUpgrade upgrade) { + if (!upgrade.isRepeatable()) return; + + int currentLevel = repeatableLevels.getOrDefault(upgrade.ordinal(), 0); + if (currentLevel >= upgrade.getMaxLevel()) return; + + int nextLevel = currentLevel + 1; + int cost = upgrade.getCostForLevel(nextLevel); + + if (spendablePoints < cost) return; + + // Send packet to server + CCoreNetwork.sendToServer(new StellarUpgradePacket(machinePos, upgrade, false)); + + // Optimistic update + repeatableLevels.put(upgrade.ordinal(), nextLevel); + spendablePoints -= cost; + } + + private int getUpgradeLevel(StellarIrisUpgrade upgrade) { + if (upgrade.isRepeatable()) { + return repeatableLevels.getOrDefault(upgrade.ordinal(), 0); + } + return unlockedUpgrades.contains(upgrade) ? 1 : 0; + } + + @Override + public boolean isPauseScreen() { + return false; + } + + // Node class + private static class UpgradeNode { + + final StellarIrisUpgrade upgrade; + float screenX, screenY; + float pulsePhase; + + UpgradeNode(StellarIrisUpgrade upgrade, float x, float y) { + this.upgrade = upgrade; + this.screenX = x; + this.screenY = y; + this.pulsePhase = (float) (Math.random() * Math.PI * 2); + } + + void tick() { + pulsePhase += 0.08f; + } + + boolean isMouseOver(int mx, int my, float zoom) { + float r = getRadius() * zoom; + float dx = mx - screenX; + float dy = my - screenY; + return dx * dx + dy * dy <= r * r * 1.5f; + } + + float getRadius() { + if (upgrade.isRepeatable()) return 12; // Smaller for repeatables + if (upgrade.isCapstone()) return 18; + if (upgrade.getRow() == 5) return 15; // T5 upgrades + return 14; + } + + int[] getColor() { + return switch (upgrade.getBranch()) { + case IGNITION -> new int[] { 255, 120, 60 }; // Fiery orange + case FUSION -> new int[] { 80, 180, 255 }; // Electric blue + case COLLAPSE -> new int[] { 180, 80, 220 }; // Void purple + case VOID -> new int[] { 80, 255, 180 }; // Ethereal teal + case REPEATABLE -> new int[] { 220, 200, 120 }; // Golden for repeatables + }; + } + + void render(GuiGraphics graphics, net.minecraft.client.gui.Font font, float fadeAlpha, float zoom, + int ticks, float partialTick, boolean owned, boolean available, boolean tierLocked, + boolean hovered, boolean selected) { + int[] rgb = getColor(); + float baseRadius = getRadius() * zoom; + + // Pulse for owned/available/hovered + float pulse = 1f; + if (owned || available || hovered || selected) { + float smooth = pulsePhase + 0.08f * partialTick; + pulse = 1f + Mth.sin(smooth) * 0.12f; + } + int radius = (int) (baseRadius * pulse); + + // Alpha based on state + float stateAlpha; + if (owned) stateAlpha = 1f; + else if (available) stateAlpha = hovered ? 0.9f : 0.6f; + else if (tierLocked) stateAlpha = 0.25f; + else stateAlpha = 0.4f; + + int alpha = (int) (fadeAlpha * stateAlpha * 255); + + // Glow for owned/available + if (owned || available || selected) { + for (int r = radius + 14; r > radius; r -= 3) { + float p = (float) (r - radius) / 14f; + int glowAlpha = (int) ((1f - p) * 60 * fadeAlpha * stateAlpha); + int glowColor = (glowAlpha << 24) | (rgb[0] << 16) | (rgb[1] << 8) | rgb[2]; + drawNodeCircle(graphics, (int) screenX, (int) screenY, r, glowColor); + } + } + + // Core - darker if locked + int coreR = owned ? rgb[0] : (int) (rgb[0] * 0.4f); + int coreG = owned ? rgb[1] : (int) (rgb[1] * 0.4f); + int coreB = owned ? rgb[2] : (int) (rgb[2] * 0.4f); + if (tierLocked) { + coreR = coreG = coreB = 40; + } + int coreColor = (alpha << 24) | (coreR << 16) | (coreG << 8) | coreB; + drawNodeCircle(graphics, (int) screenX, (int) screenY, radius, coreColor); + + // Border + int borderAlpha = (int) (fadeAlpha * (hovered || selected ? 255 : 150)); + int borderColor; + if (owned) { + borderColor = (borderAlpha << 24) | (rgb[0] << 16) | (rgb[1] << 8) | rgb[2]; + } else if (available) { + float bpulse = Mth.sin(pulsePhase) * 0.3f + 0.7f; + int br = (int) (rgb[0] * bpulse); + int bg = (int) (rgb[1] * bpulse); + int bb = (int) (rgb[2] * bpulse); + borderColor = (borderAlpha << 24) | (br << 16) | (bg << 8) | bb; + } else { + borderColor = (borderAlpha << 24) | 0x404050; + } + drawNodeRing(graphics, (int) screenX, (int) screenY, radius, borderColor); + + // Selection ring + if (selected) { + int ringAlpha = (int) (fadeAlpha * 200); + float rot = ticks * 0.05f + partialTick * 0.05f; + for (int i = 0; i < 8; i++) { + float angle = rot + i * Mth.PI / 4; + int rx = (int) (screenX + Mth.cos(angle) * (radius + 6)); + int ry = (int) (screenY + Mth.sin(angle) * (radius + 6)); + graphics.fill(rx - 1, ry - 1, rx + 2, ry + 2, (ringAlpha << 24) | 0xFFFFFF); + } + } + + // Icon/text inside + if (owned) { + graphics.drawString(font, "\u2713", (int) screenX - 3, (int) screenY - 4, + (alpha << 24) | 0xFFFFFF, false); + } else if (tierLocked) { + String lock = "T" + upgrade.getRequiredTier(); + graphics.drawString(font, lock, (int) screenX - font.width(lock) / 2, (int) screenY - 3, + (alpha << 24) | 0x505050, false); + } else { + String cost = String.valueOf(upgrade.getCost()); + int costColor = available ? 0xFFCC44 : 0x606060; + graphics.drawString(font, cost, (int) screenX - font.width(cost) / 2, (int) screenY - 3, + (alpha << 24) | costColor, false); + } + } + + private void drawNodeCircle(GuiGraphics g, int cx, int cy, int radius, int color) { + if (radius <= 0) return; + for (int y = -radius; y <= radius; y++) { + int halfWidth = (int) Math.sqrt(radius * radius - y * y); + g.fill(cx - halfWidth, cy + y, cx + halfWidth + 1, cy + y + 1, color); + } + } + + private void drawNodeRing(GuiGraphics g, int cx, int cy, int radius, int color) { + for (int a = 0; a < 360; a += 8) { + float rad = a * Mth.DEG_TO_RAD; + int px = cx + (int) (Mth.cos(rad) * radius); + int py = cy + (int) (Mth.sin(rad) * radius); + g.fill(px, py, px + 1, py + 1, color); + } + } + } + + // Particle class + private static class CosmicParticle { + + float x, y; + float twinkle; + float maxAlpha; + int life, age; + + CosmicParticle(int w, int h, Random r) { + reset(w, h, r); + } + + void reset(int w, int h, Random r) { + x = r.nextFloat() * w; + y = r.nextFloat() * h; + twinkle = r.nextFloat() * Mth.TWO_PI; + maxAlpha = 0.15f + r.nextFloat() * 0.3f; + life = 150 + r.nextInt(200); + age = 0; + } + + void tick() { + age++; + twinkle += 0.06f; + } + + boolean isDead() { + return age >= life; + } + + void render(GuiGraphics g, float screenAlpha) { + float t = Mth.sin(twinkle) * 0.3f + 0.7f; + float lifeFade = 1f; + float p = (float) age / life; + if (p < 0.1f) lifeFade = p / 0.1f; + else if (p > 0.9f) lifeFade = (1f - p) / 0.1f; + + int alpha = (int) (maxAlpha * t * lifeFade * screenAlpha * 255); + if (alpha <= 0) return; + + g.fill((int) x, (int) y, (int) x + 1, (int) y + 1, (alpha << 24) | 0xCCCCDD); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/DebugPrimeButton.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/DebugPrimeButton.java new file mode 100644 index 000000000..62a56958b --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/DebugPrimeButton.java @@ -0,0 +1,63 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import javax.annotation.Nonnull; + +public class DebugPrimeButton extends Widget { + + private final Runnable onClick; + private boolean hovered = false; + + public DebugPrimeButton(int x, int y, int width, int height, Runnable onClick) { + super(x, y, width, height); + this.onClick = onClick; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + hovered = isMouseOverElement(mouseX, mouseY); + + // Background - yellow/gold tint for "prime" + int bgColor = hovered ? 0xAA404020 : 0x80302010; + DrawerHelper.drawSolidRect(graphics, x, y, w, h, bgColor); + + // Border - golden when hovered + int borderColor = hovered ? 0xFFFFCC44 : 0xFF806020; + DrawerHelper.drawBorder(graphics, x, y, w, h, borderColor, 1); + + // Label + var font = Minecraft.getInstance().font; + String label = "[PRIME]"; + int labelWidth = font.width(label); + int labelX = x + (w - labelWidth) / 2; + int labelY = y + (h - font.lineHeight) / 2 + 1; + + int textColor = hovered ? 0xFFFFDD66 : 0xFFAA9944; + graphics.drawString(font, label, labelX, labelY, textColor, false); + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (button == 0 && isMouseOverElement(mouseX, mouseY)) { + onClick.run(); + return true; + } + return false; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/DebugStageButton.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/DebugStageButton.java new file mode 100644 index 000000000..6bd614766 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/DebugStageButton.java @@ -0,0 +1,104 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine.Stage; + +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import java.util.function.Consumer; + +import javax.annotation.Nonnull; + +public class DebugStageButton extends Widget { + + private final Stage stage; + private final Consumer onClick; + private boolean hovered = false; + + public DebugStageButton(int x, int y, int width, int height, Stage stage, Consumer onClick) { + super(x, y, width, height); + this.stage = stage; + this.onClick = onClick; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + hovered = isMouseOverElement(mouseX, mouseY); + + // Background + int bgColor = hovered ? 0xAA303040 : 0x80202030; + DrawerHelper.drawSolidRect(graphics, x, y, w, h, bgColor); + + // Border with stage color + int borderColor = getStageColor(); + if (hovered) { + borderColor = brighten(borderColor); + } + DrawerHelper.drawBorder(graphics, x, y, w, h, borderColor, 1); + + // Label + var font = Minecraft.getInstance().font; + String label = getShortLabel(); + int labelWidth = font.width(label); + int labelX = x + (w - labelWidth) / 2; + int labelY = y + (h - font.lineHeight) / 2 + 1; + + int textColor = hovered ? 0xFFFFFFFF : 0xFFAAAAAA; + graphics.drawString(font, label, labelX, labelY, textColor, false); + } + + private String getShortLabel() { + return switch (stage) { + case EMPTY -> "EMP"; + case GROWING -> "GRW"; + case STAR -> "STR"; + case SUPERSTAR -> "SUP"; + case BLACK_HOLE -> "BLK"; + case DEATH -> "DTH"; + case DEATH_GRACEFUL -> "GRC"; + }; + } + + private int getStageColor() { + return switch (stage) { + case EMPTY -> 0xFF404050; + case GROWING -> 0xFF6080FF; + case STAR -> 0xFFFFCC44; + case SUPERSTAR -> 0xFFFF8844; + case BLACK_HOLE -> 0xFF8040FF; + case DEATH -> 0xFFFF2020; + case DEATH_GRACEFUL -> 0xFF804040; + }; + } + + private int brighten(int color) { + int a = (color >> 24) & 0xFF; + int r = Math.min(255, ((color >> 16) & 0xFF) + 40); + int g = Math.min(255, ((color >> 8) & 0xFF) + 40); + int b = Math.min(255, (color & 0xFF) + 40); + return (a << 24) | (r << 16) | (g << 8) | b; + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (button == 0 && isMouseOverElement(mouseX, mouseY)) { + onClick.accept(stage); + return true; + } + return false; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/EnergyConduitWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/EnergyConduitWidget.java new file mode 100644 index 000000000..94960b349 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/EnergyConduitWidget.java @@ -0,0 +1,229 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine.Stage; + +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.util.Mth; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class EnergyConduitWidget extends Widget { + + private final Supplier stageSupplier; + private final List pulses = new ArrayList<>(); + + private float flowPhase = 0f; + private float pulseSpawnTimer = 0f; + + private static class EnergyPulse { + + float position; + float speed; + float intensity; + int conduitIndex; + boolean alive = true; + } + + public EnergyConduitWidget(int x, int y, int width, int height, Supplier stageSupplier) { + super(x, y, width, height); + this.stageSupplier = stageSupplier; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + + Stage stage = stageSupplier.get(); + float flowSpeed = getFlowSpeed(stage); + flowPhase += flowSpeed; + + pulseSpawnTimer += flowSpeed * 2f; + if (pulseSpawnTimer > 1f && stage != Stage.EMPTY && stage != Stage.DEATH_GRACEFUL) { + pulseSpawnTimer = 0f; + spawnPulse(stage); + } + + pulses.removeIf(p -> !p.alive); + for (EnergyPulse pulse : pulses) { + pulse.position += pulse.speed; + if (pulse.position > 1f) { + pulse.alive = false; + } + } + } + + private void spawnPulse(Stage stage) { + if (pulses.size() > 20) return; + + EnergyPulse pulse = new EnergyPulse(); + pulse.position = 0f; + pulse.speed = 0.02f + (float) Math.random() * 0.03f; + pulse.intensity = 0.5f + (float) Math.random() * 0.5f; + pulse.conduitIndex = (int) (Math.random() * 4); + + if (stage == Stage.DEATH) { + pulse.speed *= 2f; + } else if (stage == Stage.BLACK_HOLE) { + pulse.speed *= 1.5f; + } + + pulses.add(pulse); + } + + private float getFlowSpeed(Stage stage) { + return switch (stage) { + case EMPTY -> 0.005f; + case GROWING -> 0.03f; + case STAR -> 0.02f; + case SUPERSTAR -> 0.04f; + case BLACK_HOLE -> 0.05f; + case DEATH -> 0.08f; + case DEATH_GRACEFUL -> 0.01f; + }; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + Stage stage = stageSupplier.get(); + int baseColor = getStageColor(stage); + + drawConduitLines(graphics, x, y, w, h, baseColor, stage); + drawFlowingEnergy(graphics, x, y, w, h, baseColor, stage); + drawPulses(graphics, x, y, w, h, baseColor); + drawConduitNodes(graphics, x, y, w, h, baseColor, stage); + } + + private void drawConduitLines(GuiGraphics graphics, int x, int y, int w, int h, int baseColor, Stage stage) { + int lineColor = 0x40000000 | (baseColor & 0x00FFFFFF); + int glowColor = 0x20000000 | (baseColor & 0x00FFFFFF); + + int topY = y + 8; + graphics.fill(x, topY - 1, x + w, topY + 2, glowColor); + graphics.fill(x, topY, x + w, topY + 1, lineColor); + + int bottomY = y + h - 8; + graphics.fill(x, bottomY - 1, x + w, bottomY + 2, glowColor); + graphics.fill(x, bottomY, x + w, bottomY + 1, lineColor); + + int leftX = x + 8; + graphics.fill(leftX - 1, y, leftX + 2, y + h, glowColor); + graphics.fill(leftX, y, leftX + 1, y + h, lineColor); + + int rightX = x + w - 8; + graphics.fill(rightX - 1, y, rightX + 2, y + h, glowColor); + graphics.fill(rightX, y, rightX + 1, y + h, lineColor); + } + + private void drawFlowingEnergy(GuiGraphics graphics, int x, int y, int w, int h, int baseColor, Stage stage) { + if (stage == Stage.EMPTY) return; + + int segmentCount = 20; + float segmentSpacing = 1f / segmentCount; + + for (int i = 0; i < segmentCount; i++) { + float segmentPhase = (flowPhase + i * segmentSpacing) % 1f; + float brightness = Mth.sin(segmentPhase * Mth.PI) * 0.8f; + if (brightness < 0.1f) continue; + + int alpha = (int) (0x60 * brightness); + int color = (alpha << 24) | (baseColor & 0x00FFFFFF); + + int topY = y + 8; + int segX = x + (int) (w * segmentPhase); + graphics.fill(segX - 1, topY - 1, segX + 2, topY + 2, color); + + int bottomY = y + h - 8; + int reverseX = x + w - (int) (w * segmentPhase); + graphics.fill(reverseX - 1, bottomY - 1, reverseX + 2, bottomY + 2, color); + + int leftX = x + 8; + int segY = y + (int) (h * segmentPhase); + graphics.fill(leftX - 1, segY - 1, leftX + 2, segY + 2, color); + + int rightX = x + w - 8; + int reverseY = y + h - (int) (h * segmentPhase); + graphics.fill(rightX - 1, reverseY - 1, rightX + 2, reverseY + 2, color); + } + } + + private void drawPulses(GuiGraphics graphics, int x, int y, int w, int h, int baseColor) { + for (EnergyPulse pulse : pulses) { + float brightness = pulse.intensity * (1f - pulse.position * 0.5f); + int alpha = (int) (0xC0 * brightness); + int color = (alpha << 24) | (baseColor & 0x00FFFFFF); + int coreColor = (alpha << 24) | 0xFFFFFF; + + int px, py; + switch (pulse.conduitIndex) { + case 0 -> { + px = x + (int) (w * pulse.position); + py = y + 8; + } + case 1 -> { + px = x + w - (int) (w * pulse.position); + py = y + h - 8; + } + case 2 -> { + px = x + 8; + py = y + (int) (h * pulse.position); + } + default -> { + px = x + w - 8; + py = y + h - (int) (h * pulse.position); + } + } + + graphics.fill(px - 3, py - 3, px + 4, py + 4, color); + graphics.fill(px - 1, py - 1, px + 2, py + 2, coreColor); + } + } + + private void drawConduitNodes(GuiGraphics graphics, int x, int y, int w, int h, int baseColor, Stage stage) { + float nodePulse = Mth.sin(flowPhase * 3f) * 0.3f + 0.7f; + int nodeAlpha = (int) (0x80 * nodePulse); + int nodeColor = (nodeAlpha << 24) | (baseColor & 0x00FFFFFF); + int nodeGlow = (nodeAlpha / 2 << 24) | (baseColor & 0x00FFFFFF); + + int[][] nodePositions = { + { x + 8, y + 8 }, + { x + w - 8, y + 8 }, + { x + 8, y + h - 8 }, + { x + w - 8, y + h - 8 } + }; + + for (int[] pos : nodePositions) { + graphics.fill(pos[0] - 4, pos[1] - 4, pos[0] + 5, pos[1] + 5, nodeGlow); + graphics.fill(pos[0] - 2, pos[1] - 2, pos[0] + 3, pos[1] + 3, nodeColor); + graphics.fill(pos[0] - 1, pos[1] - 1, pos[0] + 2, pos[1] + 2, 0xFFFFFFFF); + } + } + + private int getStageColor(Stage stage) { + return switch (stage) { + case EMPTY -> 0x405060; + case GROWING -> 0x6090FF; + case STAR -> 0xFFCC44; + case SUPERSTAR -> 0xFF7722; + case BLACK_HOLE -> 0xAA55FF; + case DEATH -> 0xFF3030; + case DEATH_GRACEFUL -> 0x664040; + }; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/FuelGaugeWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/FuelGaugeWidget.java new file mode 100644 index 000000000..2d656fe75 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/FuelGaugeWidget.java @@ -0,0 +1,121 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.util.Mth; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class FuelGaugeWidget extends Widget { + + private final Supplier fuelLevelSupplier; + + private float displayedLevel = 0f; + private float animPhase = 0f; + + public FuelGaugeWidget(int x, int y, int width, int height, Supplier fuelLevelSupplier) { + super(x, y, width, height); + this.fuelLevelSupplier = fuelLevelSupplier; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + animPhase += 0.1f; + + float target = fuelLevelSupplier.get(); + displayedLevel = Mth.lerp(0.1f, displayedLevel, target); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + // Label + var font = Minecraft.getInstance().font; + graphics.drawString(font, "STELLAR FUEL", x, y, 0xFF909090, false); + + // Gauge background + int gaugeY = y + 12; + int gaugeH = h - 12; + DrawerHelper.drawSolidRect(graphics, x, gaugeY, w, gaugeH, 0xFF101020); + + // Border + DrawerHelper.drawBorder(graphics, x, gaugeY, w, gaugeH, 0xFF303050, 1); + + // Filled portion with gradient based on level + int fillW = (int) (w * displayedLevel); + if (fillW > 0) { + int fillColor = getFillColor(displayedLevel); + int fillColorDark = darkenColor(fillColor, 0.6f); + + DrawerHelper.drawGradientRect(graphics, x + 1, gaugeY + 1, fillW - 2, gaugeH - 2, + fillColorDark, fillColor, true); + + // Animated shimmer + float shimmerPos = (animPhase % (w * 2)) - w; + if (shimmerPos > 0 && shimmerPos < fillW) { + int shimmerX = x + (int) shimmerPos; + int shimmerW = Math.min(10, fillW - (int) shimmerPos); + graphics.fill(shimmerX, gaugeY + 1, shimmerX + shimmerW, gaugeY + gaugeH - 1, + 0x20FFFFFF); + } + } + + // Threshold markers + drawThresholdMarker(graphics, x, gaugeY, w, gaugeH, 0.8f, "IGNITE"); + + // Percentage text + int percent = (int) (displayedLevel * 100); + String percentStr = percent + "%"; + int textX = x + w - font.width(percentStr) - 2; + int textColor = displayedLevel >= 0.8f ? 0xFF80FF80 : 0xFFFFFFFF; + graphics.drawString(font, percentStr, textX, gaugeY + (gaugeH - font.lineHeight) / 2 + 1, + textColor, false); + } + + private void drawThresholdMarker(GuiGraphics graphics, int x, int y, int w, int h, + float threshold, String label) { + int markerX = x + (int) (w * threshold); + + // Vertical line + graphics.fill(markerX, y, markerX + 1, y + h, 0xFF80FF80); + + // Small triangle indicator + graphics.fill(markerX - 2, y - 3, markerX + 3, y, 0xFF80FF80); + } + + private int getFillColor(float level) { + if (level >= 0.8f) { + return 0xFF40FF60; // Green - ready + } else if (level >= 0.5f) { + return 0xFFFFCC40; // Yellow - charging + } else if (level >= 0.2f) { + return 0xFFFF8040; // Orange - low + } else { + return 0xFFFF4040; // Red - critical + } + } + + private int darkenColor(int color, float factor) { + int a = (color >> 24) & 0xFF; + int r = (int) (((color >> 16) & 0xFF) * factor); + int g = (int) (((color >> 8) & 0xFF) * factor); + int b = (int) ((color & 0xFF) * factor); + return (a << 24) | (r << 16) | (g << 8) | b; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/HolographicScanlineWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/HolographicScanlineWidget.java new file mode 100644 index 000000000..32a929bf5 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/HolographicScanlineWidget.java @@ -0,0 +1,187 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine.Stage; + +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.util.Mth; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class HolographicScanlineWidget extends Widget { + + private final Supplier stageSupplier; + private float scanY = 0f; + private float glitchTimer = 0f; + private float interferencePhase = 0f; + + public HolographicScanlineWidget(int x, int y, int width, int height, Supplier stageSupplier) { + super(x, y, width, height); + this.stageSupplier = stageSupplier; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + + Stage stage = stageSupplier.get(); + float scanSpeed = getScanSpeed(stage); + scanY = (scanY + scanSpeed) % 1f; + + interferencePhase += 0.07f; + + if (stage == Stage.DEATH || stage == Stage.BLACK_HOLE) { + glitchTimer += 0.15f; + } else { + glitchTimer *= 0.95f; + } + } + + private float getScanSpeed(Stage stage) { + return switch (stage) { + case EMPTY -> 0.003f; + case GROWING -> 0.008f; + case STAR -> 0.005f; + case SUPERSTAR -> 0.012f; + case BLACK_HOLE -> 0.02f; + case DEATH -> 0.04f; + case DEATH_GRACEFUL -> 0.002f; + }; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + Stage stage = stageSupplier.get(); + int baseColor = getStageColor(stage); + + drawScanLines(graphics, x, y, w, h, baseColor); + drawMainScanBeam(graphics, x, y, w, h, baseColor); + drawInterferencePattern(graphics, x, y, w, h, stage); + + if (glitchTimer > 0.5f) { + drawGlitchEffect(graphics, x, y, w, h, stage); + } + + drawEdgeVignette(graphics, x, y, w, h, baseColor); + } + + private void drawScanLines(GuiGraphics graphics, int x, int y, int w, int h, int baseColor) { + int lineAlpha = 0x08; + int lineColor = (lineAlpha << 24) | (baseColor & 0x00FFFFFF); + + for (int ly = y; ly < y + h; ly += 2) { + graphics.fill(x, ly, x + w, ly + 1, lineColor); + } + } + + private void drawMainScanBeam(GuiGraphics graphics, int x, int y, int w, int h, int baseColor) { + int beamY = y + (int) (h * scanY); + int beamHeight = 3; + + for (int i = 0; i < 8; i++) { + int spread = i * 2; + float falloff = 1f - (i / 8f); + int alpha = (int) (0x40 * falloff); + int color = (alpha << 24) | (baseColor & 0x00FFFFFF); + + int drawY = beamY - spread; + if (drawY >= y && drawY < y + h) { + graphics.fill(x, drawY, x + w, drawY + beamHeight, color); + } + drawY = beamY + spread; + if (drawY >= y && drawY < y + h) { + graphics.fill(x, drawY, x + w, drawY + beamHeight, color); + } + } + + int coreAlpha = 0x80; + int coreColor = (coreAlpha << 24) | 0xFFFFFF; + if (beamY >= y && beamY < y + h - beamHeight) { + graphics.fill(x, beamY, x + w, beamY + beamHeight, coreColor); + } + } + + private void drawInterferencePattern(GuiGraphics graphics, int x, int y, int w, int h, Stage stage) { + if (stage == Stage.EMPTY || stage == Stage.DEATH_GRACEFUL) return; + + float intensity = switch (stage) { + case GROWING -> 0.3f; + case STAR -> 0.2f; + case SUPERSTAR -> 0.5f; + case BLACK_HOLE -> 0.7f; + case DEATH -> 0.9f; + default -> 0f; + }; + + int bands = 3 + (int) (intensity * 5); + for (int i = 0; i < bands; i++) { + float bandPhase = interferencePhase + i * 0.7f; + float bandY = (Mth.sin(bandPhase) * 0.5f + 0.5f); + int by = y + (int) (h * bandY); + + float bandIntensity = Mth.sin(bandPhase * 2.3f) * 0.5f + 0.5f; + int alpha = (int) (0x15 * intensity * bandIntensity); + int color = (alpha << 24) | 0x00FFFF; + + if (by >= y && by < y + h - 2) { + graphics.fill(x, by, x + w, by + 2, color); + } + } + } + + private void drawGlitchEffect(GuiGraphics graphics, int x, int y, int w, int h, Stage stage) { + long time = System.currentTimeMillis(); + int glitchCount = stage == Stage.DEATH ? 8 : 3; + + for (int i = 0; i < glitchCount; i++) { + if (((time / 50) + i * 17) % 7 < 2) { + int glitchY = y + (int) ((time / 30 + i * 43) % h); + int glitchH = 2 + (int) (Math.random() * 4); + int offsetX = (int) ((Math.random() - 0.5) * 10); + + int glitchColor = stage == Stage.DEATH ? 0x40FF0000 : 0x30FF00FF; + graphics.fill(x + offsetX, glitchY, x + w + offsetX, Math.min(glitchY + glitchH, y + h), glitchColor); + } + } + } + + private void drawEdgeVignette(GuiGraphics graphics, int x, int y, int w, int h, int baseColor) { + int vignetteSize = 15; + for (int i = 0; i < vignetteSize; i++) { + float progress = (float) i / vignetteSize; + int alpha = (int) (0x30 * (1f - progress)); + int color = (alpha << 24) | (baseColor & 0x00FFFFFF); + + graphics.fill(x, y + i, x + w, y + i + 1, color); + graphics.fill(x, y + h - i - 1, x + w, y + h - i, color); + graphics.fill(x + i, y, x + i + 1, y + h, color); + graphics.fill(x + w - i - 1, y, x + w - i, y + h, color); + } + } + + private int getStageColor(Stage stage) { + return switch (stage) { + case EMPTY -> 0x4080A0; + case GROWING -> 0x60A0FF; + case STAR -> 0xFFCC44; + case SUPERSTAR -> 0xFF6622; + case BLACK_HOLE -> 0xAA44FF; + case DEATH -> 0xFF2020; + case DEATH_GRACEFUL -> 0x664444; + }; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/IgnitionButtonWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/IgnitionButtonWidget.java new file mode 100644 index 000000000..bf7c64012 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/IgnitionButtonWidget.java @@ -0,0 +1,293 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.resources.sounds.SimpleSoundInstance; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.util.Mth; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import java.util.function.BooleanSupplier; + +import javax.annotation.Nonnull; + +public class IgnitionButtonWidget extends Widget { + + private final BooleanSupplier canIgnite; + private final BooleanSupplier isVisible; + private final Runnable onIgnite; + + private float hoverProgress = 0f; + private float pulsePhase = 0f; + private float chargeProgress = 0f; + private boolean isCharging = false; + private boolean wasHovered = false; + + private static final int CHARGE_TICKS = 40; + private int chargeTicks = 0; + + public IgnitionButtonWidget(int x, int y, int width, int height, + BooleanSupplier canIgnite, + BooleanSupplier isVisible, + Runnable onIgnite) { + super(x, y, width, height); + this.canIgnite = canIgnite; + this.isVisible = isVisible; + this.onIgnite = onIgnite; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + pulsePhase += 0.15f; + + super.setVisible(isVisible.getAsBoolean()); + + boolean hovered = isMouseOverElement(lastMouseX, lastMouseY); + float targetHover = hovered ? 1f : 0f; + hoverProgress = Mth.lerp(0.2f, hoverProgress, targetHover); + + if (hovered && !wasHovered && isVisible()) { + Minecraft.getInstance().getSoundManager().play( + SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK.value(), 1.5f, 0.3f)); + } + wasHovered = hovered; + + if (isCharging && canIgnite.getAsBoolean()) { + chargeTicks++; + chargeProgress = (float) chargeTicks / CHARGE_TICKS; + if (chargeTicks >= CHARGE_TICKS) { + onIgnite.run(); + isCharging = false; + chargeTicks = 0; + chargeProgress = 0f; + Minecraft.getInstance().getSoundManager().play( + SimpleSoundInstance.forUI(SoundEvents.RESPAWN_ANCHOR_SET_SPAWN, 0.8f, 1.0f)); + } + } else if (isCharging) { + isCharging = false; + chargeTicks = 0; + chargeProgress = Mth.lerp(0.3f, chargeProgress, 0f); + } else { + chargeProgress = Mth.lerp(0.2f, chargeProgress, 0f); + } + } + + private int lastMouseX, lastMouseY; + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + lastMouseX = mouseX; + lastMouseY = mouseY; + + if (!isVisible()) return; + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + boolean enabled = canIgnite.getAsBoolean(); + + int bgColor; + int borderColor; + int textColor; + + if (!enabled) { + bgColor = 0xFF1A1A2A; + borderColor = 0xFF303040; + textColor = 0xFF505060; + } else if (isCharging) { + float chargeGlow = 0.5f + chargeProgress * 0.5f; + int r = (int) (255 * chargeGlow); + int g = (int) (100 * (1f - chargeProgress * 0.5f)); + bgColor = 0xFF000000 | (r << 16) | (g << 8); + borderColor = 0xFFFF8040; + textColor = 0xFFFFFFFF; + } else { + float pulse = (float) (0.6f + 0.4f * Math.sin(pulsePhase)); + float hover = hoverProgress; + int baseR = (int) (40 + 60 * pulse + 40 * hover); + int baseG = (int) (30 + 40 * pulse + 30 * hover); + int baseB = (int) (10 + 20 * pulse); + bgColor = 0xFF000000 | (baseR << 16) | (baseG << 8) | baseB; + borderColor = 0xFFFFAA40; + textColor = 0xFFFFDD80; + } + + DrawerHelper.drawSolidRect(graphics, x, y, w, h, bgColor); + + if (enabled) { + float glowIntensity = hoverProgress * 0.5f + chargeProgress * 0.5f; + if (glowIntensity > 0.01f) { + int glowAlpha = (int) (glowIntensity * 60); + int glowColor = (glowAlpha << 24) | (borderColor & 0x00FFFFFF); + DrawerHelper.drawSolidRect(graphics, x - 2, y - 2, w + 4, h + 4, glowColor); + DrawerHelper.drawSolidRect(graphics, x - 1, y - 1, w + 2, h + 2, glowColor); + } + } + + DrawerHelper.drawBorder(graphics, x, y, w, h, borderColor, 1); + + if (chargeProgress > 0.01f) { + int chargeW = (int) (w * chargeProgress); + int chargeColor = lerpColor(0x40FF8040, 0x80FF4020, chargeProgress); + DrawerHelper.drawSolidRect(graphics, x + 1, y + 1, chargeW - 2, h - 2, chargeColor); + + if (chargeW > 3) { + graphics.fill(x + chargeW - 2, y + 1, x + chargeW, y + h - 1, 0xCCFFFFFF); + } + } + + if (isCharging && chargeProgress > 0.3f) { + drawEnergyArcs(graphics, x, y, w, h, chargeProgress); + } + + var font = Minecraft.getInstance().font; + String text = getButtonText(enabled); + int textW = font.width(text); + int textX = x + (w - textW) / 2; + int textY = y + (h - font.lineHeight) / 2; + + if (enabled) { + graphics.drawString(font, text, textX + 1, textY + 1, 0xFF000000, false); + } + graphics.drawString(font, text, textX, textY, textColor, false); + + if (enabled && !isCharging) { + float shimmerPos = (pulsePhase * 2) % (w + 40) - 20; + if (shimmerPos > 0 && shimmerPos < w) { + int shimmerX = x + (int) shimmerPos; + int shimmerW = Math.min(8, w - (int) shimmerPos); + graphics.fill(shimmerX, y + 1, shimmerX + shimmerW, y + h - 1, 0x15FFFFFF); + } + } + + if (enabled) { + int accentColor = isCharging ? 0xFFFF6040 : 0xFFFFAA40; + graphics.fill(x, y, x + 4, y + 1, accentColor); + graphics.fill(x, y, x + 1, y + 4, accentColor); + graphics.fill(x + w - 4, y, x + w, y + 1, accentColor); + graphics.fill(x + w - 1, y, x + w, y + 4, accentColor); + graphics.fill(x, y + h - 1, x + 4, y + h, accentColor); + graphics.fill(x, y + h - 4, x + 1, y + h, accentColor); + graphics.fill(x + w - 4, y + h - 1, x + w, y + h, accentColor); + graphics.fill(x + w - 1, y + h - 4, x + w, y + h, accentColor); + } + } + + private void drawEnergyArcs(GuiGraphics graphics, int x, int y, int w, int h, float intensity) { + long time = System.currentTimeMillis(); + int centerX = x + w / 2; + int centerY = y + h / 2; + int particleCount = 3 + (int) (intensity * 5); + + for (int i = 0; i < particleCount; i++) { + float particlePhase = ((time / 800f) + i * 0.15f) % 1f; + float angle = (i * 2.39996f) + (time / 2000f); + float edgeX, edgeY; + + if (i % 4 == 0) { + edgeX = x + (w * ((i * 0.37f) % 1f)); + edgeY = y; + } else if (i % 4 == 1) { + edgeX = x + w; + edgeY = y + (h * ((i * 0.37f) % 1f)); + } else if (i % 4 == 2) { + edgeX = x + (w * ((i * 0.37f) % 1f)); + edgeY = y + h; + } else { + edgeX = x; + edgeY = y + (h * ((i * 0.37f) % 1f)); + } + + float progress = particlePhase * particlePhase; + int particleX = (int) Mth.lerp(progress, edgeX, centerX); + int particleY = (int) Mth.lerp(progress, edgeY, centerY); + + float brightness = 0.4f + 0.6f * progress; + int alpha = (int) (brightness * 200 * intensity); + int particleColor = (alpha << 24) | 0xFFFF80; + + int size = 1 + (int) (progress * 2); + graphics.fill(particleX - size, particleY - size, particleX + size, particleY + size, particleColor); + + if (progress > 0.1f) { + float trailProgress = progress - 0.1f; + int trailX = (int) Mth.lerp(trailProgress * trailProgress, edgeX, centerX); + int trailY = (int) Mth.lerp(trailProgress * trailProgress, edgeY, centerY); + int trailAlpha = (int) (alpha * 0.3f); + int trailColor = (trailAlpha << 24) | 0xFFAA40; + graphics.fill(trailX - 1, trailY - 1, trailX + 1, trailY + 1, trailColor); + } + } + } + + private String getButtonText(boolean enabled) { + if (!enabled) { + return "INSUFFICIENT FUEL"; + } else if (isCharging) { + int percent = (int) (chargeProgress * 100); + return "CHARGING... " + percent + "%"; + } else { + return "[ IGNITE STELLAR CORE ]"; + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (!isVisible() || !isMouseOverElement(mouseX, mouseY)) { + return false; + } + + if (button == 0 && canIgnite.getAsBoolean()) { + isCharging = true; + chargeTicks = 0; + Minecraft.getInstance().getSoundManager().play( + SimpleSoundInstance.forUI(SoundEvents.RESPAWN_ANCHOR_CHARGE, 1.2f, 0.8f)); + return true; + } + return false; + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseReleased(double mouseX, double mouseY, int button) { + if (button == 0 && isCharging) { + isCharging = false; + if (chargeTicks < CHARGE_TICKS) { + Minecraft.getInstance().getSoundManager().play( + SimpleSoundInstance.forUI(SoundEvents.FIRE_EXTINGUISH, 1.0f, 0.5f)); + } + return true; + } + return false; + } + + private int lerpColor(int color1, int color2, float t) { + int a1 = (color1 >> 24) & 0xFF; + int r1 = (color1 >> 16) & 0xFF; + int g1 = (color1 >> 8) & 0xFF; + int b1 = color1 & 0xFF; + + int a2 = (color2 >> 24) & 0xFF; + int r2 = (color2 >> 16) & 0xFF; + int g2 = (color2 >> 8) & 0xFF; + int b2 = color2 & 0xFF; + + int a = (int) Mth.lerp(t, a1, a2); + int r = (int) Mth.lerp(t, r1, r2); + int g = (int) Mth.lerp(t, g1, g2); + int b = (int) Mth.lerp(t, b1, b2); + + return (a << 24) | (r << 16) | (g << 8) | b; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/ModuleConfigPopout.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/ModuleConfigPopout.java new file mode 100644 index 000000000..dfe1f0f3f --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/ModuleConfigPopout.java @@ -0,0 +1,454 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine; +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine.Stage; + +import com.gregtechceu.gtceu.api.GTValues; + +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class ModuleConfigPopout extends WidgetGroup { + + public static final int WIDTH = 170; + public static final int HEIGHT = 140; + private static final int TITLE_HEIGHT = 16; + private static final int SETTINGS_BUTTON_SIZE = 24; + private static final ResourceLocation GEAR_TEXTURE = new ResourceLocation("gtceu", + "textures/item/material_sets/dull/gear_small.png"); + + private final Supplier machineSupplier; + private final Runnable onClose; + + private int moduleIndex = -1; + private boolean dragging = false; + private double lastDeltaX, lastDeltaY; + + private String moduleName = ""; + private boolean moduleConnected = false; + private boolean moduleWorking = false; + private long energyPerTick = 0; + private double speedBonus = 0; + private Stage irisStage = Stage.EMPTY; + + private int configuredMaxParallel = 1; + private long configuredVoltage = 32; + private int irisParallelLimit = 1; + + private long maxEUt = 0; + private int effectiveParallel = 1; + private int overclockTier = 0; + + private PowerControlPopup powerPopup; + private boolean showingPowerPopup = false; + private java.util.function.BiConsumer onPowerSettingsChanged; + + private float pulsePhase = 0f; + private float appearProgress = 0f; + + public ModuleConfigPopout(int x, int y, Supplier machineSupplier, Runnable onClose) { + super(x, y, WIDTH, HEIGHT); + this.machineSupplier = machineSupplier; + this.onClose = onClose; + setVisible(false); + initPowerPopup(); + } + + private void initPowerPopup() { + powerPopup = new PowerControlPopup(WIDTH + 10, 0, this::hidePowerPopup, this::onPowerSettingsApplied); + addWidget(powerPopup); + } + + public void setOnPowerSettingsChanged(java.util.function.BiConsumer callback) { + this.onPowerSettingsChanged = callback; + } + + private void showPowerPopup() { + showingPowerPopup = true; + powerPopup.show(configuredMaxParallel, configuredVoltage); + } + + private void hidePowerPopup() { + showingPowerPopup = false; + powerPopup.hide(); + } + + private void onPowerSettingsApplied(PowerControlPopup.PowerSettings settings) { + this.configuredMaxParallel = settings.maxParallel(); + this.configuredVoltage = settings.voltagePerParallel(); + + if (onPowerSettingsChanged != null) { + onPowerSettingsChanged.accept(configuredMaxParallel, configuredVoltage); + } + } + + public void showForModule(int index) { + this.moduleIndex = index; + this.appearProgress = 0f; + setVisible(true); + setActive(true); + } + + public void hide() { + setVisible(false); + setActive(false); + moduleIndex = -1; + hidePowerPopup(); + } + + @OnlyIn(Dist.CLIENT) + public void updateModuleData(String name, boolean connected, boolean working, long energy, double speed, + Stage stage, + int maxParallel, long voltage, int irisLimit, + long moduleMaxEUt, int moduleEffectiveParallel, int moduleOverclockTier) { + this.moduleName = name; + this.moduleConnected = connected; + this.moduleWorking = working; + this.energyPerTick = energy; + this.speedBonus = speed; + this.irisStage = stage; + this.configuredMaxParallel = maxParallel; + this.configuredVoltage = voltage; + this.irisParallelLimit = irisLimit; + this.maxEUt = moduleMaxEUt; + this.effectiveParallel = moduleEffectiveParallel; + this.overclockTier = moduleOverclockTier; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + pulsePhase += 0.1f; + + if (isVisible() && appearProgress < 1f) { + appearProgress = Math.min(1f, appearProgress + 0.15f); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + if (!isVisible()) return; + + float alpha = appearProgress; + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + int bgAlpha = (int) (0xE0 * alpha); + int bgColor = (bgAlpha << 24) | 0x0c0c14; + DrawerHelper.drawSolidRect(graphics, x, y, w, h, bgColor); + + int gridAlpha = (int) (0x08 * alpha); + int gridColor = (gridAlpha << 24) | 0xFFFFFF; + for (int gx = x + 8; gx < x + w; gx += 8) { + graphics.fill(gx, y, gx + 1, y + h, gridColor); + } + for (int gy = y + 8; gy < y + h; gy += 8) { + graphics.fill(x, gy, x + w, gy + 1, gridColor); + } + + int titleBgAlpha = (int) (0xC0 * alpha); + int titleBgColor = (titleBgAlpha << 24) | 0x101820; + DrawerHelper.drawSolidRect(graphics, x, y, w, TITLE_HEIGHT, titleBgColor); + + int accentColor = getAccentColor(); + int accentAlpha = (int) (0x80 * alpha); + int borderColor = (accentAlpha << 24) | (accentColor & 0x00FFFFFF); + + DrawerHelper.drawBorder(graphics, x, y, w, h, borderColor, 1); + graphics.fill(x + 1, y + TITLE_HEIGHT - 2, x + w - 1, y + TITLE_HEIGHT, borderColor); + + drawTitle(graphics, x, y, w, alpha); + drawContent(graphics, x, y + TITLE_HEIGHT + 4, w, alpha); + drawSettingsButton(graphics, x + w - SETTINGS_BUTTON_SIZE - 4, y + h - SETTINGS_BUTTON_SIZE - 4, mouseX, mouseY, + alpha); + drawCloseButton(graphics, x + w - 14, y + 3, mouseX, mouseY, alpha); + + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + } + + private void drawTitle(GuiGraphics graphics, int x, int y, int w, float alpha) { + var font = Minecraft.getInstance().font; + + String title = moduleName.isEmpty() ? Component.translatable("cosmiccore.stellar.module.config").getString() : + Component.translatable(moduleName).getString(); + int maxWidth = w - 24; + if (font.width(title) > maxWidth) { + while (font.width(title + "...") > maxWidth && title.length() > 1) { + title = title.substring(0, title.length() - 1); + } + title = title + "..."; + } + + int textColor = (int) (0xFF * alpha) << 24 | 0xFFFFFF; + graphics.drawString(font, title, x + 4, y + (TITLE_HEIGHT - font.lineHeight) / 2 + 1, textColor, false); + } + + private void drawContent(GuiGraphics graphics, int x, int y, int w, float alpha) { + var font = Minecraft.getInstance().font; + int labelColor = (int) (0xFF * alpha) << 24 | 0x808090; + int valueColor = (int) (0xFF * alpha) << 24 | 0xDDDDDD; + int accentColor = (int) (0xFF * alpha) << 24 | 0x80C0FF; + + int lineHeight = 11; + int contentX = x + 6; + int valueX = x + 70; + int currentY = y; + + String statusValue; + int statusColor; + if (moduleWorking) { + statusValue = Component.translatable("cosmiccore.stellar.module.status.processing").getString(); + statusColor = 0x44FF44; + } else if (moduleConnected) { + statusValue = Component.translatable("cosmiccore.stellar.module.status.idle").getString(); + statusColor = 0x6090CC; + } else { + statusValue = Component.translatable("cosmiccore.stellar.module.status.offline").getString(); + statusColor = 0xFF5555; + } + statusColor = (int) (0xFF * alpha) << 24 | statusColor; + + graphics.drawString(font, Component.translatable("cosmiccore.stellar.module.status").getString(), contentX, + currentY, labelColor, false); + graphics.drawString(font, statusValue, valueX, currentY, statusColor, false); + currentY += lineHeight; + + int sepAlpha = (int) (0x30 * alpha); + graphics.fill(contentX, currentY, x + w - 6, currentY + 1, (sepAlpha << 24) | 0x4080FF); + currentY += 4; + + graphics.drawString(font, Component.translatable("cosmiccore.stellar.module.max_eut").getString(), contentX, + currentY, labelColor, false); + String maxEUtStr = formatEnergy(maxEUt); + graphics.drawString(font, maxEUtStr, valueX, currentY, valueColor, false); + + String tierName = overclockTier < GTValues.VNF.length ? GTValues.VNF[overclockTier] : "MAX"; + int tierColor = getTierColor(overclockTier); + int badgeX = x + w - 6 - font.width(tierName) - 4; + int badgeAlpha = (int) (0x90 * alpha); + graphics.fill(badgeX - 2, currentY - 1, badgeX + font.width(tierName) + 2, currentY + font.lineHeight, + (badgeAlpha << 24) | (tierColor & 0x00333333)); + graphics.drawString(font, tierName, badgeX, currentY, (int) (0xFF * alpha) << 24 | tierColor, false); + currentY += lineHeight; + + graphics.drawString(font, Component.translatable("cosmiccore.stellar.module.parallel").getString(), contentX, + currentY, labelColor, false); + String parallelStr = effectiveParallel + "x"; + if (effectiveParallel < configuredMaxParallel) { + parallelStr = Component + .translatable("cosmiccore.stellar.module.parallel_max", effectiveParallel, configuredMaxParallel) + .getString(); + } + graphics.drawString(font, parallelStr, valueX, currentY, accentColor, false); + currentY += lineHeight; + + graphics.drawString(font, Component.translatable("cosmiccore.stellar.module.current").getString(), contentX, + currentY, labelColor, false); + if (energyPerTick > 0) { + String currentEUStr = formatEnergy(energyPerTick); + graphics.drawString(font, currentEUStr, valueX, currentY, (int) (0xFF * alpha) << 24 | 0xFFCC44, false); + } else { + graphics.drawString(font, "---", valueX, currentY, (int) (0x80 * alpha) << 24 | 0x606060, false); + } + currentY += lineHeight; + + graphics.fill(contentX, currentY, x + w - 6, currentY + 1, (sepAlpha << 24) | 0x4080FF); + currentY += 4; + + if (moduleConnected) { + graphics.drawString(font, Component.translatable("cosmiccore.stellar.module.speed_bonus").getString(), + contentX, currentY, labelColor, false); + String speedStr = speedBonus > 0 ? String.format("%.1fx", speedBonus) : "1.0x"; + int speedColor = speedBonus > 1.0 ? 0x66FF66 : 0xCCCCCC; + graphics.drawString(font, speedStr, valueX, currentY, (int) (0xFF * alpha) << 24 | speedColor, false); + currentY += lineHeight; + + graphics.drawString(font, Component.translatable("cosmiccore.stellar.module.iris_limit").getString(), + contentX, currentY, labelColor, false); + graphics.drawString(font, irisParallelLimit + "x", valueX, currentY, valueColor, false); + } else { + int disconnectedColor = (int) (0x80 * alpha) << 24 | 0x808080; + graphics.drawString(font, Component.translatable("cosmiccore.stellar.module.not_linked").getString(), + contentX, currentY, disconnectedColor, false); + } + + if (moduleWorking) { + int barY = y + HEIGHT - TITLE_HEIGHT - 14; + int barWidth = w - 12; + float progress = (float) (0.5f + 0.5f * Math.sin(System.currentTimeMillis() / 400.0)); + int fillWidth = (int) (barWidth * progress); + + int barBg = (int) (0x40 * alpha) << 24 | 0x000000; + int barFill = (int) (0xC0 * alpha) << 24 | 0x44FF44; + + graphics.fill(contentX, barY, contentX + barWidth, barY + 3, barBg); + graphics.fill(contentX, barY, contentX + fillWidth, barY + 3, barFill); + } + } + + private int getTierColor(int tier) { + return switch (tier) { + case 0 -> 0x808080; + case 1 -> 0xC0C0C0; + case 2 -> 0x00FFFF; + case 3 -> 0xFFFF00; + case 4 -> 0x0080FF; + case 5 -> 0x8000FF; + case 6 -> 0xFF0080; + case 7 -> 0xFF00FF; + case 8 -> 0x00FF00; + default -> 0xFF4040; + }; + } + + private void drawSettingsButton(GuiGraphics graphics, int x, int y, int mouseX, int mouseY, float alpha) { + int size = SETTINGS_BUTTON_SIZE; + boolean hovered = mouseX >= x && mouseX < x + size && mouseY >= y && mouseY < y + size; + + int bgColor = hovered ? (int) (0xC0 * alpha) << 24 | 0x4080FF : (int) (0x60 * alpha) << 24 | 0x404050; + + graphics.fill(x, y, x + size, y + size, bgColor); + graphics.blit(GEAR_TEXTURE, x, y, 0, 0, size, size, size, size); + } + + private void drawCloseButton(GuiGraphics graphics, int x, int y, int mouseX, int mouseY, float alpha) { + int size = 10; + boolean hovered = mouseX >= x && mouseX < x + size && mouseY >= y && mouseY < y + size; + + int bgColor = hovered ? (int) (0xC0 * alpha) << 24 | 0xFF4444 : (int) (0x60 * alpha) << 24 | 0x404050; + int fgColor = (int) (0xFF * alpha) << 24 | 0xFFFFFF; + + graphics.fill(x, y, x + size, y + size, bgColor); + graphics.fill(x + 2, y + 3, x + 4, y + 7, fgColor); + graphics.fill(x + 6, y + 3, x + 8, y + 7, fgColor); + graphics.fill(x + 3, y + 4, x + 7, y + 6, fgColor); + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (!isVisible()) return false; + + if (showingPowerPopup && powerPopup.isVisible()) { + if (powerPopup.mouseClicked(mouseX, mouseY, button)) { + return true; + } + } + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + int settingsX = x + w - SETTINGS_BUTTON_SIZE - 4; + int settingsY = y + h - SETTINGS_BUTTON_SIZE - 4; + if (mouseX >= settingsX && mouseX < settingsX + SETTINGS_BUTTON_SIZE && mouseY >= settingsY && + mouseY < settingsY + SETTINGS_BUTTON_SIZE) { + if (showingPowerPopup) { + hidePowerPopup(); + } else { + showPowerPopup(); + } + playButtonClickSound(); + return true; + } + + int closeX = x + w - 14; + int closeY = y + 3; + if (mouseX >= closeX && mouseX < closeX + 10 && mouseY >= closeY && mouseY < closeY + 10) { + if (onClose != null) { + onClose.run(); + } + hide(); + playButtonClickSound(); + return true; + } + + if (mouseX >= x && mouseX < x + w - 30 && mouseY >= y && mouseY < y + TITLE_HEIGHT) { + dragging = true; + lastDeltaX = 0; + lastDeltaY = 0; + return true; + } + + if (isMouseOverElement(mouseX, mouseY)) { + return true; + } + + return super.mouseClicked(mouseX, mouseY, button); + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseDragged(double mouseX, double mouseY, int button, double dragX, double dragY) { + double dx = dragX + lastDeltaX; + double dy = dragY + lastDeltaY; + int intDx = (int) dx; + int intDy = (int) dy; + lastDeltaX = dx - intDx; + lastDeltaY = dy - intDy; + + if (dragging) { + addSelfPosition(intDx, intDy); + return true; + } + return super.mouseDragged(mouseX, mouseY, button, dragX, dragY); + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseReleased(double mouseX, double mouseY, int button) { + if (dragging) { + dragging = false; + lastDeltaX = 0; + lastDeltaY = 0; + return true; + } + return super.mouseReleased(mouseX, mouseY, button); + } + + private String formatEnergy(long eu) { + if (eu >= 1_000_000_000) return String.format("%.1fG EU/t", eu / 1_000_000_000.0); + if (eu >= 1_000_000) return String.format("%.1fM EU/t", eu / 1_000_000.0); + if (eu >= 1000) return String.format("%.1fk EU/t", eu / 1000.0); + return String.format("%d EU/t", eu); + } + + private int getAccentColor() { + if (moduleConnected) { + return getStageColorRaw(irisStage); + } + return 0x4080AA; + } + + private int getStageColorRaw(Stage stage) { + return switch (stage) { + case EMPTY -> 0x606060; + case GROWING -> 0x66AAFF; + case STAR -> 0xFFCC44; + case SUPERSTAR -> 0xFF8844; + case BLACK_HOLE -> 0xAA66FF; + case DEATH -> 0xFF4444; + case DEATH_GRACEFUL -> 0x886666; + }; + } + + public int getModuleIndex() { + return moduleIndex; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/ModuleSelectorWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/ModuleSelectorWidget.java new file mode 100644 index 000000000..cafd9ca54 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/ModuleSelectorWidget.java @@ -0,0 +1,484 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.feature.IStellarModuleReceiver; +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine; + +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.util.Mth; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class ModuleSelectorWidget extends Widget { + + public static final int MAX_MODULES = 8; + public static final int INNER_RING_COUNT = 4; + public static final int OUTER_RING_COUNT = 4; + + private final Supplier machineSupplier; + private final Consumer onModuleSelected; + + private final List moduleSlots = new ArrayList<>(); + private float animPhase = 0f; + private int hoveredSlot = -1; + private int selectedSlot = -1; + private float pulsePhase = 0f; + + public ModuleSelectorWidget(int x, int y, int size, Supplier machineSupplier, + Consumer onModuleSelected) { + super(x, y, size, size); + this.machineSupplier = machineSupplier; + this.onModuleSelected = onModuleSelected; + + for (int i = 0; i < MAX_MODULES; i++) { + moduleSlots.add(new ModuleSlotData()); + } + } + + @Override + public void detectAndSendChanges() { + // Always call super and sync data even when not visible + // so that data is ready when we become visible + super.detectAndSendChanges(); + + IrisMultiblockMachine machine = machineSupplier.get(); + if (machine == null) return; + + List modules = new ArrayList<>(machine.getConnectedModules()); + + // Check for changes and sync + boolean changed = false; + for (int i = 0; i < MAX_MODULES; i++) { + ModuleSlotData slot = moduleSlots.get(i); + boolean hasModule = i < modules.size(); + String newName = hasModule ? getModuleName(modules.get(i)) : ""; + boolean newWorking = hasModule && isModuleWorking(modules.get(i)); + + if (slot.populated != hasModule || !slot.moduleName.equals(newName) || slot.working != newWorking) { + slot.populated = hasModule; + slot.moduleName = newName; + slot.working = newWorking; + changed = true; + } + } + + if (changed) { + writeUpdateInfo(200, buf -> { + for (ModuleSlotData slot : moduleSlots) { + buf.writeBoolean(slot.populated); + buf.writeUtf(slot.moduleName); + buf.writeBoolean(slot.working); + } + }); + } + } + + public void forceSync() { + detectAndSendChanges(); + } + + private String getModuleName(IStellarModuleReceiver module) { + if (module instanceof com.gregtechceu.gtceu.api.machine.MetaMachine metaMachine) { + return metaMachine.getBlockState().getBlock().getDescriptionId(); + } + return "Unknown Module"; + } + + private boolean isModuleWorking(IStellarModuleReceiver module) { + if (module instanceof com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine workable) { + return workable.getRecipeLogic().isWorking(); + } + return false; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void readUpdateInfo(int id, FriendlyByteBuf buffer) { + if (id == 200) { + for (ModuleSlotData slot : moduleSlots) { + slot.populated = buffer.readBoolean(); + slot.moduleName = buffer.readUtf(); + slot.working = buffer.readBoolean(); + } + } else { + super.readUpdateInfo(id, buffer); + } + } + + @Override + public void writeInitialData(FriendlyByteBuf buffer) { + super.writeInitialData(buffer); + + // Populate slot data before writing + IrisMultiblockMachine machine = machineSupplier.get(); + if (machine != null) { + List modules = new ArrayList<>(machine.getConnectedModules()); + for (int i = 0; i < MAX_MODULES; i++) { + ModuleSlotData slot = moduleSlots.get(i); + boolean hasModule = i < modules.size(); + slot.populated = hasModule; + slot.moduleName = hasModule ? getModuleName(modules.get(i)) : ""; + slot.working = hasModule && isModuleWorking(modules.get(i)); + } + } + + for (ModuleSlotData slot : moduleSlots) { + buffer.writeBoolean(slot.populated); + buffer.writeUtf(slot.moduleName); + buffer.writeBoolean(slot.working); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void readInitialData(FriendlyByteBuf buffer) { + super.readInitialData(buffer); + for (ModuleSlotData slot : moduleSlots) { + slot.populated = buffer.readBoolean(); + slot.moduleName = buffer.readUtf(); + slot.working = buffer.readBoolean(); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + animPhase += 0.02f; + pulsePhase += 0.08f; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + int cx = getPosition().x + getSize().width / 2; + int cy = getPosition().y + getSize().height / 2; + int maxRadius = getSize().width / 2 - 5; + + // Draw the two rings + drawRings(graphics, cx, cy, maxRadius); + + // Draw central hub + drawCentralHub(graphics, cx, cy); + + // Draw module slots on both rings + drawModuleSlots(graphics, cx, cy, maxRadius, mouseX, mouseY); + + // Draw connecting lines from hub to slots + drawConnectingLines(graphics, cx, cy, maxRadius); + } + + private int getRingRadius(int ringIndex, int maxRadius) { + // Inner ring at 40% of max, outer ring at 75% of max + // Leaves room for future rings + return switch (ringIndex) { + case 0 -> (int) (maxRadius * 0.40); // Inner ring + case 1 -> (int) (maxRadius * 0.75); // Outer ring + default -> (int) (maxRadius * (0.40 + ringIndex * 0.35)); + }; + } + + private float getCardinalAngle(int slotInRing) { + // Start from top (North = -PI/2), go clockwise + return switch (slotInRing) { + case 0 -> -Mth.HALF_PI; // North (top) + case 1 -> 0f; // East (right) + case 2 -> Mth.HALF_PI; // South (bottom) + case 3 -> Mth.PI; // West (left) + default -> 0f; + }; + } + + private int[] getSlotPosition(int moduleIndex) { + int ring = moduleIndex / INNER_RING_COUNT; + int slotInRing = moduleIndex % INNER_RING_COUNT; + return new int[] { ring, slotInRing }; + } + + private void drawRings(GuiGraphics graphics, int cx, int cy, int maxRadius) { + // Draw both ring circles + int ringColor = 0x60606080; + int ringColorBright = 0x908080A0; + + for (int ringIndex = 0; ringIndex < 2; ringIndex++) { + int ringRadius = getRingRadius(ringIndex, maxRadius); + + // Draw ring circle + for (int angle = 0; angle < 360; angle += 3) { + float rad = angle * Mth.DEG_TO_RAD; + int px = cx + (int) (Mth.cos(rad) * ringRadius); + int py = cy + (int) (Mth.sin(rad) * ringRadius); + + // Brighter at cardinal points + boolean isCardinal = (angle % 90) < 10 || (angle % 90) > 80; + int color = isCardinal ? ringColorBright : ringColor; + graphics.fill(px, py, px + 1, py + 1, color); + } + } + + // Inner glow + int hubRadius = 15; + for (int r = hubRadius + 10; r > hubRadius; r -= 2) { + float progress = (float) (r - hubRadius) / 10f; + int alpha = (int) (20 * (1f - progress)); + int color = (alpha << 24) | 0x101020; + drawCircle(graphics, cx, cy, r, color); + } + } + + private void drawCentralHub(GuiGraphics graphics, int cx, int cy) { + int hubRadius = 15; + + // Hub glow + for (int r = hubRadius + 5; r > hubRadius; r--) { + int alpha = (int) (60 * (1f - (float) (r - hubRadius) / 5f)); + int color = (alpha << 24) | 0x4080AA; + drawCircle(graphics, cx, cy, r, color); + } + + // Hub body + drawCircle(graphics, cx, cy, hubRadius, 0xE0101820); + + // Hub border + int pulseAlpha = (int) (100 + 50 * Mth.sin(pulsePhase)); + int borderColor = (pulseAlpha << 24) | 0x4080AA; + for (int angle = 0; angle < 360; angle += 5) { + float rad = angle * Mth.DEG_TO_RAD; + int px = cx + (int) (Mth.cos(rad) * hubRadius); + int py = cy + (int) (Mth.sin(rad) * hubRadius); + graphics.fill(px, py, px + 1, py + 1, borderColor); + } + + // Hub icon (8 dots for modules) + var font = Minecraft.getInstance().font; + String icon = "\u2699"; // Gear icon + int textWidth = font.width(icon); + graphics.drawString(font, icon, cx - textWidth / 2, cy - font.lineHeight / 2, 0xFF4080AA, false); + } + + private void drawModuleSlots(GuiGraphics graphics, int cx, int cy, int maxRadius, int mouseX, int mouseY) { + int dotSize = 12; + + hoveredSlot = -1; + + for (int i = 0; i < MAX_MODULES; i++) { + // Get ring and position within ring + int[] pos = getSlotPosition(i); + int ringIndex = pos[0]; + int slotInRing = pos[1]; + + // Calculate position + int ringRadius = getRingRadius(ringIndex, maxRadius); + float angle = getCardinalAngle(slotInRing); + + int slotX = cx + (int) (Mth.cos(angle) * ringRadius); + int slotY = cy + (int) (Mth.sin(angle) * ringRadius); + + ModuleSlotData slot = moduleSlots.get(i); + + // Check hover + int dx = mouseX - slotX; + int dy = mouseY - slotY; + boolean hovered = dx * dx + dy * dy <= (dotSize + 2) * (dotSize + 2); + if (hovered) { + hoveredSlot = i; + } + + // Draw slot + drawModuleSlot(graphics, slotX, slotY, dotSize, slot, hovered, i == selectedSlot, ringIndex); + } + } + + private void drawModuleSlot(GuiGraphics graphics, int x, int y, int size, ModuleSlotData slot, + boolean hovered, boolean selected, int ringIndex) { + int halfSize = size / 2; + + // Determine colors - inner ring slightly different tint + int bgColor; + int borderColor; + int glowColor; + + if (slot.populated) { + if (slot.working) { + // Working - green pulse + int pulse = (int) (200 + 55 * Mth.sin(pulsePhase * 2)); + bgColor = 0xE0102010; + borderColor = (pulse << 24) | 0x44FF44; + glowColor = 0x4044FF44; + } else { + // Connected but idle - cyan (inner ring slightly more blue) + bgColor = ringIndex == 0 ? 0xE0101825 : 0xE0101820; + borderColor = ringIndex == 0 ? 0xFF5090BB : 0xFF4080AA; + glowColor = ringIndex == 0 ? 0x505090BB : 0x504080AA; + } + } else { + // Empty slot - more visible + bgColor = 0x90181820; + borderColor = 0x80606070; + glowColor = 0x00000000; + } + + // Hover/selected effects + if (selected) { + borderColor = 0xFFFFFFFF; + glowColor = 0x60FFFFFF; + } else if (hovered) { + borderColor = slot.populated ? 0xFFFFCC44 : 0x80AAAAAA; + glowColor = slot.populated ? 0x40FFCC44 : 0x20AAAAAA; + } + + // Draw glow + if (glowColor != 0) { + for (int r = halfSize + 5; r > halfSize; r--) { + int alpha = (glowColor >> 24) & 0xFF; + alpha = alpha * (halfSize + 5 - r) / 5; + int color = (alpha << 24) | (glowColor & 0x00FFFFFF); + drawCircle(graphics, x, y, r, color); + } + } + + // Draw slot background + drawCircle(graphics, x, y, halfSize, bgColor); + + // Draw border - solid circle + for (int angle = 0; angle < 360; angle += 10) { + float rad = angle * Mth.DEG_TO_RAD; + int px = x + (int) (Mth.cos(rad) * halfSize); + int py = y + (int) (Mth.sin(rad) * halfSize); + graphics.fill(px, py, px + 1, py + 1, borderColor); + } + + // Draw center indicator + if (!slot.populated) { + // Empty slot - small diamond shape + int dimColor = 0x60FFFFFF; + graphics.fill(x, y - 2, x + 1, y + 3, dimColor); + graphics.fill(x - 2, y, x + 3, y + 1, dimColor); + } else { + // Draw working indicator + if (slot.working) { + int indicatorPulse = (int) (255 * (0.5f + 0.5f * Mth.sin(pulsePhase * 3))); + graphics.fill(x - 2, y - 2, x + 3, y + 3, (indicatorPulse << 24) | 0x44FF44); + } else { + graphics.fill(x - 2, y - 2, x + 3, y + 3, 0xC04080AA); + } + } + } + + private void drawConnectingLines(GuiGraphics graphics, int cx, int cy, int maxRadius) { + int hubRadius = 18; + + for (int i = 0; i < MAX_MODULES; i++) { + ModuleSlotData slot = moduleSlots.get(i); + if (!slot.populated) continue; + + // Get ring and position + int[] pos = getSlotPosition(i); + int ringIndex = pos[0]; + int slotInRing = pos[1]; + + int ringRadius = getRingRadius(ringIndex, maxRadius); + float angle = getCardinalAngle(slotInRing); + + // Line from hub edge to slot + int startX = cx + (int) (Mth.cos(angle) * hubRadius); + int startY = cy + (int) (Mth.sin(angle) * hubRadius); + int endX = cx + (int) (Mth.cos(angle) * (ringRadius - 8)); + int endY = cy + (int) (Mth.sin(angle) * (ringRadius - 8)); + + int lineColor = slot.working ? 0xA044FF44 : 0x704080AA; + + // Draw dotted line + int segments = ringIndex == 0 ? 4 : 8; + for (int s = 0; s < segments; s += 2) { + float t1 = (float) s / segments; + float t2 = (float) (s + 1) / segments; + int x1 = (int) (startX + (endX - startX) * t1); + int y1 = (int) (startY + (endY - startY) * t1); + int x2 = (int) (startX + (endX - startX) * t2); + int y2 = (int) (startY + (endY - startY) * t2); + graphics.fill(Math.min(x1, x2), Math.min(y1, y2), + Math.max(x1, x2) + 1, Math.max(y1, y2) + 1, lineColor); + } + } + } + + private void drawCircle(GuiGraphics graphics, int cx, int cy, int radius, int color) { + if (radius <= 0) return; + for (int y = -radius; y <= radius; y++) { + int halfWidth = (int) Math.sqrt(radius * radius - y * y); + graphics.fill(cx - halfWidth, cy + y, cx + halfWidth + 1, cy + y + 1, color); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (button == 0 && hoveredSlot >= 0) { + ModuleSlotData slot = moduleSlots.get(hoveredSlot); + if (slot.populated) { + selectedSlot = hoveredSlot; + if (onModuleSelected != null) { + onModuleSelected.accept(hoveredSlot); + } + playButtonClickSound(); + return true; + } + } + return super.mouseClicked(mouseX, mouseY, button); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInForeground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInForeground(graphics, mouseX, mouseY, partialTicks); + + // Draw tooltip for hovered slot + if (hoveredSlot >= 0) { + ModuleSlotData slot = moduleSlots.get(hoveredSlot); + List tooltip = new ArrayList<>(); + + if (slot.populated) { + tooltip.add(Component.translatable(slot.moduleName)); + if (slot.working) { + tooltip.add(Component.literal("\u00A7aWorking")); + } else { + tooltip.add(Component.literal("\u00A77Idle")); + } + tooltip.add(Component.literal("\u00A78Click to configure")); + } else { + tooltip.add(Component.literal("\u00A78Empty Slot " + (hoveredSlot + 1))); + } + + graphics.renderTooltip(Minecraft.getInstance().font, tooltip, java.util.Optional.empty(), mouseX, mouseY); + } + } + + public void clearSelection() { + selectedSlot = -1; + } + + public int getSelectedSlot() { + return selectedSlot; + } + + private static class ModuleSlotData { + + boolean populated = false; + String moduleName = ""; + boolean working = false; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/ModuleToggleButton.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/ModuleToggleButton.java new file mode 100644 index 000000000..cc6e92d13 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/ModuleToggleButton.java @@ -0,0 +1,155 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine.Stage; + +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import com.mojang.blaze3d.systems.RenderSystem; + +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class ModuleToggleButton extends Widget { + + private static final ResourceLocation GEAR_TEXTURE = new ResourceLocation("gtceu", + "textures/item/material_sets/dull/gear_small.png"); + + private final Consumer onToggle; + private final Supplier stageSupplier; + private boolean showingModules = false; + private boolean hovered = false; + private float hoverProgress = 0f; + private float pulsePhase = 0f; + + public ModuleToggleButton(int x, int y, int width, int height, Consumer onToggle, + Supplier stageSupplier) { + super(x, y, width, height); + this.onToggle = onToggle; + this.stageSupplier = stageSupplier; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + pulsePhase += 0.1f; + + if (hovered && hoverProgress < 1f) { + hoverProgress = Math.min(1f, hoverProgress + 0.15f); + } else if (!hovered && hoverProgress > 0f) { + hoverProgress = Math.max(0f, hoverProgress - 0.1f); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + hovered = isMouseOverElement(mouseX, mouseY); + + int bgAlpha = (int) (0xC0 + 0x20 * hoverProgress); + int bgColor = (bgAlpha << 24) | 0x101820; + DrawerHelper.drawSolidRect(graphics, x, y, w, h, bgColor); + + Stage stage = stageSupplier != null ? stageSupplier.get() : Stage.EMPTY; + int accentColor = getStageColor(stage); + int borderAlpha = (int) (0x60 + 0x40 * hoverProgress); + int borderColor = (borderAlpha << 24) | accentColor; + DrawerHelper.drawBorder(graphics, x, y, w, h, borderColor, 1); + + drawIcon(graphics, x, y, w, h); + + if (hoverProgress > 0) { + int glowAlpha = (int) (0x20 * hoverProgress); + int glowColor = (glowAlpha << 24) | accentColor; + DrawerHelper.drawBorder(graphics, x - 1, y - 1, w + 2, h + 2, glowColor, 1); + } + } + + private void drawIcon(GuiGraphics graphics, int x, int y, int w, int h) { + Stage stage = stageSupplier != null ? stageSupplier.get() : Stage.EMPTY; + int stageColor = getStageColor(stage); + float pulseAlpha = 0.8f + 0.2f * Mth.sin(pulsePhase); + + float r = ((stageColor >> 16) & 0xFF) / 255f; + float g = ((stageColor >> 8) & 0xFF) / 255f; + float b = (stageColor & 0xFF) / 255f; + + RenderSystem.enableBlend(); + RenderSystem.setShaderColor(r, g, b, pulseAlpha); + + int gearSize = Math.min(w, h) - 4; + int gearX = x + (w - gearSize) / 2; + int gearY = y + (h - gearSize) / 2; + graphics.blit(GEAR_TEXTURE, gearX, gearY, 0, 0, gearSize, gearSize, gearSize, gearSize); + + RenderSystem.setShaderColor(1f, 1f, 1f, 1f); + RenderSystem.disableBlend(); + } + + private int getStageColor(Stage stage) { + return switch (stage) { + case EMPTY -> 0x404050; // Gray + case GROWING -> 0x6080FF; // Blue + case STAR -> 0xFFCC44; // Yellow/Gold + case SUPERSTAR -> 0xFF8844; // Orange + case BLACK_HOLE -> 0x8040FF; // Purple + case DEATH -> 0xFF2020; // Red + case DEATH_GRACEFUL -> 0x804040; // Dark red + }; + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (button == 0 && isMouseOverElement(mouseX, mouseY)) { + showingModules = !showingModules; + if (onToggle != null) { + onToggle.accept(showingModules); + } + playButtonClickSound(); + return true; + } + return super.mouseClicked(mouseX, mouseY, button); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInForeground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInForeground(graphics, mouseX, mouseY, partialTicks); + + if (hovered) { + String tooltipText = showingModules ? "cosmiccore.gui.stellar.show_star" : + "cosmiccore.gui.stellar.show_modules"; + graphics.renderTooltip(Minecraft.getInstance().font, + List.of(Component.translatable(tooltipText)), + java.util.Optional.empty(), mouseX, mouseY); + } + } + + public boolean isShowingModules() { + return showingModules; + } + + public void setShowingModules(boolean showing) { + this.showingModules = showing; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/OrbitalRingsWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/OrbitalRingsWidget.java new file mode 100644 index 000000000..23ced7111 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/OrbitalRingsWidget.java @@ -0,0 +1,287 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine.Stage; + +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.util.Mth; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class OrbitalRingsWidget extends Widget { + + private final Supplier stageSupplier; + private final int centerX; + private final int centerY; + + private float rotationPhase = 0f; + private float wobblePhase = 0f; + private float pulsePhase = 0f; + + public OrbitalRingsWidget(int x, int y, int width, int height, Supplier stageSupplier) { + super(x, y, width, height); + this.stageSupplier = stageSupplier; + this.centerX = width / 2; + this.centerY = height / 2; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + + Stage stage = stageSupplier.get(); + float rotSpeed = getRotationSpeed(stage); + + rotationPhase += rotSpeed; + wobblePhase += rotSpeed * 0.7f; + pulsePhase += 0.08f; + } + + private float getRotationSpeed(Stage stage) { + return switch (stage) { + case EMPTY -> 0.005f; + case GROWING -> 0.02f; + case STAR -> 0.015f; + case SUPERSTAR -> 0.03f; + case BLACK_HOLE -> 0.06f; + case DEATH -> 0.1f; + case DEATH_GRACEFUL -> 0.003f; + }; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + int x = getPosition().x; + int y = getPosition().y; + int cx = x + centerX; + int cy = y + centerY; + + Stage stage = stageSupplier.get(); + int baseColor = getStageColor(stage); + + int ringCount = getRingCount(stage); + for (int ring = 0; ring < ringCount; ring++) { + drawOrbitalRing(graphics, cx, cy, ring, baseColor, stage); + } + + if (stage != Stage.EMPTY && stage != Stage.DEATH_GRACEFUL) { + drawOrbitalParticles(graphics, cx, cy, baseColor, stage); + } + + if (stage == Stage.BLACK_HOLE) { + drawAccretionDisk(graphics, cx, cy); + } + } + + private int getRingCount(Stage stage) { + return switch (stage) { + case EMPTY -> 1; + case GROWING -> 2; + case STAR -> 3; + case SUPERSTAR -> 4; + case BLACK_HOLE -> 5; + case DEATH -> 3; + case DEATH_GRACEFUL -> 2; + }; + } + + private void drawOrbitalRing(GuiGraphics graphics, int cx, int cy, int ringIndex, int baseColor, Stage stage) { + float baseRadius = 25 + ringIndex * 15; + float tilt = 0.3f + ringIndex * 0.1f; + float ringRotation = rotationPhase * (1f + ringIndex * 0.3f) + ringIndex * 1.2f; + float wobble = Mth.sin(wobblePhase + ringIndex * 0.8f) * 0.05f; + + float pulse = Mth.sin(pulsePhase + ringIndex * 0.5f) * 0.2f + 0.8f; + int alpha = (int) (0x40 * pulse); + + if (stage == Stage.DEATH) { + alpha = (int) (alpha * (0.5f + Math.random() * 0.5f)); + baseRadius += (float) (Math.random() - 0.5) * 5; + } + + int color = (alpha << 24) | (baseColor & 0x00FFFFFF); + + int segments = 60; + for (int i = 0; i < segments; i++) { + float angle = ringRotation + (i * Mth.TWO_PI / segments); + float nextAngle = ringRotation + ((i + 1) * Mth.TWO_PI / segments); + + float segmentBrightness = (Mth.sin(angle * 3 + pulsePhase) + 1f) * 0.3f + 0.4f; + int segmentAlpha = (int) (alpha * segmentBrightness); + int segmentColor = (segmentAlpha << 24) | (baseColor & 0x00FFFFFF); + + float x1 = cx + Mth.cos(angle) * baseRadius; + float y1 = cy + Mth.sin(angle) * baseRadius * (tilt + wobble); + float x2 = cx + Mth.cos(nextAngle) * baseRadius; + float y2 = cy + Mth.sin(nextAngle) * baseRadius * (tilt + wobble); + + drawLine(graphics, (int) x1, (int) y1, (int) x2, (int) y2, segmentColor); + } + + if (stage == Stage.STAR || stage == Stage.SUPERSTAR) { + int glowAlpha = alpha / 3; + int glowColor = (glowAlpha << 24) | (baseColor & 0x00FFFFFF); + float glowRadius = baseRadius + 2; + + for (int i = 0; i < segments; i += 2) { + float angle = ringRotation + (i * Mth.TWO_PI / segments); + float gx = cx + Mth.cos(angle) * glowRadius; + float gy = cy + Mth.sin(angle) * glowRadius * tilt; + graphics.fill((int) gx - 1, (int) gy - 1, (int) gx + 2, (int) gy + 2, glowColor); + } + } + } + + private void drawOrbitalParticles(GuiGraphics graphics, int cx, int cy, int baseColor, Stage stage) { + int particleCount = switch (stage) { + case GROWING -> 4; + case STAR -> 6; + case SUPERSTAR -> 10; + case BLACK_HOLE -> 15; + case DEATH -> 8; + default -> 2; + }; + + for (int i = 0; i < particleCount; i++) { + float particleOrbit = 20 + (i * 37) % 50; + float particleSpeed = 1f + (i % 3) * 0.5f; + float particleAngle = rotationPhase * particleSpeed + i * 0.9f; + float particleTilt = 0.2f + (i % 4) * 0.1f; + + float px = cx + Mth.cos(particleAngle) * particleOrbit; + float py = cy + Mth.sin(particleAngle) * particleOrbit * particleTilt; + + float brightness = Mth.sin(pulsePhase + i * 0.7f) * 0.4f + 0.6f; + int alpha = (int) (0xC0 * brightness); + + int particleColor; + if (stage == Stage.BLACK_HOLE) { + float hue = (particleAngle * 0.1f) % 1f; + particleColor = (alpha << 24) | hslToRgb(hue, 0.8f, 0.6f); + } else { + particleColor = (alpha << 24) | (baseColor & 0x00FFFFFF); + } + + int size = 1 + (i % 2); + graphics.fill((int) px - size, (int) py - size, (int) px + size + 1, (int) py + size + 1, particleColor); + + int trailLength = 3; + for (int t = 1; t <= trailLength; t++) { + float trailAngle = particleAngle - t * 0.15f; + float tx = cx + Mth.cos(trailAngle) * particleOrbit; + float ty = cy + Mth.sin(trailAngle) * particleOrbit * particleTilt; + int trailAlpha = alpha / (t + 1); + int trailColor = (trailAlpha << 24) | (baseColor & 0x00FFFFFF); + graphics.fill((int) tx, (int) ty, (int) tx + 1, (int) ty + 1, trailColor); + } + } + } + + private void drawAccretionDisk(GuiGraphics graphics, int cx, int cy) { + float diskRadius = 55; + float innerRadius = 20; + + int diskSegments = 120; + for (int i = 0; i < diskSegments; i++) { + float angle = rotationPhase * 0.3f + i * Mth.TWO_PI / diskSegments; + float radiusVariation = Mth.sin(angle * 8 + pulsePhase * 2) * 5; + float currentRadius = diskRadius + radiusVariation; + + float hue = ((angle + rotationPhase) * 0.15f) % 1f; + float brightness = 0.3f + Mth.sin(angle * 4 + pulsePhase) * 0.2f; + + for (float r = innerRadius; r < currentRadius; r += 3) { + float radialBrightness = 1f - (r - innerRadius) / (currentRadius - innerRadius); + int alpha = (int) (0x30 * radialBrightness * brightness); + int color = (alpha << 24) | hslToRgb(hue, 0.7f, 0.5f + radialBrightness * 0.3f); + + float dx = cx + Mth.cos(angle) * r; + float dy = cy + Mth.sin(angle) * r * 0.25f; + graphics.fill((int) dx, (int) dy, (int) dx + 2, (int) dy + 1, color); + } + } + } + + private void drawLine(GuiGraphics graphics, int x1, int y1, int x2, int y2, int color) { + int dx = Math.abs(x2 - x1); + int dy = Math.abs(y2 - y1); + int sx = x1 < x2 ? 1 : -1; + int sy = y1 < y2 ? 1 : -1; + int err = dx - dy; + + while (true) { + graphics.fill(x1, y1, x1 + 1, y1 + 1, color); + + if (x1 == x2 && y1 == y2) break; + int e2 = 2 * err; + if (e2 > -dy) { + err -= dy; + x1 += sx; + } + if (e2 < dx) { + err += dx; + y1 += sy; + } + } + } + + private int hslToRgb(float h, float s, float l) { + float c = (1 - Math.abs(2 * l - 1)) * s; + float x = c * (1 - Math.abs((h * 6) % 2 - 1)); + float m = l - c / 2; + + float r, g, b; + if (h < 1f / 6) { + r = c; + g = x; + b = 0; + } else if (h < 2f / 6) { + r = x; + g = c; + b = 0; + } else if (h < 3f / 6) { + r = 0; + g = c; + b = x; + } else if (h < 4f / 6) { + r = 0; + g = x; + b = c; + } else if (h < 5f / 6) { + r = x; + g = 0; + b = c; + } else { + r = c; + g = 0; + b = x; + } + + int ri = (int) ((r + m) * 255); + int gi = (int) ((g + m) * 255); + int bi = (int) ((b + m) * 255); + + return (ri << 16) | (gi << 8) | bi; + } + + private int getStageColor(Stage stage) { + return switch (stage) { + case EMPTY -> 0x506080; + case GROWING -> 0x80A0FF; + case STAR -> 0xFFDD66; + case SUPERSTAR -> 0xFF9944; + case BLACK_HOLE -> 0xBB66FF; + case DEATH -> 0xFF4040; + case DEATH_GRACEFUL -> 0x806060; + }; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/PowerControlPopup.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/PowerControlPopup.java new file mode 100644 index 000000000..84b48218d --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/PowerControlPopup.java @@ -0,0 +1,303 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.utils.GTUtil; + +import com.lowdragmc.lowdraglib.gui.texture.ColorBorderTexture; +import com.lowdragmc.lowdraglib.gui.texture.ColorRectTexture; +import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.TextFieldWidget; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.chat.Component; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import java.util.function.Consumer; + +import javax.annotation.Nonnull; + +public class PowerControlPopup extends WidgetGroup { + + public static final int WIDTH = 150; + public static final int HEIGHT = 90; + private static final int TITLE_HEIGHT = 16; + private static final int FIELD_HEIGHT = 20; + + private final Runnable onClose; + private final Consumer onApply; + + private int maxParallel = 1; + private long voltagePerParallel = 32; + + private TextFieldWidget parallelField; + private TextFieldWidget voltageField; + + private boolean dragging = false; + private double lastDeltaX, lastDeltaY; + private float appearProgress = 0f; + + public PowerControlPopup(int x, int y, Runnable onClose, Consumer onApply) { + super(x, y, WIDTH, HEIGHT); + this.onClose = onClose; + this.onApply = onApply; + setVisible(false); + initFields(); + } + + private void initFields() { + int fieldX = 6; + int fieldWidth = WIDTH - 12; + int labelY = TITLE_HEIGHT + 4; + + parallelField = new TextFieldWidget(fieldX, labelY + 12, fieldWidth - 12, FIELD_HEIGHT - 4, + () -> String.valueOf(maxParallel), + this::onParallelChanged); + parallelField.setClientSideWidget(); + parallelField.setNumbersOnly(1, Integer.MAX_VALUE); + parallelField.setMaxStringLength(10); + parallelField.setBackground(new GuiTextureGroup( + new ColorRectTexture(0xE0101018), + new ColorBorderTexture(1, 0xFF404060))); + addWidget(parallelField); + + int voltageY = labelY + FIELD_HEIGHT + 16; + voltageField = new TextFieldWidget(fieldX, voltageY + 12, fieldWidth - 12, FIELD_HEIGHT - 4, + () -> String.valueOf(voltagePerParallel), + this::onVoltageChanged); + voltageField.setClientSideWidget(); + voltageField.setNumbersOnly(1L, Long.MAX_VALUE); + voltageField.setMaxStringLength(20); + voltageField.setBackground(new GuiTextureGroup( + new ColorRectTexture(0xE0101018), + new ColorBorderTexture(1, 0xFF404060))); + addWidget(voltageField); + } + + public void show(int parallel, long voltage) { + this.maxParallel = parallel; + this.voltagePerParallel = voltage; + this.appearProgress = 0f; + setVisible(true); + setActive(true); + + if (parallelField != null) { + parallelField.setCurrentString(String.valueOf(parallel)); + } + if (voltageField != null) { + voltageField.setCurrentString(String.valueOf(voltage)); + } + } + + public void hide() { + setVisible(false); + setActive(false); + } + + private void onParallelChanged(String text) { + try { + int value = Integer.parseInt(text); + maxParallel = Math.max(1, value); + applySettings(); + } catch (NumberFormatException ignored) {} + } + + private void onVoltageChanged(String text) { + try { + long value = Long.parseLong(text); + voltagePerParallel = Math.max(1, value); + applySettings(); + } catch (NumberFormatException ignored) {} + } + + private void applySettings() { + if (onApply != null) { + onApply.accept(new PowerSettings(maxParallel, voltagePerParallel)); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + if (isVisible() && appearProgress < 1f) { + appearProgress = Math.min(1f, appearProgress + 0.15f); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + if (!isVisible()) return; + + float alpha = appearProgress; + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + int bgAlpha = (int) (0xE8 * alpha); + int bgColor = (bgAlpha << 24) | 0x0c0c14; + DrawerHelper.drawSolidRect(graphics, x, y, w, h, bgColor); + + int gridAlpha = (int) (0x08 * alpha); + int gridColor = (gridAlpha << 24) | 0xFFFFFF; + for (int gx = x + 8; gx < x + w; gx += 8) { + graphics.fill(gx, y, gx + 1, y + h, gridColor); + } + for (int gy = y + 8; gy < y + h; gy += 8) { + graphics.fill(x, gy, x + w, gy + 1, gridColor); + } + + int titleBgAlpha = (int) (0xD0 * alpha); + int titleBgColor = (titleBgAlpha << 24) | 0x101820; + DrawerHelper.drawSolidRect(graphics, x, y, w, TITLE_HEIGHT, titleBgColor); + + int borderAlpha = (int) (0x80 * alpha); + int borderColor = (borderAlpha << 24) | 0x4080FF; + DrawerHelper.drawBorder(graphics, x, y, w, h, borderColor, 1); + + graphics.fill(x + 1, y + TITLE_HEIGHT - 2, x + w - 1, y + TITLE_HEIGHT, borderColor); + + drawTitle(graphics, x, y, w, alpha); + drawLabels(graphics, x, y, alpha); + drawCloseButton(graphics, x + w - 14, y + 3, mouseX, mouseY, alpha); + drawTierIndicator(graphics, x, y, alpha); + + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + } + + private void drawTitle(GuiGraphics graphics, int x, int y, int w, float alpha) { + var font = Minecraft.getInstance().font; + String title = Component.translatable("cosmiccore.stellar.power.title").getString(); + int textColor = (int) (0xFF * alpha) << 24 | 0xFFFFFF; + graphics.drawString(font, title, x + 4, y + (TITLE_HEIGHT - font.lineHeight) / 2 + 1, textColor, false); + } + + private void drawLabels(GuiGraphics graphics, int x, int y, float alpha) { + var font = Minecraft.getInstance().font; + int labelColor = (int) (0xFF * alpha) << 24 | 0xA0A0B0; + + int labelY = y + TITLE_HEIGHT + 4; + graphics.drawString(font, Component.translatable("cosmiccore.stellar.power.max_parallel").getString(), x + 6, + labelY, labelColor, false); + + int voltageY = labelY + FIELD_HEIGHT + 16; + graphics.drawString(font, Component.translatable("cosmiccore.stellar.power.voltage_per_parallel").getString(), + x + 6, voltageY, labelColor, false); + } + + private void drawTierIndicator(GuiGraphics graphics, int x, int y, float alpha) { + var font = Minecraft.getInstance().font; + int tier = GTUtil.getTierByVoltage(voltagePerParallel); + String tierName = GTValues.VNF[Math.min(tier, GTValues.VNF.length - 1)]; + + int labelY = y + TITLE_HEIGHT + 4 + FIELD_HEIGHT + 16; + int badgeX = x + WIDTH - 6 - font.width(tierName) - 4; + + int tierColor = getTierColor(tier); + int badgeAlpha = (int) (0x80 * alpha); + int badgeBgColor = (badgeAlpha << 24) | (tierColor & 0x00FFFFFF); + + graphics.fill(badgeX - 2, labelY - 1, badgeX + font.width(tierName) + 2, labelY + font.lineHeight + 1, + badgeBgColor); + int textColor = (int) (0xFF * alpha) << 24 | 0xFFFFFF; + graphics.drawString(font, tierName, badgeX, labelY, textColor, false); + } + + private int getTierColor(int tier) { + return switch (tier) { + case 0 -> 0x808080; + case 1 -> 0xC0C0C0; + case 2 -> 0x00FFFF; + case 3 -> 0xFFFF00; + case 4 -> 0x0080FF; + case 5 -> 0x8000FF; + case 6 -> 0xFF0080; + case 7 -> 0xFF00FF; + case 8 -> 0x00FF00; + default -> 0xFF4040; + }; + } + + private void drawCloseButton(GuiGraphics graphics, int x, int y, int mouseX, int mouseY, float alpha) { + int size = 10; + boolean hovered = mouseX >= x && mouseX < x + size && mouseY >= y && mouseY < y + size; + + int bgColor = hovered ? (int) (0xC0 * alpha) << 24 | 0xFF4444 : (int) (0x60 * alpha) << 24 | 0x404050; + int fgColor = (int) (0xFF * alpha) << 24 | 0xFFFFFF; + + graphics.fill(x, y, x + size, y + size, bgColor); + graphics.fill(x + 2, y + 3, x + 4, y + 7, fgColor); + graphics.fill(x + 6, y + 3, x + 8, y + 7, fgColor); + graphics.fill(x + 3, y + 4, x + 7, y + 6, fgColor); + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (!isVisible()) return false; + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + + int closeX = x + w - 14; + int closeY = y + 3; + if (mouseX >= closeX && mouseX < closeX + 10 && mouseY >= closeY && mouseY < closeY + 10) { + if (onClose != null) { + onClose.run(); + } + hide(); + playButtonClickSound(); + return true; + } + + if (mouseX >= x && mouseX < x + w && mouseY >= y && mouseY < y + TITLE_HEIGHT) { + dragging = true; + lastDeltaX = 0; + lastDeltaY = 0; + return true; + } + + if (isMouseOverElement(mouseX, mouseY)) { + return super.mouseClicked(mouseX, mouseY, button); + } + + return false; + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseDragged(double mouseX, double mouseY, int button, double dragX, double dragY) { + double dx = dragX + lastDeltaX; + double dy = dragY + lastDeltaY; + int intDx = (int) dx; + int intDy = (int) dy; + lastDeltaX = dx - intDx; + lastDeltaY = dy - intDy; + + if (dragging) { + addSelfPosition(intDx, intDy); + return true; + } + return super.mouseDragged(mouseX, mouseY, button, dragX, dragY); + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseReleased(double mouseX, double mouseY, int button) { + if (dragging) { + dragging = false; + lastDeltaX = 0; + lastDeltaY = 0; + return true; + } + return super.mouseReleased(mouseX, mouseY, button); + } + + public record PowerSettings(int maxParallel, long voltagePerParallel) {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/PrestigeAnimationOverlay.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/PrestigeAnimationOverlay.java new file mode 100644 index 000000000..bf02b42a7 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/PrestigeAnimationOverlay.java @@ -0,0 +1,741 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine; +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine.Stage; + +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.resources.sounds.SimpleSoundInstance; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.util.Mth; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class PrestigeAnimationOverlay extends Widget { + + private static final int UPDATE_ID_ANIMATION_STATE = 400; + + private static final int PHASE_DESTABILIZE = 50; + private static final int PHASE_COLLAPSE = 70; + private static final int PHASE_SINGULARITY = 15; + private static final int PHASE_SHOCKWAVE = 50; + private static final int PHASE_FADE = 15; + private static final int PHASE_TRANSCENDENCE = 20; + private static final int TOTAL_TICKS = PHASE_DESTABILIZE + PHASE_COLLAPSE + + PHASE_SINGULARITY + PHASE_SHOCKWAVE + PHASE_FADE + PHASE_TRANSCENDENCE; + + // Star position within the widget (based on StellarIrisWidget layout) + private static final int STAR_X = 100; + private static final int STAR_Y = 80; + + private final Supplier machineSupplier; + private final Runnable onAnimationComplete; + private final Runnable onShowPrestigeWindow; + private final Random random = new Random(); + + private StellarCoreWidget coreWidget; + private boolean active = false; + private int tick = 0; + private int pointsEarned = 0; + private int starColor = 0xFFCC44; + + private float starScale = 1f; + private float starAlpha = 1f; + private float shake = 0f; + private float shakeX = 0f; + private float shakeY = 0f; + private float distortion = 0f; + private float glitch = 0f; + + private final List tendrils = new ArrayList<>(); + private final List particles = new ArrayList<>(); + private final List shockwaves = new ArrayList<>(); + private final List lightning = new ArrayList<>(); + private final List debris = new ArrayList<>(); + + private int[] glitchOffsets = new int[12]; + private boolean[] scanlines = new boolean[30]; + + public PrestigeAnimationOverlay(int x, int y, int width, int height, + Supplier machineSupplier, + Runnable onAnimationComplete, + Runnable onShowPrestigeWindow) { + super(x, y, width, height); + this.machineSupplier = machineSupplier; + this.onAnimationComplete = onAnimationComplete; + this.onShowPrestigeWindow = onShowPrestigeWindow; + } + + public void setCoreWidget(StellarCoreWidget coreWidget) { + this.coreWidget = coreWidget; + } + + public void startAnimation(Stage currentStage, int starColor, int points) { + active = true; + tick = 0; + pointsEarned = points; + this.starColor = starColor != -1 ? starColor : 0xFFCC44; + + starScale = 1f; + starAlpha = 1f; + shake = 0f; + distortion = 0f; + glitch = 0f; + + tendrils.clear(); + particles.clear(); + shockwaves.clear(); + lightning.clear(); + debris.clear(); + + if (coreWidget != null) { + coreWidget.setPrestigeAnimating(true); + coreWidget.setPrestigeScale(1f); + coreWidget.setPrestigeAlpha(1f); + } + + randomizeGlitch(); + playSound(SoundEvents.WARDEN_HEARTBEAT, 0.5f, 0.8f); + playSound(SoundEvents.AMBIENT_CAVE.value(), 1.0f, 0.5f); + } + + private void randomizeGlitch() { + for (int i = 0; i < glitchOffsets.length; i++) { + glitchOffsets[i] = random.nextInt(30) - 15; + } + for (int i = 0; i < scanlines.length; i++) { + scanlines[i] = random.nextFloat() < 0.4f; + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + if (!active) return; + + tick++; + + if (shake > 0) { + shakeX = (random.nextFloat() - 0.5f) * 2 * shake; + shakeY = (random.nextFloat() - 0.5f) * 2 * shake; + } else { + shakeX = 0; + shakeY = 0; + } + + int t = tick; + if (t <= PHASE_DESTABILIZE) { + tickDestabilize(t); + } else if (t <= PHASE_DESTABILIZE + PHASE_COLLAPSE) { + tickCollapse(t - PHASE_DESTABILIZE); + } else if (t <= PHASE_DESTABILIZE + PHASE_COLLAPSE + PHASE_SINGULARITY) { + tickSingularity(t - PHASE_DESTABILIZE - PHASE_COLLAPSE); + } else if (t <= PHASE_DESTABILIZE + PHASE_COLLAPSE + PHASE_SINGULARITY + PHASE_SHOCKWAVE) { + tickShockwave(t - PHASE_DESTABILIZE - PHASE_COLLAPSE - PHASE_SINGULARITY); + } else if (t <= PHASE_DESTABILIZE + PHASE_COLLAPSE + PHASE_SINGULARITY + PHASE_SHOCKWAVE + PHASE_FADE) { + tickFade(t - PHASE_DESTABILIZE - PHASE_COLLAPSE - PHASE_SINGULARITY - PHASE_SHOCKWAVE); + } else if (t <= TOTAL_TICKS) { + tickTranscendence( + t - PHASE_DESTABILIZE - PHASE_COLLAPSE - PHASE_SINGULARITY - PHASE_SHOCKWAVE - PHASE_FADE); + } else { + finish(); + } + + tendrils.removeIf(p -> { + p.tick(); + return p.dead(); + }); + particles.removeIf(p -> { + p.tick(); + return p.dead(); + }); + shockwaves.removeIf(p -> { + p.tick(); + return p.dead(); + }); + lightning.removeIf(p -> { + p.tick(); + return p.dead(); + }); + debris.removeIf(p -> { + p.tick(); + return p.dead(); + }); + + if (coreWidget != null) { + coreWidget.setPrestigeScale(starScale); + coreWidget.setPrestigeAlpha(starAlpha); + } + + if (glitch > 0 && tick % 2 == 0) { + randomizeGlitch(); + } + } + + private void tickDestabilize(int t) { + float p = (float) t / PHASE_DESTABILIZE; + shake = p * 8f; + + float flicker = Mth.sin(t * 0.8f) * 0.15f + Mth.sin(t * 1.7f) * 0.1f + Mth.sin(t * 3.3f) * 0.05f; + starScale = 1f + flicker * (1f + p); + glitch = p * 0.8f; + + if (random.nextFloat() < p * 0.3f) spawnLightning(); + + if (t == 1) playSound(SoundEvents.BEACON_DEACTIVATE, 0.5f, 0.6f); + if (t == 20) playSound(SoundEvents.WARDEN_SONIC_CHARGE, 0.7f, 0.5f); + if (t == 40) playSound(SoundEvents.WARDEN_SONIC_CHARGE, 0.9f, 0.7f); + if (random.nextFloat() < 0.1f * p) { + playSound(SoundEvents.LIGHTNING_BOLT_THUNDER, 0.3f + p * 0.3f, 0.5f + random.nextFloat() * 0.5f); + } + } + + private void tickCollapse(int t) { + float p = (float) t / PHASE_COLLAPSE; + float eased = p * p * p; + + starScale = 1.2f * (1f - eased * 0.95f); + distortion = eased * 1.5f; + shake = 8f * (1f - eased * 0.5f) + eased * 15f * (1f - p); + glitch = 0.8f * (1f - eased); + + if (t % 3 == 0 && tendrils.size() < 20) spawnTendril(); + if (t % 2 == 0) { + for (int i = 0; i < 3; i++) spawnParticle(); + } + + if (t == 1) playSound(SoundEvents.WARDEN_SONIC_BOOM, 0.6f, 0.3f); + if (t == 30) playSound(SoundEvents.WARDEN_SONIC_CHARGE, 1.0f, 0.8f); + if (t == 60) playSound(SoundEvents.WARDEN_SONIC_CHARGE, 1.0f, 1.2f); + if (t % 10 == 0) playSound(SoundEvents.WARDEN_HEARTBEAT, 0.4f + p * 0.4f, 0.5f + p * 0.5f); + } + + private void tickSingularity(int t) { + float p = (float) t / PHASE_SINGULARITY; + starScale = 0.05f * (1f - p); + distortion = 1.5f * (1f - p * 0.5f); + shake = 20f * (1f - p); + + if (t == 1) { + playSound(SoundEvents.GENERIC_EXPLODE, 1.0f, 0.3f); + playSound(SoundEvents.WARDEN_SONIC_BOOM, 1.0f, 0.5f); + playSound(SoundEvents.END_PORTAL_SPAWN, 0.8f, 0.5f); + } + } + + private void tickShockwave(int t) { + float p = (float) t / PHASE_SHOCKWAVE; + starScale = 0f; + starAlpha = 0f; + + if (t == 1) { + spawnShockwave(1.0f, 0xFFFFFFFF); + playSound(SoundEvents.DRAGON_FIREBALL_EXPLODE, 0.8f, 0.6f); + spawnDebris(40); + } + if (t == 8) spawnShockwave(0.8f, starColor | 0xFF000000); + if (t == 16) spawnShockwave(0.6f, 0xFF80A0FF); + if (t == 24) spawnShockwave(0.4f, 0xFF4060FF); + + shake = 12f * (1f - p); + distortion = 1.0f * (1f - p * p); + + if (t % 5 == 0 && t < 30) spawnDebris(5); + } + + private void tickFade(int t) { + float p = (float) t / PHASE_FADE; + starScale = 0f; + starAlpha = 0f; + distortion = 0f; + shake = 2f * (1f - p); + + if (t == 1) playSound(SoundEvents.SOUL_ESCAPE, 0.8f, 0.5f); + } + + private void tickTranscendence(int t) { + shake = 0f; + distortion = 0f; + + if (t == 1) { + onShowPrestigeWindow.run(); + playSound(SoundEvents.UI_TOAST_CHALLENGE_COMPLETE, 1.0f, 1.0f); + playSound(SoundEvents.PLAYER_LEVELUP, 0.8f, 0.8f); + } + } + + private void finish() { + active = false; + if (coreWidget != null) coreWidget.setPrestigeAnimating(false); + onAnimationComplete.run(); + } + + private void spawnTendril() { + float angle = random.nextFloat() * Mth.TWO_PI; + float dist = 80 + random.nextFloat() * 60; + tendrils.add(new Tendril( + STAR_X + Mth.cos(angle) * dist, + STAR_Y + Mth.sin(angle) * dist, + STAR_X, STAR_Y, starColor)); + } + + private void spawnParticle() { + float angle = random.nextFloat() * Mth.TWO_PI; + float dist = 25 + random.nextFloat() * 50; + particles.add(new Particle( + STAR_X + Mth.cos(angle) * dist, + STAR_Y + Mth.sin(angle) * dist, + STAR_X, STAR_Y, starColor)); + } + + private void spawnShockwave(float intensity, int color) { + shockwaves.add(new Shockwave(STAR_X, STAR_Y, intensity, color)); + } + + private void spawnLightning() { + float a1 = random.nextFloat() * Mth.TWO_PI; + float a2 = a1 + Mth.PI * (0.3f + random.nextFloat() * 0.4f); + float dist = 35 + random.nextFloat() * 35; + lightning.add(new Lightning( + STAR_X + Mth.cos(a1) * dist, STAR_Y + Mth.sin(a1) * dist, + STAR_X + Mth.cos(a2) * dist, STAR_Y + Mth.sin(a2) * dist)); + } + + private void spawnDebris(int count) { + for (int i = 0; i < count; i++) { + float angle = random.nextFloat() * Mth.TWO_PI; + float speed = 3f + random.nextFloat() * 8f; + debris.add(new Debris(STAR_X, STAR_Y, angle, speed, starColor)); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInForeground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInForeground(graphics, mouseX, mouseY, partialTicks); + if (!active) return; + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + graphics.pose().pushPose(); + graphics.pose().translate(shakeX, shakeY, 0); + + if (distortion > 0) drawDistortion(graphics, x, y); + + for (Tendril t : tendrils) t.draw(graphics, x, y); + for (Particle p : particles) p.draw(graphics, x, y); + for (Lightning l : lightning) l.draw(graphics, x, y); + for (Shockwave s : shockwaves) s.draw(graphics, x, y); + for (Debris d : debris) d.draw(graphics, x, y); + + if (glitch > 0) drawGlitch(graphics, x, y, w, h); + drawVignette(graphics, x, y, w, h); + + graphics.pose().popPose(); + } + + private void drawDistortion(GuiGraphics graphics, int ox, int oy) { + int cx = ox + STAR_X; + int cy = oy + STAR_Y; + + for (int i = 0; i < 24; i++) { + float angle = i * Mth.TWO_PI / 24; + float outer = 100; + float inner = 15 * (1f - distortion * 0.8f); + + int x1 = cx + (int) (Mth.cos(angle) * outer); + int y1 = cy + (int) (Mth.sin(angle) * outer); + int x2 = cx + (int) (Mth.cos(angle) * inner); + int y2 = cy + (int) (Mth.sin(angle) * inner); + + int alpha = (int) (50 * distortion); + drawLine(graphics, x1, y1, x2, y2, (alpha << 24) | 0x8080FF); + } + + for (int ring = 0; ring < 5; ring++) { + float radius = (80 - ring * 14) * (1f - distortion * 0.3f * (5 - ring) / 5f); + int alpha = (int) (40 * distortion); + drawRing(graphics, cx, cy, (int) radius, (alpha << 24) | 0x6060C0); + } + } + + private void drawGlitch(GuiGraphics graphics, int x, int y, int w, int h) { + for (int i = 0; i < scanlines.length; i++) { + if (scanlines[i] && random.nextFloat() < glitch) { + int sy = y + (h * i / scanlines.length); + int sh = h / scanlines.length; + int off = glitchOffsets[i % glitchOffsets.length]; + int a = (int) (50 * glitch); + + graphics.fill(x + off - 3, sy, x + w + off - 3, sy + sh, (a << 24) | 0xFF0000); + graphics.fill(x - off + 3, sy, x + w - off + 3, sy + sh, (a << 24) | 0x00FFFF); + } + } + + if (random.nextFloat() < glitch * 0.4f) { + int a = (int) (80 * glitch * random.nextFloat()); + graphics.fill(x, y, x + w, y + h, (a << 24) | 0xFFFFFF); + } + + if (glitch > 0.3f) { + int count = (int) (100 * glitch); + for (int i = 0; i < count; i++) { + int nx = x + random.nextInt(w); + int ny = y + random.nextInt(h); + int size = 1 + random.nextInt(3); + int gray = random.nextInt(256); + int a = (int) (150 * glitch); + graphics.fill(nx, ny, nx + size, ny + size, (a << 24) | (gray << 16) | (gray << 8) | gray); + } + } + + for (int row = 0; row < h; row += 4) { + if (random.nextFloat() < glitch * 0.15f) { + int a = (int) (40 * glitch); + int off = random.nextInt(20) - 10; + graphics.fill(x + off, y + row, x + w + off, y + row + 2, (a << 24)); + } + } + } + + private void drawVignette(GuiGraphics graphics, int x, int y, int w, int h) { + float strength = 0.4f + shake * 0.02f + distortion * 0.2f; + int edgeAlpha = (int) (150 * strength); + int edgeSize = h / 4; + + for (int row = 0; row < edgeSize; row++) { + int a = (int) (edgeAlpha * (1f - (float) row / edgeSize)); + graphics.fill(x, y + row, x + w, y + row + 1, a << 24); + graphics.fill(x, y + h - 1 - row, x + w, y + h - row, a << 24); + } + + for (int col = 0; col < edgeSize; col++) { + int a = (int) (edgeAlpha * (1f - (float) col / edgeSize) * 0.5f); + graphics.fill(x + col, y, x + col + 1, y + h, a << 24); + graphics.fill(x + w - 1 - col, y, x + w - col, y + h, a << 24); + } + } + + private void drawLine(GuiGraphics g, int x1, int y1, int x2, int y2, int color) { + int dx = Math.abs(x2 - x1), dy = Math.abs(y2 - y1); + int sx = x1 < x2 ? 1 : -1, sy = y1 < y2 ? 1 : -1; + int err = dx - dy; + + while (true) { + g.fill(x1, y1, x1 + 1, y1 + 1, color); + if (x1 == x2 && y1 == y2) break; + int e2 = 2 * err; + if (e2 > -dy) { + err -= dy; + x1 += sx; + } + if (e2 < dx) { + err += dx; + y1 += sy; + } + } + } + + private void drawRing(GuiGraphics g, int cx, int cy, int radius, int color) { + for (int a = 0; a < 360; a += 4) { + float rad = a * Mth.DEG_TO_RAD; + int px = cx + (int) (Mth.cos(rad) * radius); + int py = cy + (int) (Mth.sin(rad) * radius); + g.fill(px, py, px + 1, py + 1, color); + } + } + + private void playSound(net.minecraft.sounds.SoundEvent sound, float volume, float pitch) { + Minecraft.getInstance().getSoundManager().play(SimpleSoundInstance.forUI(sound, pitch, volume)); + } + + // Particle classes + + private class Tendril { + + float sx, sy, ex, ey; + int color; + float[] offsets = new float[8]; + int age = 0; + + Tendril(float sx, float sy, float ex, float ey, int color) { + this.sx = sx; + this.sy = sy; + this.ex = ex; + this.ey = ey; + this.color = color; + for (int i = 0; i < offsets.length; i++) offsets[i] = (random.nextFloat() - 0.5f) * 20; + } + + void tick() { + age++; + for (int i = 0; i < offsets.length; i++) { + offsets[i] += (random.nextFloat() - 0.5f) * 4; + offsets[i] *= 0.9f; + } + } + + boolean dead() { + return age >= 40; + } + + void draw(GuiGraphics g, int ox, int oy) { + float alpha = (1f - age / 40f) * 0.8f; + int a = (int) (alpha * 255); + int c = (a << 24) | (color & 0xFFFFFF); + + for (int i = 0; i < offsets.length - 1; i++) { + float t1 = (float) i / offsets.length; + float t2 = (float) (i + 1) / offsets.length; + float x1 = Mth.lerp(t1, sx, ex) + offsets[i] * (1f - t1); + float y1 = Mth.lerp(t1, sy, ey) + offsets[i] * 0.5f * (1f - t1); + float x2 = Mth.lerp(t2, sx, ex) + offsets[i + 1] * (1f - t2); + float y2 = Mth.lerp(t2, sy, ey) + offsets[i + 1] * 0.5f * (1f - t2); + drawLine(g, ox + (int) x1, oy + (int) y1, ox + (int) x2, oy + (int) y2, c); + } + } + } + + private class Particle { + + float x, y, tx, ty, speed; + int color, size, age = 0; + + Particle(float x, float y, float tx, float ty, int color) { + this.x = x; + this.y = y; + this.tx = tx; + this.ty = ty; + this.color = color; + this.speed = 0.05f + random.nextFloat() * 0.1f; + this.size = 1 + random.nextInt(3); + } + + void tick() { + age++; + float dx = tx - x, dy = ty - y; + x += dx * speed; + y += dy * speed; + speed *= 1.1f; + } + + boolean dead() { + float dist = Mth.sqrt((tx - x) * (tx - x) + (ty - y) * (ty - y)); + return age >= 30 || dist < 3; + } + + void draw(GuiGraphics g, int ox, int oy) { + int a = (int) ((1f - age / 30f) * 200); + int c = (a << 24) | (color & 0xFFFFFF); + g.fill(ox + (int) x - size / 2, oy + (int) y - size / 2, + ox + (int) x + size / 2 + 1, oy + (int) y + size / 2 + 1, c); + } + } + + private class Shockwave { + + float cx, cy, radius = 0, intensity, speed = 8f; + int color; + + Shockwave(float cx, float cy, float intensity, int color) { + this.cx = cx; + this.cy = cy; + this.intensity = intensity; + this.color = color; + } + + void tick() { + radius += speed; + speed *= 0.98f; + } + + boolean dead() { + return radius >= 200; + } + + void draw(GuiGraphics g, int ox, int oy) { + float p = radius / 200f; + int a = (int) (intensity * (1f - p) * 255); + + for (int t = 0; t < 3; t++) { + int r = (int) radius - t * 2; + int ra = a - t * 30; + if (r > 0 && ra > 0) { + drawRing(g, ox + (int) cx, oy + (int) cy, r, (ra << 24) | (color & 0xFFFFFF)); + } + } + } + } + + private class Lightning { + + float x1, y1, x2, y2; + float[] offsets = new float[6]; + int age = 0; + + Lightning(float x1, float y1, float x2, float y2) { + this.x1 = x1; + this.y1 = y1; + this.x2 = x2; + this.y2 = y2; + regen(); + } + + void regen() { + for (int i = 0; i < offsets.length; i++) offsets[i] = (random.nextFloat() - 0.5f) * 15; + } + + void tick() { + age++; + if (age % 2 == 0) regen(); + } + + boolean dead() { + return age >= 8; + } + + void draw(GuiGraphics g, int ox, int oy) { + float alpha = 1f - age / 8f; + int a = (int) (alpha * 255); + int c = (a << 24) | 0xAADDFF; + int glow = ((a / 2) << 24) | 0x4488FF; + + int segs = offsets.length + 1; + for (int i = 0; i < segs; i++) { + float t1 = (float) i / segs, t2 = (float) (i + 1) / segs; + float px1 = Mth.lerp(t1, x1, x2), py1 = Mth.lerp(t1, y1, y2); + float px2 = Mth.lerp(t2, x1, x2), py2 = Mth.lerp(t2, y1, y2); + + if (i < offsets.length) { + float perpX = -(y2 - y1), perpY = (x2 - x1); + float len = Mth.sqrt(perpX * perpX + perpY * perpY); + if (len > 0) { + perpX /= len; + perpY /= len; + } + px1 += perpX * offsets[i]; + py1 += perpY * offsets[i]; + } + if (i + 1 < offsets.length) { + float perpX = -(y2 - y1), perpY = (x2 - x1); + float len = Mth.sqrt(perpX * perpX + perpY * perpY); + if (len > 0) { + perpX /= len; + perpY /= len; + } + px2 += perpX * offsets[i + 1]; + py2 += perpY * offsets[i + 1]; + } + + drawLine(g, ox + (int) px1 - 1, oy + (int) py1, ox + (int) px2 - 1, oy + (int) py2, glow); + drawLine(g, ox + (int) px1 + 1, oy + (int) py1, ox + (int) px2 + 1, oy + (int) py2, glow); + drawLine(g, ox + (int) px1, oy + (int) py1, ox + (int) px2, oy + (int) py2, c); + } + } + } + + private class Debris { + + float x, y, vx, vy; + int color, size, age = 0; + + Debris(float x, float y, float angle, float speed, int baseColor) { + this.x = x; + this.y = y; + this.vx = Mth.cos(angle) * speed; + this.vy = Mth.sin(angle) * speed; + int r = ((baseColor >> 16) & 0xFF) + random.nextInt(40) - 20; + int g = ((baseColor >> 8) & 0xFF) + random.nextInt(40) - 20; + int b = (baseColor & 0xFF) + random.nextInt(40) - 20; + this.color = (Mth.clamp(r, 0, 255) << 16) | (Mth.clamp(g, 0, 255) << 8) | Mth.clamp(b, 0, 255); + this.size = 1 + random.nextInt(4); + } + + void tick() { + age++; + x += vx; + y += vy; + vx *= 0.97f; + vy *= 0.97f; + vy += 0.05f; + } + + boolean dead() { + return age >= 60; + } + + void draw(GuiGraphics g, int ox, int oy) { + int a = (int) ((1f - age / 60f) * 200); + g.fill(ox + (int) x - size / 2, oy + (int) y - size / 2, + ox + (int) x + size / 2 + 1, oy + (int) y + size / 2 + 1, (a << 24) | color); + } + } + + // Public API + + public boolean isAnimationActive() { + return active; + } + + public int getAnimationTick() { + return tick; + } + + public int getPointsEarned() { + return pointsEarned; + } + + public float getStarScale() { + return starScale; + } + + public float getStarAlpha() { + return starAlpha; + } + + @Override + public void detectAndSendChanges() { + super.detectAndSendChanges(); + IrisMultiblockMachine machine = machineSupplier.get(); + if (machine == null) return; + + if (machine.isPrestigeAnimationActive() && !active) { + writeUpdateInfo(UPDATE_ID_ANIMATION_STATE, buf -> { + buf.writeBoolean(true); + buf.writeEnum(machine.getStage()); + buf.writeInt(machine.getCustomStarColor()); + buf.writeInt(machine.getLastPrestigePointsEarned()); + }); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void readUpdateInfo(int id, FriendlyByteBuf buffer) { + if (id == UPDATE_ID_ANIMATION_STATE) { + boolean shouldStart = buffer.readBoolean(); + if (shouldStart && !active) { + Stage stage = buffer.readEnum(Stage.class); + int color = buffer.readInt(); + int points = buffer.readInt(); + startAnimation(stage, color, points); + } + } else { + super.readUpdateInfo(id, buffer); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/PrestigeIgnitionButton.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/PrestigeIgnitionButton.java new file mode 100644 index 000000000..cd11f243a --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/PrestigeIgnitionButton.java @@ -0,0 +1,507 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.resources.sounds.SimpleSoundInstance; +import net.minecraft.network.chat.Component; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.util.Mth; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import java.util.Random; +import java.util.function.BooleanSupplier; + +import javax.annotation.Nonnull; + +public class PrestigeIgnitionButton extends Widget { + + private final BooleanSupplier isPrestigeItemPresent; + private final BooleanSupplier hasActiveStar; + private final Runnable onPrestigeTriggered; + + private float warningScrollPhase = 0f; + private float glitchPhase = 0f; + private float hoverProgress = 0f; + private boolean wasHovered = false; + private int lastMouseX, lastMouseY; + + private int crackStage = 0; + private float crackAnimProgress = 0f; + private boolean isHolding = false; + private int holdTicks = 0; + private static final int HOLD_THRESHOLD = 25; + + private boolean isBreaking = false; + private float breakAnimProgress = 0f; + private float[] shardOffsets; + + private final Random scrambleRandom = new Random(); + private String currentScrambledText = ""; + private int scrambleUpdateCounter = 0; + private static final String SCRAMBLE_CHARS = "!@#$%^&*<>?/\\|=-+"; + + private static final int BG_COLOR_DARK = 0xFF1A0808; + private static final int BG_COLOR_MID = 0xFF2A1010; + private static final int BORDER_COLOR = 0xFFFF2020; + private static final int WARNING_STRIPE_1 = 0xFFCC0000; + private static final int WARNING_STRIPE_2 = 0xFF440000; + private static final int TEXT_COLOR = 0xFFFFFFFF; + private static final int WARNING_ICON_COLOR = 0xFFFFCC00; + + public PrestigeIgnitionButton(int x, int y, int width, int height, + BooleanSupplier isPrestigeItemPresent, + BooleanSupplier hasActiveStar, + Runnable onPrestigeTriggered) { + super(x, y, width, height); + this.isPrestigeItemPresent = isPrestigeItemPresent; + this.hasActiveStar = hasActiveStar; + this.onPrestigeTriggered = onPrestigeTriggered; + + shardOffsets = new float[12]; + for (int i = 0; i < shardOffsets.length; i++) { + shardOffsets[i] = (float) (Math.random() * 2 - 1); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + + if (!isPrestigeItemPresent.getAsBoolean()) { + return; + } + + warningScrollPhase += 0.8f; + glitchPhase += 0.15f; + + boolean hovered = isMouseOverElement(lastMouseX, lastMouseY); + float targetHover = hovered ? 1f : 0f; + hoverProgress = Mth.lerp(0.15f, hoverProgress, targetHover); + + if (hovered && !wasHovered && !isBreaking) { + Minecraft.getInstance().getSoundManager().play( + SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK.value(), 0.8f, 0.2f)); + } + wasHovered = hovered; + + if (isHolding && !isBreaking && crackStage < 3) { + holdTicks++; + if (holdTicks >= HOLD_THRESHOLD) { + advanceCrackStage(); + holdTicks = 0; + } + } + + crackAnimProgress = Mth.lerp(0.1f, crackAnimProgress, 0f); + + if (isBreaking) { + breakAnimProgress += 0.05f; + if (breakAnimProgress >= 1f) { + onPrestigeTriggered.run(); + isBreaking = false; + breakAnimProgress = 0f; + crackStage = 0; + } + } + + scrambleUpdateCounter++; + if (scrambleUpdateCounter >= 3) { + scrambleUpdateCounter = 0; + updateScrambledText(); + } + } + + private void advanceCrackStage() { + crackStage++; + crackAnimProgress = 1f; + + float pitch = 0.6f + crackStage * 0.15f; + Minecraft.getInstance().getSoundManager().play( + SimpleSoundInstance.forUI(SoundEvents.GLASS_BREAK, pitch, 0.8f)); + + if (crackStage == 1) { + Minecraft.getInstance().getSoundManager().play( + SimpleSoundInstance.forUI(SoundEvents.STONE_BREAK, 0.5f, 0.5f)); + } else if (crackStage == 2) { + Minecraft.getInstance().getSoundManager().play( + SimpleSoundInstance.forUI(SoundEvents.ANVIL_LAND, 0.3f, 0.3f)); + } else if (crackStage >= 3) { + isBreaking = true; + breakAnimProgress = 0f; + + Minecraft.getInstance().getSoundManager().play( + SimpleSoundInstance.forUI(SoundEvents.GLASS_BREAK, 0.4f, 1.0f)); + Minecraft.getInstance().getSoundManager().play( + SimpleSoundInstance.forUI(SoundEvents.GENERIC_EXPLODE, 0.7f, 0.5f)); + Minecraft.getInstance().getSoundManager().play( + SimpleSoundInstance.forUI(SoundEvents.TOTEM_USE, 1.2f, 0.8f)); + } + } + + private void updateScrambledText() { + StringBuilder sb = new StringBuilder(); + float glitchIntensity = 0.3f + crackStage * 0.2f; + String baseText = Component.translatable("cosmiccore.stellar.ignition.ignite").getString(); + + for (int i = 0; i < baseText.length(); i++) { + if (scrambleRandom.nextFloat() < glitchIntensity) { + sb.append(SCRAMBLE_CHARS.charAt(scrambleRandom.nextInt(SCRAMBLE_CHARS.length()))); + } else { + sb.append(baseText.charAt(i)); + } + } + currentScrambledText = sb.toString(); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + lastMouseX = mouseX; + lastMouseY = mouseY; + + if (!isPrestigeItemPresent.getAsBoolean()) { + return; + } + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + boolean canActivate = hasActiveStar.getAsBoolean(); + + if (isBreaking) { + drawBreakingAnimation(graphics, x, y, w, h); + return; + } + + drawWarningBackground(graphics, x, y, w, h); + drawMainButton(graphics, x, y, w, h, canActivate); + drawCracks(graphics, x, y, w, h); + drawWarningIcons(graphics, x, y, w, h); + drawButtonText(graphics, x, y, w, h, canActivate); + + if (isHolding && crackStage < 3) { + drawHoldProgress(graphics, x, y, w, h); + } + } + + private void drawWarningBackground(GuiGraphics graphics, int x, int y, int w, int h) { + float pulse = Mth.sin(glitchPhase) * 0.3f + 0.7f; + int glowAlpha = (int) (40 * pulse * (1 + hoverProgress * 0.5f)); + int glowColor = (glowAlpha << 24) | (BORDER_COLOR & 0x00FFFFFF); + + for (int i = 3; i > 0; i--) { + DrawerHelper.drawSolidRect(graphics, x - i, y - i, w + i * 2, h + i * 2, glowColor); + } + + DrawerHelper.drawSolidRect(graphics, x, y, w, h, BG_COLOR_DARK); + } + + private void drawMainButton(GuiGraphics graphics, int x, int y, int w, int h, boolean canActivate) { + int stripeHeight = h; + int stripeWidth = 16; + float scrollOffset = warningScrollPhase % (stripeWidth * 2); + + graphics.enableScissor(x + 1, y + 1, x + w - 1, y + h - 1); + + for (int sx = (int) (-stripeWidth * 4 + scrollOffset); sx < w + stripeWidth * 2; sx += stripeWidth) { + int stripe1X = x + sx; + int stripe2X = x + sx + stripeWidth / 2; + + drawDiagonalStripe(graphics, stripe1X, y, stripeWidth / 2, h, WARNING_STRIPE_1); + drawDiagonalStripe(graphics, stripe2X, y, stripeWidth / 2, h, WARNING_STRIPE_2); + } + + graphics.disableScissor(); + + int centerPadding = 25; + int centerAlpha = canActivate ? 0xD0 : 0xE0; + int centerColor = (centerAlpha << 24) | (BG_COLOR_MID & 0x00FFFFFF); + DrawerHelper.drawSolidRect(graphics, x + centerPadding, y + 4, w - centerPadding * 2, h - 8, centerColor); + + int borderColor = canActivate ? BORDER_COLOR : 0xFF602020; + DrawerHelper.drawBorder(graphics, x, y, w, h, borderColor, 1); + + int innerBorderColor = canActivate ? 0xFF801010 : 0xFF401010; + DrawerHelper.drawBorder(graphics, x + 1, y + 1, w - 2, h - 2, innerBorderColor, 1); + + if (canActivate) { + float accentPulse = Mth.sin(glitchPhase * 2) * 0.5f + 0.5f; + int accentAlpha = (int) (150 + 100 * accentPulse); + int accentColor = (accentAlpha << 24) | (BORDER_COLOR & 0x00FFFFFF); + graphics.fill(x + 2, y + 2, x + w - 2, y + 3, accentColor); + graphics.fill(x + 2, y + h - 3, x + w - 2, y + h - 2, accentColor); + } + } + + private void drawDiagonalStripe(GuiGraphics graphics, int x, int y, int w, int h, int color) { + int skew = h / 3; + for (int row = 0; row < h; row++) { + int offset = (row * skew) / h; + graphics.fill(x + offset, y + row, x + offset + w, y + row + 1, color); + } + } + + private void drawCracks(GuiGraphics graphics, int x, int y, int w, int h) { + if (crackStage == 0) return; + + int crackColor = 0xFF000000; + int highlightColor = 0x60FFFFFF; + + int shakeX = 0, shakeY = 0; + if (crackAnimProgress > 0.5f) { + shakeX = (int) ((Math.random() - 0.5) * 4 * crackAnimProgress); + shakeY = (int) ((Math.random() - 0.5) * 4 * crackAnimProgress); + } + + int cx = x + w / 2 + shakeX; + int cy = y + h / 2 + shakeY; + + if (crackStage >= 1) { + drawCrackLine(graphics, x + 5, y + 3, cx - 10, cy - 5, crackColor); + drawCrackLine(graphics, x + 6, y + 4, cx - 9, cy - 4, highlightColor); + } + + if (crackStage >= 2) { + drawCrackLine(graphics, x + w - 5, y + h - 3, cx + 10, cy + 5, crackColor); + drawCrackLine(graphics, x + w - 6, y + h - 4, cx + 9, cy + 4, highlightColor); + + drawCrackLine(graphics, cx, cy, cx + 15, cy - 8, crackColor); + drawCrackLine(graphics, cx, cy, cx - 12, cy + 10, crackColor); + } + + if (crackStage >= 3) { + for (int i = 0; i < 8; i++) { + float angle = i * Mth.TWO_PI / 8; + int endX = cx + (int) (Mth.cos(angle) * 20); + int endY = cy + (int) (Mth.sin(angle) * 10); + drawCrackLine(graphics, cx, cy, endX, endY, crackColor); + } + } + } + + private void drawCrackLine(GuiGraphics graphics, int x1, int y1, int x2, int y2, int color) { + int dx = Math.abs(x2 - x1); + int dy = Math.abs(y2 - y1); + int sx = x1 < x2 ? 1 : -1; + int sy = y1 < y2 ? 1 : -1; + int err = dx - dy; + + int px = x1, py = y1; + int jitterCounter = 0; + + while (true) { + int jx = px + (jitterCounter % 3 == 0 ? (int) (Math.random() * 2 - 1) : 0); + int jy = py + (jitterCounter % 4 == 0 ? (int) (Math.random() * 2 - 1) : 0); + graphics.fill(jx, jy, jx + 1, jy + 1, color); + + if (px == x2 && py == y2) break; + + int e2 = 2 * err; + if (e2 > -dy) { + err -= dy; + px += sx; + } + if (e2 < dx) { + err += dx; + py += sy; + } + jitterCounter++; + } + } + + private void drawWarningIcons(GuiGraphics graphics, int x, int y, int w, int h) { + int iconSize = 12; + int iconY = y + (h - iconSize) / 2; + + drawWarningTriangle(graphics, x + 6, iconY, iconSize); + drawWarningTriangle(graphics, x + w - 6 - iconSize, iconY, iconSize); + } + + private void drawWarningTriangle(GuiGraphics graphics, int x, int y, int size) { + float flash = Mth.sin(glitchPhase * 3) * 0.3f + 0.7f; + int alpha = (int) (255 * flash); + int color = (alpha << 24) | (WARNING_ICON_COLOR & 0x00FFFFFF); + + int cx = x + size / 2; + for (int row = 0; row < size; row++) { + int halfWidth = (row * size) / (size * 2); + graphics.fill(cx - halfWidth, y + row, cx + halfWidth + 1, y + row + 1, color); + } + + var font = Minecraft.getInstance().font; + int exclamationWidth = font.width("!"); + graphics.drawString(font, "!", cx - exclamationWidth / 2, y + size / 3, 0xFF000000, false); + } + + private void drawButtonText(GuiGraphics graphics, int x, int y, int w, int h, boolean canActivate) { + var font = Minecraft.getInstance().font; + + String displayText; + int textColor; + + if (!canActivate) { + displayText = Component.translatable("cosmiccore.stellar.ignition.requires_star").getString(); + textColor = 0xFF804040; + } else if (crackStage >= 3) { + displayText = Component.translatable("cosmiccore.stellar.ignition.breaking").getString(); + textColor = 0xFFFFFFFF; + } else { + displayText = "[ " + currentScrambledText + " ]"; + textColor = TEXT_COLOR; + } + + int textW = font.width(displayText); + int textX = x + (w - textW) / 2; + int textY = y + (h - font.lineHeight) / 2; + + if (canActivate) { + graphics.drawString(font, displayText, textX + 1, textY + 1, 0xFF000000, false); + } + + graphics.drawString(font, displayText, textX, textY, textColor, false); + + if (canActivate && crackStage > 0) { + float glitchIntensity = crackStage * 0.3f + crackAnimProgress; + if (scrambleRandom.nextFloat() < glitchIntensity * 0.5f) { + int ghostAlpha = (int) (60 * glitchIntensity); + int ghostColor = (ghostAlpha << 24) | 0x00FFFF; + int offsetX = (int) ((Math.random() - 0.5) * 4); + graphics.drawString(font, displayText, textX + offsetX, textY, ghostColor, false); + } + } + } + + private void drawHoldProgress(GuiGraphics graphics, int x, int y, int w, int h) { + float progress = (float) holdTicks / HOLD_THRESHOLD; + + int barHeight = 3; + int barY = y + h - barHeight - 2; + int barW = (int) ((w - 4) * progress); + + graphics.fill(x + 2, barY, x + w - 2, barY + barHeight, 0x80000000); + + int r = (int) (255 * (0.8f + 0.2f * progress)); + int g = (int) (255 * (1f - progress * 0.7f)); + int fillColor = 0xFF000000 | (r << 16) | (g << 8); + graphics.fill(x + 2, barY, x + 2 + barW, barY + barHeight, fillColor); + + if (barW > 2) { + graphics.fill(x + 2 + barW - 1, barY, x + 2 + barW, barY + barHeight, 0xCCFFFFFF); + } + } + + private void drawBreakingAnimation(GuiGraphics graphics, int x, int y, int w, int h) { + int pieceW = w / 3; + int pieceH = h / 2; + + for (int i = 0; i < 6; i++) { + int row = i / 3; + int col = i % 3; + + float dx = shardOffsets[i * 2] * breakAnimProgress * 50; + float dy = shardOffsets[i * 2 + 1] * breakAnimProgress * 30 + breakAnimProgress * breakAnimProgress * 20; + + int px = x + col * pieceW + (int) dx; + int py = y + row * pieceH + (int) dy; + + int alpha = (int) (255 * (1f - breakAnimProgress)); + int color = (alpha << 24) | (BG_COLOR_MID & 0x00FFFFFF); + + graphics.fill(px, py, px + pieceW - 1, py + pieceH - 1, color); + + int borderAlpha = alpha / 2; + int borderColor = (borderAlpha << 24) | (BORDER_COLOR & 0x00FFFFFF); + DrawerHelper.drawBorder(graphics, px, py, pieceW - 1, pieceH - 1, borderColor, 1); + } + + for (int i = 0; i < 10; i++) { + float particleProgress = breakAnimProgress + i * 0.05f; + if (particleProgress > 1f) continue; + + float px = x + w / 2 + (float) Math.cos(i * 0.7) * particleProgress * 60; + float py = y + h / 2 + (float) Math.sin(i * 0.7) * particleProgress * 40 + + particleProgress * particleProgress * 30; + + int particleAlpha = (int) (200 * (1f - particleProgress)); + int particleColor = (particleAlpha << 24) | 0xFFAA00; + graphics.fill((int) px - 1, (int) py - 1, (int) px + 2, (int) py + 2, particleColor); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInForeground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInForeground(graphics, mouseX, mouseY, partialTicks); + + if (isBreaking && breakAnimProgress < 0.3f) { + int flashAlpha = (int) (150 * (1f - breakAnimProgress / 0.3f)); + graphics.fill(-1000, -1000, 2000, 2000, (flashAlpha << 24) | 0xFFFFFF); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (!isPrestigeItemPresent.getAsBoolean()) { + return false; + } + + if (!isMouseOverElement(mouseX, mouseY)) { + return false; + } + + if (button == 0 && hasActiveStar.getAsBoolean() && !isBreaking) { + isHolding = true; + holdTicks = 0; + + Minecraft.getInstance().getSoundManager().play( + SimpleSoundInstance.forUI(SoundEvents.STONE_PRESSURE_PLATE_CLICK_ON, 0.8f, 0.6f)); + + return true; + } + + return false; + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseReleased(double mouseX, double mouseY, int button) { + if (button == 0 && isHolding) { + isHolding = false; + holdTicks = 0; + + if (crackStage < 3 && !isBreaking) { + Minecraft.getInstance().getSoundManager().play( + SimpleSoundInstance.forUI(SoundEvents.STONE_PRESSURE_PLATE_CLICK_OFF, 0.9f, 0.4f)); + } + + return true; + } + return false; + } + + public void reset() { + crackStage = 0; + crackAnimProgress = 0f; + isHolding = false; + holdTicks = 0; + isBreaking = false; + breakAnimProgress = 0f; + } + + public int getCrackStage() { + return crackStage; + } + + public boolean isBreaking() { + return isBreaking; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/PrestigeWindow.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/PrestigeWindow.java new file mode 100644 index 000000000..40189c221 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/PrestigeWindow.java @@ -0,0 +1,384 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine; + +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.util.Mth; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class PrestigeWindow extends Widget { + + private static final int UPDATE_ID_PRESTIGE_DATA = 410; + + private final Supplier machineSupplier; + private final Runnable onClose; + + private boolean visible = false; + private float fadeAlpha = 0f; + private float targetAlpha = 0f; + + private int totalPoints = 0; + private int earnedPoints = 0; + private int currentTier = 0; + private int previousTier = 0; + + private int animationTick = 0; + private float pointCounterDisplay = 0f; + private boolean showTierUp = false; + private int tierUpAnimTick = 0; + + private static final int BG_COLOR = 0xFF101020; + private static final int BORDER_COLOR = 0xFF4060A0; + private static final int ACCENT_COLOR = 0xFF80A0FF; + private static final int GOLD_COLOR = 0xFFFFCC44; + private static final int TEXT_COLOR = 0xFFCCCCDD; + private static final int TIER_COLORS[] = { + 0xFF808080, + 0xFF60A060, + 0xFF4080C0, + 0xFFA060C0, + 0xFFD08040, + 0xFFFFCC44, + }; + + public PrestigeWindow(int x, int y, int width, int height, + Supplier machineSupplier, + Runnable onClose) { + super(x, y, width, height); + this.machineSupplier = machineSupplier; + this.onClose = onClose; + } + + public void show(int earned, int total, int tier, int prevTier) { + this.earnedPoints = earned; + this.totalPoints = total; + this.currentTier = tier; + this.previousTier = prevTier; + this.visible = true; + this.targetAlpha = 1f; + this.animationTick = 0; + this.pointCounterDisplay = 0f; + this.showTierUp = tier > prevTier; + this.tierUpAnimTick = 0; + } + + public void hide() { + this.targetAlpha = 0f; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + + if (fadeAlpha < targetAlpha) { + fadeAlpha = Math.min(fadeAlpha + 0.05f, targetAlpha); + } else if (fadeAlpha > targetAlpha) { + fadeAlpha = Math.max(fadeAlpha - 0.05f, targetAlpha); + if (fadeAlpha <= 0f) { + visible = false; + } + } + + if (!visible) return; + + animationTick++; + + if (animationTick > 20 && pointCounterDisplay < earnedPoints) { + float remaining = earnedPoints - pointCounterDisplay; + float speed = Math.max(1f, remaining * 0.15f); + pointCounterDisplay = Math.min(pointCounterDisplay + speed, earnedPoints); + } + + if (showTierUp && animationTick > 60) { + tierUpAnimTick++; + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + if (!visible && fadeAlpha <= 0f) return; + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + drawWindowBackground(graphics, x, y, w, h); + drawHeader(graphics, x, y, w); + drawPointsSection(graphics, x, y + 30, w); + drawTierSection(graphics, x, y + 80, w); + + if (showTierUp && tierUpAnimTick > 0) { + drawTierUpCelebration(graphics, x, y, w, h); + } + + drawCloseHint(graphics, x, y + h - 16, w); + } + + private void drawWindowBackground(GuiGraphics graphics, int x, int y, int w, int h) { + int bgAlpha = (int) (0xFF * fadeAlpha); + int bgColor = (bgAlpha << 24) | (BG_COLOR & 0x00FFFFFF); + DrawerHelper.drawSolidRect(graphics, x, y, w, h, bgColor); + + int borderAlpha = (int) (0xFF * fadeAlpha); + int borderColor = (borderAlpha << 24) | (BORDER_COLOR & 0x00FFFFFF); + DrawerHelper.drawBorder(graphics, x, y, w, h, borderColor, 2); + + int glowAlpha = (int) (0x40 * fadeAlpha); + int glowColor = (glowAlpha << 24) | (ACCENT_COLOR & 0x00FFFFFF); + DrawerHelper.drawGradientRect(graphics, x + 2, y + 2, w - 4, 30, glowColor, 0x00000000, false); + } + + private void drawHeader(GuiGraphics graphics, int x, int y, int w) { + var font = Minecraft.getInstance().font; + + String title = Component.translatable("cosmiccore.stellar.prestige.title").getString(); + int titleColor = applyFade(GOLD_COLOR); + + int titleX = x + (w - font.width(title)) / 2; + int titleY = y + 8; + + graphics.drawString(font, title, titleX + 1, titleY + 1, applyFade(0xFF000000), false); + graphics.drawString(font, title, titleX, titleY, titleColor, false); + + int lineY = y + 24; + int lineAlpha = (int) (0x80 * fadeAlpha); + int lineColor = (lineAlpha << 24) | (ACCENT_COLOR & 0x00FFFFFF); + graphics.fill(x + 20, lineY, x + w - 20, lineY + 1, lineColor); + } + + private void drawPointsSection(GuiGraphics graphics, int x, int y, int w) { + var font = Minecraft.getInstance().font; + + String earnedLabel = Component.translatable("cosmiccore.stellar.prestige.points_earned").getString(); + int labelColor = applyFade(TEXT_COLOR); + int labelX = x + (w - font.width(earnedLabel)) / 2; + graphics.drawString(font, earnedLabel, labelX, y, labelColor, false); + + String pointsStr = "+" + (int) pointCounterDisplay; + int pointsColor = applyFade(GOLD_COLOR); + + float scale = 2.0f; + int pointsWidth = (int) (font.width(pointsStr) * scale); + int pointsX = x + (w - pointsWidth) / 2; + int pointsY = y + 12; + + graphics.pose().pushPose(); + graphics.pose().translate(pointsX, pointsY, 0); + graphics.pose().scale(scale, scale, 1f); + graphics.drawString(font, pointsStr, 0, 0, pointsColor, false); + graphics.pose().popPose(); + + String totalLabel = Component.translatable("cosmiccore.stellar.prestige.total_points", totalPoints).getString(); + int totalLabelX = x + (w - font.width(totalLabel)) / 2; + int totalY = y + 35; + graphics.drawString(font, totalLabel, totalLabelX, totalY, applyFade(TEXT_COLOR), false); + } + + private void drawTierSection(GuiGraphics graphics, int x, int y, int w) { + var font = Minecraft.getInstance().font; + + String tierLabel = Component.translatable("cosmiccore.stellar.prestige.current_tier").getString(); + int labelX = x + (w - font.width(tierLabel)) / 2; + graphics.drawString(font, tierLabel, labelX, y, applyFade(TEXT_COLOR), false); + + int tierColor = applyFade(getTierColor(currentTier)); + String tierStr = getTierName(currentTier); + + float scale = 1.5f; + int tierWidth = (int) (font.width(tierStr) * scale); + int tierX = x + (w - tierWidth) / 2; + int tierY = y + 12; + + graphics.pose().pushPose(); + graphics.pose().translate(tierX, tierY, 0); + graphics.pose().scale(scale, scale, 1f); + graphics.drawString(font, tierStr, 0, 0, tierColor, false); + graphics.pose().popPose(); + + if (currentTier < 5) { + int nextTierPoints = getPointsForTier(currentTier + 1); + int currentTierPoints = getPointsForTier(currentTier); + float progress = (float) (totalPoints - currentTierPoints) / (nextTierPoints - currentTierPoints); + progress = Mth.clamp(progress, 0f, 1f); + + int barY = y + 35; + int barW = w - 40; + int barH = 8; + int barX = x + 20; + + int barBgColor = applyFade(0xFF202030); + DrawerHelper.drawSolidRect(graphics, barX, barY, barW, barH, barBgColor); + + int fillW = (int) (barW * progress); + int fillColor = applyFade(getTierColor(currentTier + 1)); + if (fillW > 0) { + DrawerHelper.drawSolidRect(graphics, barX, barY, fillW, barH, fillColor); + } + + DrawerHelper.drawBorder(graphics, barX, barY, barW, barH, applyFade(0xFF404060), 1); + + String nextLabel = Component + .translatable("cosmiccore.stellar.prestige.next_tier", nextTierPoints, getTierName(currentTier + 1)) + .getString(); + int nextLabelX = x + (w - font.width(nextLabel)) / 2; + graphics.drawString(font, nextLabel, nextLabelX, barY + 10, applyFade(TEXT_COLOR), false); + } else { + String maxLabel = Component.translatable("cosmiccore.stellar.prestige.max_tier").getString(); + int maxLabelX = x + (w - font.width(maxLabel)) / 2; + graphics.drawString(font, maxLabel, maxLabelX, y + 35, applyFade(GOLD_COLOR), false); + } + } + + private void drawTierUpCelebration(GuiGraphics graphics, int x, int y, int w, int h) { + var font = Minecraft.getInstance().font; + + float animProgress = Math.min(1f, tierUpAnimTick / 30f); + float easeOut = 1f - (1f - animProgress) * (1f - animProgress); + + int bannerH = 40; + int bannerY = (int) (y - bannerH + easeOut * (h / 2 + bannerH / 2)); + + int bannerAlpha = (int) (0xF0 * easeOut * fadeAlpha); + int bannerColor = (bannerAlpha << 24) | (getTierColor(currentTier) & 0x00FFFFFF); + DrawerHelper.drawSolidRect(graphics, x + 10, bannerY, w - 20, bannerH, bannerColor); + + String tierUpText = Component.translatable("cosmiccore.stellar.prestige.tier_up").getString(); + String newTierText = getTierName(currentTier); + + int textAlpha = (int) (255 * easeOut * fadeAlpha); + int textColor = (textAlpha << 24) | 0xFFFFFF; + + float scale = 1.8f; + int tierUpWidth = (int) (font.width(tierUpText) * scale); + int tierUpX = x + (w - tierUpWidth) / 2; + + graphics.pose().pushPose(); + graphics.pose().translate(tierUpX, bannerY + 4, 0); + graphics.pose().scale(scale, scale, 1f); + graphics.drawString(font, tierUpText, 0, 0, textColor, false); + graphics.pose().popPose(); + + int newTierWidth = font.width(newTierText); + int newTierX = x + (w - newTierWidth) / 2; + graphics.drawString(font, newTierText, newTierX, bannerY + 26, textColor, false); + + if (tierUpAnimTick < 40) { + drawParticleBurst(graphics, x + w / 2, bannerY + bannerH / 2, tierUpAnimTick); + } + } + + private void drawParticleBurst(GuiGraphics graphics, int cx, int cy, int tick) { + int particleCount = 16; + float progress = tick / 40f; + + for (int i = 0; i < particleCount; i++) { + float angle = i * Mth.TWO_PI / particleCount; + float distance = progress * 80; + + int px = cx + (int) (Mth.cos(angle) * distance); + int py = cy + (int) (Mth.sin(angle) * distance * 0.5f); + + int alpha = (int) ((1f - progress) * 200 * fadeAlpha); + int color = (alpha << 24) | (GOLD_COLOR & 0x00FFFFFF); + + int size = (int) (3 * (1f - progress)); + if (size > 0) { + graphics.fill(px - size, py - size, px + size + 1, py + size + 1, color); + } + } + } + + private void drawCloseHint(GuiGraphics graphics, int x, int y, int w) { + var font = Minecraft.getInstance().font; + String hint = Component.translatable("cosmiccore.stellar.prestige.continue").getString(); + int hintX = x + (w - font.width(hint)) / 2; + graphics.drawString(font, hint, hintX, y, applyFade(0xFF808090), false); + } + + private int applyFade(int color) { + int a = (color >> 24) & 0xFF; + a = (int) (a * fadeAlpha); + return (a << 24) | (color & 0x00FFFFFF); + } + + private int getTierColor(int tier) { + if (tier < 0) tier = 0; + if (tier >= TIER_COLORS.length) tier = TIER_COLORS.length - 1; + return TIER_COLORS[tier]; + } + + private String getTierName(int tier) { + return switch (tier) { + case 0 -> Component.translatable("cosmiccore.stellar.prestige.tier.novice").getString(); + case 1 -> Component.translatable("cosmiccore.stellar.prestige.tier.apprentice").getString(); + case 2 -> Component.translatable("cosmiccore.stellar.prestige.tier.journeyman").getString(); + case 3 -> Component.translatable("cosmiccore.stellar.prestige.tier.expert").getString(); + case 4 -> Component.translatable("cosmiccore.stellar.prestige.tier.master").getString(); + case 5 -> Component.translatable("cosmiccore.stellar.prestige.tier.grandmaster").getString(); + default -> Component.translatable("cosmiccore.stellar.prestige.tier.unknown").getString(); + }; + } + + private int getPointsForTier(int tier) { + return switch (tier) { + case 1 -> 50; + case 2 -> 100; + case 3 -> 250; + case 4 -> 500; + case 5 -> 1000; + default -> 0; + }; + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (visible && fadeAlpha > 0.5f && animationTick > 40) { + hide(); + onClose.run(); + return true; + } + return false; + } + + public boolean isVisible() { + return visible || fadeAlpha > 0f; + } + + @Override + public void detectAndSendChanges() { + super.detectAndSendChanges(); + IrisMultiblockMachine machine = machineSupplier.get(); + if (machine == null) return; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void readUpdateInfo(int id, FriendlyByteBuf buffer) { + if (id == UPDATE_ID_PRESTIGE_DATA) { + int earned = buffer.readInt(); + int total = buffer.readInt(); + int tier = buffer.readInt(); + int prevTier = buffer.readInt(); + show(earned, total, tier, prevTier); + } else { + super.readUpdateInfo(id, buffer); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StageContextPanel.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StageContextPanel.java new file mode 100644 index 000000000..6db58aef7 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StageContextPanel.java @@ -0,0 +1,261 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine; +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine.Stage; + +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; + +import com.lowdragmc.lowdraglib.gui.texture.ColorBorderTexture; +import com.lowdragmc.lowdraglib.gui.texture.ColorRectTexture; +import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class StageContextPanel extends WidgetGroup { + + private static final int UPDATE_ID_PRESTIGE_STATE = 100; + + private final Supplier machineSupplier; + private final StellarIrisWidget parentWidget; + + private IgnitionButtonWidget normalIgnitionButton; + private PrestigeIgnitionButton prestigeIgnitionButton; + + private boolean hasPrestigeItem = false; + private boolean hasActiveStar = false; + + public StageContextPanel(int x, int y, int width, int height, + Supplier machineSupplier, + StellarIrisWidget parentWidget) { + super(x, y, width, height); + this.machineSupplier = machineSupplier; + this.parentWidget = parentWidget; + initWidgets(); + } + + private void initWidgets() { + addWidget(new LabelWidget(5, 5, this::getStagePanelTitle)); + + addWidget(new FuelGaugeWidget(5, 22, getSize().width - 10, 30, parentWidget::getFuelLevel)); + + normalIgnitionButton = new IgnitionButtonWidget( + 5, 58, getSize().width - 10, 24, + parentWidget::canIgnite, + () -> !hasPrestigeItem && (getCurrentStage() == Stage.EMPTY || parentWidget.canIgnite()), + parentWidget::requestIgnition); + addWidget(normalIgnitionButton); + + prestigeIgnitionButton = new PrestigeIgnitionButton( + 5, 58, getSize().width - 10, 24, + () -> hasPrestigeItem, + () -> hasActiveStar, + this::onPrestigeTriggered); + addWidget(prestigeIgnitionButton); + + IrisMultiblockMachine machine = machineSupplier.get(); + if (machine != null) { + SlotWidget starSeedSlot = new SlotWidget(machine.getInventory().storage, 0, 5, 88, true, true); + starSeedSlot.setBackground(new GuiTextureGroup( + new ColorRectTexture(0xC0101018), + new ColorBorderTexture(1, 0xFF505070)), GuiTextures.ATOMIC_OVERLAY_1); + addWidget(starSeedSlot); + addWidget(new LabelWidget(28, 92, + () -> Component.translatable("cosmiccore.stellar.slot.star_seed").getString()) + .setTextColor(0xFF808090)); + } + } + + private void onPrestigeTriggered() { + parentWidget.triggerPrestigeAnimation(); + } + + @Override + public void writeInitialData(FriendlyByteBuf buffer) { + super.writeInitialData(buffer); + IrisMultiblockMachine machine = machineSupplier.get(); + if (machine != null) { + buffer.writeBoolean(machine.hasPrestigeItem()); + buffer.writeBoolean(machine.hasActiveStar()); + } else { + buffer.writeBoolean(false); + buffer.writeBoolean(false); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void readInitialData(FriendlyByteBuf buffer) { + super.readInitialData(buffer); + hasPrestigeItem = buffer.readBoolean(); + hasActiveStar = buffer.readBoolean(); + updateButtonVisibility(); + } + + @Override + public void detectAndSendChanges() { + super.detectAndSendChanges(); + + IrisMultiblockMachine machine = machineSupplier.get(); + if (machine == null) return; + + boolean newHasPrestigeItem = machine.hasPrestigeItem(); + boolean newHasActiveStar = machine.hasActiveStar(); + + if (newHasPrestigeItem != hasPrestigeItem || newHasActiveStar != hasActiveStar) { + hasPrestigeItem = newHasPrestigeItem; + hasActiveStar = newHasActiveStar; + writeUpdateInfo(UPDATE_ID_PRESTIGE_STATE, buf -> { + buf.writeBoolean(hasPrestigeItem); + buf.writeBoolean(hasActiveStar); + }); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void readUpdateInfo(int id, FriendlyByteBuf buffer) { + if (id == UPDATE_ID_PRESTIGE_STATE) { + hasPrestigeItem = buffer.readBoolean(); + hasActiveStar = buffer.readBoolean(); + updateButtonVisibility(); + + if (!hasPrestigeItem) { + prestigeIgnitionButton.reset(); + } + } else { + super.readUpdateInfo(id, buffer); + } + } + + @OnlyIn(Dist.CLIENT) + private void updateButtonVisibility() { + normalIgnitionButton.setVisible(!hasPrestigeItem); + normalIgnitionButton.setActive(!hasPrestigeItem); + prestigeIgnitionButton.setVisible(hasPrestigeItem); + prestigeIgnitionButton.setActive(hasPrestigeItem); + } + + private Stage getCurrentStage() { + IrisMultiblockMachine machine = machineSupplier.get(); + return machine != null ? machine.getStage() : Stage.EMPTY; + } + + private String getStagePanelTitle() { + return switch (getCurrentStage()) { + case EMPTY -> Component.translatable("cosmiccore.stellar.stage.initialization").getString(); + case GROWING -> Component.translatable("cosmiccore.stellar.stage.stellar_ignition").getString(); + case STAR -> Component.translatable("cosmiccore.stellar.stage.stellar_operations").getString(); + case SUPERSTAR -> Component.translatable("cosmiccore.stellar.stage.critical_mass").getString(); + case BLACK_HOLE -> Component.translatable("cosmiccore.stellar.stage.singularity_control").getString(); + case DEATH -> Component.translatable("cosmiccore.stellar.stage.emergency_protocols").getString(); + case DEATH_GRACEFUL -> Component.translatable("cosmiccore.stellar.stage.controlled_shutdown").getString(); + }; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + DrawerHelper.drawSolidRect(graphics, x, y, w, h, 0xCC0a0a14); + + int accentColor = getStageAccentColor(); + DrawerHelper.drawBorder(graphics, x, y, w, h, accentColor, 1); + graphics.fill(x + 1, y + 1, x + w - 1, y + 3, accentColor); + + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + drawStageInfo(graphics, x, y, w, h); + } + + private void drawStageInfo(GuiGraphics graphics, int x, int y, int w, int h) { + var font = Minecraft.getInstance().font; + int infoY = y + h - 35; + int textColor = 0xFF808090; + + switch (getCurrentStage()) { + case EMPTY -> { + graphics.drawString(font, Component.translatable("cosmiccore.stellar.context.empty_line1").getString(), + x + 5, infoY, textColor, false); + graphics.drawString(font, Component.translatable("cosmiccore.stellar.context.empty_line2").getString(), + x + 5, infoY + 10, textColor, false); + graphics.drawString(font, Component.translatable("cosmiccore.stellar.context.empty_line3").getString(), + x + 5, infoY + 20, textColor, false); + } + case GROWING -> { + graphics.drawString(font, + Component.translatable("cosmiccore.stellar.context.growing_line1").getString(), x + 5, infoY, + 0xFFAAAAFF, false); + graphics.drawString(font, + Component.translatable("cosmiccore.stellar.context.growing_line2").getString(), x + 5, + infoY + 10, 0xFFAAAAFF, false); + } + case STAR -> { + graphics.drawString(font, Component.translatable("cosmiccore.stellar.context.star_line1").getString(), + x + 5, infoY, 0xFFFFCC44, false); + graphics.drawString(font, Component.translatable("cosmiccore.stellar.context.star_line2").getString(), + x + 5, infoY + 10, textColor, false); + } + case SUPERSTAR -> { + graphics.drawString(font, + Component.translatable("cosmiccore.stellar.context.superstar_line1").getString(), x + 5, infoY, + 0xFFFF8844, false); + graphics.drawString(font, + Component.translatable("cosmiccore.stellar.context.superstar_line2").getString(), x + 5, + infoY + 10, 0xFFFF6622, false); + } + case BLACK_HOLE -> { + graphics.drawString(font, + Component.translatable("cosmiccore.stellar.context.blackhole_line1").getString(), x + 5, infoY, + 0xFFAA66FF, false); + graphics.drawString(font, + Component.translatable("cosmiccore.stellar.context.blackhole_line2").getString(), x + 5, + infoY + 10, 0xFF8844DD, false); + } + case DEATH -> { + if (parentWidget.getTickCounter() % 20 < 10) { + graphics.fill(x + 1, y + 1, x + w - 1, y + h - 1, 0x30FF0000); + } + graphics.drawString(font, Component.translatable("cosmiccore.stellar.context.death_line1").getString(), + x + 5, infoY, 0xFFFF0000, false); + graphics.drawString(font, Component.translatable("cosmiccore.stellar.context.death_line2").getString(), + x + 5, infoY + 10, 0xFFFF4444, false); + } + case DEATH_GRACEFUL -> { + graphics.drawString(font, + Component.translatable("cosmiccore.stellar.context.death_graceful_line1").getString(), x + 5, + infoY, 0xFF884444, false); + graphics.drawString(font, + Component.translatable("cosmiccore.stellar.context.death_graceful_line2").getString(), x + 5, + infoY + 10, textColor, false); + } + } + } + + private int getStageAccentColor() { + return switch (getCurrentStage()) { + case EMPTY -> 0xFF404060; + case GROWING -> 0xFF6080FF; + case STAR -> 0xFFFFCC44; + case SUPERSTAR -> 0xFFFF8844; + case BLACK_HOLE -> 0xFF8040FF; + case DEATH -> 0xFFFF2020; + case DEATH_GRACEFUL -> 0xFF804040; + }; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StarColorButton.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StarColorButton.java new file mode 100644 index 000000000..ac252276a --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StarColorButton.java @@ -0,0 +1,135 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.chat.Component; +import net.minecraft.util.Mth; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import java.util.List; +import java.util.function.Consumer; +import java.util.function.IntSupplier; + +import javax.annotation.Nonnull; + +public class StarColorButton extends Widget { + + private final Consumer onToggle; + private final IntSupplier colorSupplier; + private boolean hovered = false; + private float hoverProgress = 0f; + private float pulsePhase = 0f; + + public StarColorButton(int x, int y, int width, int height, Consumer onToggle, IntSupplier colorSupplier) { + super(x, y, width, height); + this.onToggle = onToggle; + this.colorSupplier = colorSupplier; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + pulsePhase += 0.1f; + + if (hovered && hoverProgress < 1f) { + hoverProgress = Math.min(1f, hoverProgress + 0.15f); + } else if (!hovered && hoverProgress > 0f) { + hoverProgress = Math.max(0f, hoverProgress - 0.15f); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + hovered = isMouseOverElement(mouseX, mouseY); + + int bgAlpha = (int) (0xC0 + 0x20 * hoverProgress); + int bgColor = (bgAlpha << 24) | 0x101820; + DrawerHelper.drawSolidRect(graphics, x, y, w, h, bgColor); + + int currentColor = colorSupplier != null ? colorSupplier.getAsInt() : -1; + int displayColor = currentColor == -1 ? 0xFFCC44 : currentColor; + + int borderAlpha = (int) (0x60 + 0x40 * hoverProgress); + int borderColor = (borderAlpha << 24) | displayColor; + DrawerHelper.drawBorder(graphics, x, y, w, h, borderColor, 1); + + drawColorIcon(graphics, x, y, w, h, displayColor, currentColor == -1); + + if (hoverProgress > 0) { + int glowAlpha = (int) (0x20 * hoverProgress); + int glowColor = (glowAlpha << 24) | displayColor; + DrawerHelper.drawBorder(graphics, x - 1, y - 1, w + 2, h + 2, glowColor, 1); + } + } + + private void drawColorIcon(GuiGraphics graphics, int x, int y, int w, int h, int color, boolean isDefault) { + int padding = 3; + int iconX = x + padding; + int iconY = y + padding; + int iconW = w - padding * 2; + int iconH = h - padding * 2; + + float pulseAlpha = 0.8f + 0.2f * Mth.sin(pulsePhase); + int alpha = (int) (0xFF * pulseAlpha); + + if (isDefault) { + int checkSize = 3; + for (int cy = 0; cy < iconH / checkSize; cy++) { + for (int cx = 0; cx < iconW / checkSize; cx++) { + int checkColor = ((cx + cy) % 2 == 0) ? 0xFF303030 : 0xFF505050; + int checkX = iconX + cx * checkSize; + int checkY = iconY + cy * checkSize; + int checkW = Math.min(checkSize, iconX + iconW - checkX); + int checkH = Math.min(checkSize, iconY + iconH - checkY); + graphics.fill(checkX, checkY, checkX + checkW, checkY + checkH, checkColor); + } + } + } + + graphics.fill(iconX, iconY, iconX + iconW, iconY + iconH, (alpha << 24) | color); + + int innerBorder = 0x40000000; + graphics.fill(iconX, iconY, iconX + iconW, iconY + 1, innerBorder); + graphics.fill(iconX, iconY, iconX + 1, iconY + iconH, innerBorder); + + if (isDefault) { + var font = Minecraft.getInstance().font; + int textColor = 0x80FFFFFF; + graphics.drawString(font, "D", iconX + iconW - 6, iconY + iconH - 8, textColor, false); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (button == 0 && isMouseOverElement(mouseX, mouseY)) { + if (onToggle != null) { + onToggle.accept(true); + } + playButtonClickSound(); + return true; + } + return false; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInForeground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + if (isMouseOverElement(mouseX, mouseY)) { + graphics.renderTooltip(Minecraft.getInstance().font, + List.of(Component.translatable("cosmiccore.gui.stellar.star_color")), + java.util.Optional.empty(), mouseX, mouseY); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StarColorPickerPopup.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StarColorPickerPopup.java new file mode 100644 index 000000000..0f07e6ff0 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StarColorPickerPopup.java @@ -0,0 +1,462 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.lowdragmc.lowdraglib.gui.texture.ColorBorderTexture; +import com.lowdragmc.lowdraglib.gui.texture.ColorRectTexture; +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.TextFieldWidget; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.util.Mth; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import java.util.function.IntConsumer; + +import javax.annotation.Nonnull; + +public class StarColorPickerPopup extends WidgetGroup { + + public static final int WIDTH = 160; + public static final int HEIGHT = 140; + private static final int TITLE_HEIGHT = 16; + private static final int PICKER_SIZE = 80; + private static final int HUE_BAR_WIDTH = 12; + + private final Runnable onClose; + private final IntConsumer onColorChanged; + + // Current color in HSB + private float hue = 0.15f; // Default yellow-ish + private float saturation = 0.8f; + private float brightness = 1.0f; + + // Current color as RGB + private int currentColor = 0xFFCC44; + + // Text field for hex input + private TextFieldWidget hexField; + + // Dragging state + private boolean draggingPicker = false; + private boolean draggingHue = false; + private boolean draggingTitle = false; + private double lastDeltaX, lastDeltaY; + + // Animation + private float appearProgress = 0f; + + public StarColorPickerPopup(int x, int y, Runnable onClose, IntConsumer onColorChanged) { + super(x, y, WIDTH, HEIGHT); + this.onClose = onClose; + this.onColorChanged = onColorChanged; + setVisible(false); + initWidgets(); + } + + private void initWidgets() { + // Hex input field at bottom + int fieldX = 6; + int fieldY = HEIGHT - 26; + int fieldWidth = WIDTH - 60; + + hexField = new TextFieldWidget(fieldX, fieldY, fieldWidth, 16, + this::getHexString, + this::onHexChanged); + hexField.setClientSideWidget(); + hexField.setMaxStringLength(7); // #RRGGBB + hexField.setBackground(new com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup( + new ColorRectTexture(0xE0101018), + new ColorBorderTexture(1, 0xFF404060))); + addWidget(hexField); + } + + public void show(int color) { + if (color == -1) { + // Default - use a nice yellow + currentColor = 0xFFCC44; + } else { + currentColor = color & 0xFFFFFF; + } + + // Convert to HSB + float[] hsb = rgbToHsb(currentColor); + hue = hsb[0]; + saturation = hsb[1]; + brightness = hsb[2]; + + appearProgress = 0f; + setVisible(true); + setActive(true); + + updateHexField(); + } + + public void hide() { + setVisible(false); + setActive(false); + } + + private String getHexString() { + return String.format("#%06X", currentColor & 0xFFFFFF); + } + + private void onHexChanged(String text) { + try { + String hex = text.startsWith("#") ? text.substring(1) : text; + if (hex.length() == 6) { + int color = Integer.parseInt(hex, 16); + setColor(color); + } + } catch (NumberFormatException ignored) {} + } + + private void setColor(int rgb) { + currentColor = rgb & 0xFFFFFF; + float[] hsb = rgbToHsb(currentColor); + hue = hsb[0]; + saturation = hsb[1]; + brightness = hsb[2]; + + if (onColorChanged != null) { + onColorChanged.accept(currentColor); + } + } + + private void updateFromHsb() { + currentColor = hsbToRgb(hue, saturation, brightness); + updateHexField(); + + if (onColorChanged != null) { + onColorChanged.accept(currentColor); + } + } + + private void updateHexField() { + if (hexField != null) { + hexField.setCurrentString(getHexString()); + } + } + + private void resetToDefault() { + if (onColorChanged != null) { + onColorChanged.accept(-1); // -1 signals default + } + hide(); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + if (isVisible() && appearProgress < 1f) { + appearProgress = Math.min(1f, appearProgress + 0.15f); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + if (!isVisible()) return; + + float alpha = appearProgress; + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + // Background + int bgAlpha = (int) (0xE8 * alpha); + int bgColor = (bgAlpha << 24) | 0x0c0c14; + DrawerHelper.drawSolidRect(graphics, x, y, w, h, bgColor); + + // Grid pattern + int gridAlpha = (int) (0x08 * alpha); + int gridColor = (gridAlpha << 24) | 0xFFFFFF; + for (int gx = x + 8; gx < x + w; gx += 8) { + graphics.fill(gx, y, gx + 1, y + h, gridColor); + } + for (int gy = y + 8; gy < y + h; gy += 8) { + graphics.fill(x, gy, x + w, gy + 1, gridColor); + } + + // Title bar + int titleBgAlpha = (int) (0xD0 * alpha); + int titleBgColor = (titleBgAlpha << 24) | 0x101820; + DrawerHelper.drawSolidRect(graphics, x, y, w, TITLE_HEIGHT, titleBgColor); + + // Border + int borderAlpha = (int) (0x80 * alpha); + int borderColor = (borderAlpha << 24) | 0x4080FF; + DrawerHelper.drawBorder(graphics, x, y, w, h, borderColor, 1); + + // Title bar accent + graphics.fill(x + 1, y + TITLE_HEIGHT - 2, x + w - 1, y + TITLE_HEIGHT, borderColor); + + // Draw title + drawTitle(graphics, x, y, w, alpha); + + // Draw color picker + drawColorPicker(graphics, x, y, mouseX, mouseY, alpha); + + // Draw close button + drawCloseButton(graphics, x + w - 14, y + 3, mouseX, mouseY, alpha); + + // Draw reset button + drawResetButton(graphics, x + w - 50, y + HEIGHT - 26, mouseX, mouseY, alpha); + + // Draw color preview + drawColorPreview(graphics, x, y, alpha); + + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + } + + private void drawTitle(GuiGraphics graphics, int x, int y, int w, float alpha) { + var font = Minecraft.getInstance().font; + String title = "Star Color"; + int textColor = (int) (0xFF * alpha) << 24 | 0xFFFFFF; + graphics.drawString(font, title, x + 4, y + (TITLE_HEIGHT - font.lineHeight) / 2 + 1, textColor, false); + } + + private void drawColorPicker(GuiGraphics graphics, int baseX, int baseY, int mouseX, int mouseY, float alpha) { + int pickerX = baseX + 6; + int pickerY = baseY + TITLE_HEIGHT + 4; + + // Draw saturation/brightness gradient + for (int py = 0; py < PICKER_SIZE; py++) { + for (int px = 0; px < PICKER_SIZE; px++) { + float s = (float) px / PICKER_SIZE; + float b = 1f - (float) py / PICKER_SIZE; + int color = hsbToRgb(hue, s, b); + int pixelAlpha = (int) (0xFF * alpha); + graphics.fill(pickerX + px, pickerY + py, pickerX + px + 1, pickerY + py + 1, + (pixelAlpha << 24) | color); + } + } + + // Border around picker + int pickerBorder = (int) (0x80 * alpha) << 24 | 0x606080; + DrawerHelper.drawBorder(graphics, pickerX, pickerY, PICKER_SIZE, PICKER_SIZE, pickerBorder, 1); + + // Draw crosshair at current position + int crossX = pickerX + (int) (saturation * PICKER_SIZE); + int crossY = pickerY + (int) ((1f - brightness) * PICKER_SIZE); + int crossColor = (int) (0xFF * alpha) << 24 | 0xFFFFFF; + graphics.fill(crossX - 4, crossY, crossX + 5, crossY + 1, crossColor); + graphics.fill(crossX, crossY - 4, crossX + 1, crossY + 5, crossColor); + + // Draw hue bar + int hueX = pickerX + PICKER_SIZE + 6; + for (int py = 0; py < PICKER_SIZE; py++) { + float h = (float) py / PICKER_SIZE; + int color = hsbToRgb(h, 1f, 1f); + int pixelAlpha = (int) (0xFF * alpha); + graphics.fill(hueX, pickerY + py, hueX + HUE_BAR_WIDTH, pickerY + py + 1, (pixelAlpha << 24) | color); + } + + // Border around hue bar + DrawerHelper.drawBorder(graphics, hueX, pickerY, HUE_BAR_WIDTH, PICKER_SIZE, pickerBorder, 1); + + // Draw hue indicator + int hueY = pickerY + (int) (hue * PICKER_SIZE); + graphics.fill(hueX - 2, hueY - 1, hueX + HUE_BAR_WIDTH + 2, hueY + 2, crossColor); + } + + private void drawColorPreview(GuiGraphics graphics, int baseX, int baseY, float alpha) { + int previewX = baseX + 6 + PICKER_SIZE + 6 + HUE_BAR_WIDTH + 8; + int previewY = baseY + TITLE_HEIGHT + 4; + int previewSize = 30; + + // Background checkerboard for transparency reference + int checkSize = 5; + for (int cy = 0; cy < previewSize / checkSize; cy++) { + for (int cx = 0; cx < previewSize / checkSize; cx++) { + int checkColor = ((cx + cy) % 2 == 0) ? 0xFF404040 : 0xFF808080; + graphics.fill(previewX + cx * checkSize, previewY + cy * checkSize, + previewX + (cx + 1) * checkSize, previewY + (cy + 1) * checkSize, checkColor); + } + } + + // Color preview + int previewAlpha = (int) (0xFF * alpha); + graphics.fill(previewX, previewY, previewX + previewSize, previewY + previewSize, + (previewAlpha << 24) | currentColor); + + // Border + int previewBorder = (int) (0x80 * alpha) << 24 | 0x606080; + DrawerHelper.drawBorder(graphics, previewX, previewY, previewSize, previewSize, previewBorder, 1); + + // Label + var font = Minecraft.getInstance().font; + int textColor = (int) (0xFF * alpha) << 24 | 0xA0A0B0; + graphics.drawString(font, "Preview", previewX, previewY + previewSize + 4, textColor, false); + } + + private void drawCloseButton(GuiGraphics graphics, int x, int y, int mouseX, int mouseY, float alpha) { + int size = 10; + boolean hovered = mouseX >= x && mouseX < x + size && mouseY >= y && mouseY < y + size; + + int bgColor = hovered ? (int) (0xC0 * alpha) << 24 | 0xFF4444 : (int) (0x60 * alpha) << 24 | 0x404050; + int fgColor = (int) (0xFF * alpha) << 24 | 0xFFFFFF; + + graphics.fill(x, y, x + size, y + size, bgColor); + + // X mark + graphics.fill(x + 2, y + 3, x + 4, y + 7, fgColor); + graphics.fill(x + 6, y + 3, x + 8, y + 7, fgColor); + graphics.fill(x + 3, y + 4, x + 7, y + 6, fgColor); + } + + private void drawResetButton(GuiGraphics graphics, int x, int y, int mouseX, int mouseY, float alpha) { + int bw = 44; + int bh = 16; + boolean hovered = mouseX >= x && mouseX < x + bw && mouseY >= y && mouseY < y + bh; + + int bgColor = hovered ? (int) (0xC0 * alpha) << 24 | 0x4080FF : (int) (0x80 * alpha) << 24 | 0x404060; + + graphics.fill(x, y, x + bw, y + bh, bgColor); + DrawerHelper.drawBorder(graphics, x, y, bw, bh, (int) (0x80 * alpha) << 24 | 0x606080, 1); + + var font = Minecraft.getInstance().font; + String text = "Reset"; + int textX = x + (bw - font.width(text)) / 2; + int textY = y + (bh - font.lineHeight) / 2; + int textColor = (int) (0xFF * alpha) << 24 | 0xFFFFFF; + graphics.drawString(font, text, textX, textY, textColor, false); + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (!isVisible()) return false; + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + + // Check close button + int closeX = x + w - 14; + int closeY = y + 3; + if (mouseX >= closeX && mouseX < closeX + 10 && mouseY >= closeY && mouseY < closeY + 10) { + if (onClose != null) { + onClose.run(); + } + hide(); + playButtonClickSound(); + return true; + } + + // Check reset button + int resetX = x + w - 50; + int resetY = y + HEIGHT - 26; + if (mouseX >= resetX && mouseX < resetX + 44 && mouseY >= resetY && mouseY < resetY + 16) { + resetToDefault(); + playButtonClickSound(); + return true; + } + + // Check color picker area + int pickerX = x + 6; + int pickerY = y + TITLE_HEIGHT + 4; + if (mouseX >= pickerX && mouseX < pickerX + PICKER_SIZE && + mouseY >= pickerY && mouseY < pickerY + PICKER_SIZE) { + draggingPicker = true; + updatePickerFromMouse(mouseX, mouseY, pickerX, pickerY); + return true; + } + + // Check hue bar + int hueX = pickerX + PICKER_SIZE + 6; + if (mouseX >= hueX && mouseX < hueX + HUE_BAR_WIDTH && + mouseY >= pickerY && mouseY < pickerY + PICKER_SIZE) { + draggingHue = true; + updateHueFromMouse(mouseY, pickerY); + return true; + } + + // Check title bar for dragging + if (mouseX >= x && mouseX < x + w - 20 && mouseY >= y && mouseY < y + TITLE_HEIGHT) { + draggingTitle = true; + lastDeltaX = 0; + lastDeltaY = 0; + return true; + } + + // Click inside panel + if (isMouseOverElement(mouseX, mouseY)) { + return super.mouseClicked(mouseX, mouseY, button); + } + + return false; + } + + private void updatePickerFromMouse(double mouseX, double mouseY, int pickerX, int pickerY) { + saturation = Mth.clamp((float) (mouseX - pickerX) / PICKER_SIZE, 0f, 1f); + brightness = Mth.clamp(1f - (float) (mouseY - pickerY) / PICKER_SIZE, 0f, 1f); + updateFromHsb(); + } + + private void updateHueFromMouse(double mouseY, int pickerY) { + hue = Mth.clamp((float) (mouseY - pickerY) / PICKER_SIZE, 0f, 1f); + updateFromHsb(); + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseDragged(double mouseX, double mouseY, int button, double dragX, double dragY) { + if (draggingPicker) { + int pickerX = getPosition().x + 6; + int pickerY = getPosition().y + TITLE_HEIGHT + 4; + updatePickerFromMouse(mouseX, mouseY, pickerX, pickerY); + return true; + } + + if (draggingHue) { + int pickerY = getPosition().y + TITLE_HEIGHT + 4; + updateHueFromMouse(mouseY, pickerY); + return true; + } + + if (draggingTitle) { + double dx = dragX + lastDeltaX; + double dy = dragY + lastDeltaY; + int intDx = (int) dx; + int intDy = (int) dy; + lastDeltaX = dx - intDx; + lastDeltaY = dy - intDy; + addSelfPosition(intDx, intDy); + return true; + } + + return super.mouseDragged(mouseX, mouseY, button, dragX, dragY); + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseReleased(double mouseX, double mouseY, int button) { + if (draggingPicker || draggingHue || draggingTitle) { + draggingPicker = false; + draggingHue = false; + draggingTitle = false; + lastDeltaX = 0; + lastDeltaY = 0; + return true; + } + return super.mouseReleased(mouseX, mouseY, button); + } + + private static float[] rgbToHsb(int rgb) { + int r = (rgb >> 16) & 0xFF; + int g = (rgb >> 8) & 0xFF; + int b = rgb & 0xFF; + + float[] hsb = new float[3]; + java.awt.Color.RGBtoHSB(r, g, b, hsb); + return hsb; + } + + private static int hsbToRgb(float h, float s, float b) { + return java.awt.Color.HSBtoRGB(h, s, b) & 0xFFFFFF; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StarfieldBackgroundWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StarfieldBackgroundWidget.java new file mode 100644 index 000000000..417f4b154 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StarfieldBackgroundWidget.java @@ -0,0 +1,312 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine.Stage; + +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.util.Mth; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class StarfieldBackgroundWidget extends Widget { + + private final Supplier stageSupplier; + private final List stars = new ArrayList<>(); + private final List nebulae = new ArrayList<>(); + private final Random random = new Random(42); + + private float driftPhase = 0f; + private float nebulaPhase = 0f; + + private static class BackgroundStar { + + float x, y; + float baseX, baseY; + float size; + float twinkleSpeed; + float twinkleOffset; + int color; + float depth; + } + + private static class Nebula { + + float x, y; + float radius; + int color; + float pulseSpeed; + float pulseOffset; + } + + public StarfieldBackgroundWidget(int x, int y, int width, int height, Supplier stageSupplier) { + super(x, y, width, height); + this.stageSupplier = stageSupplier; + initStars(width, height); + initNebulae(width, height); + } + + private void initStars(int w, int h) { + int starCount = 80; + for (int i = 0; i < starCount; i++) { + BackgroundStar star = new BackgroundStar(); + star.baseX = random.nextFloat() * w; + star.baseY = random.nextFloat() * h; + star.x = star.baseX; + star.y = star.baseY; + star.size = 0.5f + random.nextFloat() * 1.5f; + star.twinkleSpeed = 0.02f + random.nextFloat() * 0.05f; + star.twinkleOffset = random.nextFloat() * Mth.TWO_PI; + star.depth = 0.3f + random.nextFloat() * 0.7f; + + float colorRand = random.nextFloat(); + if (colorRand < 0.6f) { + star.color = 0xFFFFFF; + } else if (colorRand < 0.75f) { + star.color = 0xFFDDAA; + } else if (colorRand < 0.85f) { + star.color = 0xAADDFF; + } else if (colorRand < 0.95f) { + star.color = 0xFFAAAA; + } else { + star.color = 0xAAFFAA; + } + + stars.add(star); + } + } + + private void initNebulae(int w, int h) { + int nebulaCount = 4; + int[] nebulaColors = { 0x4020A0, 0xA02040, 0x204080, 0x802060 }; + + for (int i = 0; i < nebulaCount; i++) { + Nebula nebula = new Nebula(); + nebula.x = random.nextFloat() * w; + nebula.y = random.nextFloat() * h; + nebula.radius = 30 + random.nextFloat() * 50; + nebula.color = nebulaColors[i % nebulaColors.length]; + nebula.pulseSpeed = 0.01f + random.nextFloat() * 0.02f; + nebula.pulseOffset = random.nextFloat() * Mth.TWO_PI; + nebulae.add(nebula); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + + Stage stage = stageSupplier.get(); + float driftSpeed = getDriftSpeed(stage); + driftPhase += driftSpeed; + nebulaPhase += 0.02f; + + float driftX = Mth.sin(driftPhase * 0.3f) * 2f; + float driftY = Mth.cos(driftPhase * 0.2f) * 1.5f; + + for (BackgroundStar star : stars) { + star.x = star.baseX + driftX * star.depth; + star.y = star.baseY + driftY * star.depth; + } + } + + private float getDriftSpeed(Stage stage) { + return switch (stage) { + case EMPTY -> 0.01f; + case GROWING -> 0.02f; + case STAR -> 0.015f; + case SUPERSTAR -> 0.03f; + case BLACK_HOLE -> 0.05f; + case DEATH -> 0.08f; + case DEATH_GRACEFUL -> 0.005f; + }; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + Stage stage = stageSupplier.get(); + + drawDeepSpaceGradient(graphics, x, y, w, h, stage); + drawNebulae(graphics, x, y, w, h, stage); + drawStars(graphics, x, y, w, h, stage); + + if (stage == Stage.BLACK_HOLE) { + drawGravitationalDistortion(graphics, x, y, w, h); + } + } + + private void drawDeepSpaceGradient(GuiGraphics graphics, int x, int y, int w, int h, Stage stage) { + int topColor, bottomColor; + + switch (stage) { + case EMPTY -> { + topColor = 0xFF08080C; + bottomColor = 0xFF040406; + } + case GROWING -> { + topColor = 0xFF0A0A14; + bottomColor = 0xFF060610; + } + case STAR -> { + topColor = 0xFF100808; + bottomColor = 0xFF080404; + } + case SUPERSTAR -> { + topColor = 0xFF140808; + bottomColor = 0xFF0A0404; + } + case BLACK_HOLE -> { + topColor = 0xFF0C0410; + bottomColor = 0xFF040208; + } + case DEATH -> { + topColor = 0xFF140404; + bottomColor = 0xFF0A0202; + } + default -> { + topColor = 0xFF0A0808; + bottomColor = 0xFF050404; + } + } + + for (int row = 0; row < h; row++) { + float progress = (float) row / h; + int color = lerpColor(topColor, bottomColor, progress); + graphics.fill(x, y + row, x + w, y + row + 1, color); + } + } + + private void drawNebulae(GuiGraphics graphics, int x, int y, int w, int h, Stage stage) { + float intensity = switch (stage) { + case EMPTY -> 0.3f; + case GROWING -> 0.5f; + case STAR -> 0.6f; + case SUPERSTAR -> 0.8f; + case BLACK_HOLE -> 1.0f; + case DEATH -> 0.4f; + case DEATH_GRACEFUL -> 0.2f; + }; + + for (Nebula nebula : nebulae) { + float pulse = Mth.sin(nebulaPhase + nebula.pulseOffset) * 0.3f + 0.7f; + float radius = nebula.radius * pulse; + + int layers = 8; + for (int layer = layers; layer > 0; layer--) { + float layerProgress = (float) layer / layers; + float layerRadius = radius * layerProgress; + + int alpha = (int) (0x08 * intensity * (1f - layerProgress * 0.7f)); + int color = (alpha << 24) | (nebula.color & 0x00FFFFFF); + + int nx = x + (int) nebula.x; + int ny = y + (int) nebula.y; + int r = (int) layerRadius; + + for (int py = -r; py <= r; py++) { + int halfWidth = (int) Math.sqrt(r * r - py * py); + int drawY = ny + py; + if (drawY >= y && drawY < y + h) { + int x1 = Math.max(x, nx - halfWidth); + int x2 = Math.min(x + w, nx + halfWidth); + if (x1 < x2) { + graphics.fill(x1, drawY, x2, drawY + 1, color); + } + } + } + } + } + } + + private void drawStars(GuiGraphics graphics, int x, int y, int w, int h, Stage stage) { + float baseAlpha = switch (stage) { + case EMPTY -> 0.4f; + case GROWING -> 0.6f; + case STAR -> 0.8f; + case SUPERSTAR -> 0.7f; + case BLACK_HOLE -> 0.5f; + case DEATH -> 0.3f; + case DEATH_GRACEFUL -> 0.5f; + }; + + for (BackgroundStar star : stars) { + float twinkle = Mth.sin(driftPhase * star.twinkleSpeed * 60f + star.twinkleOffset); + float brightness = 0.6f + 0.4f * twinkle; + int alpha = (int) (0xFF * baseAlpha * brightness); + + int starX = x + (int) star.x; + int starY = y + (int) star.y; + + if (starX < x || starX >= x + w || starY < y || starY >= y + h) continue; + + int color = (alpha << 24) | (star.color & 0x00FFFFFF); + + if (star.size > 1.2f) { + graphics.fill(starX - 1, starY, starX + 2, starY + 1, color); + graphics.fill(starX, starY - 1, starX + 1, starY + 2, color); + } else { + graphics.fill(starX, starY, starX + 1, starY + 1, color); + } + + if (star.size > 1.5f && brightness > 0.8f) { + int glowAlpha = (int) (alpha * 0.3f); + int glowColor = (glowAlpha << 24) | (star.color & 0x00FFFFFF); + graphics.fill(starX - 1, starY - 1, starX + 2, starY + 2, glowColor); + } + } + } + + private void drawGravitationalDistortion(GuiGraphics graphics, int x, int y, int w, int h) { + int cx = x + w / 2; + int cy = y + h / 2; + + for (int ring = 0; ring < 5; ring++) { + float ringPhase = driftPhase * 0.5f + ring * 0.5f; + float ringRadius = 30 + ring * 20 + Mth.sin(ringPhase) * 5; + + int alpha = 0x15 - ring * 0x03; + int color = (alpha << 24) | 0x8040FF; + + int r = (int) ringRadius; + for (int angle = 0; angle < 360; angle += 4) { + float rad = angle * Mth.DEG_TO_RAD; + int px = cx + (int) (Mth.cos(rad) * r); + int py = cy + (int) (Mth.sin(rad) * r * 0.4f); + + if (px >= x && px < x + w && py >= y && py < y + h) { + graphics.fill(px, py, px + 1, py + 1, color); + } + } + } + } + + private int lerpColor(int c1, int c2, float t) { + int a1 = (c1 >> 24) & 0xFF, a2 = (c2 >> 24) & 0xFF; + int r1 = (c1 >> 16) & 0xFF, r2 = (c2 >> 16) & 0xFF; + int g1 = (c1 >> 8) & 0xFF, g2 = (c2 >> 8) & 0xFF; + int b1 = c1 & 0xFF, b2 = c2 & 0xFF; + + int a = (int) Mth.lerp(t, a1, a2); + int r = (int) Mth.lerp(t, r1, r2); + int g = (int) Mth.lerp(t, g1, g2); + int b = (int) Mth.lerp(t, b1, b2); + + return (a << 24) | (r << 16) | (g << 8) | b; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarBackgroundWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarBackgroundWidget.java new file mode 100644 index 000000000..9c79db144 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarBackgroundWidget.java @@ -0,0 +1,285 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine.Stage; + +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.util.Mth; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +/** + * Full-screen background widget that provides unified visual styling + * for the entire Stellar Iris UI, including the inventory area. + */ +public class StellarBackgroundWidget extends Widget { + + private final Supplier stageSupplier; + private float animPhase = 0f; + + public StellarBackgroundWidget(int x, int y, int width, int height, Supplier stageSupplier) { + super(x, y, width, height); + this.stageSupplier = stageSupplier; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + animPhase += 0.02f; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + Stage stage = stageSupplier.get(); + + DrawerHelper.drawGradientRect(graphics, x, y, w, h, 0xFF0c0c12, 0xFF060608, false); + + drawGridPattern(graphics, x, y, w, h); + + drawSidePanels(graphics, x, y, w, h, stage); + + int accentColor = getStageAccentColor(stage, 0.4f); + drawCornerAccents(graphics, x, y, w, h, accentColor); + + int borderColor = getStageAccentColor(stage, 0.2f); + DrawerHelper.drawBorder(graphics, x, y, w, h, borderColor, 1); + } + + private void drawGridPattern(GuiGraphics graphics, int x, int y, int w, int h) { + int gridColor = 0x08FFFFFF; + int spacing = 16; + + // Vertical lines + for (int gx = x + spacing; gx < x + w; gx += spacing) { + graphics.fill(gx, y, gx + 1, y + h, gridColor); + } + + // Horizontal lines + for (int gy = y + spacing; gy < y + h; gy += spacing) { + graphics.fill(x, gy, x + w, gy + 1, gridColor); + } + } + + private void drawCornerAccents(GuiGraphics graphics, int x, int y, int w, int h, int color) { + int len = 20; + int thickness = 2; + + // Top-left + graphics.fill(x, y, x + len, y + thickness, color); + graphics.fill(x, y, x + thickness, y + len, color); + + // Top-right + graphics.fill(x + w - len, y, x + w, y + thickness, color); + graphics.fill(x + w - thickness, y, x + w, y + len, color); + + // Bottom-left + graphics.fill(x, y + h - thickness, x + len, y + h, color); + graphics.fill(x, y + h - len, x + thickness, y + h, color); + + // Bottom-right + graphics.fill(x + w - len, y + h - thickness, x + w, y + h, color); + graphics.fill(x + w - thickness, y + h - len, x + w, y + h, color); + } + + private void drawSidePanels(GuiGraphics graphics, int x, int y, int w, int h, Stage stage) { + int invWidth = 162; + int invX = x + (w - invWidth) / 2; + + int leftPanelW = invX - x - 5; + if (leftPanelW > 10) { + drawTechPanel(graphics, x + 3, y + h - 85, leftPanelW, 80, stage, true); + } + + int rightPanelX = invX + invWidth + 5; + int rightPanelW = (x + w) - rightPanelX - 3; + if (rightPanelW > 10) { + drawStatsPanel(graphics, rightPanelX, y + h - 85, rightPanelW, 80, stage); + } + } + + private void drawStatsPanel(GuiGraphics graphics, int px, int py, int pw, int ph, Stage stage) { + DrawerHelper.drawSolidRect(graphics, px, py, pw, ph, 0x40000000); + + int borderColor = getStageAccentColor(stage, 0.2f); + DrawerHelper.drawBorder(graphics, px, py, pw, ph, borderColor, 1); + + int accentColor = getStageAccentColor(stage, 0.5f); + graphics.fill(px + 1, py + 1, px + pw - 1, py + 3, accentColor); + + var font = net.minecraft.client.Minecraft.getInstance().font; + int labelColor = 0xFF606080; + int valueColor = 0xFFCCCCCC; + + graphics.drawString(font, "STAR STATS", px + 4, py + 6, accentColor, false); + + float temp = getStageTemp(stage); + float mass = getStageMass(stage); + float output = getStageOutput(stage); + + int row1 = py + 20; + int row2 = py + 32; + int row3 = py + 44; + int row4 = py + 56; + + graphics.drawString(font, "TEMP:", px + 4, row1, labelColor, false); + graphics.drawString(font, formatTemp(temp), px + 35, row1, getTemperatureColor(temp), false); + + graphics.drawString(font, "MASS:", px + 4, row2, labelColor, false); + graphics.drawString(font, String.format("%.1f M\u2609", mass), px + 35, row2, valueColor, false); + + graphics.drawString(font, "OUT:", px + 4, row3, labelColor, false); + graphics.drawString(font, formatEnergy(output), px + 30, row3, valueColor, false); + + String status = getStatusString(stage); + graphics.drawString(font, status, px + 4, row4, getStatusColor(stage), false); + } + + private float getStageTemp(Stage stage) { + return switch (stage) { + case EMPTY -> 2.7f; + case GROWING -> 5_000_000f; + case STAR -> 15_000_000f; + case SUPERSTAR -> 100_000_000f; + case BLACK_HOLE -> Float.POSITIVE_INFINITY; + case DEATH -> 500_000_000f; + case DEATH_GRACEFUL -> 1_000_000f; + }; + } + + private float getStageMass(Stage stage) { + return switch (stage) { + case EMPTY -> 0f; + case GROWING -> 0.3f; + case STAR -> 1f; + case SUPERSTAR -> 8f; + case BLACK_HOLE -> 25f; + case DEATH -> 12f; + case DEATH_GRACEFUL -> 0.1f; + }; + } + + private float getStageOutput(Stage stage) { + return switch (stage) { + case EMPTY -> 0f; + case GROWING -> 1_000f; + case STAR -> 50_000f; + case SUPERSTAR -> 500_000f; + case BLACK_HOLE -> 10_000_000f; + case DEATH -> 100_000_000f; + case DEATH_GRACEFUL -> 500f; + }; + } + + private String formatTemp(float temp) { + if (Float.isInfinite(temp)) return "\u221E K"; + if (temp >= 1_000_000) return String.format("%.0fM K", temp / 1_000_000); + if (temp >= 1000) return String.format("%.0fk K", temp / 1000); + return String.format("%.1f K", temp); + } + + private String formatEnergy(float energy) { + if (energy >= 1_000_000) return String.format("%.1f PW", energy / 1_000_000); + if (energy >= 1000) return String.format("%.0f TW", energy / 1000); + return String.format("%.0f GW", energy); + } + + private int getTemperatureColor(float temp) { + if (temp >= 100_000_000) return 0xFFFF4444; + if (temp >= 10_000_000) return 0xFFFFAA44; + if (temp >= 1_000_000) return 0xFFFFFF44; + return 0xFFCCCCCC; + } + + private String getStatusString(Stage stage) { + return switch (stage) { + case EMPTY -> "DORMANT"; + case GROWING -> "IGNITING"; + case STAR -> "STABLE"; + case SUPERSTAR -> "CRITICAL"; + case BLACK_HOLE -> "CONTAINED"; + case DEATH -> "FAILURE"; + case DEATH_GRACEFUL -> "SHUTDOWN"; + }; + } + + private int getStatusColor(Stage stage) { + return switch (stage) { + case EMPTY -> 0xFF606060; + case GROWING -> 0xFF66AAFF; + case STAR -> 0xFF66FF66; + case SUPERSTAR -> 0xFFFFAA44; + case BLACK_HOLE -> 0xFFAA66FF; + case DEATH -> 0xFFFF4444; + case DEATH_GRACEFUL -> 0xFF886666; + }; + } + + private void drawTechPanel(GuiGraphics graphics, int px, int py, int pw, int ph, Stage stage, boolean isLeft) { + // Panel background + DrawerHelper.drawSolidRect(graphics, px, py, pw, ph, 0x40000000); + + // Border + int borderColor = getStageAccentColor(stage, 0.2f); + DrawerHelper.drawBorder(graphics, px, py, pw, ph, borderColor, 1); + + // Accent line at top + int accentColor = getStageAccentColor(stage, 0.5f); + graphics.fill(px + 1, py + 1, px + pw - 1, py + 3, accentColor); + + // Animated scan line + float scanPos = (animPhase * 0.5f) % 1f; + int scanY = py + 5 + (int) ((ph - 10) * scanPos); + int scanColor = getStageAccentColor(stage, 0.15f); + graphics.fill(px + 2, scanY, px + pw - 2, scanY + 2, scanColor); + + // Tech decoration lines + int lineColor = 0x20FFFFFF; + int lineY = py + 15; + for (int i = 0; i < 5 && lineY + 10 < py + ph; i++) { + int lineW = (int) ((pw - 10) * (0.3f + 0.5f * Math.abs(Mth.sin(animPhase + i * 0.5f)))); + if (isLeft) { + graphics.fill(px + 5, lineY, px + 5 + lineW, lineY + 2, lineColor); + } else { + graphics.fill(px + pw - 5 - lineW, lineY, px + pw - 5, lineY + 2, lineColor); + } + lineY += 12; + } + + // Small blinking indicators + int indicatorY = py + ph - 15; + for (int i = 0; i < 3; i++) { + int ix = isLeft ? (px + 8 + i * 8) : (px + pw - 8 - i * 8 - 4); + boolean blink = ((int) (animPhase * 3 + i) % 3) == 0; + int indColor = blink ? getStageAccentColor(stage, 0.8f) : 0x30404050; + graphics.fill(ix, indicatorY, ix + 4, indicatorY + 4, indColor); + } + } + + private int getStageAccentColor(Stage stage, float alpha) { + int a = (int) (alpha * 255) << 24; + return switch (stage) { + case EMPTY -> a | 0x404060; + case GROWING -> a | 0x6080FF; + case STAR -> a | 0xFFCC44; + case SUPERSTAR -> a | 0xFF8844; + case BLACK_HOLE -> a | 0x8040FF; + case DEATH -> a | 0xFF2020; + case DEATH_GRACEFUL -> a | 0x804040; + }; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarCommandConsoleWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarCommandConsoleWidget.java new file mode 100644 index 000000000..51f85e6af --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarCommandConsoleWidget.java @@ -0,0 +1,331 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine; +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine.Stage; + +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; + +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class StellarCommandConsoleWidget extends WidgetGroup { + + public static final int WIDTH = 360; + public static final int HEIGHT = 220; + + private final Supplier machineSupplier; + + private Stage lastSyncedStage = Stage.EMPTY; + private float fuelLevel = 0f; + private boolean canIgnite = false; + private boolean debugPrimed = false; + + private int tickCounter = 0; + + public StellarCommandConsoleWidget(Supplier machineSupplier) { + super(0, 0, WIDTH, HEIGHT); + this.machineSupplier = machineSupplier; + initWidgets(); + } + + private void initWidgets() { + addWidget(new StarfieldBackgroundWidget(0, 0, WIDTH, HEIGHT, this::getCurrentStage)); + + addWidget(new HolographicScanlineWidget(0, 0, WIDTH, HEIGHT, this::getCurrentStage)); + + addWidget(new EnergyConduitWidget(0, 0, WIDTH, HEIGHT, this::getCurrentStage)); + + int coreSize = 130; + int coreX = 20; + int coreY = 30; + addWidget(new StellarCoreWidget(coreX, coreY, coreSize, this::getCurrentStage)); + + addWidget(new OrbitalRingsWidget(coreX - 10, coreY - 10, coreSize + 20, coreSize + 20, this::getCurrentStage)); + + int telemetryX = coreX + coreSize + 25; + int telemetryW = WIDTH - telemetryX - 15; + int telemetryH = 130; + addWidget(new TelemetryPanelWidget(telemetryX, 25, telemetryW, telemetryH, + machineSupplier, this::getCurrentStage)); + + int controlY = 160; + int controlH = HEIGHT - controlY - 10; + addWidget(new ControlPanelWidget(telemetryX, controlY, telemetryW, controlH, + machineSupplier, this)); + + addWidget(new WarningOverlayWidget(0, 0, WIDTH, HEIGHT, this::getCurrentStage)); + + addWidget(new DebugPrimeButton(5, HEIGHT - 19, 50, 14, this::requestDebugPrime)); + } + + public Stage getCurrentStage() { + return lastSyncedStage; + } + + public float getFuelLevel() { + return fuelLevel; + } + + public boolean canIgnite() { + return canIgnite; + } + + public int getTickCounter() { + return tickCounter; + } + + public void requestDebugPrime() { + writeClientAction(3, buf -> {}); + } + + public void requestIgnition() { + writeClientAction(1, buf -> {}); + } + + @Override + public void detectAndSendChanges() { + super.detectAndSendChanges(); + + IrisMultiblockMachine machine = machineSupplier.get(); + if (machine == null) return; + + Stage currentStage = machine.getStage(); + if (currentStage != lastSyncedStage) { + lastSyncedStage = currentStage; + writeUpdateInfo(203, buf -> buf.writeEnum(currentStage)); + } + + float newFuelLevel = calculateFuelLevel(machine); + if (Math.abs(newFuelLevel - fuelLevel) > 0.01f) { + fuelLevel = newFuelLevel; + writeUpdateInfo(204, buf -> buf.writeFloat(fuelLevel)); + } + + boolean newCanIgnite = checkIgnitionRequirements(machine); + if (newCanIgnite != canIgnite) { + canIgnite = newCanIgnite; + writeUpdateInfo(205, buf -> buf.writeBoolean(canIgnite)); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void readUpdateInfo(int id, FriendlyByteBuf buffer) { + if (id == 203) { + lastSyncedStage = buffer.readEnum(Stage.class); + } else if (id == 204) { + fuelLevel = buffer.readFloat(); + } else if (id == 205) { + canIgnite = buffer.readBoolean(); + } else { + super.readUpdateInfo(id, buffer); + } + } + + private float calculateFuelLevel(IrisMultiblockMachine machine) { + if (debugPrimed) return 1f; + + if (machine.getStage() == Stage.EMPTY) { + return machine.getInventory().getStackInSlot(0).isEmpty() ? 0f : 1f; + } + return switch (machine.getStage()) { + case EMPTY -> 0f; + case GROWING -> 0.5f; + case STAR, SUPERSTAR, BLACK_HOLE -> 1f; + case DEATH, DEATH_GRACEFUL -> 0.2f; + }; + } + + private boolean checkIgnitionRequirements(IrisMultiblockMachine machine) { + if (debugPrimed) return true; + if (machine.getStage() != Stage.EMPTY) return false; + if (machine.getInventory().getStackInSlot(0).isEmpty()) return false; + return fuelLevel >= 0.8f; + } + + @Override + public void handleClientAction(int id, FriendlyByteBuf buffer) { + IrisMultiblockMachine machine = machineSupplier.get(); + if (machine == null) return; + + if (id == 1) { + if (canIgnite || debugPrimed) { + machine.setStarStage(); + debugPrimed = false; + } + } else if (id == 2) { + machine.setStarStage(); + } else if (id == 3) { + debugPrimed = true; + } else { + super.handleClientAction(id, buffer); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + tickCounter++; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + drawConsoleFrame(graphics, x, y, w, h); + + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + drawConsoleTitle(graphics, x, y, w); + } + + private void drawConsoleFrame(GuiGraphics graphics, int x, int y, int w, int h) { + int frameColor = getStageFrameColor(lastSyncedStage); + int frameGlow = (0x30 << 24) | (frameColor & 0x00FFFFFF); + + graphics.fill(x - 2, y - 2, x + w + 2, y, frameGlow); + graphics.fill(x - 2, y + h, x + w + 2, y + h + 2, frameGlow); + graphics.fill(x - 2, y, x, y + h, frameGlow); + graphics.fill(x + w, y, x + w + 2, y + h, frameGlow); + + int cornerLen = 15; + int cornerColor = (0xC0 << 24) | frameColor; + + graphics.fill(x, y, x + cornerLen, y + 2, cornerColor); + graphics.fill(x, y, x + 2, y + cornerLen, cornerColor); + + graphics.fill(x + w - cornerLen, y, x + w, y + 2, cornerColor); + graphics.fill(x + w - 2, y, x + w, y + cornerLen, cornerColor); + + graphics.fill(x, y + h - 2, x + cornerLen, y + h, cornerColor); + graphics.fill(x, y + h - cornerLen, x + 2, y + h, cornerColor); + + graphics.fill(x + w - cornerLen, y + h - 2, x + w, y + h, cornerColor); + graphics.fill(x + w - 2, y + h - cornerLen, x + w, y + h, cornerColor); + } + + private void drawConsoleTitle(GuiGraphics graphics, int x, int y, int w) { + var font = Minecraft.getInstance().font; + + String title = "STELLAR IRIS COMMAND CONSOLE"; + int titleW = font.width(title); + int titleX = x + (w - titleW) / 2; + int titleY = y + 8; + + int frameColor = getStageFrameColor(lastSyncedStage); + + int bgW = titleW + 20; + int bgX = x + (w - bgW) / 2; + graphics.fill(bgX, titleY - 3, bgX + bgW, titleY + 11, 0xE0080810); + + int borderColor = (0x80 << 24) | frameColor; + graphics.fill(bgX, titleY - 3, bgX + bgW, titleY - 2, borderColor); + graphics.fill(bgX, titleY + 10, bgX + bgW, titleY + 11, borderColor); + graphics.fill(bgX, titleY - 2, bgX + 1, titleY + 10, borderColor); + graphics.fill(bgX + bgW - 1, titleY - 2, bgX + bgW, titleY + 10, borderColor); + + int textColor = 0xFFFFFFFF; + if (lastSyncedStage == Stage.DEATH && (tickCounter / 5) % 2 == 0) { + textColor = 0xFFFF4444; + } + + graphics.drawString(font, title, titleX, titleY, textColor, true); + } + + private int getStageFrameColor(Stage stage) { + return switch (stage) { + case EMPTY -> 0x506080; + case GROWING -> 0x6090FF; + case STAR -> 0xFFCC44; + case SUPERSTAR -> 0xFF7722; + case BLACK_HOLE -> 0xAA55FF; + case DEATH -> 0xFF3030; + case DEATH_GRACEFUL -> 0x664040; + }; + } + + private static class ControlPanelWidget extends WidgetGroup { + + private final Supplier machineSupplier; + private final StellarCommandConsoleWidget parent; + + public ControlPanelWidget(int x, int y, int width, int height, + Supplier machineSupplier, + StellarCommandConsoleWidget parent) { + super(x, y, width, height); + this.machineSupplier = machineSupplier; + this.parent = parent; + initWidgets(); + } + + private void initWidgets() { + addWidget(new FuelGaugeWidget(5, 5, getSize().width - 75, 22, parent::getFuelLevel)); + + addWidget(new IgnitionButtonWidget( + 5, 30, getSize().width - 75, 22, + parent::canIgnite, + () -> parent.getCurrentStage() == Stage.EMPTY || parent.canIgnite(), + parent::requestIgnition)); + + IrisMultiblockMachine machine = machineSupplier.get(); + if (machine != null) { + int slotX = getSize().width - 65; + SlotWidget starSeedSlot = new SlotWidget(machine.getInventory().storage, 0, slotX, 12, true, true); + starSeedSlot.setBackground(GuiTextures.SLOT, GuiTextures.ATOMIC_OVERLAY_1); + addWidget(starSeedSlot); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + DrawerHelper.drawSolidRect(graphics, x, y, w, h, 0xCC0a0a14); + + Stage stage = parent.getCurrentStage(); + int accentColor = getStageAccentColor(stage); + DrawerHelper.drawBorder(graphics, x, y, w, h, (0x80 << 24) | accentColor, 1); + graphics.fill(x + 1, y + 1, x + w - 1, y + 3, (0x60 << 24) | accentColor); + + var font = Minecraft.getInstance().font; + graphics.drawString(font, "IGNITION CONTROL", x + 5, y - 8, (0xA0 << 24) | accentColor, false); + + int slotX = x + w - 65; + graphics.drawString(font, "SEED", slotX + 8, y + 32, 0xFF606080, false); + + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + } + + private int getStageAccentColor(Stage stage) { + return switch (stage) { + case EMPTY -> 0x506080; + case GROWING -> 0x6090FF; + case STAR -> 0xFFCC44; + case SUPERSTAR -> 0xFF7722; + case BLACK_HOLE -> 0xAA55FF; + case DEATH -> 0xFF3030; + case DEATH_GRACEFUL -> 0x664040; + }; + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarConduitWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarConduitWidget.java new file mode 100644 index 000000000..124fc48ec --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarConduitWidget.java @@ -0,0 +1,277 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine.Stage; + +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.util.Mth; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class StellarConduitWidget extends Widget { + + private final Supplier stageSupplier; + private final int coreX, coreY, coreSize; + private final int panelX, panelY, panelW, panelH; + + private final List pulses = new ArrayList<>(); + private float flowPhase = 0f; + + private static class EnergyPulse { + + float position; + float speed; + float intensity; + int pathIndex; + boolean alive = true; + } + + public StellarConduitWidget(int x, int y, int width, int height, + int coreX, int coreY, int coreSize, + int panelX, int panelY, int panelW, int panelH, + Supplier stageSupplier) { + super(x, y, width, height); + this.coreX = coreX; + this.coreY = coreY; + this.coreSize = coreSize; + this.panelX = panelX; + this.panelY = panelY; + this.panelW = panelW; + this.panelH = panelH; + this.stageSupplier = stageSupplier; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + + Stage stage = stageSupplier.get(); + float speed = getFlowSpeed(stage); + flowPhase += speed; + + if (stage != Stage.EMPTY && stage != Stage.DEATH_GRACEFUL) { + if (Math.random() < speed * 3) { + spawnPulse(stage); + } + } + + pulses.removeIf(p -> !p.alive); + for (EnergyPulse pulse : pulses) { + pulse.position += pulse.speed; + if (pulse.position > 1f) { + pulse.alive = false; + } + } + } + + private void spawnPulse(Stage stage) { + if (pulses.size() > 15) return; + + EnergyPulse pulse = new EnergyPulse(); + pulse.position = 0f; + pulse.speed = 0.015f + (float) Math.random() * 0.02f; + pulse.intensity = 0.6f + (float) Math.random() * 0.4f; + pulse.pathIndex = (int) (Math.random() * 6); + + if (stage == Stage.DEATH) pulse.speed *= 2.5f; + else if (stage == Stage.BLACK_HOLE) pulse.speed *= 1.8f; + else if (stage == Stage.SUPERSTAR) pulse.speed *= 1.4f; + + pulses.add(pulse); + } + + private float getFlowSpeed(Stage stage) { + return switch (stage) { + case EMPTY -> 0.003f; + case GROWING -> 0.025f; + case STAR -> 0.018f; + case SUPERSTAR -> 0.035f; + case BLACK_HOLE -> 0.045f; + case DEATH -> 0.07f; + case DEATH_GRACEFUL -> 0.008f; + }; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + int x = getPosition().x; + int y = getPosition().y; + + Stage stage = stageSupplier.get(); + int color = getStageColor(stage); + + drawConduitPaths(graphics, x, y, color, stage); + drawFlowingEnergy(graphics, x, y, color, stage); + drawPulses(graphics, x, y, color); + drawJunctionNodes(graphics, x, y, color, stage); + } + + private void drawConduitPaths(GuiGraphics graphics, int ox, int oy, int color, Stage stage) { + int lineColor = 0x30000000 | (color & 0x00FFFFFF); + int glowColor = 0x15000000 | (color & 0x00FFFFFF); + + int cx = ox + coreX + coreSize / 2; + int cy = ox + coreY + coreSize / 2; + int coreRadius = coreSize / 2 + 5; + + int px = ox + panelX; + int py = oy + panelY; + int pw = panelW; + int ph = panelH; + + drawHorizontalConduit(graphics, cx + coreRadius, cy - 20, px - (cx + coreRadius), lineColor, glowColor); + drawHorizontalConduit(graphics, cx + coreRadius, cy + 20, px - (cx + coreRadius), lineColor, glowColor); + + drawVerticalConduit(graphics, px + pw / 2, py, oy + 5 - py, lineColor, glowColor); + drawVerticalConduit(graphics, px + pw / 2, py + ph, oy + getSize().height - 5 - (py + ph), lineColor, + glowColor); + + drawVerticalConduit(graphics, ox + coreX + coreSize / 2, oy + 5, coreY - 10, lineColor, glowColor); + drawVerticalConduit(graphics, ox + coreX + coreSize / 2, oy + coreY + coreSize + 5, + getSize().height - coreY - coreSize - 10, lineColor, glowColor); + } + + private void drawHorizontalConduit(GuiGraphics graphics, int x, int y, int length, int lineColor, int glowColor) { + if (length <= 0) return; + graphics.fill(x, y - 1, x + length, y + 2, glowColor); + graphics.fill(x, y, x + length, y + 1, lineColor); + } + + private void drawVerticalConduit(GuiGraphics graphics, int x, int y, int length, int lineColor, int glowColor) { + if (length <= 0) return; + graphics.fill(x - 1, y, x + 2, y + length, glowColor); + graphics.fill(x, y, x + 1, y + length, lineColor); + } + + private void drawFlowingEnergy(GuiGraphics graphics, int ox, int oy, int color, Stage stage) { + if (stage == Stage.EMPTY) return; + + int segments = 12; + float segmentSpacing = 1f / segments; + + int cx = ox + coreX + coreSize / 2; + int cy = oy + coreY + coreSize / 2; + int coreRadius = coreSize / 2 + 5; + int px = ox + panelX; + + for (int i = 0; i < segments; i++) { + float phase = (flowPhase + i * segmentSpacing) % 1f; + float brightness = Mth.sin(phase * Mth.PI); + if (brightness < 0.15f) continue; + + int alpha = (int) (0x80 * brightness); + int segColor = (alpha << 24) | (color & 0x00FFFFFF); + + int topConduitX = cx + coreRadius + (int) ((px - cx - coreRadius) * phase); + graphics.fill(topConduitX - 1, cy - 21, topConduitX + 2, cy - 19, segColor); + + int bottomConduitX = cx + coreRadius + (int) ((px - cx - coreRadius) * (1f - phase)); + graphics.fill(bottomConduitX - 1, cy + 19, bottomConduitX + 2, cy + 21, segColor); + } + } + + private void drawPulses(GuiGraphics graphics, int ox, int oy, int color) { + int cx = ox + coreX + coreSize / 2; + int cy = oy + coreY + coreSize / 2; + int coreRadius = coreSize / 2 + 5; + int px = ox + panelX; + int py = oy + panelY; + int pw = panelW; + int ph = panelH; + + for (EnergyPulse pulse : pulses) { + float brightness = pulse.intensity * (1f - pulse.position * 0.3f); + int alpha = (int) (0xDD * brightness); + int pulseColor = (alpha << 24) | (color & 0x00FFFFFF); + int coreColor = (alpha << 24) | 0xFFFFFF; + + int pulseX, pulseY; + + switch (pulse.pathIndex % 6) { + case 0 -> { + pulseX = cx + coreRadius + (int) ((px - cx - coreRadius) * pulse.position); + pulseY = cy - 20; + } + case 1 -> { + pulseX = cx + coreRadius + (int) ((px - cx - coreRadius) * pulse.position); + pulseY = cy + 20; + } + case 2 -> { + pulseX = px + pw / 2; + pulseY = py - (int) ((py - oy - 5) * pulse.position); + } + case 3 -> { + pulseX = px + pw / 2; + pulseY = py + ph + (int) ((oy + getSize().height - 5 - py - ph) * pulse.position); + } + case 4 -> { + pulseX = ox + coreX + coreSize / 2; + pulseY = oy + 5 + (int) ((coreY - 10) * pulse.position); + } + default -> { + pulseX = ox + coreX + coreSize / 2; + pulseY = oy + coreY + coreSize + 5 + + (int) ((getSize().height - coreY - coreSize - 10) * pulse.position); + } + } + + graphics.fill(pulseX - 2, pulseY - 2, pulseX + 3, pulseY + 3, pulseColor); + graphics.fill(pulseX - 1, pulseY - 1, pulseX + 2, pulseY + 2, coreColor); + } + } + + private void drawJunctionNodes(GuiGraphics graphics, int ox, int oy, int color, Stage stage) { + float pulse = Mth.sin(flowPhase * 4f) * 0.3f + 0.7f; + int nodeAlpha = (int) (0x90 * pulse); + int nodeColor = (nodeAlpha << 24) | (color & 0x00FFFFFF); + int nodeGlow = (nodeAlpha / 2 << 24) | (color & 0x00FFFFFF); + + int cx = ox + coreX + coreSize / 2; + int cy = oy + coreY + coreSize / 2; + int coreRadius = coreSize / 2 + 5; + int px = ox + panelX; + int py = oy + panelY; + int pw = panelW; + int ph = panelH; + + int[][] nodes = { + { cx + coreRadius, cy - 20 }, + { cx + coreRadius, cy + 20 }, + { px, cy - 20 }, + { px, cy + 20 }, + { px + pw / 2, py }, + { px + pw / 2, py + ph }, + { cx, oy + 5 }, + { cx, oy + getSize().height - 5 }, + }; + + for (int[] node : nodes) { + graphics.fill(node[0] - 3, node[1] - 3, node[0] + 4, node[1] + 4, nodeGlow); + graphics.fill(node[0] - 2, node[1] - 2, node[0] + 3, node[1] + 3, nodeColor); + graphics.fill(node[0] - 1, node[1] - 1, node[0] + 2, node[1] + 2, 0xDDFFFFFF); + } + } + + private int getStageColor(Stage stage) { + return switch (stage) { + case EMPTY -> 0x506080; + case GROWING -> 0x6090FF; + case STAR -> 0xFFCC44; + case SUPERSTAR -> 0xFF7722; + case BLACK_HOLE -> 0xAA55FF; + case DEATH -> 0xFF3030; + case DEATH_GRACEFUL -> 0x664040; + }; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarCoreWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarCoreWidget.java new file mode 100644 index 000000000..20ca533f3 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarCoreWidget.java @@ -0,0 +1,432 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine.Stage; + +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.util.Mth; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class StellarCoreWidget extends Widget { + + private final Supplier stageSupplier; + private final java.util.function.IntSupplier customColorSupplier; + + private float animPhase = 0f; + private float pulsePhase = 0f; + private float transitionProgress = 1f; + private Stage previousStage = Stage.EMPTY; + private Stage targetStage = Stage.EMPTY; + + private float prestigeScale = 1f; + private float prestigeAlpha = 1f; + private boolean prestigeAnimating = false; + + public StellarCoreWidget(int x, int y, int size, Supplier stageSupplier) { + this(x, y, size, stageSupplier, null); + } + + public StellarCoreWidget(int x, int y, int size, Supplier stageSupplier, + java.util.function.IntSupplier customColorSupplier) { + super(x, y, size, size); + this.stageSupplier = stageSupplier; + this.customColorSupplier = customColorSupplier; + } + + private int getCustomColor() { + return customColorSupplier != null ? customColorSupplier.getAsInt() : -1; + } + + public void setPrestigeScale(float scale) { + this.prestigeScale = Mth.clamp(scale, 0f, 1f); + } + + public void setPrestigeAlpha(float alpha) { + this.prestigeAlpha = Mth.clamp(alpha, 0f, 1f); + } + + public void setPrestigeAnimating(boolean animating) { + this.prestigeAnimating = animating; + if (!animating) { + this.prestigeScale = 1f; + this.prestigeAlpha = 1f; + } + } + + public boolean isPrestigeAnimating() { + return prestigeAnimating; + } + + public float getPrestigeScale() { + return prestigeScale; + } + + public float getPrestigeAlpha() { + return prestigeAlpha; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + animPhase += 0.03f; + pulsePhase += 0.08f; + + Stage current = stageSupplier.get(); + if (current != targetStage) { + previousStage = targetStage; + targetStage = current; + transitionProgress = 0f; + } + + if (transitionProgress < 1f) { + transitionProgress = Math.min(1f, transitionProgress + 0.02f); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + if (prestigeAnimating && prestigeAlpha <= 0f) { + return; + } + + int cx = getPosition().x + getSize().width / 2; + int cy = getPosition().y + getSize().height / 2; + int maxRadius = getSize().width / 2 - 5; + + if (prestigeAnimating) { + maxRadius = (int) (maxRadius * prestigeScale); + } + + Stage stage = stageSupplier.get(); + + drawVoidBackground(graphics, cx, cy, getSize().width / 2 - 5); + + switch (stage) { + case EMPTY -> drawEmptyCore(graphics, cx, cy, maxRadius); + case GROWING -> drawGrowingCore(graphics, cx, cy, maxRadius); + case STAR -> drawStarCore(graphics, cx, cy, maxRadius); + case SUPERSTAR -> drawSuperstarCore(graphics, cx, cy, maxRadius); + case BLACK_HOLE -> drawBlackHoleCore(graphics, cx, cy, maxRadius); + case DEATH, DEATH_GRACEFUL -> drawDeathCore(graphics, cx, cy, maxRadius, stage); + } + + if (!prestigeAnimating) { + drawStageLabel(graphics, cx, stage); + } + } + + private void drawVoidBackground(GuiGraphics graphics, int cx, int cy, int radius) { + for (int r = radius; r > 0; r -= 3) { + float progress = (float) r / radius; + int alpha = (int) (30 * progress); + int color = (alpha << 24) | 0x101020; + drawCircle(graphics, cx, cy, r, color); + } + } + + private void drawEmptyCore(GuiGraphics graphics, int cx, int cy, int radius) { + float pulse = 0.5f + 0.3f * Mth.sin(pulsePhase); + int alpha = (int) (pulse * 60); + + drawCircleRing(graphics, cx, cy, radius - 5, 2, (alpha << 24) | 0x404060); + + int innerRadius = radius / 3; + for (int r = innerRadius; r > 0; r -= 2) { + float glowProgress = (float) r / innerRadius; + int glowAlpha = (int) (20 * glowProgress * pulse); + drawCircle(graphics, cx, cy, r, (glowAlpha << 24) | 0x303050); + } + + drawCircle(graphics, cx, cy, 3, (int) (pulse * 100) << 24 | 0x505080); + } + + private void drawGrowingCore(GuiGraphics graphics, int cx, int cy, int radius) { + float pulse = 0.8f + 0.2f * Mth.sin(pulsePhase * 1.5f); + float grow = 0.3f + 0.4f * (Mth.sin(animPhase * 0.5f) * 0.5f + 0.5f); + + int coreRadius = (int) (radius * grow * pulse); + + for (int i = 0; i < 8; i++) { + float angle = animPhase * 2f + i * Mth.PI / 4f; + float dist = radius * 0.8f * (0.5f + 0.5f * Mth.sin(animPhase + i)); + int px = cx + (int) (Mth.cos(angle) * dist); + int py = cy + (int) (Mth.sin(angle) * dist); + int pAlpha = (int) (100 * (1f - dist / (radius * 0.8f))); + drawCircle(graphics, px, py, 2, (pAlpha << 24) | 0x6090FF); + } + + int[] colors = { 0x2040A0, 0x4060C0, 0x6080E0, 0x80A0FF }; + for (int layer = 0; layer < colors.length; layer++) { + int layerRadius = coreRadius - layer * 3; + if (layerRadius > 0) { + int alpha = 60 + layer * 30; + drawCircle(graphics, cx, cy, layerRadius, (alpha << 24) | colors[layer]); + } + } + + drawCircle(graphics, cx, cy, Math.max(3, coreRadius / 4), 0xDDFFFFFF); + } + + private void drawStarCore(GuiGraphics graphics, int cx, int cy, int radius) { + float pulse = 0.95f + 0.05f * Mth.sin(pulsePhase); + int coreRadius = (int) (radius * 0.7f * pulse); + + int customColor = getCustomColor(); + int baseColor = customColor != -1 ? customColor : 0xFFCC44; + + int[] colors = generateColorGradient(baseColor); + int coronaColor = blendTowardsWhite(baseColor, 0.3f); + + for (int r = coreRadius + 15; r > coreRadius; r -= 2) { + float glowProgress = (float) (r - coreRadius) / 15f; + int alpha = (int) ((1f - glowProgress) * 60); + drawCircle(graphics, cx, cy, r, (alpha << 24) | coronaColor); + } + + for (int layer = 0; layer < colors.length; layer++) { + int layerRadius = coreRadius - layer * (coreRadius / colors.length); + if (layerRadius > 0) { + int alpha = 180 + layer * 15; + alpha = Math.min(255, alpha); + drawCircle(graphics, cx, cy, layerRadius, (alpha << 24) | colors[layer]); + } + } + + int hotCenterRadius = coreRadius / 4; + drawCircle(graphics, cx, cy, hotCenterRadius, 0xEEFFFFFF); + + drawSolarFlares(graphics, cx, cy, coreRadius, coronaColor); + } + + private void drawSuperstarCore(GuiGraphics graphics, int cx, int cy, int radius) { + float pulse = 0.9f + 0.1f * Mth.sin(pulsePhase * 0.7f); + int coreRadius = (int) (radius * 0.85f * pulse); + + int customColor = getCustomColor(); + int baseColor = customColor != -1 ? shiftHue(customColor, 0.05f) : 0xFF7722; + + int[] colors = generateColorGradient(baseColor); + int coronaColor = darken(baseColor, 0.7f); + + for (int r = coreRadius + 20; r > coreRadius; r -= 2) { + float glowProgress = (float) (r - coreRadius) / 20f; + int alpha = (int) ((1f - glowProgress) * 80); + drawCircle(graphics, cx, cy, r, (alpha << 24) | coronaColor); + } + + for (int layer = 0; layer < colors.length; layer++) { + int layerRadius = coreRadius - layer * (coreRadius / colors.length); + if (layerRadius > 0) { + int alpha = 200 + layer * 11; + alpha = Math.min(255, alpha); + drawCircle(graphics, cx, cy, layerRadius, (alpha << 24) | colors[layer]); + } + } + + drawCircle(graphics, cx, cy, coreRadius / 3, 0xFFFFEECC); + + drawSolarFlares(graphics, cx, cy, coreRadius, coronaColor); + drawSolarFlares(graphics, cx, cy, coreRadius * 0.8f, blendTowardsWhite(baseColor, 0.5f)); + } + + private void drawBlackHoleCore(GuiGraphics graphics, int cx, int cy, int radius) { + int eventHorizonRadius = (int) (radius * 0.3f); + drawCircle(graphics, cx, cy, eventHorizonRadius, 0xFF000000); + + float diskPulse = 0.9f + 0.1f * Mth.sin(pulsePhase * 0.5f); + for (int i = 0; i < 360; i += 5) { + float angle = Mth.DEG_TO_RAD * i + animPhase; + float diskRadius = radius * 0.7f * diskPulse; + float variance = 0.1f * Mth.sin(angle * 3 + animPhase * 2); + diskRadius *= (1f + variance); + + int px = cx + (int) (Mth.cos(angle) * diskRadius); + int py = cy + (int) (Mth.sin(angle) * diskRadius * 0.3f); + + float colorPhase = (i / 360f + animPhase * 0.1f) % 1f; + int r = (int) (128 + 127 * Mth.sin(colorPhase * Mth.TWO_PI)); + int g = (int) (64 + 64 * Mth.sin(colorPhase * Mth.TWO_PI + 1)); + int b = (int) (180 + 75 * Mth.sin(colorPhase * Mth.TWO_PI + 2)); + int color = 0xAA000000 | (r << 16) | (g << 8) | b; + + drawCircle(graphics, px, py, 2, color); + } + + drawCircleRing(graphics, cx, cy, eventHorizonRadius + 3, 2, 0x60FFFFFF); + + for (int r = eventHorizonRadius; r > eventHorizonRadius - 10 && r > 0; r--) { + int alpha = (int) (40 * (1f - (float) (eventHorizonRadius - r) / 10f)); + drawCircle(graphics, cx, cy, r, (alpha << 24) | 0x6040A0); + } + } + + private void drawDeathCore(GuiGraphics graphics, int cx, int cy, int radius, Stage stage) { + boolean graceful = stage == Stage.DEATH_GRACEFUL; + + float pulse; + if (graceful) { + pulse = 0.3f + 0.2f * Mth.sin(pulsePhase * 0.3f); + } else { + pulse = 0.5f + 0.3f * Mth.sin(pulsePhase * 3f) + 0.2f * Mth.sin(pulsePhase * 7f + 1.3f) + + 0.1f * Mth.sin(pulsePhase * 11f + 2.7f); + pulse = Mth.clamp(pulse, 0.2f, 1.2f); + } + + int coreRadius = (int) (radius * 0.5f * pulse); + + int[] colors = graceful ? new int[] { 0x301010, 0x502020, 0x703030, 0x904040 } : + new int[] { 0x660000, 0xAA0000, 0xDD2200, 0xFF4400 }; + + for (int layer = 0; layer < colors.length; layer++) { + int layerRadius = coreRadius - layer * 3; + if (layerRadius > 0) { + int alpha = graceful ? (80 + layer * 20) : (150 + layer * 25); + alpha = Math.min(255, alpha); + drawCircle(graphics, cx, cy, layerRadius, (alpha << 24) | colors[layer]); + } + } + + if (!graceful && Math.random() < 0.1) { + int flickerRadius = coreRadius + (int) (Math.random() * 10); + drawCircle(graphics, cx, cy, flickerRadius, 0x40FF0000); + } + } + + private void drawSolarFlares(GuiGraphics graphics, int cx, int cy, float baseRadius, int color) { + int flareCount = 5; + for (int i = 0; i < flareCount; i++) { + float angle = animPhase * 0.5f + i * Mth.TWO_PI / flareCount; + float flareLength = 8 + 5 * Mth.sin(animPhase * 2 + i * 1.3f); + float dist = baseRadius + flareLength; + + int px = cx + (int) (Mth.cos(angle) * dist); + int py = cy + (int) (Mth.sin(angle) * dist); + + int alpha = (int) (80 + 40 * Mth.sin(animPhase * 3 + i)); + drawCircle(graphics, px, py, 3, (alpha << 24) | color); + } + } + + private void drawCircle(GuiGraphics graphics, int cx, int cy, int radius, int color) { + if (radius <= 0) return; + for (int y = -radius; y <= radius; y++) { + int halfWidth = (int) Math.sqrt(radius * radius - y * y); + graphics.fill(cx - halfWidth, cy + y, cx + halfWidth + 1, cy + y + 1, color); + } + } + + private void drawCircleRing(GuiGraphics graphics, int cx, int cy, int radius, int thickness, int color) { + for (int t = 0; t < thickness; t++) { + int r = radius - t; + if (r <= 0) continue; + for (int angle = 0; angle < 360; angle += 3) { + float rad = angle * Mth.DEG_TO_RAD; + int px = cx + (int) (Mth.cos(rad) * r); + int py = cy + (int) (Mth.sin(rad) * r); + graphics.fill(px, py, px + 1, py + 1, color); + } + } + } + + private void drawStageLabel(GuiGraphics graphics, int cx, Stage stage) { + String label = switch (stage) { + case EMPTY -> "DORMANT"; + case GROWING -> "IGNITING"; + case STAR -> "MAIN SEQUENCE"; + case SUPERSTAR -> "RED GIANT"; + case BLACK_HOLE -> "SINGULARITY"; + case DEATH -> "UNSTABLE"; + case DEATH_GRACEFUL -> "FADING"; + }; + + var font = Minecraft.getInstance().font; + int labelWidth = font.width(label); + int labelX = cx - labelWidth / 2; + int labelY = getPosition().y + getSize().height - 12; + + int textColor = getStageTextColor(stage); + graphics.drawString(font, label, labelX, labelY, textColor, false); + } + + private int getStageTextColor(Stage stage) { + int customColor = getCustomColor(); + if (customColor != -1 && (stage == Stage.STAR || stage == Stage.SUPERSTAR)) { + return 0xFF000000 | customColor; + } + + return switch (stage) { + case EMPTY -> 0xFF606080; + case GROWING -> 0xFF8090FF; + case STAR -> 0xFFFFCC44; + case SUPERSTAR -> 0xFFFF8844; + case BLACK_HOLE -> 0xFFAA66FF; + case DEATH -> 0xFFFF4444; + case DEATH_GRACEFUL -> 0xFF884444; + }; + } + + private int[] generateColorGradient(int baseColor) { + int[] gradient = new int[5]; + float[] hsb = rgbToHsb(baseColor); + + for (int i = 0; i < 5; i++) { + float brightness = 0.3f + (i * 0.175f); + float saturation = Math.max(0.2f, hsb[1] - (i * 0.1f)); + gradient[i] = hsbToRgb(hsb[0], saturation, Math.min(1f, brightness)); + } + + return gradient; + } + + private int blendTowardsWhite(int color, float factor) { + int r = (color >> 16) & 0xFF; + int g = (color >> 8) & 0xFF; + int b = color & 0xFF; + + r = (int) (r + (255 - r) * factor); + g = (int) (g + (255 - g) * factor); + b = (int) (b + (255 - b) * factor); + + return (r << 16) | (g << 8) | b; + } + + private int darken(int color, float factor) { + int r = (int) (((color >> 16) & 0xFF) * factor); + int g = (int) (((color >> 8) & 0xFF) * factor); + int b = (int) ((color & 0xFF) * factor); + + return (r << 16) | (g << 8) | b; + } + + private int shiftHue(int color, float shift) { + float[] hsb = rgbToHsb(color); + hsb[0] = (hsb[0] + shift) % 1f; + if (hsb[0] < 0) hsb[0] += 1f; + return hsbToRgb(hsb[0], hsb[1], hsb[2]); + } + + private static float[] rgbToHsb(int rgb) { + int r = (rgb >> 16) & 0xFF; + int g = (rgb >> 8) & 0xFF; + int b = rgb & 0xFF; + + float[] hsb = new float[3]; + java.awt.Color.RGBtoHSB(r, g, b, hsb); + return hsb; + } + + private static int hsbToRgb(float h, float s, float b) { + return java.awt.Color.HSBtoRGB(h, s, b) & 0xFFFFFF; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarFancyUIWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarFancyUIWidget.java new file mode 100644 index 000000000..19a8ef187 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarFancyUIWidget.java @@ -0,0 +1,383 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine.Stage; + +import com.gregtechceu.gtceu.api.gui.fancy.FancyMachineUIWidget; +import com.gregtechceu.gtceu.api.gui.fancy.IFancyUIProvider; + +import com.lowdragmc.lowdraglib.gui.texture.ColorBorderTexture; +import com.lowdragmc.lowdraglib.gui.texture.ColorRectTexture; +import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; +import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.SlotWidget; +import com.lowdragmc.lowdraglib.gui.widget.Widget; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class StellarFancyUIWidget extends FancyMachineUIWidget { + + private final Supplier stageSupplier; + private Stage lastStage = Stage.EMPTY; + + private static final int BG_COLOR = 0xE00a0a14; + private static final int BORDER_COLOR = 0xFF404060; + private static final int SLOT_BG_COLOR = 0xC0101018; + private static final int SLOT_BORDER_COLOR = 0xFF505070; + + public StellarFancyUIWidget(IFancyUIProvider mainPage, int width, int height, Supplier stageSupplier) { + super(mainPage, width, height); + this.stageSupplier = stageSupplier; + setBackground((IGuiTexture) null); + applyDarkTheme(); + } + + private void applyDarkTheme() { + IGuiTexture titleBarBg = new GuiTextureGroup( + new ColorRectTexture(BG_COLOR), + new ColorBorderTexture(1, BORDER_COLOR)); + + if (titleBar != null) { + titleBar.setBackground((IGuiTexture) null); + for (Widget widget : titleBar.widgets) { + if (widget instanceof WidgetGroup group) { + group.setBackground(titleBarBg); + } + } + } + + if (sideTabsWidget != null) { + sideTabsWidget.setBackground((IGuiTexture) null); + updateTabStyling(Stage.EMPTY); + } + + if (configuratorPanel != null) { + configuratorPanel.setVisible(false); + configuratorPanel.setActive(false); + } + + if (playerInventory != null) { + playerInventory.setBackground((IGuiTexture) null); + IGuiTexture darkSlot = new GuiTextureGroup( + new ColorRectTexture(SLOT_BG_COLOR), + new ColorBorderTexture(1, SLOT_BORDER_COLOR)); + for (Widget widget : playerInventory.widgets) { + if (widget instanceof SlotWidget slotWidget) { + slotWidget.setBackground(darkSlot); + } + } + } + } + + private void updateTabStyling(Stage stage) { + if (sideTabsWidget == null) return; + + int accentColor = getStageAccentColorFull(stage); + int accentColorDim = dimColor(accentColor, 0.6f); + + IGuiTexture tabNormal = new GuiTextureGroup( + new ColorRectTexture(0xA0080812), + new ColorBorderTexture(1, accentColorDim)); + IGuiTexture tabHover = new GuiTextureGroup( + new ColorRectTexture(0xC0151525), + new ColorBorderTexture(1, accentColor)); + IGuiTexture tabPressed = new GuiTextureGroup( + new ColorRectTexture(0xE0101020), + new ColorBorderTexture(1, accentColor)); + + sideTabsWidget.setTabTexture(tabNormal); + sideTabsWidget.setTabHoverTexture(tabHover); + sideTabsWidget.setTabPressedTexture(tabPressed); + } + + private int dimColor(int color, float factor) { + int a = (color >> 24) & 0xFF; + int r = (int) (((color >> 16) & 0xFF) * factor); + int g = (int) (((color >> 8) & 0xFF) * factor); + int b = (int) ((color & 0xFF) * factor); + return (a << 24) | (r << 16) | (g << 8) | b; + } + + @Override + public void initWidget() { + super.initWidget(); + if (playerInventory != null) { + IGuiTexture darkSlot = new GuiTextureGroup( + new ColorRectTexture(SLOT_BG_COLOR), + new ColorBorderTexture(1, SLOT_BORDER_COLOR)); + for (Widget widget : playerInventory.widgets) { + if (widget instanceof SlotWidget slotWidget) { + slotWidget.setBackground(darkSlot); + } + } + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + Stage currentStage = stageSupplier.get(); + if (currentStage != lastStage) { + lastStage = currentStage; + updateTabStyling(currentStage); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + drawFullBackground(graphics); + drawCustomOverlays(graphics); + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + drawTitleText(graphics); + } + + private void drawFullBackground(GuiGraphics graphics) { + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + Stage stage = stageSupplier.get(); + + DrawerHelper.drawGradientRect(graphics, x, y, w, h, 0xFF0c0c12, 0xFF060608, false); + drawGridPattern(graphics, x, y, w, h); + drawCornerAccents(graphics, x, y, w, h, getStageAccentColorFull(stage) & 0x66FFFFFF); + DrawerHelper.drawBorder(graphics, x, y, w, h, getStageAccentColorFull(stage) & 0x33FFFFFF, 1); + + if (playerInventory != null && playerInventory.isVisible()) { + drawSidePanels(graphics, x, y, w, h, stage); + } + } + + private void drawGridPattern(GuiGraphics graphics, int x, int y, int w, int h) { + int gridColor = 0x08FFFFFF; + int spacing = 16; + for (int gx = x + spacing; gx < x + w; gx += spacing) { + graphics.fill(gx, y, gx + 1, y + h, gridColor); + } + for (int gy = y + spacing; gy < y + h; gy += spacing) { + graphics.fill(x, gy, x + w, gy + 1, gridColor); + } + } + + private void drawCornerAccents(GuiGraphics graphics, int x, int y, int w, int h, int color) { + int len = 20; + int thickness = 2; + graphics.fill(x, y, x + len, y + thickness, color); + graphics.fill(x, y, x + thickness, y + len, color); + graphics.fill(x + w - len, y, x + w, y + thickness, color); + graphics.fill(x + w - thickness, y, x + w, y + len, color); + graphics.fill(x, y + h - thickness, x + len, y + h, color); + graphics.fill(x, y + h - len, x + thickness, y + h, color); + graphics.fill(x + w - len, y + h - thickness, x + w, y + h, color); + graphics.fill(x + w - thickness, y + h - len, x + w, y + h, color); + } + + private void drawSidePanels(GuiGraphics graphics, int x, int y, int w, int h, Stage stage) { + int invY = playerInventory.getPosition().y; + int invX = playerInventory.getPosition().x; + int invW = playerInventory.getSize().width; + int panelH = h - (invY - y) - 5; + + int leftPanelX = x + 3; + int leftPanelW = invX - leftPanelX - 3; + if (leftPanelW > 20) { + drawTechPanel(graphics, leftPanelX, invY, leftPanelW, panelH, stage); + } + + int rightPanelX = invX + invW + 3; + int rightPanelW = (x + w) - rightPanelX - 3; + if (rightPanelW > 20) { + drawStatsPanel(graphics, rightPanelX, invY, rightPanelW, panelH, stage); + } + } + + private void drawTechPanel(GuiGraphics graphics, int px, int py, int pw, int ph, Stage stage) { + DrawerHelper.drawSolidRect(graphics, px, py, pw, ph, 0x40000000); + int borderColor = getStageAccentColorFull(stage) & 0x33FFFFFF; + DrawerHelper.drawBorder(graphics, px, py, pw, ph, borderColor, 1); + int accentColor = getStageAccentColorFull(stage) & 0x80FFFFFF; + graphics.fill(px + 1, py + 1, px + pw - 1, py + 3, accentColor); + + int lineColor = 0x20FFFFFF; + int lineY = py + 15; + for (int i = 0; i < 5 && lineY + 10 < py + ph; i++) { + int lineW = (int) ((pw - 10) * (0.3f + 0.4f * ((System.currentTimeMillis() / 100 + i * 50) % 100) / 100f)); + graphics.fill(px + 5, lineY, px + 5 + lineW, lineY + 2, lineColor); + lineY += 12; + } + } + + private void drawStatsPanel(GuiGraphics graphics, int px, int py, int pw, int ph, Stage stage) { + DrawerHelper.drawSolidRect(graphics, px, py, pw, ph, 0x40000000); + int borderColor = getStageAccentColorFull(stage) & 0x33FFFFFF; + DrawerHelper.drawBorder(graphics, px, py, pw, ph, borderColor, 1); + int accentColor = getStageAccentColorFull(stage) & 0x80FFFFFF; + graphics.fill(px + 1, py + 1, px + pw - 1, py + 3, accentColor); + + var font = Minecraft.getInstance().font; + int labelColor = 0xFF606080; + int valueColor = 0xFFCCCCCC; + + graphics.drawString(font, "STAR STATS", px + 4, py + 6, accentColor | 0xFF000000, false); + + float temp = getStageTemp(stage); + float mass = getStageMass(stage); + float output = getStageOutput(stage); + + graphics.drawString(font, "TEMP:", px + 4, py + 20, labelColor, false); + graphics.drawString(font, formatTemp(temp), px + 35, py + 20, getTemperatureColor(temp), false); + graphics.drawString(font, "MASS:", px + 4, py + 32, labelColor, false); + graphics.drawString(font, String.format("%.1f M\u2609", mass), px + 35, py + 32, valueColor, false); + graphics.drawString(font, "OUT:", px + 4, py + 44, labelColor, false); + graphics.drawString(font, formatEnergy(output), px + 30, py + 44, valueColor, false); + graphics.drawString(font, getStatusString(stage), px + 4, py + 56, getStatusColor(stage), false); + } + + private float getStageTemp(Stage stage) { + return switch (stage) { + case EMPTY -> 2.7f; + case GROWING -> 5_000_000f; + case STAR -> 15_000_000f; + case SUPERSTAR -> 100_000_000f; + case BLACK_HOLE -> Float.POSITIVE_INFINITY; + case DEATH -> 500_000_000f; + case DEATH_GRACEFUL -> 1_000_000f; + }; + } + + private float getStageMass(Stage stage) { + return switch (stage) { + case EMPTY -> 0f; + case GROWING -> 0.3f; + case STAR -> 1f; + case SUPERSTAR -> 8f; + case BLACK_HOLE -> 25f; + case DEATH -> 12f; + case DEATH_GRACEFUL -> 0.1f; + }; + } + + private float getStageOutput(Stage stage) { + return switch (stage) { + case EMPTY -> 0f; + case GROWING -> 1_000f; + case STAR -> 50_000f; + case SUPERSTAR -> 500_000f; + case BLACK_HOLE -> 10_000_000f; + case DEATH -> 100_000_000f; + case DEATH_GRACEFUL -> 500f; + }; + } + + private String formatTemp(float temp) { + if (Float.isInfinite(temp)) return "\u221E K"; + if (temp >= 1_000_000) return String.format("%.0fM K", temp / 1_000_000); + if (temp >= 1000) return String.format("%.0fk K", temp / 1000); + return String.format("%.1f K", temp); + } + + private String formatEnergy(float energy) { + if (energy >= 1_000_000) return String.format("%.1f PW", energy / 1_000_000); + if (energy >= 1000) return String.format("%.0f TW", energy / 1000); + return String.format("%.0f GW", energy); + } + + private int getTemperatureColor(float temp) { + if (temp >= 100_000_000) return 0xFFFF4444; + if (temp >= 10_000_000) return 0xFFFFAA44; + if (temp >= 1_000_000) return 0xFFFFFF44; + return 0xFFCCCCCC; + } + + private String getStatusString(Stage stage) { + return switch (stage) { + case EMPTY -> "DORMANT"; + case GROWING -> "IGNITING"; + case STAR -> "STABLE"; + case SUPERSTAR -> "CRITICAL"; + case BLACK_HOLE -> "CONTAINED"; + case DEATH -> "FAILURE"; + case DEATH_GRACEFUL -> "SHUTDOWN"; + }; + } + + private int getStatusColor(Stage stage) { + return switch (stage) { + case EMPTY -> 0xFF606060; + case GROWING -> 0xFF66AAFF; + case STAR -> 0xFF66FF66; + case SUPERSTAR -> 0xFFFFAA44; + case BLACK_HOLE -> 0xFFAA66FF; + case DEATH -> 0xFFFF4444; + case DEATH_GRACEFUL -> 0xFF886666; + }; + } + + private void drawTitleText(GuiGraphics graphics) { + if (titleBar == null || mainPage == null) return; + + var font = Minecraft.getInstance().font; + String title = mainPage.getTitle().getString(); + + int titleBarX = getPosition().x + 8; + int titleBarY = getPosition().y - 16; + int textAreaX = titleBarX + 18 + 16; + int textAreaY = titleBarY + 3; + int textAreaWidth = getSize().width - 16 - 18 - 18 - 16; + int textAreaHeight = 13; + + graphics.fill(textAreaX, textAreaY, textAreaX + textAreaWidth, textAreaY + textAreaHeight, BG_COLOR); + + int textWidth = font.width(title); + int centeredX = textAreaX + (textAreaWidth - textWidth) / 2; + int centeredY = textAreaY + (textAreaHeight - font.lineHeight) / 2; + graphics.drawString(font, title, centeredX, centeredY, 0xFFFFFFFF, true); + } + + private void drawCustomOverlays(GuiGraphics graphics) { + Stage stage = stageSupplier.get(); + int accentColor = getStageAccentColor(stage); + + if (playerInventory != null && playerInventory.isVisible()) { + int x = getPosition().x; + int w = getSize().width; + int invY = playerInventory.getPosition().y; + graphics.fill(x + 10, invY - 2, x + w - 10, invY - 1, accentColor); + } + } + + private int getStageAccentColor(Stage stage) { + int alpha = 0x60; + return (alpha << 24) | switch (stage) { + case EMPTY -> 0x404060; + case GROWING -> 0x6080FF; + case STAR -> 0xFFCC44; + case SUPERSTAR -> 0xFF8844; + case BLACK_HOLE -> 0x8040FF; + case DEATH -> 0xFF2020; + case DEATH_GRACEFUL -> 0x804040; + }; + } + + private int getStageAccentColorFull(Stage stage) { + return 0xFF000000 | switch (stage) { + case EMPTY -> 0x404060; + case GROWING -> 0x6080FF; + case STAR -> 0xFFCC44; + case SUPERSTAR -> 0xFF8844; + case BLACK_HOLE -> 0x8040FF; + case DEATH -> 0xFF2020; + case DEATH_GRACEFUL -> 0x804040; + }; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarIrisWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarIrisWidget.java new file mode 100644 index 000000000..52729deb5 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarIrisWidget.java @@ -0,0 +1,728 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.feature.IStellarIrisProvider; +import com.ghostipedia.cosmiccore.api.machine.feature.IStellarModuleReceiver; +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine; +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine.Stage; +import com.ghostipedia.cosmiccore.api.machine.multiblock.StellarBaseModule; +import com.ghostipedia.cosmiccore.client.gui.screen.StellarConvergenceScreen; + +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; + +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class StellarIrisWidget extends WidgetGroup { + + public static final int WIDTH = 310; + public static final int HEIGHT = 160; + + private final Supplier machineSupplier; + + private Stage lastSyncedStage = Stage.EMPTY; + private boolean hasReceivedInitialSync = false; + private float fuelLevel = 0f; + private boolean canIgnite = false; + private int lastSyncedStarColor = -1; + + private StellarCoreWidget coreWidget; + private OrbitalRingsWidget orbitalRings; + private ModuleSelectorWidget moduleSelectorWidget; + private ModuleToggleButton moduleToggleButton; + private ModuleConfigPopout moduleConfigPopout; + private StageContextPanel contextPanel; + private StarColorButton starColorButton; + private StarColorPickerPopup starColorPicker; + private boolean showingColorPicker = false; + + private PrestigeAnimationOverlay prestigeAnimationOverlay; + private PrestigeWindow prestigeWindow; + private UpgradeTreeWidget upgradeTreeWidget; + private UpgradeTreeButton upgradeTreeButton; + private boolean prestigeAnimationTriggered = false; + private Stage stageBeforePrestige = Stage.EMPTY; + + private int tickCounter = 0; + private boolean debugPrimed = false; + private boolean showingModuleSelector = false; + + private int selectedModuleIndex = -1; + private String lastSyncedModuleName = ""; + private boolean lastSyncedModuleConnected = false; + private boolean lastSyncedModuleWorking = false; + private long lastSyncedModuleEnergy = 0; + private double lastSyncedModuleSpeed = 0; + private Stage lastSyncedModuleStage = Stage.EMPTY; + private int lastSyncedModuleParallel = 0; + private long lastSyncedModuleVoltage = 0; + private int lastSyncedIrisParallelLimit = 0; + private long lastSyncedMaxEUt = 0; + private int lastSyncedEffectiveParallel = 0; + private int lastSyncedOverclockTier = 0; + + public StellarIrisWidget(Supplier machineSupplier) { + super(0, 0, WIDTH, HEIGHT); + this.machineSupplier = machineSupplier; + initWidgets(); + } + + @Override + public void writeInitialData(FriendlyByteBuf buffer) { + super.writeInitialData(buffer); + IrisMultiblockMachine machine = machineSupplier.get(); + if (machine != null) { + Stage serverStage = machine.getStage(); + // Debug: log what stage the SERVER is sending + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.warn( + "[StellarIrisWidget] SERVER writeInitialData: stage={}, color={}", + serverStage, machine.getCustomStarColor()); + buffer.writeEnum(serverStage); + buffer.writeInt(machine.getCustomStarColor()); + } else { + buffer.writeEnum(Stage.EMPTY); + buffer.writeInt(-1); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void readInitialData(FriendlyByteBuf buffer) { + super.readInitialData(buffer); + lastSyncedStage = buffer.readEnum(Stage.class); + lastSyncedStarColor = buffer.readInt(); + hasReceivedInitialSync = true; + // Debug: log what stage the CLIENT received + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.warn( + "[StellarIrisWidget] CLIENT readInitialData: stage={}, color={}", + lastSyncedStage, lastSyncedStarColor); + } + + private void initWidgets() { + // Debug: verify the stage supplier returns EMPTY before sync + // Version marker: V3 - 2026-01-13 + Stage initialStage = getCurrentStage(); + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.warn( + "[StellarIrisWidget V3] initWidgets: getCurrentStage()={}, hasReceivedInitialSync={}", + initialStage, hasReceivedInitialSync); + + addWidget(new StarfieldBackgroundWidget(0, 0, WIDTH, HEIGHT, this::getCurrentStage)); + + int margin = 5; + int gap = 5; + + int coreSize = 130; + int panelWidth = 135; + + int panelX = WIDTH - margin - panelWidth; + int panelY = margin; + int panelH = HEIGHT - (margin * 2); + + int coreX = panelX - gap - coreSize; + int coreY = (HEIGHT - coreSize) / 2; + + orbitalRings = new OrbitalRingsWidget(coreX - 5, coreY - 5, coreSize + 10, coreSize + 10, + this::getCurrentStage); + addWidget(orbitalRings); + + coreWidget = new StellarCoreWidget(coreX, coreY, coreSize, this::getCurrentStage, this::getCurrentStarColor); + addWidget(coreWidget); + + int moduleSelectorSize = HEIGHT - margin * 2; + int moduleSelectorX = (WIDTH - moduleSelectorSize) / 2; + int moduleSelectorY = margin; + moduleSelectorWidget = new ModuleSelectorWidget(moduleSelectorX, moduleSelectorY, moduleSelectorSize, + machineSupplier, this::onModuleSelected); + moduleSelectorWidget.setVisible(false); + moduleSelectorWidget.setActive(false); + addWidget(moduleSelectorWidget); + + contextPanel = new StageContextPanel(panelX, panelY, panelWidth, panelH, machineSupplier, this); + addWidget(contextPanel); + + int popoutX = moduleSelectorX + moduleSelectorSize + 10; + int popoutY = moduleSelectorY + 20; + moduleConfigPopout = new ModuleConfigPopout(popoutX, popoutY, machineSupplier, this::onModulePopoutClosed); + moduleConfigPopout.setOnPowerSettingsChanged(this::onPowerSettingsChanged); + addWidget(moduleConfigPopout); + + initDebugButtons(); + initModuleToggle(); + initStarColorButton(); + initPrestigeWidgets(); + initUpgradeTreeWidgets(); + } + + private void initPrestigeWidgets() { + int windowW = 200; + int windowH = 160; + int windowX = (WIDTH - windowW) / 2; + int windowY = (HEIGHT - windowH) / 2; + + prestigeWindow = new PrestigeWindow(windowX, windowY, windowW, windowH, + machineSupplier, this::onPrestigeWindowClosed); + addWidget(prestigeWindow); + + prestigeAnimationOverlay = new PrestigeAnimationOverlay(0, 0, WIDTH, HEIGHT, + machineSupplier, this::onPrestigeAnimationComplete, this::onShowPrestigeWindow); + prestigeAnimationOverlay.setCoreWidget(coreWidget); + addWidget(prestigeAnimationOverlay); + } + + private void initUpgradeTreeWidgets() { + // Upgrade tree button - positioned next to other buttons + int btnSize = 18; + int btnX = 5 + 18 + 4 + 18 + 4; // After module toggle and color button + int btnY = HEIGHT - btnSize - 5; + + upgradeTreeButton = new UpgradeTreeButton(btnX, btnY, btnSize, btnSize, + this::onUpgradeTreeButtonClicked, machineSupplier); + addWidget(upgradeTreeButton); + + // Note: Widget is no longer used - we open a full screen instead + upgradeTreeWidget = null; + } + + @OnlyIn(Dist.CLIENT) + private void onUpgradeTreeButtonClicked(boolean ignored) { + // Open the full-screen upgrade tree + IrisMultiblockMachine machine = machineSupplier.get(); + if (machine != null) { + StellarConvergenceScreen.open(machine); + } + } + + private void initDebugButtons() { + int btnWidth = 50; + int btnHeight = 14; + int btnX = 5; + int btnY = HEIGHT - btnHeight - 5 - 20; + + addWidget(new DebugPrimeButton(btnX, btnY, btnWidth, btnHeight, this::requestDebugPrime)); + } + + private void initModuleToggle() { + int btnSize = 18; + int btnX = 5; + int btnY = HEIGHT - btnSize - 5; + + moduleToggleButton = new ModuleToggleButton(btnX, btnY, btnSize, btnSize, this::onModuleToggle, + this::getCurrentStage); + addWidget(moduleToggleButton); + } + + private void initStarColorButton() { + int btnSize = 18; + int btnX = 5 + 18 + 4; + int btnY = HEIGHT - btnSize - 5; + + starColorButton = new StarColorButton(btnX, btnY, btnSize, btnSize, this::onColorButtonClicked, + this::getCurrentStarColor); + addWidget(starColorButton); + + int pickerX = btnX; + int pickerY = btnY - StarColorPickerPopup.HEIGHT - 5; + starColorPicker = new StarColorPickerPopup(pickerX, pickerY, this::hideColorPicker, this::onStarColorChanged); + addWidget(starColorPicker); + } + + private void onColorButtonClicked(boolean ignored) { + if (showingColorPicker) { + hideColorPicker(); + } else { + showColorPicker(); + } + } + + private void showColorPicker() { + showingColorPicker = true; + starColorPicker.show(lastSyncedStarColor); + } + + private void hideColorPicker() { + showingColorPicker = false; + starColorPicker.hide(); + } + + private void onStarColorChanged(int newColor) { + writeClientAction(6, buf -> buf.writeInt(newColor)); + } + + public int getCurrentStarColor() { + return lastSyncedStarColor; + } + + private void onModuleToggle(boolean showModules) { + showingModuleSelector = showModules; + + coreWidget.setVisible(!showModules); + coreWidget.setActive(!showModules); + orbitalRings.setVisible(!showModules); + orbitalRings.setActive(!showModules); + contextPanel.setVisible(!showModules); + contextPanel.setActive(!showModules); + + moduleSelectorWidget.setVisible(showModules); + moduleSelectorWidget.setActive(showModules); + + if (!showModules) { + moduleConfigPopout.hide(); + moduleSelectorWidget.clearSelection(); + writeClientAction(4, buf -> buf.writeInt(-1)); + } + } + + private void onModuleSelected(int moduleIndex) { + this.selectedModuleIndex = moduleIndex; + moduleConfigPopout.showForModule(moduleIndex); + writeClientAction(4, buf -> buf.writeInt(moduleIndex)); + } + + private void onModulePopoutClosed() { + moduleSelectorWidget.clearSelection(); + } + + private void onPowerSettingsChanged(int maxParallel, long voltagePerParallel) { + if (selectedModuleIndex < 0) return; + + writeClientAction(5, buf -> { + buf.writeInt(selectedModuleIndex); + buf.writeInt(maxParallel); + buf.writeLong(voltagePerParallel); + }); + + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.info( + "[StellarIrisWidget] CLIENT sending power settings: module={}, parallel={}, voltage={}", + selectedModuleIndex, maxParallel, voltagePerParallel); + } + + public void requestDebugPrime() { + writeClientAction(3, buf -> {}); + } + + public Stage getCurrentStage() { + // Before we receive initial sync, return EMPTY as safe default + // The client-side machine may have corrupted stage data before sync completes + if (!hasReceivedInitialSync) { + com.ghostipedia.cosmiccore.CosmicCore.LOGGER + .warn("[StellarIrisWidget] getCurrentStage: No initial sync yet, returning EMPTY"); + return Stage.EMPTY; + } + // Safety check: if lastSyncedStage is somehow null, return EMPTY + if (lastSyncedStage == null) { + com.ghostipedia.cosmiccore.CosmicCore.LOGGER + .warn("[StellarIrisWidget] getCurrentStage: lastSyncedStage is null, returning EMPTY"); + return Stage.EMPTY; + } + // Debug: log non-empty/non-star stages + if (lastSyncedStage != Stage.EMPTY && lastSyncedStage != Stage.STAR) { + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.warn("[StellarIrisWidget] getCurrentStage: returning {}", + lastSyncedStage); + } + return lastSyncedStage; + } + + public float getFuelLevel() { + return fuelLevel; + } + + public boolean canIgnite() { + return canIgnite; + } + + @Override + public void detectAndSendChanges() { + super.detectAndSendChanges(); + + IrisMultiblockMachine machine = machineSupplier.get(); + if (machine == null) return; + + Stage currentStage = machine.getStage(); + if (currentStage != lastSyncedStage) { + lastSyncedStage = currentStage; + writeUpdateInfo(301, buf -> buf.writeEnum(currentStage)); + } + + float newFuelLevel = calculateFuelLevel(machine); + if (Math.abs(newFuelLevel - fuelLevel) > 0.01f) { + fuelLevel = newFuelLevel; + writeUpdateInfo(302, buf -> buf.writeFloat(fuelLevel)); + } + + boolean newCanIgnite = checkIgnitionRequirements(machine); + if (newCanIgnite != canIgnite) { + canIgnite = newCanIgnite; + writeUpdateInfo(303, buf -> buf.writeBoolean(canIgnite)); + } + + int newStarColor = machine.getCustomStarColor(); + if (newStarColor != lastSyncedStarColor) { + lastSyncedStarColor = newStarColor; + writeUpdateInfo(306, buf -> buf.writeInt(newStarColor)); + } + + syncSelectedModuleData(machine); + } + + private void syncSelectedModuleData(IrisMultiblockMachine machine) { + if (selectedModuleIndex < 0) return; + + List modules = new ArrayList<>(machine.getConnectedModules()); + if (selectedModuleIndex >= modules.size()) { + selectedModuleIndex = -1; + writeUpdateInfo(305, buf -> {}); + return; + } + + IStellarModuleReceiver receiver = modules.get(selectedModuleIndex); + + String newName = ""; + boolean newConnected = false; + boolean newWorking = false; + long newEnergy = 0; + double newSpeed = 0; + Stage newStage = Stage.EMPTY; + int newParallel = 1; + long newVoltage = 32; + int newIrisLimit = 1; + long newMaxEUt = 0; + int newEffectiveParallel = 1; + int newOverclockTier = 0; + + if (receiver instanceof StellarBaseModule module) { + newName = module.getBlockState().getBlock().getDescriptionId(); + IStellarIrisProvider iris = module.getStellarIris(); + if (iris == null) { + iris = machine; // Use Iris as fallback + } + + newConnected = iris != null && iris.isFormed(); + newWorking = module.getRecipeLogic().isWorking(); + newEnergy = module.getEnergyConsumedPerTick(); + + newParallel = module.getConfiguredMaxParallel(); + newVoltage = module.getConfiguredVoltagePerParallel(); + newIrisLimit = module.getIrisParallelLimit(); + + newMaxEUt = module.getMaxEUt(); + newEffectiveParallel = module.getEffectiveParallelLimit(); + newOverclockTier = module.getOverclockTier(); + + if (iris != null && iris.canProcess()) { + newSpeed = iris.getSpeedBonus(); + newStage = iris.getStage(); + } + } + + boolean changed = !newName.equals(lastSyncedModuleName) || newConnected != lastSyncedModuleConnected || + newWorking != lastSyncedModuleWorking || newEnergy != lastSyncedModuleEnergy || + newSpeed != lastSyncedModuleSpeed || newStage != lastSyncedModuleStage || + newParallel != lastSyncedModuleParallel || newVoltage != lastSyncedModuleVoltage || + newIrisLimit != lastSyncedIrisParallelLimit || newMaxEUt != lastSyncedMaxEUt || + newEffectiveParallel != lastSyncedEffectiveParallel || newOverclockTier != lastSyncedOverclockTier; + + if (changed) { + lastSyncedModuleName = newName; + lastSyncedModuleConnected = newConnected; + lastSyncedModuleWorking = newWorking; + lastSyncedModuleEnergy = newEnergy; + lastSyncedModuleSpeed = newSpeed; + lastSyncedModuleStage = newStage; + lastSyncedModuleParallel = newParallel; + lastSyncedModuleVoltage = newVoltage; + lastSyncedIrisParallelLimit = newIrisLimit; + lastSyncedMaxEUt = newMaxEUt; + lastSyncedEffectiveParallel = newEffectiveParallel; + lastSyncedOverclockTier = newOverclockTier; + + final String syncName = newName; + final boolean syncConnected = newConnected; + final boolean syncWorking = newWorking; + final long syncEnergy = newEnergy; + final double syncSpeed = newSpeed; + final Stage syncStage = newStage; + final int syncParallel = newParallel; + final long syncVoltage = newVoltage; + final int syncIrisLimit = newIrisLimit; + final long syncMaxEUt = newMaxEUt; + final int syncEffectiveParallel = newEffectiveParallel; + final int syncOverclockTier = newOverclockTier; + + writeUpdateInfo(304, buf -> { + buf.writeUtf(syncName); + buf.writeBoolean(syncConnected); + buf.writeBoolean(syncWorking); + buf.writeLong(syncEnergy); + buf.writeDouble(syncSpeed); + buf.writeEnum(syncStage); + buf.writeInt(syncParallel); + buf.writeLong(syncVoltage); + buf.writeInt(syncIrisLimit); + buf.writeLong(syncMaxEUt); + buf.writeInt(syncEffectiveParallel); + buf.writeInt(syncOverclockTier); + }); + + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.info( + "[StellarIrisWidget] Syncing module data: name={}, connected={}, parallel={}, voltage={}, maxEUt={}, tier={}", + syncName, syncConnected, syncParallel, syncVoltage, syncMaxEUt, syncOverclockTier); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void readUpdateInfo(int id, FriendlyByteBuf buffer) { + // Debug: log ALL update info calls to trace unexpected stage changes + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.warn( + "[StellarIrisWidget] readUpdateInfo: id={}, buffer remaining={}", + id, buffer.readableBytes()); + + if (id == 301) { + Stage newStage = buffer.readEnum(Stage.class); + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.warn( + "[StellarIrisWidget] readUpdateInfo(301): stage change {} -> {}", + lastSyncedStage, newStage); + lastSyncedStage = newStage; + } else if (id == 302) { + fuelLevel = buffer.readFloat(); + } else if (id == 303) { + canIgnite = buffer.readBoolean(); + } else if (id == 304) { + String name = buffer.readUtf(); + boolean connected = buffer.readBoolean(); + boolean working = buffer.readBoolean(); + long energy = buffer.readLong(); + double speed = buffer.readDouble(); + Stage stage = buffer.readEnum(Stage.class); + int parallel = buffer.readInt(); + long voltage = buffer.readLong(); + int irisLimit = buffer.readInt(); + long maxEUt = buffer.readLong(); + int effectiveParallel = buffer.readInt(); + int overclockTier = buffer.readInt(); + + // Update popout with synced data + moduleConfigPopout.updateModuleData(name, connected, working, energy, speed, stage, + parallel, voltage, irisLimit, maxEUt, effectiveParallel, overclockTier); + + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.info( + "[StellarIrisWidget] CLIENT readUpdateInfo: module name={}, parallel={}, voltage={}, maxEUt={}, tier={}", + name, parallel, voltage, maxEUt, overclockTier); + } else if (id == 305) { + moduleConfigPopout.hide(); + moduleSelectorWidget.clearSelection(); + } else if (id == 306) { + lastSyncedStarColor = buffer.readInt(); + } else { + super.readUpdateInfo(id, buffer); + } + } + + private float calculateFuelLevel(IrisMultiblockMachine machine) { + if (debugPrimed) { + return 1f; + } + + if (machine.getStage() == Stage.EMPTY) { + return machine.getInventory().getStackInSlot(0).isEmpty() ? 0f : 1f; + } + return switch (machine.getStage()) { + case EMPTY -> 0f; + case GROWING -> 0.5f; + case STAR, SUPERSTAR, BLACK_HOLE -> 1f; + case DEATH, DEATH_GRACEFUL -> 0.2f; + }; + } + + private boolean checkIgnitionRequirements(IrisMultiblockMachine machine) { + if (debugPrimed) { + return true; + } + if (machine.getStage() != Stage.EMPTY) return false; + if (machine.getInventory().getStackInSlot(0).isEmpty()) return false; + return fuelLevel >= 0.8f; + } + + public void debugPrime() { + debugPrimed = true; + } + + public void requestIgnition() { + writeClientAction(1, buf -> {}); + } + + public void requestStageAdvance() { + writeClientAction(2, buf -> {}); + } + + public void triggerPrestigeAnimation() { + if (prestigeAnimationTriggered) return; + + prestigeAnimationTriggered = true; + stageBeforePrestige = lastSyncedStage; + + prestigeAnimationOverlay.startAnimation(stageBeforePrestige, lastSyncedStarColor, 50); + writeClientAction(7, buf -> {}); + + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.info( + "[StellarIrisWidget] Prestige animation triggered! Stage before: {}", stageBeforePrestige); + } + + private void onPrestigeAnimationComplete() { + writeClientAction(8, buf -> {}); + + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.info( + "[StellarIrisWidget] Prestige animation complete, requesting completion from server"); + } + + private void onShowPrestigeWindow() { + IrisMultiblockMachine machine = machineSupplier.get(); + if (machine != null) { + int earned = machine.getLastPrestigePointsEarned(); + int total = machine.getSpendablePoints() + earned; + int tier = machine.getPrestigeTier(); + int prevTier = tier; + + prestigeWindow.show(earned, total, tier, prevTier); + } else { + prestigeWindow.show(50, 50, 1, 0); + } + } + + private void onPrestigeWindowClosed() { + prestigeAnimationTriggered = false; + stageBeforePrestige = Stage.EMPTY; + + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.info( + "[StellarIrisWidget] Prestige window closed"); + } + + @Override + public void handleClientAction(int id, FriendlyByteBuf buffer) { + IrisMultiblockMachine machine = machineSupplier.get(); + if (machine == null) return; + + if (id == 1) { + if (canIgnite || debugPrimed) { + machine.setStarStage(); + debugPrimed = false; + } + } else if (id == 2) { + machine.setStarStage(); + } else if (id == 3) { + debugPrimed = true; + } else if (id == 4) { + int newSelectedModule = buffer.readInt(); + this.selectedModuleIndex = newSelectedModule; + this.lastSyncedModuleName = ""; + this.lastSyncedModuleConnected = false; + this.lastSyncedModuleWorking = false; + this.lastSyncedModuleEnergy = -1; + this.lastSyncedModuleSpeed = -1; + this.lastSyncedModuleStage = null; + this.lastSyncedModuleParallel = -1; + this.lastSyncedModuleVoltage = -1; + this.lastSyncedIrisParallelLimit = -1; + this.lastSyncedMaxEUt = -1; + this.lastSyncedEffectiveParallel = -1; + this.lastSyncedOverclockTier = -1; + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.info( + "[StellarIrisWidget] handleClientAction: module selection = {}", newSelectedModule); + } else if (id == 5) { + int moduleIndex = buffer.readInt(); + int newParallel = buffer.readInt(); + long newVoltage = buffer.readLong(); + + List modules = new ArrayList<>(machine.getConnectedModules()); + if (moduleIndex >= 0 && moduleIndex < modules.size()) { + IStellarModuleReceiver receiver = modules.get(moduleIndex); + if (receiver instanceof StellarBaseModule stellarModule) { + stellarModule.setConfiguredMaxParallel(newParallel); + stellarModule.setConfiguredVoltagePerParallel(newVoltage); + + stellarModule.markDirty(); + + this.lastSyncedModuleParallel = -1; + this.lastSyncedModuleVoltage = -1; + + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.info( + "[StellarIrisWidget] SERVER updated module {} power: parallel={}, voltage={}", + moduleIndex, newParallel, newVoltage); + } + } + } else if (id == 6) { + int newColor = buffer.readInt(); + machine.setCustomStarColor(newColor); + machine.markDirty(); + lastSyncedStarColor = newColor - 1; + + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.info( + "[StellarIrisWidget] SERVER updated star color: {}", + newColor == -1 ? "default" : String.format("#%06X", newColor)); + } else if (id == 7) { + machine.triggerPrestige(); + + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.info( + "[StellarIrisWidget] SERVER prestige triggered"); + } else if (id == 8) { + machine.completePrestige(); + + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.info( + "[StellarIrisWidget] SERVER prestige completed. Points: {}, Tier: {}", + machine.getSpendablePoints(), machine.getPrestigeTier()); + } else { + super.handleClientAction(id, buffer); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + tickCounter++; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + int borderColor = getStageAccentColor(lastSyncedStage, 0.4f); + DrawerHelper.drawBorder(graphics, x, y, w, h, borderColor, 1); + + if (lastSyncedStage != Stage.EMPTY) { + int glowColor = getStageAccentColor(lastSyncedStage, 0.15f); + DrawerHelper.drawGradientRect(graphics, x + 1, y + 1, w - 2, 20, glowColor, 0x00000000, false); + } + + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + } + + private int getStageAccentColor(Stage stage, float alpha) { + int a = (int) (alpha * 255) << 24; + return switch (stage) { + case EMPTY -> a | 0x404050; + case GROWING -> a | 0x6080FF; + case STAR -> a | 0xFFCC44; + case SUPERSTAR -> a | 0xFF8844; + case BLACK_HOLE -> a | 0x8040FF; + case DEATH -> a | 0xFF2020; + case DEATH_GRACEFUL -> a | 0x804040; + }; + } + + public int getTickCounter() { + return tickCounter; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarModuleContentWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarModuleContentWidget.java new file mode 100644 index 000000000..e5bea5fa5 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarModuleContentWidget.java @@ -0,0 +1,480 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.feature.IStellarIrisProvider; +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine.Stage; +import com.ghostipedia.cosmiccore.api.machine.multiblock.StellarBaseModule; + +import com.gregtechceu.gtceu.api.GTValues; + +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import java.util.function.BiConsumer; +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class StellarModuleContentWidget extends WidgetGroup { + + public static final int WIDTH = 186; + public static final int HEIGHT = 100; + + private static final int GEAR_BUTTON_SIZE = 20; + private static final ResourceLocation GEAR_TEXTURE = new ResourceLocation("gtceu", + "textures/item/material_sets/dull/gear_small.png"); + + private final Supplier moduleSupplier; + + private boolean isConnected = false; + private boolean canProcess = false; + private boolean isWorking = false; + private Stage irisStage = Stage.EMPTY; + + private long maxEUt = 0; + private long currentEUt = 0; + private int effectiveParallel = 1; + private int configuredParallel = 1; + private int overclockTier = 0; + private double speedBonus = 1.0; + private int irisParallelLimit = 1; + private boolean wirelessAvailable = false; + private boolean powerFailure = false; + private long configuredVoltage = 32; + + private PowerControlPopup powerPopup; + private boolean showingPowerPopup = false; + private BiConsumer onPowerSettingsChanged; + + public StellarModuleContentWidget(Supplier moduleSupplier) { + super(0, 0, WIDTH, HEIGHT); + this.moduleSupplier = moduleSupplier; + initPowerPopup(); + } + + private void initPowerPopup() { + powerPopup = new PowerControlPopup(WIDTH + 4, 0, this::hidePowerPopup, this::onPowerSettingsApplied); + addWidget(powerPopup); + } + + public void setOnPowerSettingsChanged(BiConsumer callback) { + this.onPowerSettingsChanged = callback; + } + + private void showPowerPopup() { + showingPowerPopup = true; + powerPopup.show(configuredParallel, configuredVoltage); + } + + private void hidePowerPopup() { + showingPowerPopup = false; + powerPopup.hide(); + } + + private void onPowerSettingsApplied(PowerControlPopup.PowerSettings settings) { + this.configuredParallel = settings.maxParallel(); + this.configuredVoltage = settings.voltagePerParallel(); + + if (onPowerSettingsChanged != null) { + onPowerSettingsChanged.accept(configuredParallel, configuredVoltage); + } + } + + @Override + public void detectAndSendChanges() { + super.detectAndSendChanges(); + + StellarBaseModule module = moduleSupplier.get(); + if (module == null) return; + + IStellarIrisProvider iris = module.getStellarIris(); + boolean newConnected = iris != null && iris.isFormed(); + boolean newCanProcess = newConnected && iris.canProcess(); + boolean newWorking = module.getRecipeLogic() != null && module.getRecipeLogic().isWorking(); + Stage newStage = iris != null ? iris.getStage() : Stage.EMPTY; + + long newMaxEUt = module.getMaxEUt(); + long newCurrentEUt = module.getEnergyConsumedPerTick(); + int newEffectiveParallel = module.getEffectiveParallelLimit(); + int newConfiguredParallel = module.getConfiguredMaxParallel(); + int newOverclockTier = module.getOverclockTier(); + double newSpeedBonus = (iris != null && iris.canProcess()) ? iris.getSpeedBonus() : 1.0; + int newIrisLimit = module.getIrisParallelLimit(); + boolean newWirelessAvailable = module.isWirelessEnergyAvailable(); + boolean newPowerFailure = module.isPowerFailure(); + long newConfiguredVoltage = module.getConfiguredVoltagePerParallel(); + + if (newConnected != isConnected || newCanProcess != canProcess || newWorking != isWorking || + newStage != irisStage || newMaxEUt != maxEUt || newCurrentEUt != currentEUt || + newEffectiveParallel != effectiveParallel || newConfiguredParallel != configuredParallel || + newOverclockTier != overclockTier || newSpeedBonus != speedBonus || + newIrisLimit != irisParallelLimit || newWirelessAvailable != wirelessAvailable || + newPowerFailure != powerFailure || newConfiguredVoltage != configuredVoltage) { + + isConnected = newConnected; + canProcess = newCanProcess; + isWorking = newWorking; + irisStage = newStage; + maxEUt = newMaxEUt; + currentEUt = newCurrentEUt; + effectiveParallel = newEffectiveParallel; + configuredParallel = newConfiguredParallel; + overclockTier = newOverclockTier; + speedBonus = newSpeedBonus; + irisParallelLimit = newIrisLimit; + wirelessAvailable = newWirelessAvailable; + powerFailure = newPowerFailure; + configuredVoltage = newConfiguredVoltage; + + writeUpdateInfo(202, buf -> { + buf.writeBoolean(isConnected); + buf.writeBoolean(canProcess); + buf.writeBoolean(isWorking); + buf.writeEnum(irisStage); + buf.writeLong(maxEUt); + buf.writeLong(currentEUt); + buf.writeInt(effectiveParallel); + buf.writeInt(configuredParallel); + buf.writeInt(overclockTier); + buf.writeDouble(speedBonus); + buf.writeInt(irisParallelLimit); + buf.writeBoolean(wirelessAvailable); + buf.writeBoolean(powerFailure); + buf.writeLong(configuredVoltage); + }); + } + } + + @Override + public void writeInitialData(FriendlyByteBuf buffer) { + super.writeInitialData(buffer); + StellarBaseModule module = moduleSupplier.get(); + if (module != null) { + IStellarIrisProvider iris = module.getStellarIris(); + buffer.writeBoolean(iris != null && iris.isFormed()); + buffer.writeBoolean(iris != null && iris.isFormed() && iris.canProcess()); + buffer.writeBoolean(module.getRecipeLogic() != null && module.getRecipeLogic().isWorking()); + buffer.writeEnum(iris != null ? iris.getStage() : Stage.EMPTY); + buffer.writeLong(module.getMaxEUt()); + buffer.writeLong(module.getEnergyConsumedPerTick()); + buffer.writeInt(module.getEffectiveParallelLimit()); + buffer.writeInt(module.getConfiguredMaxParallel()); + buffer.writeInt(module.getOverclockTier()); + buffer.writeDouble((iris != null && iris.canProcess()) ? iris.getSpeedBonus() : 1.0); + buffer.writeInt(module.getIrisParallelLimit()); + buffer.writeBoolean(module.isWirelessEnergyAvailable()); + buffer.writeBoolean(module.isPowerFailure()); + buffer.writeLong(module.getConfiguredVoltagePerParallel()); + } else { + buffer.writeBoolean(false); + buffer.writeBoolean(false); + buffer.writeBoolean(false); + buffer.writeEnum(Stage.EMPTY); + buffer.writeLong(0); + buffer.writeLong(0); + buffer.writeInt(1); + buffer.writeInt(1); + buffer.writeInt(0); + buffer.writeDouble(1.0); + buffer.writeInt(1); + buffer.writeBoolean(false); + buffer.writeBoolean(false); + buffer.writeLong(32); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void readInitialData(FriendlyByteBuf buffer) { + super.readInitialData(buffer); + isConnected = buffer.readBoolean(); + canProcess = buffer.readBoolean(); + isWorking = buffer.readBoolean(); + irisStage = buffer.readEnum(Stage.class); + maxEUt = buffer.readLong(); + currentEUt = buffer.readLong(); + effectiveParallel = buffer.readInt(); + configuredParallel = buffer.readInt(); + overclockTier = buffer.readInt(); + speedBonus = buffer.readDouble(); + irisParallelLimit = buffer.readInt(); + wirelessAvailable = buffer.readBoolean(); + powerFailure = buffer.readBoolean(); + configuredVoltage = buffer.readLong(); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void readUpdateInfo(int id, FriendlyByteBuf buffer) { + if (id == 202) { + isConnected = buffer.readBoolean(); + canProcess = buffer.readBoolean(); + isWorking = buffer.readBoolean(); + irisStage = buffer.readEnum(Stage.class); + maxEUt = buffer.readLong(); + currentEUt = buffer.readLong(); + effectiveParallel = buffer.readInt(); + configuredParallel = buffer.readInt(); + overclockTier = buffer.readInt(); + speedBonus = buffer.readDouble(); + irisParallelLimit = buffer.readInt(); + wirelessAvailable = buffer.readBoolean(); + powerFailure = buffer.readBoolean(); + configuredVoltage = buffer.readLong(); + } else { + super.readUpdateInfo(id, buffer); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + DrawerHelper.drawGradientRect(graphics, x, y, w, h, 0xE00c0c14, 0xE0080810, false); + + int gridColor = 0x08FFFFFF; + for (int gx = x + 16; gx < x + w; gx += 16) { + graphics.fill(gx, y, gx + 1, y + h, gridColor); + } + for (int gy = y + 16; gy < y + h; gy += 16) { + graphics.fill(x, gy, x + w, gy + 1, gridColor); + } + + int accentColor = getAccentColor(); + DrawerHelper.drawBorder(graphics, x, y, w, h, accentColor & 0x60FFFFFF, 1); + + int cornerLen = 12; + int cornerColor = accentColor & 0x80FFFFFF; + graphics.fill(x, y, x + cornerLen, y + 2, cornerColor); + graphics.fill(x, y, x + 2, y + cornerLen, cornerColor); + graphics.fill(x + w - cornerLen, y, x + w, y + 2, cornerColor); + graphics.fill(x + w - 2, y, x + w, y + cornerLen, cornerColor); + + drawContent(graphics, x + 6, y + 6, w - 12 - GEAR_BUTTON_SIZE - 4); + drawGearButton(graphics, x + w - GEAR_BUTTON_SIZE - 4, y + h - GEAR_BUTTON_SIZE - 4, mouseX, mouseY); + + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + } + + @OnlyIn(Dist.CLIENT) + private void drawContent(GuiGraphics graphics, int x, int y, int contentWidth) { + var font = Minecraft.getInstance().font; + int labelColor = 0xFF808090; + int valueColor = 0xFFDDDDDD; + int accentColor = 0xFF80C0FF; + + int lineHeight = 11; + int valueX = x + 70; + int currentY = y; + + String statusValue; + int statusColor; + if (powerFailure) { + statusValue = Component.translatable("cosmiccore.stellar.module.status.power_fail").getString(); + statusColor = 0xFFFF4444; + } else if (!wirelessAvailable) { + statusValue = Component.translatable("cosmiccore.stellar.module.status.no_wireless").getString(); + statusColor = 0xFFFF5555; + } else if (isWorking) { + statusValue = Component.translatable("cosmiccore.stellar.module.status.processing").getString(); + statusColor = 0xFF44FF44; + } else if (isConnected && canProcess) { + statusValue = Component.translatable("cosmiccore.stellar.module.status.ready").getString(); + statusColor = 0xFF6090CC; + } else if (isConnected) { + statusValue = Component.translatable("cosmiccore.stellar.module.status.iris_inactive").getString(); + statusColor = 0xFFCC8844; + } else { + statusValue = Component.translatable("cosmiccore.stellar.module.status.disconnected").getString(); + statusColor = 0xFFFF5555; + } + + graphics.drawString(font, Component.translatable("cosmiccore.stellar.module.status").getString(), x, currentY, + labelColor, false); + graphics.drawString(font, statusValue, valueX, currentY, statusColor, false); + currentY += lineHeight; + + int sepColor = 0x304080FF; + graphics.fill(x, currentY, x + contentWidth, currentY + 1, sepColor); + currentY += 4; + + graphics.drawString(font, Component.translatable("cosmiccore.stellar.module.max_eut").getString(), x, currentY, + labelColor, false); + String maxEUtStr = formatEnergy(maxEUt); + graphics.drawString(font, maxEUtStr, valueX, currentY, valueColor, false); + + String tierName = overclockTier < GTValues.VNF.length ? GTValues.VNF[overclockTier] : "MAX"; + int tierColor = getTierColor(overclockTier); + int badgeX = x + contentWidth - font.width(tierName) - 4; + graphics.fill(badgeX - 2, currentY - 1, badgeX + font.width(tierName) + 2, currentY + font.lineHeight, + 0x90000000 | (tierColor & 0x00333333)); + graphics.drawString(font, tierName, badgeX, currentY, 0xFF000000 | tierColor, false); + currentY += lineHeight; + + graphics.drawString(font, Component.translatable("cosmiccore.stellar.module.parallel").getString(), x, currentY, + labelColor, false); + String parallelStr = effectiveParallel + "x"; + if (effectiveParallel < configuredParallel) { + parallelStr = Component + .translatable("cosmiccore.stellar.module.parallel_max", effectiveParallel, configuredParallel) + .getString(); + } + graphics.drawString(font, parallelStr, valueX, currentY, accentColor, false); + currentY += lineHeight; + + graphics.drawString(font, Component.translatable("cosmiccore.stellar.module.current").getString(), x, currentY, + labelColor, false); + if (currentEUt > 0) { + String currentEUStr = formatEnergy(currentEUt); + graphics.drawString(font, currentEUStr, valueX, currentY, 0xFFFFCC44, false); + } else { + graphics.drawString(font, "---", valueX, currentY, 0x80606060, false); + } + currentY += lineHeight; + + graphics.fill(x, currentY, x + contentWidth, currentY + 1, sepColor); + currentY += 4; + + if (isConnected && canProcess) { + graphics.drawString(font, Component.translatable("cosmiccore.stellar.module.speed_bonus").getString(), x, + currentY, labelColor, false); + String speedStr = String.format("%.1fx", speedBonus); + int speedColor = speedBonus > 1.0 ? 0xFF66FF66 : 0xFFCCCCCC; + graphics.drawString(font, speedStr, valueX, currentY, speedColor, false); + currentY += lineHeight; + + graphics.drawString(font, Component.translatable("cosmiccore.stellar.module.iris_limit").getString(), x, + currentY, labelColor, false); + graphics.drawString(font, irisParallelLimit + "x", valueX, currentY, valueColor, false); + } else if (isConnected) { + graphics.drawString(font, Component.translatable("cosmiccore.stellar.module.stage").getString(), x, + currentY, labelColor, false); + int stageColor = getStageTextColor(irisStage); + graphics.drawString(font, irisStage.toString(), valueX, currentY, stageColor, false); + currentY += lineHeight; + graphics.drawString(font, Component.translatable("cosmiccore.stellar.module.waiting_iris").getString(), x, + currentY, 0x80AAAAAA, false); + } else { + graphics.drawString(font, Component.translatable("cosmiccore.stellar.module.not_linked").getString(), x, + currentY, 0x80808080, false); + } + } + + @OnlyIn(Dist.CLIENT) + private void drawGearButton(GuiGraphics graphics, int btnX, int btnY, int mouseX, int mouseY) { + boolean hovered = mouseX >= btnX && mouseX < btnX + GEAR_BUTTON_SIZE && + mouseY >= btnY && mouseY < btnY + GEAR_BUTTON_SIZE; + + int bgColor = hovered ? 0xC04080FF : 0x80404060; + graphics.fill(btnX, btnY, btnX + GEAR_BUTTON_SIZE, btnY + GEAR_BUTTON_SIZE, bgColor); + + int borderColor = hovered ? 0xFF6090FF : 0xFF505070; + DrawerHelper.drawBorder(graphics, btnX, btnY, GEAR_BUTTON_SIZE, GEAR_BUTTON_SIZE, borderColor, 1); + + int gearSize = GEAR_BUTTON_SIZE - 4; + int gearX = btnX + 2; + int gearY = btnY + 2; + graphics.blit(GEAR_TEXTURE, gearX, gearY, 0, 0, gearSize, gearSize, gearSize, gearSize); + } + + private int getGearButtonX() { + return getPosition().x + WIDTH - GEAR_BUTTON_SIZE - 4; + } + + private int getGearButtonY() { + return getPosition().y + HEIGHT - GEAR_BUTTON_SIZE - 4; + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (showingPowerPopup && powerPopup.isVisible()) { + if (powerPopup.mouseClicked(mouseX, mouseY, button)) { + return true; + } + if (!powerPopup.isMouseOverElement(mouseX, mouseY)) { + hidePowerPopup(); + return true; + } + } + + int btnX = getGearButtonX(); + int btnY = getGearButtonY(); + if (mouseX >= btnX && mouseX < btnX + GEAR_BUTTON_SIZE && + mouseY >= btnY && mouseY < btnY + GEAR_BUTTON_SIZE) { + if (showingPowerPopup) { + hidePowerPopup(); + } else { + showPowerPopup(); + } + playButtonClickSound(); + return true; + } + + return super.mouseClicked(mouseX, mouseY, button); + } + + private String formatEnergy(long eu) { + if (eu >= 1_000_000_000) return String.format("%.1fG EU/t", eu / 1_000_000_000.0); + if (eu >= 1_000_000) return String.format("%.1fM EU/t", eu / 1_000_000.0); + if (eu >= 1000) return String.format("%.1fk EU/t", eu / 1000.0); + return String.format("%d EU/t", eu); + } + + private int getTierColor(int tier) { + return switch (tier) { + case 0 -> 0x808080; + case 1 -> 0xC0C0C0; + case 2 -> 0x00FFFF; + case 3 -> 0xFFFF00; + case 4 -> 0x0080FF; + case 5 -> 0x8000FF; + case 6 -> 0xFF0080; + case 7 -> 0xFF00FF; + case 8 -> 0x00FF00; + default -> 0xFF4040; + }; + } + + private int getStageTextColor(Stage stage) { + return 0xFF000000 | switch (stage) { + case EMPTY -> 0x606060; + case GROWING -> 0x66AAFF; + case STAR -> 0xFFCC44; + case SUPERSTAR -> 0xFF8844; + case BLACK_HOLE -> 0xAA66FF; + case DEATH -> 0xFF4444; + case DEATH_GRACEFUL -> 0x886666; + }; + } + + private int getAccentColor() { + if (isConnected && canProcess) { + return getStageAccentColor(irisStage); + } + return 0xFF4080AA; + } + + private int getStageAccentColor(Stage stage) { + return 0xFF000000 | switch (stage) { + case EMPTY -> 0x404060; + case GROWING -> 0x6080FF; + case STAR -> 0xFFCC44; + case SUPERSTAR -> 0xFF8844; + case BLACK_HOLE -> 0x8040FF; + case DEATH -> 0xFF2020; + case DEATH_GRACEFUL -> 0x804040; + }; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarModuleUIWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarModuleUIWidget.java new file mode 100644 index 000000000..583ec3e3e --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarModuleUIWidget.java @@ -0,0 +1,501 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.feature.IStellarIrisProvider; +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine.Stage; +import com.ghostipedia.cosmiccore.api.machine.multiblock.StellarBaseModule; + +import com.gregtechceu.gtceu.api.gui.fancy.FancyMachineUIWidget; +import com.gregtechceu.gtceu.api.gui.fancy.IFancyUIProvider; + +import com.lowdragmc.lowdraglib.gui.texture.ColorBorderTexture; +import com.lowdragmc.lowdraglib.gui.texture.ColorRectTexture; +import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; +import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.SlotWidget; +import com.lowdragmc.lowdraglib.gui.widget.Widget; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class StellarModuleUIWidget extends FancyMachineUIWidget { + + private final Supplier moduleSupplier; + + private static final int BG_COLOR = 0xE00a0a14; + private static final int BORDER_COLOR = 0xFF404060; + private static final int SLOT_BG_COLOR = 0xC0101018; + private static final int SLOT_BORDER_COLOR = 0xFF505070; + private static final int MODULE_ACCENT = 0xFF4080AA; + private static final int MODULE_ACCENT_DIM = 0xFF305070; + + private int syncedMaxParallel = 1; + private long syncedVoltage = 32; + private int syncedIrisParallelLimit = 1; + private StellarModuleContentWidget contentWidget; + + public StellarModuleUIWidget(IFancyUIProvider mainPage, int width, int height, + Supplier moduleSupplier) { + super(mainPage, width, height); + this.moduleSupplier = moduleSupplier; + setBackground((IGuiTexture) null); + applyDarkTheme(); + } + + private void onPowerSettingsChanged(int maxParallel, long voltage) { + writeClientAction(1, buf -> { + buf.writeInt(maxParallel); + buf.writeLong(voltage); + }); + } + + @Override + public void handleClientAction(int id, FriendlyByteBuf buffer) { + if (id == 1) { + int newParallel = buffer.readInt(); + long newVoltage = buffer.readLong(); + + StellarBaseModule module = moduleSupplier.get(); + if (module != null) { + module.setConfiguredMaxParallel(newParallel); + module.setConfiguredVoltagePerParallel(newVoltage); + + // Mark dirty so it saves + module.markDirty(); + + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.info( + "[StellarModuleUI] SERVER received power settings: parallel={}, voltage={}", + newParallel, newVoltage); + } + } else { + super.handleClientAction(id, buffer); + } + } + + @Override + public void detectAndSendChanges() { + super.detectAndSendChanges(); + StellarBaseModule module = moduleSupplier.get(); + if (module != null) { + int currentParallel = module.getConfiguredMaxParallel(); + long currentVoltage = module.getConfiguredVoltagePerParallel(); + int currentIrisLimit = module.getIrisParallelLimit(); + if (currentParallel != syncedMaxParallel || + currentVoltage != syncedVoltage || + currentIrisLimit != syncedIrisParallelLimit) { + syncedMaxParallel = currentParallel; + syncedVoltage = currentVoltage; + syncedIrisParallelLimit = currentIrisLimit; + writeUpdateInfo(201, buf -> { + buf.writeInt(syncedMaxParallel); + buf.writeLong(syncedVoltage); + buf.writeInt(syncedIrisParallelLimit); + }); + } + } + } + + @Override + public void writeInitialData(FriendlyByteBuf buffer) { + super.writeInitialData(buffer); + + StellarBaseModule module = moduleSupplier.get(); + if (module != null) { + buffer.writeInt(module.getConfiguredMaxParallel()); + buffer.writeLong(module.getConfiguredVoltagePerParallel()); + buffer.writeInt(module.getIrisParallelLimit()); + } else { + buffer.writeInt(1); + buffer.writeLong(32L); + buffer.writeInt(1); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void readInitialData(FriendlyByteBuf buffer) { + super.readInitialData(buffer); + syncedMaxParallel = buffer.readInt(); + syncedVoltage = buffer.readLong(); + syncedIrisParallelLimit = buffer.readInt(); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void readUpdateInfo(int id, FriendlyByteBuf buffer) { + if (id == 201) { + syncedMaxParallel = buffer.readInt(); + syncedVoltage = buffer.readLong(); + syncedIrisParallelLimit = buffer.readInt(); + } else { + super.readUpdateInfo(id, buffer); + } + } + + private void applyDarkTheme() { + IGuiTexture titleBarBg = new GuiTextureGroup( + new ColorRectTexture(BG_COLOR), + new ColorBorderTexture(1, BORDER_COLOR)); + + if (titleBar != null) { + titleBar.setBackground((IGuiTexture) null); + for (Widget widget : titleBar.widgets) { + if (widget instanceof WidgetGroup group) { + group.setBackground(titleBarBg); + } + } + } + + if (sideTabsWidget != null) { + sideTabsWidget.setBackground((IGuiTexture) null); + updateTabStyling(); + } + + if (configuratorPanel != null) { + configuratorPanel.setVisible(false); + configuratorPanel.setActive(false); + } + + if (playerInventory != null) { + playerInventory.setBackground((IGuiTexture) null); + IGuiTexture darkSlot = new GuiTextureGroup( + new ColorRectTexture(SLOT_BG_COLOR), + new ColorBorderTexture(1, SLOT_BORDER_COLOR)); + for (Widget widget : playerInventory.widgets) { + if (widget instanceof SlotWidget slotWidget) { + slotWidget.setBackground(darkSlot); + } + } + } + } + + private void updateTabStyling() { + if (sideTabsWidget == null) return; + + int accentColor = getAccentColor(); + int accentColorDim = dimColor(accentColor, 0.6f); + + IGuiTexture tabNormal = new GuiTextureGroup( + new ColorRectTexture(0xA0080812), + new ColorBorderTexture(1, accentColorDim)); + IGuiTexture tabHover = new GuiTextureGroup( + new ColorRectTexture(0xC0151525), + new ColorBorderTexture(1, accentColor)); + IGuiTexture tabPressed = new GuiTextureGroup( + new ColorRectTexture(0xE0101020), + new ColorBorderTexture(1, accentColor)); + + sideTabsWidget.setTabTexture(tabNormal); + sideTabsWidget.setTabHoverTexture(tabHover); + sideTabsWidget.setTabPressedTexture(tabPressed); + } + + private int dimColor(int color, float factor) { + int a = (color >> 24) & 0xFF; + int r = (int) (((color >> 16) & 0xFF) * factor); + int g = (int) (((color >> 8) & 0xFF) * factor); + int b = (int) ((color & 0xFF) * factor); + return (a << 24) | (r << 16) | (g << 8) | b; + } + + @Override + public void initWidget() { + super.initWidget(); + if (playerInventory != null) { + IGuiTexture darkSlot = new GuiTextureGroup( + new ColorRectTexture(SLOT_BG_COLOR), + new ColorBorderTexture(1, SLOT_BORDER_COLOR)); + for (Widget widget : playerInventory.widgets) { + if (widget instanceof SlotWidget slotWidget) { + slotWidget.setBackground(darkSlot); + } + } + } + + // Find and wire up the content widget for power settings callback + findContentWidget(this); + if (contentWidget != null) { + contentWidget.setOnPowerSettingsChanged(this::onPowerSettingsChanged); + } + } + + private void findContentWidget(WidgetGroup group) { + for (Widget widget : group.widgets) { + if (widget instanceof StellarModuleContentWidget smcw) { + contentWidget = smcw; + return; + } + if (widget instanceof WidgetGroup wg) { + findContentWidget(wg); + if (contentWidget != null) return; + } + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + drawFullBackground(graphics); + drawCustomOverlays(graphics); + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + drawTitleText(graphics); + } + + private void drawFullBackground(GuiGraphics graphics) { + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + // Dark gradient background + DrawerHelper.drawGradientRect(graphics, x, y, w, h, 0xFF0c0c12, 0xFF060608, false); + + // Subtle grid pattern + drawGridPattern(graphics, x, y, w, h); + + // Corner accents + int accentColor = getAccentColor(); + drawCornerAccents(graphics, x, y, w, h, accentColor & 0x66FFFFFF); + + // Border + DrawerHelper.drawBorder(graphics, x, y, w, h, accentColor & 0x33FFFFFF, 1); + + // Side panels if inventory is visible + if (playerInventory != null && playerInventory.isVisible()) { + drawSidePanels(graphics, x, y, w, h); + } + } + + private void drawGridPattern(GuiGraphics graphics, int x, int y, int w, int h) { + int gridColor = 0x08FFFFFF; + int spacing = 16; + for (int gx = x + spacing; gx < x + w; gx += spacing) { + graphics.fill(gx, y, gx + 1, y + h, gridColor); + } + for (int gy = y + spacing; gy < y + h; gy += spacing) { + graphics.fill(x, gy, x + w, gy + 1, gridColor); + } + } + + private void drawCornerAccents(GuiGraphics graphics, int x, int y, int w, int h, int color) { + int len = 20; + int thickness = 2; + // Top-left + graphics.fill(x, y, x + len, y + thickness, color); + graphics.fill(x, y, x + thickness, y + len, color); + // Top-right + graphics.fill(x + w - len, y, x + w, y + thickness, color); + graphics.fill(x + w - thickness, y, x + w, y + len, color); + // Bottom-left + graphics.fill(x, y + h - thickness, x + len, y + h, color); + graphics.fill(x, y + h - len, x + thickness, y + h, color); + // Bottom-right + graphics.fill(x + w - len, y + h - thickness, x + w, y + h, color); + graphics.fill(x + w - thickness, y + h - len, x + w, y + h, color); + } + + private void drawSidePanels(GuiGraphics graphics, int x, int y, int w, int h) { + int invY = playerInventory.getPosition().y; + int invX = playerInventory.getPosition().x; + int invW = playerInventory.getSize().width; + int panelH = h - (invY - y) - 5; + + // Left panel - connection status + int leftPanelX = x + 3; + int leftPanelW = invX - leftPanelX - 3; + if (leftPanelW > 20) { + drawConnectionPanel(graphics, leftPanelX, invY, leftPanelW, panelH); + } + + // Right panel - stats + int rightPanelX = invX + invW + 3; + int rightPanelW = (x + w) - rightPanelX - 3; + if (rightPanelW > 20) { + drawStatsPanel(graphics, rightPanelX, invY, rightPanelW, panelH); + } + } + + private void drawConnectionPanel(GuiGraphics graphics, int px, int py, int pw, int ph) { + DrawerHelper.drawSolidRect(graphics, px, py, pw, ph, 0x40000000); + int borderColor = getAccentColor() & 0x33FFFFFF; + DrawerHelper.drawBorder(graphics, px, py, pw, ph, borderColor, 1); + int accentColor = getAccentColor() & 0x80FFFFFF; + graphics.fill(px + 1, py + 1, px + pw - 1, py + 3, accentColor); + + var font = Minecraft.getInstance().font; + StellarBaseModule module = moduleSupplier.get(); + + if (module != null) { + IStellarIrisProvider iris = module.getStellarIris(); + boolean connected = iris != null && iris.isFormed(); + boolean canProcess = connected && iris.canProcess(); + + String statusText = connected ? (canProcess ? "LINKED" : "WAITING") : "OFFLINE"; + int statusColor = connected ? (canProcess ? 0xFF66FF66 : 0xFFFFAA44) : 0xFFFF4444; + + graphics.drawString(font, "IRIS LINK", px + 4, py + 6, accentColor | 0xFF000000, false); + graphics.drawString(font, statusText, px + 4, py + 18, statusColor, false); + + // Animated connection indicator + if (connected) { + int pulseAlpha = (int) (128 + 64 * Math.sin(System.currentTimeMillis() / 200.0)); + int pulseColor = (pulseAlpha << 24) | (statusColor & 0x00FFFFFF); + int indicatorY = py + 30; + int indicatorW = (int) ((pw - 10) * (0.5f + 0.5f * Math.sin(System.currentTimeMillis() / 500.0))); + graphics.fill(px + 5, indicatorY, px + 5 + Math.max(5, indicatorW), indicatorY + 2, pulseColor); + } + } + } + + private void drawStatsPanel(GuiGraphics graphics, int px, int py, int pw, int ph) { + DrawerHelper.drawSolidRect(graphics, px, py, pw, ph, 0x40000000); + int borderColor = getAccentColor() & 0x33FFFFFF; + DrawerHelper.drawBorder(graphics, px, py, pw, ph, borderColor, 1); + int accentColor = getAccentColor() & 0x80FFFFFF; + graphics.fill(px + 1, py + 1, px + pw - 1, py + 3, accentColor); + + var font = Minecraft.getInstance().font; + int labelColor = 0xFF606080; + int valueColor = 0xFFCCCCCC; + + graphics.drawString(font, "MODULE", px + 4, py + 6, accentColor | 0xFF000000, false); + + StellarBaseModule module = moduleSupplier.get(); + if (module != null) { + IStellarIrisProvider iris = module.getStellarIris(); + + // Energy usage + long euPerTick = module.getEnergyConsumedPerTick(); + graphics.drawString(font, "EU/t:", px + 4, py + 20, labelColor, false); + graphics.drawString(font, formatEnergy(euPerTick), px + 30, py + 20, valueColor, false); + + // Iris bonuses (if connected) + if (iris != null && iris.canProcess()) { + graphics.drawString(font, "SPEED:", px + 4, py + 32, labelColor, false); + graphics.drawString(font, String.format("%.1fx", iris.getSpeedBonus()), px + 38, py + 32, 0xFF66FF66, + false); + + graphics.drawString(font, "STAGE:", px + 4, py + 44, labelColor, false); + Stage stage = iris.getStage(); + graphics.drawString(font, getShortStageName(stage), px + 38, py + 44, getStageColor(stage), false); + } else { + graphics.drawString(font, "---", px + 4, py + 32, 0xFF404040, false); + } + } + } + + private String formatEnergy(long eu) { + if (eu >= 1_000_000_000) return String.format("%.1fG", eu / 1_000_000_000.0); + if (eu >= 1_000_000) return String.format("%.1fM", eu / 1_000_000.0); + if (eu >= 1000) return String.format("%.1fk", eu / 1000.0); + return String.format("%d", eu); + } + + private String getShortStageName(Stage stage) { + return switch (stage) { + case EMPTY -> "NONE"; + case GROWING -> "GROW"; + case STAR -> "STAR"; + case SUPERSTAR -> "SUPER"; + case BLACK_HOLE -> "B.HOLE"; + case DEATH -> "DEATH"; + case DEATH_GRACEFUL -> "FADE"; + }; + } + + private int getStageColor(Stage stage) { + return switch (stage) { + case EMPTY -> 0xFF606060; + case GROWING -> 0xFF66AAFF; + case STAR -> 0xFFFFCC44; + case SUPERSTAR -> 0xFFFF8844; + case BLACK_HOLE -> 0xFFAA66FF; + case DEATH -> 0xFFFF4444; + case DEATH_GRACEFUL -> 0xFF886666; + }; + } + + private void drawTitleText(GuiGraphics graphics) { + if (titleBar == null || mainPage == null) return; + + var font = Minecraft.getInstance().font; + String title = mainPage.getTitle().getString(); + + int titleBarX = getPosition().x + 8; + int titleBarY = getPosition().y - 16; + int textAreaX = titleBarX + 18 + 16; + int textAreaY = titleBarY + 3; + int textAreaWidth = getSize().width - 16 - 18 - 18 - 16; + int textAreaHeight = 13; + + graphics.fill(textAreaX, textAreaY, textAreaX + textAreaWidth, textAreaY + textAreaHeight, BG_COLOR); + + int textWidth = font.width(title); + int maxWidth = textAreaWidth - 4; + if (textWidth > maxWidth) { + String ellipsis = "..."; + int ellipsisWidth = font.width(ellipsis); + while (textWidth + ellipsisWidth > maxWidth && title.length() > 1) { + title = title.substring(0, title.length() - 1); + textWidth = font.width(title); + } + title = title + ellipsis; + textWidth = font.width(title); + } + + int centeredX = textAreaX + (textAreaWidth - textWidth) / 2; + int centeredY = textAreaY + (textAreaHeight - font.lineHeight) / 2; + + graphics.enableScissor(textAreaX, textAreaY, textAreaX + textAreaWidth, textAreaY + textAreaHeight); + graphics.drawString(font, title, centeredX, centeredY, 0xFFFFFFFF, true); + graphics.disableScissor(); + } + + private void drawCustomOverlays(GuiGraphics graphics) { + int accentColor = getAccentColor() & 0x60FFFFFF; + + if (playerInventory != null && playerInventory.isVisible()) { + int x = getPosition().x; + int w = getSize().width; + int invY = playerInventory.getPosition().y; + graphics.fill(x + 10, invY - 2, x + w - 10, invY - 1, accentColor); + } + } + + private int getAccentColor() { + StellarBaseModule module = moduleSupplier.get(); + if (module != null) { + IStellarIrisProvider iris = module.getStellarIris(); + if (iris != null && iris.isFormed() && iris.canProcess()) { + return getStageAccentColor(iris.getStage()); + } + } + return MODULE_ACCENT; + } + + private int getStageAccentColor(Stage stage) { + return 0xFF000000 | switch (stage) { + case EMPTY -> 0x404060; + case GROWING -> 0x6080FF; + case STAR -> 0xFFCC44; + case SUPERSTAR -> 0xFF8844; + case BLACK_HOLE -> 0x8040FF; + case DEATH -> 0xFF2020; + case DEATH_GRACEFUL -> 0x804040; + }; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/TelemetryPanelWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/TelemetryPanelWidget.java new file mode 100644 index 000000000..d224339c5 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/TelemetryPanelWidget.java @@ -0,0 +1,379 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine; +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine.Stage; + +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.util.Mth; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class TelemetryPanelWidget extends Widget { + + private final Supplier machineSupplier; + private final Supplier stageSupplier; + + private final List logLines = new ArrayList<>(); + private float scrollOffset = 0f; + private float dataUpdateTimer = 0f; + private float glitchPhase = 0f; + + private float displayedTemp = 0f; + private float displayedPressure = 0f; + private float displayedMass = 0f; + private float displayedEnergy = 0f; + + public TelemetryPanelWidget(int x, int y, int width, int height, + Supplier machineSupplier, + Supplier stageSupplier) { + super(x, y, width, height); + this.machineSupplier = machineSupplier; + this.stageSupplier = stageSupplier; + initLogLines(); + } + + private void initLogLines() { + logLines.add("[SYS] Stellar Iris v3.7.2 initialized"); + logLines.add("[SYS] Containment field generators online"); + logLines.add("[SYS] Plasma injectors standby"); + logLines.add("[SYS] Gravitational stabilizers active"); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + + Stage stage = stageSupplier.get(); + scrollOffset += 0.02f; + dataUpdateTimer += 1f; + glitchPhase += 0.1f; + + updateDisplayedValues(stage); + + if (dataUpdateTimer > 60f) { + dataUpdateTimer = 0f; + addLogLine(stage); + } + } + + private void updateDisplayedValues(Stage stage) { + float targetTemp = getTemperature(stage); + float targetPressure = getPressure(stage); + float targetMass = getMass(stage); + float targetEnergy = getEnergy(stage); + + float lerpSpeed = 0.05f; + displayedTemp = Mth.lerp(lerpSpeed, displayedTemp, targetTemp); + displayedPressure = Mth.lerp(lerpSpeed, displayedPressure, targetPressure); + displayedMass = Mth.lerp(lerpSpeed, displayedMass, targetMass); + displayedEnergy = Mth.lerp(lerpSpeed, displayedEnergy, targetEnergy); + + if (stage == Stage.DEATH) { + displayedTemp += (float) (Math.random() - 0.5) * 1000; + displayedPressure += (float) (Math.random() - 0.5) * 50; + } + } + + private float getTemperature(Stage stage) { + return switch (stage) { + case EMPTY -> 2.7f; + case GROWING -> 5_000_000f; + case STAR -> 15_000_000f; + case SUPERSTAR -> 100_000_000f; + case BLACK_HOLE -> Float.POSITIVE_INFINITY; + case DEATH -> 500_000_000f; + case DEATH_GRACEFUL -> 1_000_000f; + }; + } + + private float getPressure(Stage stage) { + return switch (stage) { + case EMPTY -> 0f; + case GROWING -> 150f; + case STAR -> 250f; + case SUPERSTAR -> 450f; + case BLACK_HOLE -> 999f; + case DEATH -> 800f; + case DEATH_GRACEFUL -> 50f; + }; + } + + private float getMass(Stage stage) { + return switch (stage) { + case EMPTY -> 0f; + case GROWING -> 0.3f; + case STAR -> 1f; + case SUPERSTAR -> 8f; + case BLACK_HOLE -> 25f; + case DEATH -> 12f; + case DEATH_GRACEFUL -> 0.1f; + }; + } + + private float getEnergy(Stage stage) { + return switch (stage) { + case EMPTY -> 0f; + case GROWING -> 1_000f; + case STAR -> 50_000f; + case SUPERSTAR -> 500_000f; + case BLACK_HOLE -> 10_000_000f; + case DEATH -> 100_000_000f; + case DEATH_GRACEFUL -> 500f; + }; + } + + private void addLogLine(Stage stage) { + String newLine = generateLogLine(stage); + logLines.add(newLine); + if (logLines.size() > 50) { + logLines.remove(0); + } + } + + private String generateLogLine(Stage stage) { + long tick = System.currentTimeMillis() / 50; + String timestamp = String.format("[%04d]", tick % 10000); + + return switch (stage) { + case EMPTY -> timestamp + " [IDLE] Awaiting ignition sequence"; + case GROWING -> { + String[] msgs = { + " [CORE] Fusion rate increasing", + " [FUEL] Hydrogen consumption nominal", + " [TEMP] Core temperature rising", + " [STAB] Plasma containment stable" + }; + yield timestamp + msgs[(int) (tick % msgs.length)]; + } + case STAR -> { + String[] msgs = { + " [CORE] Main sequence fusion active", + " [OUT] Energy output: " + (int) displayedEnergy + " TW", + " [FUEL] Helium ash accumulating", + " [STAB] All systems nominal" + }; + yield timestamp + msgs[(int) (tick % msgs.length)]; + } + case SUPERSTAR -> { + String[] msgs = { + " [WARN] Core pressure critical", + " [WARN] Mass exceeding safe limits", + " [ALERT] Collapse threshold approaching", + " [CORE] Heavy element fusion detected" + }; + yield timestamp + msgs[(int) (tick % msgs.length)]; + } + case BLACK_HOLE -> { + String[] msgs = { + " [SING] Event horizon stable", + " [GRAV] Hawking radiation detected", + " [CONT] Exotic matter containment active", + " [DATA] Spacetime curvature nominal" + }; + yield timestamp + msgs[(int) (tick % msgs.length)]; + } + case DEATH -> { + String[] msgs = { + " [CRIT] CONTAINMENT FAILURE", + " [CRIT] EMERGENCY PROTOCOLS ACTIVE", + " [CRIT] EVACUATE IMMEDIATELY", + " [CRIT] SYSTEM FAILURE IMMINENT" + }; + yield timestamp + msgs[(int) (tick % msgs.length)]; + } + case DEATH_GRACEFUL -> timestamp + " [SHUT] Controlled shutdown in progress"; + }; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + Stage stage = stageSupplier.get(); + int accentColor = getStageColor(stage); + + DrawerHelper.drawSolidRect(graphics, x, y, w, h, 0xDD080810); + DrawerHelper.drawBorder(graphics, x, y, w, h, (0x80 << 24) | accentColor, 1); + + graphics.fill(x + 1, y + 1, x + w - 1, y + 3, (0x60 << 24) | accentColor); + + int dataHeight = 50; + drawDataReadouts(graphics, x + 5, y + 8, w - 10, dataHeight, stage, accentColor); + + int logY = y + 8 + dataHeight + 5; + int logH = h - dataHeight - 18; + drawLogPanel(graphics, x + 5, logY, w - 10, logH, stage, accentColor); + } + + private void drawDataReadouts(GuiGraphics graphics, int x, int y, int w, int h, Stage stage, int accentColor) { + var font = Minecraft.getInstance().font; + + graphics.fill(x, y, x + w, y + h, 0x40000000); + DrawerHelper.drawBorder(graphics, x, y, w, h, (0x40 << 24) | accentColor, 1); + + int col1 = x + 5; + int col2 = x + w / 2 + 5; + int row1 = y + 5; + int row2 = y + 15; + int row3 = y + 25; + int row4 = y + 35; + + int labelColor = 0xFF606080; + int valueColor = 0xFFCCCCCC; + + graphics.drawString(font, "CORE TEMP:", col1, row1, labelColor, false); + graphics.drawString(font, formatTemperature(displayedTemp), col1 + 60, row1, getTemperatureColor(displayedTemp), + false); + + graphics.drawString(font, "PRESSURE:", col1, row2, labelColor, false); + graphics.drawString(font, String.format("%.1f GPa", displayedPressure), col1 + 60, row2, valueColor, false); + + graphics.drawString(font, "MASS:", col2, row1, labelColor, false); + graphics.drawString(font, String.format("%.2f M\u2609", displayedMass), col2 + 35, row1, valueColor, false); + + graphics.drawString(font, "OUTPUT:", col2, row2, labelColor, false); + graphics.drawString(font, formatEnergy(displayedEnergy), col2 + 45, row2, valueColor, false); + + String status = getStatusString(stage); + int statusColor = getStatusColor(stage); + graphics.drawString(font, "STATUS:", col1, row3, labelColor, false); + + if (stage == Stage.DEATH && ((int) (glitchPhase * 2) % 3 == 0)) { + int glitchOffset = (int) ((Math.random() - 0.5) * 4); + graphics.drawString(font, status, col1 + 45 + glitchOffset, row3, statusColor, false); + } else { + graphics.drawString(font, status, col1 + 45, row3, statusColor, false); + } + + String stageLabel = "PHASE: " + stage.name().replace("_", " "); + graphics.drawString(font, stageLabel, col1, row4, (0xC0 << 24) | accentColor, false); + } + + private void drawLogPanel(GuiGraphics graphics, int x, int y, int w, int h, Stage stage, int accentColor) { + var font = Minecraft.getInstance().font; + + graphics.fill(x, y, x + w, y + h, 0x60000000); + DrawerHelper.drawBorder(graphics, x, y, w, h, (0x30 << 24) | accentColor, 1); + + graphics.drawString(font, "SYSTEM LOG", x + 3, y + 2, (0x80 << 24) | accentColor, false); + + int logStartY = y + 12; + int logHeight = h - 14; + int lineHeight = 9; + int visibleLines = logHeight / lineHeight; + + graphics.enableScissor(x + 2, logStartY, x + w - 2, y + h - 2); + + int startIndex = Math.max(0, logLines.size() - visibleLines); + for (int i = startIndex; i < logLines.size(); i++) { + int lineY = logStartY + (i - startIndex) * lineHeight; + String line = logLines.get(i); + + int lineColor; + if (line.contains("[CRIT]")) { + lineColor = 0xFFFF4444; + } else if (line.contains("[WARN]") || line.contains("[ALERT]")) { + lineColor = 0xFFFFAA44; + } else if (line.contains("[SYS]")) { + lineColor = 0xFF44AAFF; + } else { + lineColor = 0xFF888888; + } + + if (stage == Stage.DEATH && line.contains("[CRIT]")) { + if ((int) (glitchPhase * 3) % 2 == 0) { + int glitchX = (int) ((Math.random() - 0.5) * 3); + graphics.drawString(font, line, x + 3 + glitchX, lineY, lineColor, false); + } + } else { + graphics.drawString(font, line, x + 3, lineY, lineColor, false); + } + } + + graphics.disableScissor(); + } + + private String formatTemperature(float temp) { + if (Float.isInfinite(temp)) { + return "\u221E K"; + } else if (temp >= 1_000_000_000) { + return String.format("%.1f GK", temp / 1_000_000_000); + } else if (temp >= 1_000_000) { + return String.format("%.1f MK", temp / 1_000_000); + } else if (temp >= 1000) { + return String.format("%.1f kK", temp / 1000); + } else { + return String.format("%.1f K", temp); + } + } + + private String formatEnergy(float energy) { + if (energy >= 1_000_000) { + return String.format("%.1f PW", energy / 1_000_000); + } else if (energy >= 1000) { + return String.format("%.1f TW", energy / 1000); + } else { + return String.format("%.0f GW", energy); + } + } + + private int getTemperatureColor(float temp) { + if (temp >= 100_000_000) return 0xFFFF4444; + if (temp >= 10_000_000) return 0xFFFFAA44; + if (temp >= 1_000_000) return 0xFFFFFF44; + return 0xFFCCCCCC; + } + + private String getStatusString(Stage stage) { + return switch (stage) { + case EMPTY -> "DORMANT"; + case GROWING -> "IGNITING"; + case STAR -> "STABLE"; + case SUPERSTAR -> "CRITICAL"; + case BLACK_HOLE -> "CONTAINED"; + case DEATH -> "FAILURE"; + case DEATH_GRACEFUL -> "SHUTDOWN"; + }; + } + + private int getStatusColor(Stage stage) { + return switch (stage) { + case EMPTY -> 0xFF606060; + case GROWING -> 0xFF66AAFF; + case STAR -> 0xFF66FF66; + case SUPERSTAR -> 0xFFFFAA44; + case BLACK_HOLE -> 0xFFAA66FF; + case DEATH -> 0xFFFF4444; + case DEATH_GRACEFUL -> 0xFF886666; + }; + } + + private int getStageColor(Stage stage) { + return switch (stage) { + case EMPTY -> 0x405060; + case GROWING -> 0x6090FF; + case STAR -> 0xFFCC44; + case SUPERSTAR -> 0xFF7722; + case BLACK_HOLE -> 0xAA55FF; + case DEATH -> 0xFF3030; + case DEATH_GRACEFUL -> 0x664040; + }; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/UpgradeTreeButton.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/UpgradeTreeButton.java new file mode 100644 index 000000000..5d3ed6d58 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/UpgradeTreeButton.java @@ -0,0 +1,108 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine; + +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.resources.sounds.SimpleSoundInstance; +import net.minecraft.sounds.SoundEvents; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import java.util.function.Consumer; +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class UpgradeTreeButton extends Widget { + + private static final int BG_COLOR = 0xFF202030; + private static final int BORDER_COLOR = 0xFF404060; + private static final int HOVER_COLOR = 0xFF303050; + private static final int ACCENT_COLOR = 0xFFFFCC44; + + private final Consumer onClick; + private final Supplier machineSupplier; + private boolean hovered = false; + private float pulsePhase = 0f; + + public UpgradeTreeButton(int x, int y, int width, int height, + Consumer onClick, + Supplier machineSupplier) { + super(x, y, width, height); + this.onClick = onClick; + this.machineSupplier = machineSupplier; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + pulsePhase += 0.1f; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + hovered = isMouseOverElement(mouseX, mouseY); + + // Background + int bgColor = hovered ? HOVER_COLOR : BG_COLOR; + DrawerHelper.drawSolidRect(graphics, x, y, w, h, bgColor); + + // Border - pulse if has spendable points + int borderColor = BORDER_COLOR; + IrisMultiblockMachine machine = machineSupplier.get(); + if (machine != null && machine.getSpendablePoints() > 0) { + float pulse = (float) (Math.sin(pulsePhase) * 0.5 + 0.5); + int r = (int) (((ACCENT_COLOR >> 16) & 0xFF) * pulse + ((BORDER_COLOR >> 16) & 0xFF) * (1 - pulse)); + int g = (int) (((ACCENT_COLOR >> 8) & 0xFF) * pulse + ((BORDER_COLOR >> 8) & 0xFF) * (1 - pulse)); + int b = (int) ((ACCENT_COLOR & 0xFF) * pulse + (BORDER_COLOR & 0xFF) * (1 - pulse)); + borderColor = 0xFF000000 | (r << 16) | (g << 8) | b; + } + DrawerHelper.drawBorder(graphics, x, y, w, h, borderColor, 1); + + // Draw upgrade tree icon (stylized star with branches) + var font = Minecraft.getInstance().font; + int iconColor = hovered ? 0xFFFFFFFF : 0xFFAAAAAA; + + // Simple "UP" text or star symbol + String icon = "\u2726"; // Star symbol + int iconX = x + (w - font.width(icon)) / 2; + int iconY = y + (h - 8) / 2; + graphics.drawString(font, icon, iconX, iconY, iconColor, false); + + // Draw point count badge if has points + if (machine != null && machine.getSpendablePoints() > 0) { + String points = String.valueOf(machine.getSpendablePoints()); + int badgeW = font.width(points) + 4; + int badgeX = x + w - badgeW + 2; + int badgeY = y - 2; + + DrawerHelper.drawSolidRect(graphics, badgeX, badgeY, badgeW, 8, ACCENT_COLOR); + graphics.drawString(font, points, badgeX + 2, badgeY, 0xFF000000, false); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (button == 0 && isMouseOverElement(mouseX, mouseY)) { + Minecraft.getInstance().getSoundManager().play( + SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK.value(), 1.0f, 0.8f)); + onClick.accept(true); + return true; + } + return super.mouseClicked(mouseX, mouseY, button); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/UpgradeTreeWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/UpgradeTreeWidget.java new file mode 100644 index 000000000..0da62bbf2 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/UpgradeTreeWidget.java @@ -0,0 +1,689 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine; +import com.ghostipedia.cosmiccore.api.machine.multiblock.StellarIrisUpgrade; + +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.resources.sounds.SimpleSoundInstance; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.sounds.SoundEvents; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import java.util.*; +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +/** + * Clean, performant upgrade tree widget. + * Displays 4 branches in a vertical layout with clear visual hierarchy. + */ +public class UpgradeTreeWidget extends Widget { + + private static final int UPDATE_ID_SYNC = 420; + private static final int CLIENT_ACTION_UNLOCK = 1; + private static final int CLIENT_ACTION_RESPEC = 2; + + // Clean color palette + private static final int BG_COLOR = 0xF0101018; + private static final int HEADER_COLOR = 0xFF181820; + private static final int BORDER_COLOR = 0xFF3A3A50; + private static final int BORDER_ACCENT = 0xFF5A5A80; + + private static final int[] BRANCH_COLORS = { + 0xFFFF6644, // IGNITION - orange + 0xFF44AAFF, // FUSION - blue + 0xFFAA44FF, // COLLAPSE - purple + 0xFF44FFAA, // VOID - teal + 0xFFFFCC44 // ULTIMATE - gold + }; + + private static final String[] BRANCH_NAMES = { "IGNITION", "FUSION", "COLLAPSE", "VOID" }; + + private final Supplier machineSupplier; + private final Runnable onClose; + + private boolean visible = false; + private float fadeAlpha = 0f; + private int animTick = 0; + + // Cached data + private Set unlockedUpgrades = EnumSet.noneOf(StellarIrisUpgrade.class); + private int spendablePoints = 0; + private int tier = 0; + private int ascensionLevel = 0; + + // UI state + private StellarIrisUpgrade hoveredUpgrade = null; + private boolean showRespecConfirm = false; + private int unlockFlashTick = 0; + private StellarIrisUpgrade lastUnlocked = null; + + // Precomputed node positions + private final Map nodePositions = new HashMap<>(); + + public UpgradeTreeWidget(int x, int y, int width, int height, + Supplier machineSupplier, + Runnable onClose) { + super(x, y, width, height); + this.machineSupplier = machineSupplier; + this.onClose = onClose; + calculateNodePositions(); + } + + private void calculateNodePositions() { + int w = getSize().width; + int h = getSize().height; + + // Layout: 4 branches side by side, rows going down + // Each branch gets ~1/4 of the width + int branchWidth = w / 4; + int startY = 35; // Below header + int rowHeight = 24; + int nodeSize = 9; + + for (StellarIrisUpgrade upgrade : StellarIrisUpgrade.values()) { + int branchIdx = upgrade.getBranch().ordinal(); + int branchCenterX = branchWidth / 2 + branchIdx * branchWidth; + int row = upgrade.getRow(); + + // Get all upgrades in same row/branch for horizontal layout + List sameRowBranch = new ArrayList<>(); + for (StellarIrisUpgrade u : StellarIrisUpgrade.values()) { + if (u.getBranch() == upgrade.getBranch() && u.getRow() == row) { + sameRowBranch.add(u); + } + } + sameRowBranch.sort(Comparator.comparingInt(Enum::ordinal)); + + int col = sameRowBranch.indexOf(upgrade); + int colCount = sameRowBranch.size(); + int spacing = 22; + int offsetX = (colCount == 1) ? 0 : (int) ((col - (colCount - 1) / 2.0f) * spacing); + + int nx = branchCenterX + offsetX; + int ny = startY + (row - 1) * rowHeight; + + nodePositions.put(upgrade, new int[] { nx, ny }); + } + } + + public void show() { + visible = true; + animTick = 0; + syncFromMachine(); + } + + public void hide() { + visible = false; + showRespecConfirm = false; + } + + public boolean isVisible() { + return visible; + } + + private void syncFromMachine() { + IrisMultiblockMachine machine = machineSupplier.get(); + if (machine != null) { + Set machineUpgrades = machine.getUnlockedUpgrades(); + if (machineUpgrades.isEmpty()) { + unlockedUpgrades = EnumSet.noneOf(StellarIrisUpgrade.class); + } else { + unlockedUpgrades = EnumSet.copyOf(machineUpgrades); + } + spendablePoints = machine.getSpendablePoints(); + tier = machine.getPrestigeTier(); + ascensionLevel = machine.getAscensionLevel(); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + + if (visible) { + fadeAlpha = Math.min(fadeAlpha + 0.15f, 1f); + animTick++; + } else { + fadeAlpha = Math.max(fadeAlpha - 0.2f, 0f); + } + + if (unlockFlashTick > 0) unlockFlashTick--; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + if (fadeAlpha <= 0f) return; + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + // Push pose for z-ordering - draw on top of everything + graphics.pose().pushPose(); + graphics.pose().translate(0, 0, 400); + + // Solid opaque background - ensures we cover the main UI + int bgAlpha = (int) (240 * fadeAlpha); + graphics.fill(x, y, x + w, y + h, (bgAlpha << 24) | 0x0C0C14); + + // Header bar + drawHeader(graphics, x, y, w); + + // Update hovered + updateHovered(mouseX, mouseY, x, y); + + // Branch separators and labels + drawBranchSections(graphics, x, y, w, h); + + // Draw connections + drawConnections(graphics, x, y); + + // Draw nodes + for (StellarIrisUpgrade upgrade : StellarIrisUpgrade.values()) { + drawNode(graphics, x, y, upgrade, mouseX, mouseY); + } + + // Footer with controls hint + drawFooter(graphics, x, y + h - 14, w); + + // Draw tooltip last (on top) + if (hoveredUpgrade != null && !showRespecConfirm) { + drawTooltip(graphics, mouseX, mouseY); + } + + // Respec confirmation overlay + if (showRespecConfirm) { + drawRespecConfirm(graphics, x, y, w, h); + } + + // Border + int borderAlpha = (int) (255 * fadeAlpha); + DrawerHelper.drawBorder(graphics, x, y, w, h, (borderAlpha << 24) | 0x4A4A60, 1); + + graphics.pose().popPose(); + } + + private void drawHeader(GuiGraphics graphics, int x, int y, int w) { + var font = Minecraft.getInstance().font; + int alpha = (int) (255 * fadeAlpha); + + // Header background + graphics.fill(x, y, x + w, y + 20, (alpha << 24) | 0x14141C); + graphics.fill(x, y + 19, x + w, y + 20, ((int) (alpha * 0.5) << 24) | 0x4A4A60); + + // Title + String title = "STELLAR CONVERGENCE"; + graphics.drawString(font, title, x + 8, y + 6, (alpha << 24) | 0xE0E0F0, false); + + // Points display + String points = "\u2726 " + spendablePoints; + int pointsW = font.width(points); + int pointsColor = spendablePoints > 0 ? 0xFFCC44 : 0x808090; + graphics.drawString(font, points, x + w - pointsW - 8, y + 6, (alpha << 24) | pointsColor, false); + + // Tier/Ascension indicator + String tierStr = "T" + tier; + if (ascensionLevel > 0) { + tierStr = "\u2605".repeat(Math.min(ascensionLevel, 5)) + " " + tierStr; + } + int tierW = font.width(tierStr); + graphics.drawString(font, tierStr, x + (w - tierW) / 2, y + 6, (alpha << 24) | 0x909090, false); + } + + private void drawBranchSections(GuiGraphics graphics, int x, int y, int w, int h) { + var font = Minecraft.getInstance().font; + int alpha = (int) (255 * fadeAlpha); + int branchWidth = w / 4; + + for (int i = 0; i < 4; i++) { + int bx = x + i * branchWidth; + + // Vertical separator (except first) + if (i > 0) { + int sepAlpha = (int) (80 * fadeAlpha); + graphics.fill(bx, y + 22, bx + 1, y + h - 30, (sepAlpha << 24) | 0x404060); + } + + // Branch label + String name = BRANCH_NAMES[i]; + int labelX = bx + (branchWidth - font.width(name)) / 2; + int labelAlpha = (int) (200 * fadeAlpha); + int labelColor = BRANCH_COLORS[i]; + graphics.drawString(font, name, labelX, y + 24, (labelAlpha << 24) | (labelColor & 0xFFFFFF), false); + } + + // Ultimate label at bottom + String ultLabel = "ASCENSION"; + int ultX = x + (w - font.width(ultLabel)) / 2; + int ultAlpha = (int) (180 * fadeAlpha); + graphics.drawString(font, ultLabel, ultX, y + h - 40, (ultAlpha << 24) | 0xFFCC44, false); + } + + private void drawFooter(GuiGraphics graphics, int x, int y, int w) { + var font = Minecraft.getInstance().font; + int alpha = (int) (150 * fadeAlpha); + String hint = "[ESC] Close [R] Respec"; + int hintW = font.width(hint); + graphics.drawString(font, hint, x + (w - hintW) / 2, y, (alpha << 24) | 0x606070, false); + } + + private void updateHovered(int mouseX, int mouseY, int ox, int oy) { + hoveredUpgrade = null; + for (Map.Entry entry : nodePositions.entrySet()) { + int[] pos = entry.getValue(); + int nx = ox + pos[0]; + int ny = oy + pos[1]; + int size = getNodeSize(entry.getKey()); + + if (mouseX >= nx - size && mouseX <= nx + size && + mouseY >= ny - size && mouseY <= ny + size) { + hoveredUpgrade = entry.getKey(); + break; + } + } + } + + private int getNodeSize(StellarIrisUpgrade upgrade) { + if (upgrade.isCapstone()) return 10; + return 8; + } + + private void drawConnections(GuiGraphics graphics, int ox, int oy) { + for (StellarIrisUpgrade upgrade : StellarIrisUpgrade.values()) { + int[] pos = nodePositions.get(upgrade); + if (pos == null) continue; + + for (StellarIrisUpgrade prereq : upgrade.getPrerequisites()) { + int[] prereqPos = nodePositions.get(prereq); + if (prereqPos == null) continue; + + int x1 = ox + prereqPos[0]; + int y1 = oy + prereqPos[1]; + int x2 = ox + pos[0]; + int y2 = oy + pos[1]; + + boolean owned = unlockedUpgrades.contains(prereq) && unlockedUpgrades.contains(upgrade); + boolean prereqOwned = unlockedUpgrades.contains(prereq); + + int lineAlpha; + int lineColor; + + if (owned) { + lineAlpha = (int) (200 * fadeAlpha); + lineColor = BRANCH_COLORS[upgrade.getBranch().ordinal()]; + } else if (prereqOwned) { + lineAlpha = (int) (100 * fadeAlpha); + lineColor = 0x606080; + } else { + lineAlpha = (int) (40 * fadeAlpha); + lineColor = 0x303040; + } + + drawLine(graphics, x1, y1, x2, y2, (lineAlpha << 24) | (lineColor & 0xFFFFFF)); + } + } + } + + private void drawNode(GuiGraphics graphics, int ox, int oy, StellarIrisUpgrade upgrade, int mouseX, int mouseY) { + int[] pos = nodePositions.get(upgrade); + if (pos == null) return; + + int nx = ox + pos[0]; + int ny = oy + pos[1]; + int size = getNodeSize(upgrade); + + boolean owned = unlockedUpgrades.contains(upgrade); + boolean available = !owned && upgrade.canUnlock(unlockedUpgrades, tier) && spendablePoints >= upgrade.getCost(); + boolean tierLocked = tier < upgrade.getRequiredTier(); + boolean isHovered = upgrade == hoveredUpgrade; + boolean justUnlocked = upgrade == lastUnlocked && unlockFlashTick > 0; + + int branchColor = BRANCH_COLORS[upgrade.getBranch().ordinal()]; + int alpha = (int) (255 * fadeAlpha); + + // Flash effect + if (justUnlocked) { + float flash = unlockFlashTick / 15f; + int flashAlpha = (int) (150 * flash * fadeAlpha); + int flashSize = size + (int) (8 * flash); + graphics.fill(nx - flashSize, ny - flashSize, nx + flashSize, ny + flashSize, + (flashAlpha << 24) | 0xFFFFFF); + } + + // Node background + int bgColor; + if (owned) { + bgColor = darken(branchColor, 80); + } else if (available) { + bgColor = darken(branchColor, 140); + } else if (tierLocked) { + bgColor = 0x18181E; + } else { + bgColor = 0x202028; + } + graphics.fill(nx - size, ny - size, nx + size, ny + size, (alpha << 24) | bgColor); + + // Border + int borderColor; + if (owned) { + borderColor = branchColor; + } else if (available) { + // Pulsing border for available + float pulse = (float) (Math.sin(animTick * 0.15) * 0.3 + 0.7); + int r = (int) (((branchColor >> 16) & 0xFF) * pulse); + int g = (int) (((branchColor >> 8) & 0xFF) * pulse); + int b = (int) ((branchColor & 0xFF) * pulse); + borderColor = (r << 16) | (g << 8) | b; + } else { + borderColor = 0x404050; + } + DrawerHelper.drawBorder(graphics, nx - size, ny - size, size * 2, size * 2, + (alpha << 24) | borderColor, 1); + + // Node content + var font = Minecraft.getInstance().font; + if (owned) { + // Checkmark + graphics.drawString(font, "\u2713", nx - 3, ny - 4, (alpha << 24) | 0xFFFFFF, false); + } else if (tierLocked) { + // Lock indicator + String lock = "T" + upgrade.getRequiredTier(); + graphics.drawString(font, lock, nx - font.width(lock) / 2, ny - 3, + (alpha << 24) | 0x505060, false); + } else { + // Cost + String cost = String.valueOf(upgrade.getCost()); + int costColor = available ? 0xFFCC44 : 0x606070; + graphics.drawString(font, cost, nx - font.width(cost) / 2, ny - 3, + (alpha << 24) | costColor, false); + } + + // Hover highlight + if (isHovered) { + int hoverAlpha = (int) (50 * fadeAlpha); + graphics.fill(nx - size + 1, ny - size + 1, nx + size - 1, ny + size - 1, + (hoverAlpha << 24) | 0xFFFFFF); + } + } + + private void drawTooltip(GuiGraphics graphics, int mx, int my) { + if (hoveredUpgrade == null) return; + + var font = Minecraft.getInstance().font; + + String name = Component.translatable(hoveredUpgrade.getTranslationKey()).getString(); + String desc = Component.translatable(hoveredUpgrade.getDescriptionKey()).getString(); + String cost = "Cost: " + hoveredUpgrade.getCost(); + String tierReq = "Requires Tier " + hoveredUpgrade.getRequiredTier(); + + boolean owned = unlockedUpgrades.contains(hoveredUpgrade); + boolean available = !owned && hoveredUpgrade.canUnlock(unlockedUpgrades, tier); + boolean canAfford = spendablePoints >= hoveredUpgrade.getCost(); + + int tw = Math.max(font.width(name), Math.max(font.width(desc), 100)) + 16; + int th = 52; + int tx = mx + 10; + int ty = my - th - 5; + + // Keep tooltip on screen + if (tx + tw > getPosition().x + getSize().width - 5) tx = mx - tw - 10; + if (ty < getPosition().y + 20) ty = my + 15; + + int alpha = (int) (255 * fadeAlpha); + int branchColor = BRANCH_COLORS[hoveredUpgrade.getBranch().ordinal()]; + + // Background + graphics.fill(tx, ty, tx + tw, ty + th, (alpha << 24) | 0x08080C); + + // Top accent bar + graphics.fill(tx, ty, tx + tw, ty + 2, (alpha << 24) | branchColor); + + // Border + DrawerHelper.drawBorder(graphics, tx, ty, tw, th, (alpha << 24) | 0x404060, 1); + + int textY = ty + 6; + + // Name + graphics.drawString(font, name, tx + 6, textY, (alpha << 24) | 0xFFFFFF, false); + textY += 11; + + // Description + graphics.drawString(font, desc, tx + 6, textY, (alpha << 24) | 0x9090A0, false); + textY += 12; + + // Cost + int costColor = canAfford ? 0xFFCC44 : 0xFF5544; + graphics.drawString(font, cost, tx + 6, textY, (alpha << 24) | costColor, false); + textY += 10; + + // Tier req + int tierColor = tier >= hoveredUpgrade.getRequiredTier() ? 0x707080 : 0xFF5544; + graphics.drawString(font, tierReq, tx + 6, textY, (alpha << 24) | tierColor, false); + + // Status indicator + if (owned) { + graphics.drawString(font, "OWNED", tx + tw - font.width("OWNED") - 6, ty + 6, + (alpha << 24) | 0x44FF44, false); + } else if (available && canAfford) { + graphics.drawString(font, "Click!", tx + tw - font.width("Click!") - 6, ty + 6, + (alpha << 24) | 0x88FF88, false); + } + } + + private void drawRespecConfirm(GuiGraphics graphics, int x, int y, int w, int h) { + var font = Minecraft.getInstance().font; + int alpha = (int) (255 * fadeAlpha); + + // Dim background + graphics.fill(x, y, x + w, y + h, ((int) (180 * fadeAlpha) << 24) | 0x000000); + + // Dialog box + int bw = 160; + int bh = 60; + int bx = x + (w - bw) / 2; + int by = y + (h - bh) / 2; + + graphics.fill(bx, by, bx + bw, by + bh, (alpha << 24) | 0x101018); + DrawerHelper.drawBorder(graphics, bx, by, bw, bh, (alpha << 24) | 0xFF4444, 2); + + // Title + String title = "Reset Upgrades?"; + graphics.drawString(font, title, bx + (bw - font.width(title)) / 2, by + 10, + (alpha << 24) | 0xFFFFFF, false); + + // Refund amount + int refund = 0; + for (StellarIrisUpgrade u : unlockedUpgrades) { + refund += u.getCost(); + } + String refundStr = "Refund: " + refund + " pts"; + graphics.drawString(font, refundStr, bx + (bw - font.width(refundStr)) / 2, by + 24, + (alpha << 24) | 0xFFCC44, false); + + // Buttons hint + graphics.drawString(font, "[Y] Yes", bx + 20, by + bh - 16, (alpha << 24) | 0x88FF88, false); + graphics.drawString(font, "[N] No", bx + bw - 50, by + bh - 16, (alpha << 24) | 0xFF8888, false); + } + + private void drawLine(GuiGraphics g, int x1, int y1, int x2, int y2, int color) { + int dx = Math.abs(x2 - x1), dy = Math.abs(y2 - y1); + int sx = x1 < x2 ? 1 : -1, sy = y1 < y2 ? 1 : -1; + int err = dx - dy; + + while (true) { + g.fill(x1, y1, x1 + 1, y1 + 1, color); + if (x1 == x2 && y1 == y2) break; + int e2 = 2 * err; + if (e2 > -dy) { + err -= dy; + x1 += sx; + } + if (e2 < dx) { + err += dx; + y1 += sy; + } + } + } + + private int darken(int color, int amount) { + int r = Math.max(0, ((color >> 16) & 0xFF) - amount); + int g = Math.max(0, ((color >> 8) & 0xFF) - amount); + int b = Math.max(0, (color & 0xFF) - amount); + return (r << 16) | (g << 8) | b; + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (!visible || fadeAlpha < 0.5f) return false; + + if (showRespecConfirm) return true; + + if (button == 0 && hoveredUpgrade != null) { + boolean owned = unlockedUpgrades.contains(hoveredUpgrade); + boolean available = !owned && hoveredUpgrade.canUnlock(unlockedUpgrades, tier); + boolean canAfford = spendablePoints >= hoveredUpgrade.getCost(); + + if (available && canAfford) { + writeClientAction(CLIENT_ACTION_UNLOCK, buf -> buf.writeEnum(hoveredUpgrade)); + + // Optimistic update + unlockedUpgrades.add(hoveredUpgrade); + spendablePoints -= hoveredUpgrade.getCost(); + lastUnlocked = hoveredUpgrade; + unlockFlashTick = 15; + + playSound(SoundEvents.EXPERIENCE_ORB_PICKUP, 1.0f, 1.2f); + return true; + } + } + + return super.mouseClicked(mouseX, mouseY, button); + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + if (!visible) return false; + + if (keyCode == 256) { // ESC + if (showRespecConfirm) { + showRespecConfirm = false; + } else { + onClose.run(); + } + return true; + } + + if (keyCode == 82 && !showRespecConfirm) { // R + showRespecConfirm = true; + return true; + } + + if (keyCode == 89 && showRespecConfirm) { // Y + writeClientAction(CLIENT_ACTION_RESPEC, buf -> {}); + showRespecConfirm = false; + playSound(SoundEvents.GLASS_BREAK, 0.8f, 0.8f); + + int refund = 0; + for (StellarIrisUpgrade u : unlockedUpgrades) { + refund += u.getCost(); + } + unlockedUpgrades.clear(); + spendablePoints += refund; + return true; + } + + if (keyCode == 78 && showRespecConfirm) { // N + showRespecConfirm = false; + return true; + } + + return super.keyPressed(keyCode, scanCode, modifiers); + } + + @Override + public void handleClientAction(int id, FriendlyByteBuf buffer) { + IrisMultiblockMachine machine = machineSupplier.get(); + if (machine == null) return; + + if (id == CLIENT_ACTION_UNLOCK) { + StellarIrisUpgrade upgrade = buffer.readEnum(StellarIrisUpgrade.class); + machine.tryUnlockUpgrade(upgrade); + } + // Respec is no longer supported - upgrades are permanent + } + + @Override + public void detectAndSendChanges() { + super.detectAndSendChanges(); + + IrisMultiblockMachine machine = machineSupplier.get(); + if (machine == null) return; + + Set currentUpgrades = machine.getUnlockedUpgrades(); + int currentPoints = machine.getSpendablePoints(); + int currentTier = machine.getPrestigeTier(); + int currentAscension = machine.getAscensionLevel(); + + if (!currentUpgrades.equals(unlockedUpgrades) || + currentPoints != spendablePoints || + currentTier != tier || + currentAscension != ascensionLevel) { + + writeUpdateInfo(UPDATE_ID_SYNC, buf -> { + buf.writeInt(currentPoints); + buf.writeInt(currentTier); + buf.writeInt(currentAscension); + buf.writeInt(currentUpgrades.size()); + for (StellarIrisUpgrade u : currentUpgrades) { + buf.writeEnum(u); + } + }); + + if (currentUpgrades.isEmpty()) { + unlockedUpgrades = EnumSet.noneOf(StellarIrisUpgrade.class); + } else { + unlockedUpgrades = EnumSet.copyOf(currentUpgrades); + } + spendablePoints = currentPoints; + tier = currentTier; + ascensionLevel = currentAscension; + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void readUpdateInfo(int id, FriendlyByteBuf buffer) { + if (id == UPDATE_ID_SYNC) { + spendablePoints = buffer.readInt(); + tier = buffer.readInt(); + ascensionLevel = buffer.readInt(); + + int count = buffer.readInt(); + unlockedUpgrades = EnumSet.noneOf(StellarIrisUpgrade.class); + for (int i = 0; i < count; i++) { + unlockedUpgrades.add(buffer.readEnum(StellarIrisUpgrade.class)); + } + } else { + super.readUpdateInfo(id, buffer); + } + } + + private void playSound(net.minecraft.sounds.SoundEvent sound, float volume, float pitch) { + Minecraft.getInstance().getSoundManager().play(SimpleSoundInstance.forUI(sound, pitch, volume)); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/WarningOverlayWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/WarningOverlayWidget.java new file mode 100644 index 000000000..a3be92574 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/WarningOverlayWidget.java @@ -0,0 +1,253 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine.Stage; + +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.util.Mth; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class WarningOverlayWidget extends Widget { + + private final Supplier stageSupplier; + + private float warningPhase = 0f; + private float alertFlash = 0f; + private float textGlitch = 0f; + + public WarningOverlayWidget(int x, int y, int width, int height, Supplier stageSupplier) { + super(x, y, width, height); + this.stageSupplier = stageSupplier; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + + Stage stage = stageSupplier.get(); + warningPhase += 0.1f; + + if (stage == Stage.DEATH) { + alertFlash += 0.3f; + textGlitch = (float) Math.random() * 0.5f; + } else if (stage == Stage.SUPERSTAR || stage == Stage.BLACK_HOLE) { + alertFlash += 0.15f; + textGlitch *= 0.9f; + } else { + alertFlash *= 0.9f; + textGlitch *= 0.8f; + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + Stage stage = stageSupplier.get(); + + if (stage == Stage.EMPTY || stage == Stage.GROWING || stage == Stage.STAR) { + return; + } + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + switch (stage) { + case SUPERSTAR -> drawSuperstarWarning(graphics, x, y, w, h); + case BLACK_HOLE -> drawBlackHoleWarning(graphics, x, y, w, h); + case DEATH -> drawCriticalAlert(graphics, x, y, w, h); + case DEATH_GRACEFUL -> drawShutdownNotice(graphics, x, y, w, h); + } + } + + private void drawSuperstarWarning(GuiGraphics graphics, int x, int y, int w, int h) { + float pulse = Mth.sin(warningPhase) * 0.5f + 0.5f; + + int bannerAlpha = (int) (0x40 * pulse); + int bannerColor = (bannerAlpha << 24) | 0xFF8800; + + int bannerY = y + 5; + int bannerH = 16; + graphics.fill(x, bannerY, x + w, bannerY + bannerH, bannerColor); + + int borderColor = (0x80 << 24) | 0xFF6600; + graphics.fill(x, bannerY, x + w, bannerY + 1, borderColor); + graphics.fill(x, bannerY + bannerH - 1, x + w, bannerY + bannerH, borderColor); + + var font = Minecraft.getInstance().font; + String warning = "!! CRITICAL MASS APPROACHING !!"; + int textWidth = font.width(warning); + + float scroll = (warningPhase * 2f) % (textWidth + w); + int textX = x + w - (int) scroll; + + graphics.enableScissor(x, bannerY, x + w, bannerY + bannerH); + graphics.drawString(font, warning, textX, bannerY + 4, 0xFFFFCC00, false); + graphics.drawString(font, warning, textX + textWidth + 50, bannerY + 4, 0xFFFFCC00, false); + graphics.disableScissor(); + + drawHazardStripes(graphics, x, bannerY + bannerH + 2, w, 3, 0xFFFF8800, 0xFF442200); + } + + private void drawBlackHoleWarning(GuiGraphics graphics, int x, int y, int w, int h) { + float pulse = Mth.sin(warningPhase * 0.7f) * 0.5f + 0.5f; + + int topBannerY = y + 5; + int bottomBannerY = y + h - 21; + int bannerH = 16; + + int bannerAlpha = (int) (0x50 * pulse); + int bannerColor = (bannerAlpha << 24) | 0x8040FF; + + graphics.fill(x, topBannerY, x + w, topBannerY + bannerH, bannerColor); + graphics.fill(x, bottomBannerY, x + w, bottomBannerY + bannerH, bannerColor); + + int borderColor = (0xA0 << 24) | 0x6020DD; + graphics.fill(x, topBannerY, x + w, topBannerY + 1, borderColor); + graphics.fill(x, topBannerY + bannerH - 1, x + w, topBannerY + bannerH, borderColor); + graphics.fill(x, bottomBannerY, x + w, bottomBannerY + 1, borderColor); + graphics.fill(x, bottomBannerY + bannerH - 1, x + w, bottomBannerY + bannerH, borderColor); + + var font = Minecraft.getInstance().font; + + String topText = ">> SINGULARITY CONTAINMENT ACTIVE <<"; + int topTextW = font.width(topText); + graphics.drawString(font, topText, x + (w - topTextW) / 2, topBannerY + 4, 0xFFCC99FF, false); + + String bottomText = "GRAVITATIONAL ANOMALY DETECTED"; + int bottomTextW = font.width(bottomText); + int glitchOffset = (int) (textGlitch * 3); + graphics.drawString(font, bottomText, x + (w - bottomTextW) / 2 + glitchOffset, bottomBannerY + 4, 0xFFAA77FF, + false); + + drawCornerBrackets(graphics, x + 10, topBannerY - 5, w - 20, bannerH + 10, 0xAA8040FF); + } + + private void drawCriticalAlert(GuiGraphics graphics, int x, int y, int w, int h) { + float flash = Mth.sin(alertFlash) * 0.5f + 0.5f; + + int screenFlashAlpha = (int) (0x20 * flash); + graphics.fill(x, y, x + w, y + h, (screenFlashAlpha << 24) | 0xFF0000); + + int topY = y + 5; + int bottomY = y + h - 25; + int bannerH = 20; + + int bannerAlpha = (int) (0x60 + 0x40 * flash); + int bannerColor = (bannerAlpha << 24) | 0xCC0000; + + graphics.fill(x, topY, x + w, topY + bannerH, bannerColor); + graphics.fill(x, bottomY, x + w, bottomY + bannerH, bannerColor); + + drawHazardStripes(graphics, x, topY - 4, w, 4, 0xFFFF0000, 0xFF440000); + drawHazardStripes(graphics, x, topY + bannerH, w, 4, 0xFFFF0000, 0xFF440000); + drawHazardStripes(graphics, x, bottomY - 4, w, 4, 0xFFFF0000, 0xFF440000); + drawHazardStripes(graphics, x, bottomY + bannerH, w, 4, 0xFFFF0000, 0xFF440000); + + var font = Minecraft.getInstance().font; + + String criticalText = "!!! CRITICAL FAILURE !!!"; + int textW = font.width(criticalText); + int glitchX = (int) ((Math.random() - 0.5) * textGlitch * 10); + int glitchY = (int) ((Math.random() - 0.5) * textGlitch * 4); + + int textColor = flash > 0.5f ? 0xFFFFFFFF : 0xFFFF4444; + graphics.drawString(font, criticalText, x + (w - textW) / 2 + glitchX, topY + 6 + glitchY, textColor, false); + + if (textGlitch > 0.2f) { + int ghostAlpha = (int) (0x40 * textGlitch); + int ghostColor = (ghostAlpha << 24) | 0x00FFFF; + graphics.drawString(font, criticalText, x + (w - textW) / 2 + glitchX + 2, topY + 6 + glitchY, ghostColor, + false); + } + + String evacuateText = "EVACUATE IMMEDIATELY"; + int evacW = font.width(evacuateText); + graphics.drawString(font, evacuateText, x + (w - evacW) / 2, bottomY + 6, 0xFFFFAAAA, false); + + drawWarningTriangles(graphics, x + 15, topY + 3, 14); + drawWarningTriangles(graphics, x + w - 29, topY + 3, 14); + } + + private void drawShutdownNotice(GuiGraphics graphics, int x, int y, int w, int h) { + float fade = Mth.sin(warningPhase * 0.3f) * 0.3f + 0.7f; + + int bannerY = y + h / 2 - 12; + int bannerH = 24; + + int bannerAlpha = (int) (0x50 * fade); + int bannerColor = (bannerAlpha << 24) | 0x604040; + graphics.fill(x + 20, bannerY, x + w - 20, bannerY + bannerH, bannerColor); + + int borderColor = (0x60 << 24) | 0x804040; + graphics.fill(x + 20, bannerY, x + w - 20, bannerY + 1, borderColor); + graphics.fill(x + 20, bannerY + bannerH - 1, x + w - 20, bannerY + bannerH, borderColor); + graphics.fill(x + 20, bannerY, x + 21, bannerY + bannerH, borderColor); + graphics.fill(x + w - 21, bannerY, x + w - 20, bannerY + bannerH, borderColor); + + var font = Minecraft.getInstance().font; + String text = "CONTROLLED SHUTDOWN IN PROGRESS"; + int textW = font.width(text); + int textColor = (int) (0xFF * fade) << 24 | 0x999999; + graphics.drawString(font, text, x + (w - textW) / 2, bannerY + 8, textColor, false); + + int dotsVisible = ((int) (warningPhase * 2)) % 4; + StringBuilder dots = new StringBuilder(); + for (int i = 0; i < dotsVisible; i++) dots.append("."); + graphics.drawString(font, dots.toString(), x + (w + textW) / 2 + 2, bannerY + 8, textColor, false); + } + + private void drawHazardStripes(GuiGraphics graphics, int x, int y, int w, int h, int color1, int color2) { + int stripeWidth = 8; + float offset = (warningPhase * 20) % (stripeWidth * 2); + + graphics.enableScissor(x, y, x + w, y + h); + for (int sx = x - stripeWidth * 2 + (int) offset; sx < x + w + stripeWidth; sx += stripeWidth * 2) { + graphics.fill(sx, y, sx + stripeWidth, y + h, color1); + graphics.fill(sx + stripeWidth, y, sx + stripeWidth * 2, y + h, color2); + } + graphics.disableScissor(); + } + + private void drawCornerBrackets(GuiGraphics graphics, int x, int y, int w, int h, int color) { + int len = 8; + int thickness = 2; + + graphics.fill(x, y, x + len, y + thickness, color); + graphics.fill(x, y, x + thickness, y + len, color); + + graphics.fill(x + w - len, y, x + w, y + thickness, color); + graphics.fill(x + w - thickness, y, x + w, y + len, color); + + graphics.fill(x, y + h - thickness, x + len, y + h, color); + graphics.fill(x, y + h - len, x + thickness, y + h, color); + + graphics.fill(x + w - len, y + h - thickness, x + w, y + h, color); + graphics.fill(x + w - thickness, y + h - len, x + w, y + h, color); + } + + private void drawWarningTriangles(GuiGraphics graphics, int x, int y, int size) { + int color = 0xFFFFCC00; + + for (int row = 0; row < size; row++) { + int halfWidth = row * size / (size * 2); + int cx = x + size / 2; + int drawY = y + row; + graphics.fill(cx - halfWidth, drawY, cx + halfWidth + 1, drawY + 1, color); + } + + var font = Minecraft.getInstance().font; + graphics.drawString(font, "!", x + size / 2 - 2, y + size / 3, 0xFF000000, false); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/keybind/BootsKeybinds.java b/src/main/java/com/ghostipedia/cosmiccore/client/keybind/BootsKeybinds.java new file mode 100644 index 000000000..21f856410 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/keybind/BootsKeybinds.java @@ -0,0 +1,141 @@ +package com.ghostipedia.cosmiccore.client.keybind; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.item.armor.boots.ICosmicBoots; +import com.ghostipedia.cosmiccore.common.network.CCoreNetwork; +import com.ghostipedia.cosmiccore.common.network.packet.BootsControlPacket; + +import com.gregtechceu.gtceu.api.item.armor.ArmorComponentItem; + +import net.minecraft.client.KeyMapping; +import net.minecraft.client.Minecraft; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.client.event.InputEvent; +import net.minecraftforge.client.event.RegisterKeyMappingsEvent; +import net.minecraftforge.client.settings.KeyConflictContext; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; + +import com.mojang.blaze3d.platform.InputConstants; +import org.lwjgl.glfw.GLFW; + +/** + * Keybind handler for CosmicCore boots. + * Provides controls for speed/jump modifiers, step assist, and inertia cancellation. + */ +@OnlyIn(Dist.CLIENT) +public class BootsKeybinds { + + public static final String CATEGORY = "key.categories.cosmiccore.boots"; + + // Keybinds + public static KeyMapping SPEED_INCREASE; + public static KeyMapping SPEED_DECREASE; + public static KeyMapping JUMP_INCREASE; + public static KeyMapping JUMP_DECREASE; + public static KeyMapping TOGGLE_STEP_ASSIST; + public static KeyMapping TOGGLE_INERTIA; + + /** + * Register all boot keybinds. + */ + public static void registerKeyMappings(RegisterKeyMappingsEvent event) { + SPEED_INCREASE = new KeyMapping( + "key.cosmiccore.boots.speed_increase", + KeyConflictContext.IN_GAME, + InputConstants.Type.KEYSYM, + GLFW.GLFW_KEY_KP_ADD, + CATEGORY); + event.register(SPEED_INCREASE); + + SPEED_DECREASE = new KeyMapping( + "key.cosmiccore.boots.speed_decrease", + KeyConflictContext.IN_GAME, + InputConstants.Type.KEYSYM, + GLFW.GLFW_KEY_KP_SUBTRACT, + CATEGORY); + event.register(SPEED_DECREASE); + + JUMP_INCREASE = new KeyMapping( + "key.cosmiccore.boots.jump_increase", + KeyConflictContext.IN_GAME, + InputConstants.Type.KEYSYM, + GLFW.GLFW_KEY_KP_MULTIPLY, + CATEGORY); + event.register(JUMP_INCREASE); + + JUMP_DECREASE = new KeyMapping( + "key.cosmiccore.boots.jump_decrease", + KeyConflictContext.IN_GAME, + InputConstants.Type.KEYSYM, + GLFW.GLFW_KEY_KP_DIVIDE, + CATEGORY); + event.register(JUMP_DECREASE); + + TOGGLE_STEP_ASSIST = new KeyMapping( + "key.cosmiccore.boots.toggle_step", + KeyConflictContext.IN_GAME, + InputConstants.Type.KEYSYM, + GLFW.GLFW_KEY_UNKNOWN, + CATEGORY); + event.register(TOGGLE_STEP_ASSIST); + + TOGGLE_INERTIA = new KeyMapping( + "key.cosmiccore.boots.toggle_inertia", + KeyConflictContext.IN_GAME, + InputConstants.Type.KEYSYM, + GLFW.GLFW_KEY_UNKNOWN, + CATEGORY); + event.register(TOGGLE_INERTIA); + } + + /** + * Event handler for boot keybinds. + */ + @Mod.EventBusSubscriber(modid = CosmicCore.MOD_ID, bus = Mod.EventBusSubscriber.Bus.FORGE, value = Dist.CLIENT) + public static class KeyHandler { + + @SubscribeEvent + public static void onKeyInput(InputEvent.Key event) { + if (event.getAction() != GLFW.GLFW_PRESS) return; + + Minecraft mc = Minecraft.getInstance(); + Player player = mc.player; + if (player == null || mc.screen != null) return; + + // Check if player is wearing cosmic boots + ItemStack boots = player.getItemBySlot(EquipmentSlot.FEET); + if (!isCosmicBoots(boots)) return; + + // Handle keybinds + if (SPEED_INCREASE != null && SPEED_INCREASE.matches(event.getKey(), event.getScanCode())) { + CCoreNetwork.sendToServer(new BootsControlPacket(BootsControlPacket.Action.SPEED_INCREASE)); + } else if (SPEED_DECREASE != null && SPEED_DECREASE.matches(event.getKey(), event.getScanCode())) { + CCoreNetwork.sendToServer(new BootsControlPacket(BootsControlPacket.Action.SPEED_DECREASE)); + } else if (JUMP_INCREASE != null && JUMP_INCREASE.matches(event.getKey(), event.getScanCode())) { + CCoreNetwork.sendToServer(new BootsControlPacket(BootsControlPacket.Action.JUMP_INCREASE)); + } else if (JUMP_DECREASE != null && JUMP_DECREASE.matches(event.getKey(), event.getScanCode())) { + CCoreNetwork.sendToServer(new BootsControlPacket(BootsControlPacket.Action.JUMP_DECREASE)); + } else if (TOGGLE_STEP_ASSIST != null && + TOGGLE_STEP_ASSIST.matches(event.getKey(), event.getScanCode())) { + CCoreNetwork.sendToServer(new BootsControlPacket(BootsControlPacket.Action.TOGGLE_STEP)); + } else + if (TOGGLE_INERTIA != null && TOGGLE_INERTIA.matches(event.getKey(), event.getScanCode())) { + CCoreNetwork.sendToServer(new BootsControlPacket(BootsControlPacket.Action.TOGGLE_INERTIA)); + } + } + + /** + * Check if the item is a CosmicCore boots item. + */ + private static boolean isCosmicBoots(ItemStack stack) { + if (stack.isEmpty()) return false; + if (!(stack.getItem() instanceof ArmorComponentItem armorItem)) return false; + return armorItem.getArmorLogic() instanceof ICosmicBoots; + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/renderer/BackgroundRenderer.java b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/BackgroundRenderer.java new file mode 100644 index 000000000..fe3990d72 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/BackgroundRenderer.java @@ -0,0 +1,105 @@ +package com.ghostipedia.cosmiccore.client.renderer; + +import com.ghostipedia.cosmiccore.client.CosmicCoreClient; + +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.ShaderInstance; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.BufferUploader; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.VertexFormat; +import org.joml.Matrix4f; + +@OnlyIn(Dist.CLIENT) +public class BackgroundRenderer { + + public enum BackgroundType { + VOID, // Mystical ethereal void + GALAXY // Deep space galaxy with nebulae + } + + public static void render(PoseStack poseStack, BackgroundType type, float fadeAlpha, + int screenWidth, int screenHeight) { + Matrix4f matrix = poseStack.last().pose(); + + // Black overlay first so world fades to black during transitions + int blackAlpha = (int) (fadeAlpha * 255); + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + RenderSystem.setShader(GameRenderer::getPositionColorShader); + + BufferBuilder blackBuffer = Tesselator.getInstance().getBuilder(); + blackBuffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); + blackBuffer.vertex(matrix, 0, screenHeight, 0).color(0, 0, 0, blackAlpha).endVertex(); + blackBuffer.vertex(matrix, screenWidth, screenHeight, 0).color(0, 0, 0, blackAlpha).endVertex(); + blackBuffer.vertex(matrix, screenWidth, 0, 0).color(0, 0, 0, blackAlpha).endVertex(); + blackBuffer.vertex(matrix, 0, 0, 0).color(0, 0, 0, blackAlpha).endVertex(); + BufferUploader.drawWithShader(blackBuffer.end()); + + ShaderInstance shader = type == BackgroundType.VOID ? CosmicCoreClient.getVoidBgShader() : + CosmicCoreClient.getGalaxyBgShader(); + + if (shader == null) { + RenderSystem.disableBlend(); + return; + } + + if (fadeAlpha < 0.01f) { + RenderSystem.disableBlend(); + return; + } + + RenderSystem.setShader(() -> shader); + + if (shader.GAME_TIME != null) { + shader.GAME_TIME.set(RenderSystem.getShaderGameTime()); + } + if (shader.SCREEN_SIZE != null) { + shader.SCREEN_SIZE.set((float) screenWidth, (float) screenHeight); + } + + setUniformSafe(shader, "Intensity", fadeAlpha); + + BufferBuilder buffer = Tesselator.getInstance().getBuilder(); + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); + buffer.vertex(matrix, 0, screenHeight, 0).uv(0, 1).endVertex(); + buffer.vertex(matrix, screenWidth, screenHeight, 0).uv(1, 1).endVertex(); + buffer.vertex(matrix, screenWidth, 0, 0).uv(1, 0).endVertex(); + buffer.vertex(matrix, 0, 0, 0).uv(0, 0).endVertex(); + BufferUploader.drawWithShader(buffer.end()); + + RenderSystem.disableBlend(); + RenderSystem.setShader(GameRenderer::getPositionTexShader); + } + + private static void renderFallback(PoseStack poseStack, int screenWidth, int screenHeight) { + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + RenderSystem.setShader(GameRenderer::getPositionColorShader); + + Matrix4f matrix = poseStack.last().pose(); + + BufferBuilder buffer = Tesselator.getInstance().getBuilder(); + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); + buffer.vertex(matrix, 0, screenHeight, 0).color(0, 0, 0, 255).endVertex(); + buffer.vertex(matrix, screenWidth, screenHeight, 0).color(0, 0, 0, 255).endVertex(); + buffer.vertex(matrix, screenWidth, 0, 0).color(0, 0, 0, 255).endVertex(); + buffer.vertex(matrix, 0, 0, 0).color(0, 0, 0, 255).endVertex(); + BufferUploader.drawWithShader(buffer.end()); + + RenderSystem.disableBlend(); + } + + private static void setUniformSafe(ShaderInstance shader, String name, float value) { + var uniform = shader.getUniform(name); + if (uniform != null) { + uniform.set(value); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/renderer/CosmicCoreRenderTypes.java b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/CosmicCoreRenderTypes.java index 95401554a..6b5037b53 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/client/renderer/CosmicCoreRenderTypes.java +++ b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/CosmicCoreRenderTypes.java @@ -13,6 +13,8 @@ public class CosmicCoreRenderTypes extends RenderType { protected static final ShaderStateShard NEBULAE_SHADER = new ShaderStateShard(CosmicCoreClient::getNebulaeShader); + protected static final ShaderStateShard SOUL_AURA_SHADER = new ShaderStateShard( + CosmicCoreClient::getSoulAuraShader); private static final RenderType NEBULAE = RenderType.create("nebulae", DefaultVertexFormat.POSITION, VertexFormat.Mode.QUADS, 256, false, false, @@ -20,6 +22,14 @@ public class CosmicCoreRenderTypes extends RenderType { .setShaderState(NEBULAE_SHADER) .createCompositeState(false)); + private static final RenderType SOUL_AURA = RenderType.create("soul_aura", + DefaultVertexFormat.POSITION_TEX, VertexFormat.Mode.QUADS, 256, false, false, + RenderType.CompositeState.builder() + .setShaderState(SOUL_AURA_SHADER) + .setTransparencyState(TRANSLUCENT_TRANSPARENCY) + .setWriteMaskState(COLOR_WRITE) + .createCompositeState(false)); + private CosmicCoreRenderTypes(String name, VertexFormat format, VertexFormat.Mode mode, int bufferSize, boolean affectsCrumbling, boolean sortOnUpload, Runnable setupState, Runnable clearState) { @@ -29,4 +39,8 @@ private CosmicCoreRenderTypes(String name, VertexFormat format, VertexFormat.Mod public static RenderType nebulae() { return NEBULAE; } + + public static RenderType soulAura() { + return SOUL_AURA; + } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/renderer/RingUpgradePreviewRenderer.java b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/RingUpgradePreviewRenderer.java new file mode 100644 index 000000000..a75fc10f4 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/RingUpgradePreviewRenderer.java @@ -0,0 +1,322 @@ +package com.ghostipedia.cosmiccore.client.renderer; + +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.StarLadderResearchHubPatterns; + +import net.minecraft.client.Camera; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.ItemBlockRenderTypes; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.block.BlockRenderDispatcher; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.VertexFormat; + +import java.util.*; + +public class RingUpgradePreviewRenderer { + + private static final Map ACTIVE_PREVIEWS = new HashMap<>(); + private static final RandomSource RANDOM = RandomSource.create(); + + // Cached delta maps: position relative to controller -> block to place + private static Map DELTA_NOTHING_TO_T0; + private static Map DELTA_T0_TO_T1; + private static Map DELTA_T1_TO_T2; + private static Map DELTA_T2_TO_T3; + private static Map DELTA_T3_TO_T4; + + // Block mapping for unified character scheme + private static Map CHAR_TO_BLOCK; + + private record PreviewData(BlockPos controllerPos, Map deltaBlocks) {} + + static { + initializeBlockMapping(); + computeDeltas(); + } + + private static void initializeBlockMapping() { + CHAR_TO_BLOCK = new HashMap<>(); + CHAR_TO_BLOCK.put('A', CosmicBlocks.SUPERHEAVY_STEEL_CASING.get()); + CHAR_TO_BLOCK.put('B', CosmicBlocks.BOLTED_HEAVY_FRAME_CASING.get()); + CHAR_TO_BLOCK.put('C', CosmicBlocks.SOMARUST_CASING.get()); + CHAR_TO_BLOCK.put('D', CosmicBlocks.SOUL_MUTED_CASING.get()); + CHAR_TO_BLOCK.put('E', CosmicBlocks.BICHROMAL_NEVRAMITE_CASING.get()); + CHAR_TO_BLOCK.put('F', CosmicBlocks.OSCILLATING_GILDED_PTHANTERUM_CASING.get()); + CHAR_TO_BLOCK.put('G', CosmicBlocks.HIGHLY_FLEXIBLE_REINFORCED_TRINAVINE_CASING.get()); + CHAR_TO_BLOCK.put('H', CosmicBlocks.ROYAL_ICHORIUM_CASING.get()); + CHAR_TO_BLOCK.put('I', CosmicBlocks.MULTIPURPOSE_INTERSTELLAR_GRADE_CASING.get()); + CHAR_TO_BLOCK.put('J', CosmicBlocks.ULTRA_POWERED_CASING.get()); + } + + private static void computeDeltas() { + // Parse each tier's pattern + Map t0Blocks = parsePatternRelativeToController(StarLadderResearchHubPatterns.TIER_0, + "T0"); + Map t1Blocks = parsePatternRelativeToController(StarLadderResearchHubPatterns.TIER_1, + "T1"); + Map t2Blocks = parsePatternRelativeToController(StarLadderResearchHubPatterns.TIER_2, + "T2"); + Map t3Blocks = parsePatternRelativeToController(StarLadderResearchHubPatterns.TIER_3, + "T3"); + + // Compute deltas between consecutive tiers + // Delta from nothing (controller-only) to T0 is just all T0 blocks + DELTA_NOTHING_TO_T0 = computeDelta(new HashMap<>(), t0Blocks); + DELTA_T0_TO_T1 = computeDelta(t0Blocks, t1Blocks); + DELTA_T1_TO_T2 = computeDelta(t1Blocks, t2Blocks); + DELTA_T2_TO_T3 = computeDelta(t2Blocks, t3Blocks); + // T4 not yet available + DELTA_T3_TO_T4 = new HashMap<>(); + } + + private static Map parsePatternRelativeToController(String[] patternData, String tierName) { + if (patternData == null || patternData.length == 0) return new HashMap<>(); + + List> aisles = new ArrayList<>(); + for (String aisleStr : patternData) { + if (aisleStr.contains("|")) { + aisles.add(Arrays.asList(aisleStr.split("\\|", -1))); + } + } + if (aisles.isEmpty()) return new HashMap<>(); + + // Find controller position (marked with '#') + BlockPos controllerPos = null; + outer: + for (int z = 0; z < aisles.size(); z++) { + List aisle = aisles.get(z); + for (int y = 0; y < aisle.size(); y++) { + String layer = aisle.get(y); + for (int x = 0; x < layer.length(); x++) { + if (layer.charAt(x) == '#') { + controllerPos = new BlockPos(x, y, z); + break outer; + } + } + } + } + if (controllerPos == null) return new HashMap<>(); + + // Extract all blocks relative to controller + Map blocks = new HashMap<>(); + int cx = controllerPos.getX(), cy = controllerPos.getY(), cz = controllerPos.getZ(); + + for (int z = 0; z < aisles.size(); z++) { + List aisle = aisles.get(z); + for (int y = 0; y < aisle.size(); y++) { + String layer = aisle.get(y); + for (int x = 0; x < layer.length(); x++) { + char ch = layer.charAt(x); + if (ch != ' ' && ch != '@' && ch != '#') { + blocks.put(new BlockPos(x - cx, y - cy, z - cz), ch); + } + } + } + } + return blocks; + } + + private static Map computeDelta(Map prevTier, + Map nextTier) { + Map delta = new HashMap<>(); + + for (Map.Entry entry : nextTier.entrySet()) { + BlockPos pos = entry.getKey(); + char ch = entry.getValue(); + + // Block is new if it wasn't in previous tier or was a different type + if (!prevTier.containsKey(pos) || !prevTier.get(pos).equals(ch)) { + Block block = CHAR_TO_BLOCK.get(ch); + if (block != null) { + delta.put(pos, block); + } + } + } + + return delta; + } + + public static void enablePreview(BlockPos controllerPos, Direction facing, int currentTier) { + if (currentTier >= 3) return; // T3 is max currently (T4 not available) + + Map delta = getDeltaForTier(currentTier); + if (delta == null || delta.isEmpty()) return; + + // Rotate delta positions based on controller facing + Map rotatedDelta = new HashMap<>(); + for (Map.Entry entry : delta.entrySet()) { + BlockPos relPos = entry.getKey(); + BlockPos rotated = rotateOffset(relPos.getX(), relPos.getY(), relPos.getZ(), facing); + BlockPos worldPos = controllerPos.offset(rotated); + rotatedDelta.put(worldPos, entry.getValue()); + } + + ACTIVE_PREVIEWS.put(controllerPos, new PreviewData(controllerPos, rotatedDelta)); + } + + public static void disablePreview(BlockPos controllerPos) { + ACTIVE_PREVIEWS.remove(controllerPos); + } + + public static void updatePreview(BlockPos controllerPos, Direction facing, int newTier) { + if (ACTIVE_PREVIEWS.containsKey(controllerPos)) { + disablePreview(controllerPos); + enablePreview(controllerPos, facing, newTier); + } + } + + public static void clearAllPreviews() { + ACTIVE_PREVIEWS.clear(); + } + + private static Map getDeltaForTier(int currentTier) { + return switch (currentTier) { + case -1 -> DELTA_NOTHING_TO_T0; + case 0 -> DELTA_T0_TO_T1; + case 1 -> DELTA_T1_TO_T2; + case 2 -> DELTA_T2_TO_T3; + case 3 -> DELTA_T3_TO_T4; + default -> null; + }; + } + + private static BlockPos rotateOffset(int x, int y, int z, Direction facing) { + // Maps pattern coords to world coords based on GTCEu's setActualRelativeOffset + return switch (facing) { + case NORTH -> new BlockPos(-x, y, -z); + case SOUTH -> new BlockPos(x, y, z); + case EAST -> new BlockPos(z, y, -x); + case WEST -> new BlockPos(-z, y, x); + default -> new BlockPos(x, y, z); + }; + } + + public static void renderPreviews(PoseStack poseStack, Camera camera) { + if (ACTIVE_PREVIEWS.isEmpty()) return; + + var mc = Minecraft.getInstance(); + if (mc.level == null) return; + + Vec3 camPos = camera.getPosition(); + BlockRenderDispatcher dispatcher = mc.getBlockRenderer(); + Tesselator tesselator = Tesselator.getInstance(); + BufferBuilder buffer = tesselator.getBuilder(); + + poseStack.pushPose(); + poseStack.translate(-camPos.x, -camPos.y, -camPos.z); + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + RenderSystem.enableDepthTest(); + + for (PreviewData preview : ACTIVE_PREVIEWS.values()) { + if (!mc.level.isLoaded(preview.controllerPos)) continue; + + for (Map.Entry entry : preview.deltaBlocks.entrySet()) { + BlockPos pos = entry.getKey(); + Block block = entry.getValue(); + + // Only render ghost blocks where there's air + if (!mc.level.isEmptyBlock(pos)) continue; + + BlockState state = block.defaultBlockState(); + renderGhostBlock(poseStack, dispatcher, buffer, tesselator, pos, state); + } + } + + RenderSystem.disableBlend(); + poseStack.popPose(); + } + + private static void renderGhostBlock(PoseStack poseStack, BlockRenderDispatcher dispatcher, + BufferBuilder buffer, Tesselator tesselator, + BlockPos pos, BlockState state) { + poseStack.pushPose(); + poseStack.translate(pos.getX(), pos.getY(), pos.getZ()); + poseStack.translate(0.5, 0.5, 0.5); + poseStack.scale(0.8f, 0.8f, 0.8f); + poseStack.translate(-0.5, -0.5, -0.5); + + for (RenderType renderType : RenderType.chunkBufferLayers()) { + if (!ItemBlockRenderTypes.getRenderLayers(state).contains(renderType)) continue; + renderType.setupRenderState(); + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.BLOCK); + dispatcher.renderBatched(state, pos, Minecraft.getInstance().level, poseStack, buffer, false, RANDOM); + tesselator.end(); + renderType.clearRenderState(); + } + poseStack.popPose(); + } + + public static int getDeltaBlockCount(int currentTier) { + Map delta = getDeltaForTier(currentTier); + return delta != null ? delta.size() : 0; + } + + public static Map getDeltaBlockCounts(int currentTier) { + Map delta = getDeltaForTier(currentTier); + if (delta == null) return new HashMap<>(); + + Map counts = new HashMap<>(); + for (Block block : delta.values()) { + counts.merge(block, 1, Integer::sum); + } + return counts; + } + + public static Block getRingBlock(int tier) { + Map delta = getDeltaForTier(tier - 1); + if (delta == null || delta.isEmpty()) return null; + + Map counts = new HashMap<>(); + for (Block block : delta.values()) { + counts.merge(block, 1, Integer::sum); + } + return counts.entrySet().stream() + .max(Map.Entry.comparingByValue()) + .map(Map.Entry::getKey) + .orElse(null); + } + + public static int getRingBlockCount(int tier) { + Map delta = getDeltaForTier(tier - 1); + return delta != null ? delta.size() : 0; + } + + public static Set calculateRingPositions(BlockPos controllerPos, Direction facing, int targetTier) { + Map delta = getDeltaForTier(targetTier - 1); + if (delta == null || delta.isEmpty()) return new HashSet<>(); + + Set positions = new HashSet<>(); + for (BlockPos relPos : delta.keySet()) { + BlockPos rotated = rotateOffset(relPos.getX(), relPos.getY(), relPos.getZ(), facing); + positions.add(controllerPos.offset(rotated)); + } + return positions; + } + + public static Map calculateRingPositionsWithBlocks(BlockPos controllerPos, Direction facing, + int targetTier) { + Map delta = getDeltaForTier(targetTier - 1); + if (delta == null || delta.isEmpty()) return new HashMap<>(); + + Map positions = new HashMap<>(); + for (Map.Entry entry : delta.entrySet()) { + BlockPos relPos = entry.getKey(); + BlockPos rotated = rotateOffset(relPos.getX(), relPos.getY(), relPos.getZ(), facing); + positions.put(controllerPos.offset(rotated), entry.getValue()); + } + return positions; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/renderer/SoulAuraRenderer.java b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/SoulAuraRenderer.java new file mode 100644 index 000000000..65326a0ed --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/SoulAuraRenderer.java @@ -0,0 +1,110 @@ +package com.ghostipedia.cosmiccore.client.renderer; + +import com.ghostipedia.cosmiccore.client.CosmicCoreClient; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionConstants; + +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.ShaderInstance; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.BufferUploader; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.VertexFormat; +import org.joml.Matrix4f; + +@OnlyIn(Dist.CLIENT) +public class SoulAuraRenderer { + + public static void render(PoseStack poseStack, int centerX, int centerY, int radius, + int erosion, float intensity, int screenWidth, int screenHeight) { + ShaderInstance shader = CosmicCoreClient.getSoulAuraShader(); + if (shader == null) return; + + float[] color = getAuraColor(erosion); + + float normalizedCenterX = (float) centerX / screenWidth; + float normalizedCenterY = (float) centerY / screenHeight; + float normalizedRadius = (float) radius / Math.min(screenWidth, screenHeight); + + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + RenderSystem.setShader(() -> shader); + + if (shader.GAME_TIME != null) { + shader.GAME_TIME.set(RenderSystem.getShaderGameTime()); + } + if (shader.SCREEN_SIZE != null) { + shader.SCREEN_SIZE.set((float) screenWidth, (float) screenHeight); + } + + setUniformSafe(shader, "Center", normalizedCenterX, normalizedCenterY); + setUniformSafe(shader, "BaseColor", color[0], color[1], color[2]); + setUniformSafe(shader, "Intensity", intensity); + setUniformSafe(shader, "Radius", normalizedRadius); + + int auraSize = (int) (radius * 3.0f); + int x1 = centerX - auraSize; + int y1 = centerY - auraSize; + int x2 = centerX + auraSize; + int y2 = centerY + auraSize; + + float u1 = (float) x1 / screenWidth; + float v1 = (float) y1 / screenHeight; + float u2 = (float) x2 / screenWidth; + float v2 = (float) y2 / screenHeight; + + Matrix4f matrix = poseStack.last().pose(); + + BufferBuilder buffer = Tesselator.getInstance().getBuilder(); + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); + buffer.vertex(matrix, x1, y2, 0).uv(u1, v2).endVertex(); + buffer.vertex(matrix, x2, y2, 0).uv(u2, v2).endVertex(); + buffer.vertex(matrix, x2, y1, 0).uv(u2, v1).endVertex(); + buffer.vertex(matrix, x1, y1, 0).uv(u1, v1).endVertex(); + BufferUploader.drawWithShader(buffer.end()); + + RenderSystem.disableBlend(); + RenderSystem.setShader(GameRenderer::getPositionTexShader); + } + + // Aura colors are complementary to soul orb colors + private static float[] getAuraColor(int erosion) { + int tier = ReflectionConstants.getSoulColorTier(erosion); + + return switch (tier) { + case 0 -> new float[] { 1.0f, 0.85f, 0.45f }; + case 1 -> new float[] { 1.0f, 0.60f, 0.30f }; + case 2 -> new float[] { 0.70f, 0.90f, 0.30f }; + case 3 -> new float[] { 0.30f, 0.85f, 0.50f }; + case 4 -> new float[] { 0.25f, 0.75f, 0.75f }; + case 5 -> new float[] { 0.15f, 0.45f, 0.45f }; + default -> new float[] { 0.10f, 0.25f, 0.25f }; + }; + } + + private static void setUniformSafe(ShaderInstance shader, String name, float value) { + var uniform = shader.getUniform(name); + if (uniform != null) { + uniform.set(value); + } + } + + private static void setUniformSafe(ShaderInstance shader, String name, float x, float y) { + var uniform = shader.getUniform(name); + if (uniform != null) { + uniform.set(x, y); + } + } + + private static void setUniformSafe(ShaderInstance shader, String name, float x, float y, float z) { + var uniform = shader.getUniform(name); + if (uniform != null) { + uniform.set(x, y, z); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/renderer/block/NebulaeCoilRenderer.java b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/block/NebulaeCoilRenderer.java index b0789e773..e7dccd714 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/client/renderer/block/NebulaeCoilRenderer.java +++ b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/block/NebulaeCoilRenderer.java @@ -32,6 +32,11 @@ public class NebulaeCoilRenderer implements BlockEntityRenderer getBioVatRenderer() { return BioVatRender.INSTANCE; } + + public static DynamicRender getStarLadderRender() { + return StarLadderRender.INSTANCE; + } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/StarLadderRender.java b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/StarLadderRender.java new file mode 100644 index 000000000..6318ab5be --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/StarLadderRender.java @@ -0,0 +1,538 @@ +package com.ghostipedia.cosmiccore.client.renderer.machine; + +import com.ghostipedia.cosmiccore.CosmicCore; + +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; +import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; +import com.gregtechceu.gtceu.client.renderer.machine.DynamicRender; +import com.gregtechceu.gtceu.client.renderer.machine.DynamicRenderType; +import com.gregtechceu.gtceu.client.util.ModelUtils; +import com.gregtechceu.gtceu.client.util.RenderBufferHelper; + +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.Util; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.Sheets; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Vec3i; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.phys.AABB; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.serialization.Codec; +import org.jetbrains.annotations.NotNull; +import org.joml.Matrix4f; +import org.joml.Quaternionf; + +import java.util.HashSet; +import java.util.function.BiFunction; + +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +public class StarLadderRender extends + DynamicRender { + + public static final StarLadderRender INSTANCE = new StarLadderRender(); + public static final Codec CODEC = Codec.unit(INSTANCE); + public static final DynamicRenderType TYPE = new DynamicRenderType<>( + StarLadderRender.CODEC); + + private static final BiFunction renderBoundCache = Util.memoize((front, upwards) -> { + Direction up = RelativeDirection.UP.getRelative(front, upwards, false); + Direction back = RelativeDirection.BACK.getRelative(front, upwards, false); + Direction left = RelativeDirection.LEFT.getRelative(front, upwards, false); + + // offset from the controller to the inner cube (scaled up by 1 in all directions) + // values are from the multi pattern + BlockPos.MutableBlockPos minPos = new BlockPos.MutableBlockPos() + .move(left, 3).move(up, 1).move(back, 2); + BlockPos.MutableBlockPos maxPos = new BlockPos.MutableBlockPos() + .move(left, -3).move(up, 7).move(back, 8); + + return new AABB(minPos, maxPos); + }); + + public static final ResourceLocation BLOOD_CUBE_TEXTURE = CosmicCore.id("block/iris/blood_cube"); + + private static TextureAtlasSprite bloodCubeSprite = null; + private static boolean isEventListenerRegistered = false; + + @SuppressWarnings("deprecation") + private StarLadderRender() { + if (!isEventListenerRegistered) { + ModelUtils.registerAtlasStitchedEventListener(true, TextureAtlas.LOCATION_BLOCKS, event -> { + bloodCubeSprite = event.getAtlas().getSprite(BLOOD_CUBE_TEXTURE); + }); + isEventListenerRegistered = true; + } + } + + @Override + public DynamicRenderType getType() { + return TYPE; + } + + @Override + public int getViewDistance() { + return 512; + } + + @Override + public AABB getRenderBoundingBox(WorkableElectricMultiblockMachine multi) { + return new AABB(multi.getPos()).inflate(getViewDistance(), 256, getViewDistance()); + } + + @Override + public boolean shouldRenderOffScreen(WorkableElectricMultiblockMachine machine) { + return true; + } + + @Override + public void render(WorkableElectricMultiblockMachine machine, float partialTick, PoseStack poseStack, + MultiBufferSource buffer, int packedLight, int packedOverlay) { + if (!machine.isFormed()) { + return; + } + float totalTick = (Minecraft.getInstance().player.tickCount + partialTick); + + poseStack.pushPose(); + + // Position the pillar 11 blocks in front of the controller + Direction front = machine.getFrontFacing(); + Direction upwards = machine.getUpwardsFacing(); + boolean flipped = machine.isFlipped(); + Direction frontDir = RelativeDirection.FRONT.getRelative(front, upwards, flipped); + Direction.Axis leftAxis = RelativeDirection.LEFT.getRelative(front, upwards, flipped).getAxis(); + + float x0ffset = 0, y0ffset = 0.5f, z0ffset = 0; + + // Calculate offset 11 blocks in front of controller + Vec3i frontNormal = frontDir.getNormal(); + for (Direction.Axis axis : Direction.Axis.VALUES) { + int frontOffset = frontNormal.get(axis); + float offset = frontOffset * 10.5f; + switch (axis) { + case X -> x0ffset = offset; + case Y -> y0ffset = 0.5f; + case Z -> z0ffset = offset; + } + } + + poseStack.translate( + x0ffset + (leftAxis == Direction.Axis.X ? 0.5f : 0.0f), + y0ffset, + z0ffset + (leftAxis == Direction.Axis.Z ? 0.5f : 0.0f)); + + // Render the massive woven cable pillar + renderWovenCablePillar(poseStack, buffer, totalTick, packedLight, packedOverlay); + + poseStack.popPose(); + } + + private static void renderWireDodecahedron(PoseStack poseStack, MultiBufferSource buffer, + float scale, int sidesColorRGBA, float alpha) { + float r = ((sidesColorRGBA >> 16) & 0xFF) / 255f; + float g = ((sidesColorRGBA >> 8) & 0xFF) / 255f; + float b = ((sidesColorRGBA) & 0xFF) / 255f; + + final float phi = (1f + (float) Math.sqrt(5.0)) * 0.5f; + final float inv = 1f / phi; + + // build vertex list! Wahoo! + final float[][] V = new float[20][3]; + int idx = 0; + for (int sx = -1; sx <= 1; sx += 2) + for (int sy = -1; sy <= 1; sy += 2) + for (int sz = -1; sz <= 1; sz += 2) + V[idx++] = new float[] { sx, sy, sz }; + + for (int s1 = -1; s1 <= 1; s1 += 2) + for (int s2 = -1; s2 <= 1; s2 += 2) { + V[idx++] = new float[] { 0f, s1 * inv, s2 * phi }; + V[idx++] = new float[] { s1 * inv, s2 * phi, 0f }; + V[idx++] = new float[] { s1 * phi, 0f, s2 * inv }; + } + + for (int i = 0; i < 20; i++) { + V[i][0] *= scale; + V[i][1] *= scale; + V[i][2] *= scale; + } + + float edge2 = Float.POSITIVE_INFINITY; + for (int i = 0; i < 20; i++) + for (int j = i + 1; j < 20; j++) { + float dx = V[i][0] - V[j][0], dy = V[i][1] - V[j][1], dz = V[i][2] - V[j][2]; + float d2 = dx * dx + dy * dy + dz * dz; + if (d2 > 1e-6f && d2 < edge2) edge2 = d2; + } + final float eps = edge2 * 1.0015f; + + var mat = poseStack.last().pose(); + var nrm = poseStack.last().normal(); + VertexConsumer vc = buffer.getBuffer(net.minecraft.client.renderer.RenderType.lines()); + + for (int i = 0; i < 20; i++) + for (int j = i + 1; j < 20; j++) { + float dx = V[i][0] - V[j][0], dy = V[i][1] - V[j][1], dz = V[i][2] - V[j][2]; + float d2 = dx * dx + dy * dy + dz * dz; + if (d2 <= eps) { + float len = (float) Math.sqrt(d2); + float nx = dx / len, ny = dy / len, nz = dz / len; + + vc.vertex(mat, V[i][0], V[i][1], V[i][2]) + .color(r, g, b, alpha).normal(nrm, nx, ny, nz).endVertex(); + vc.vertex(mat, V[j][0], V[j][1], V[j][2]) + .color(r, g, b, alpha).normal(nrm, nx, ny, nz).endVertex(); + } + } + } + + private static void renderWireDodecahedronThick(PoseStack poseStack, MultiBufferSource buffer, + float scale, float thickness, + float r, float g, float b, float a) { + final float phi = (1f + (float) Math.sqrt(5.0)) * 0.5f; + final float inv = 1f / phi; + + final float[][] V = new float[20][3]; + int idx = 0; + for (int sx = -1; sx <= 1; sx += 2) + for (int sy = -1; sy <= 1; sy += 2) + for (int sz = -1; sz <= 1; sz += 2) + V[idx++] = new float[] { sx, sy, sz }; + + for (int s1 = -1; s1 <= 1; s1 += 2) + for (int s2 = -1; s2 <= 1; s2 += 2) { + V[idx++] = new float[] { 0f, s1 * inv, s2 * phi }; + V[idx++] = new float[] { s1 * inv, s2 * phi, 0f }; + V[idx++] = new float[] { s1 * phi, 0f, s2 * inv }; + } + + for (int i = 0; i < 20; i++) { + V[i][0] *= scale; + V[i][1] *= scale; + V[i][2] *= scale; + } + + HashSet edges = new java.util.HashSet<>(64); + for (int i = 0; i < 20; i++) { + int[] ns = getInts(V, i); + for (int j : ns) { + int low = Math.min(i, j); + int high = Math.max(i, j); + long key = ((long) low << 32) | (high & 0xFFFFFFFFL); + edges.add(key); + } + } + VertexConsumer vertexConsumer = buffer.getBuffer(GTRenderTypes.getLightRing()); + final Matrix4f mat = poseStack.last().pose(); + + var cam = Minecraft.getInstance().gameRenderer.getMainCamera(); + var v3 = cam.getLookVector(); + float vx = (float) v3.x, vy = (float) v3.y, vz = (float) v3.z; + float vlen = (float) Math.sqrt(vx * vx + vy * vy + vz * vz); + if (vlen > 0f) { + vx /= vlen; + vy /= vlen; + vz /= vlen; + } + + final float EPS = 1e-6f; + for (long key : edges) { + vertexConsumer = buffer.getBuffer(GTRenderTypes.getLightRing()); + int i0 = (int) (key >>> 32); + int i1 = (int) (key & 0xFFFFFFFFL); + + float x0 = V[i0][0], y0 = V[i0][1], z0 = V[i0][2]; + float x1 = V[i1][0], y1 = V[i1][1], z1 = V[i1][2]; + + float dx = x1 - x0, dy = y1 - y0, dz = z1 - z0; + float L2 = dx * dx + dy * dy + dz * dz; + if (L2 < EPS) continue; + float L = (float) Math.sqrt(L2); + float ex = dx / L, ey = dy / L, ez = dz / L; + float nx = ey * vz - ez * vy; + float ny = ez * vx - ex * vz; + float nz = ex * vy - ey * vx; + float n2 = nx * nx + ny * ny + nz * nz; + if (n2 < EPS) { + float upx = 0f, upy = 1f, upz = 0f; + nx = ey * upz - ez * upy; + ny = ez * upx - ex * upz; + nz = ex * upy - ey * upx; + n2 = nx * nx + ny * ny + nz * nz; + if (n2 < EPS) { + nx = 1f; + ny = 0f; + nz = 0f; + n2 = 1f; + } + } + float s = (0.5f * thickness) / (float) Math.sqrt(n2); + float ox = nx * s, oy = ny * s, oz = nz * s; + float ax = x0 - ox, ay = y0 - oy, az = z0 - oz; + float bx = x0 + ox, by = y0 + oy, bz = z0 + oz; + float cx = x1 + ox, cy = y1 + oy, cz = z1 + oz; + float dxq = x1 - ox, dyq = y1 - oy, dzq = z1 - oz; + + // Tri 1: A,B,C + vertexConsumer.vertex(mat, ax, ay, az).color(r, g, b, a).endVertex(); + vertexConsumer.vertex(mat, bx, by, bz).color(r, g, b, a).endVertex(); + vertexConsumer.vertex(mat, cx, cy, cz).color(r, g, b, a).endVertex(); + + // Tri 2: A,C,D + vertexConsumer.vertex(mat, ax, ay, az).color(r, g, b, a).endVertex(); + vertexConsumer.vertex(mat, cx, cy, cz).color(r, g, b, a).endVertex(); + vertexConsumer.vertex(mat, dxq, dyq, dzq).color(r, g, b, a).endVertex(); + } + } + + private static int @NotNull [] getInts(float[][] V, int i) { + int n1 = -1, n2 = -1, n3 = -1; + float d1 = Float.POSITIVE_INFINITY, d2 = Float.POSITIVE_INFINITY, d3 = Float.POSITIVE_INFINITY; + + float xi = V[i][0], yi = V[i][1], zi = V[i][2]; + for (int j = 0; j < 20; j++) if (j != i) { + float dx = xi - V[j][0], dy = yi - V[j][1], dz = zi - V[j][2]; + float d = dx * dx + dy * dy + dz * dz; + if (d < d1) { + d3 = d2; + n3 = n2; + d2 = d1; + n2 = n1; + d1 = d; + n1 = j; + } else if (d < d2) { + d3 = d2; + n3 = n2; + d2 = d; + n2 = j; + } else if (d < d3) { + d3 = d; + n3 = j; + } + } + int[] ns = { n1, n2, n3 }; + return ns; + } + + public static void renderSolidSphere(PoseStack poseStack, MultiBufferSource buffer, + float cx, float cy, float cz, + float radius, int slices, int stacks, + float r, float g, float b, float a) { + Matrix4f mat = poseStack.last().pose(); + VertexConsumer vc = buffer.getBuffer(GTRenderTypes.getLightRing()); + + float dPhi = (float) (Mth.TWO_PI / Math.max(3, slices)); + float dTheta = (float) (Math.PI / Math.max(2, stacks)); + + for (int i = 0; i < stacks; i++) { + float th0 = i * dTheta; + float th1 = (i + 1) * dTheta; + float sin0 = Mth.sin(th0), cos0 = Mth.cos(th0); + float sin1 = Mth.sin(th1), cos1 = Mth.cos(th1); + + // one triangle strip per latitude band; <= closes seam + for (int j = 0; j <= slices; j++) { + float ph = j * dPhi; + float cosp = Mth.cos(ph), sinp = Mth.sin(ph); + + // band top (th0) + float x0 = cx + radius * sin0 * cosp; + float y0 = cy + radius * cos0; + float z0 = cz + radius * sin0 * sinp; + + // band bottom (th1) + float x1 = cx + radius * sin1 * cosp; + float y1 = cy + radius * cos1; + float z1 = cz + radius * sin1 * sinp; + + // order chosen for typical backface cull; swap if it looks inside-out + vc.vertex(mat, x0, y0, z0).color(r, g, b, a).endVertex(); + vc.vertex(mat, x1, y1, z1).color(r, g, b, a).endVertex(); + } + } + } + + @OnlyIn(Dist.CLIENT) + public void renderBloodCube(PoseStack poseStack, MultiBufferSource bufferSource, float totalTick) { + poseStack.pushPose(); + // rotate around center + Quaternionf rot = new Quaternionf() + .rotateXYZ(Mth.sin(totalTick / 20), + Mth.sin(totalTick / 30), + Mth.cos(Mth.HALF_PI + totalTick / 60)) + .rotateXYZ(55f * Mth.DEG_TO_RAD, 30f * Mth.DEG_TO_RAD, 0); + poseStack.mulPose(rot); + + // draw cube quads + var consumer = bufferSource.getBuffer(Sheets.translucentCullBlockSheet()); + RenderBufferHelper.renderCube(consumer, poseStack.last(), 0xffffffff, + LightTexture.FULL_BRIGHT, bloodCubeSprite, + -1, -1, -1, 1, 1, 1); + + poseStack.popPose(); + } + + @OnlyIn(Dist.CLIENT) + private void renderWovenCablePillar(PoseStack poseStack, MultiBufferSource buffer, + float totalTick, int packedLight, int packedOverlay) { + int numStrands = 4; + float pillarHeight = 2048f; + float coreRadius = 3.0f; + float strandRadius = 0.85f; + float helixRadius = 3.8f; + float windingSpeed = 0.03f; + + float animTime = -totalTick * 0.10f; + + // Render central core column first (back to front for translucency) + VertexConsumer coreConsumer = buffer.getBuffer(GTRenderTypes.getLightRing()); + renderCoreColumn(poseStack, coreConsumer, pillarHeight, coreRadius, totalTick, packedLight, packedOverlay); + + // Render counter-rotating helix layers for structural stability look + // First layer - clockwise spiral + for (int strand = 0; strand < numStrands; strand++) { + VertexConsumer strandConsumer = buffer.getBuffer(GTRenderTypes.getLightRing()); + float strandAngleOffset = (strand / (float) numStrands) * Mth.TWO_PI; + renderBraidedStrand(poseStack, strandConsumer, pillarHeight, helixRadius, strandRadius, + strandAngleOffset, animTime, windingSpeed, packedLight, packedOverlay, true); + } + + // Second layer - counter-clockwise spiral (creates woven/braided effect) + for (int strand = 0; strand < numStrands; strand++) { + VertexConsumer strandConsumer = buffer.getBuffer(GTRenderTypes.getLightRing()); + float strandAngleOffset = (strand / (float) numStrands) * Mth.TWO_PI + (Mth.PI / numStrands); + renderBraidedStrand(poseStack, strandConsumer, pillarHeight, helixRadius * 0.95f, strandRadius * 0.8f, + strandAngleOffset, animTime, -windingSpeed, packedLight, packedOverlay, false); + } + } + + @OnlyIn(Dist.CLIENT) + private void renderBraidedStrand(PoseStack poseStack, VertexConsumer consumer, float height, + float helixRadius, float strandRadius, float angleOffset, + float animTime, float windingSpeed, int packedLight, int packedOverlay, + boolean isClockwise) { + int segments = 256; + float segmentHeight = height / segments; + + Matrix4f mat = poseStack.last().pose(); + + // Different colors for each layer to show the braiding + float r = isClockwise ? 0.1f : 0.15f; + float g = isClockwise ? 0.1f : 0.15f; + float b = isClockwise ? 0.1f : 0.15f; + + for (int i = 0; i < segments; i++) { + float y1 = i * segmentHeight; + float y2 = (i + 1) * segmentHeight; + + float angle1 = (y1 * windingSpeed + angleOffset + animTime) % Mth.TWO_PI; + float angle2 = (y2 * windingSpeed + angleOffset + animTime) % Mth.TWO_PI; + + float x1 = helixRadius * Mth.cos(angle1); + float z1 = helixRadius * Mth.sin(angle1); + float x2 = helixRadius * Mth.cos(angle2); + float z2 = helixRadius * Mth.sin(angle2); + + // Draw cylindrical tube segment + drawTubeSegment(mat, consumer, x1, y1, z1, x2, y2, z2, strandRadius, r, g, b, 1f); + } + } + + @OnlyIn(Dist.CLIENT) + private void renderCoreColumn(PoseStack poseStack, VertexConsumer consumer, float height, + float radius, float totalTick, int packedLight, int packedOverlay) { + int segments = 256; + float segmentHeight = height / segments; + + Matrix4f mat = poseStack.last().pose(); + + for (int i = 0; i < segments; i++) { + float y1 = i * segmentHeight; + float y2 = (i + 1) * segmentHeight; + + float glow = 0.7f + 0.3f * Mth.sin(totalTick * 0.05f + y1 * 0.1f); + + // Draw central glowing column + drawTubeSegment(mat, consumer, 0, y1, 0, 0, y2, 0, radius, + 0.3f * glow, 0.45f * glow, 0.6f * glow, 1f); + } + } + + @OnlyIn(Dist.CLIENT) + private void drawTubeSegment(Matrix4f mat, VertexConsumer consumer, + float x1, float y1, float z1, float x2, float y2, float z2, + float radius, float r, float g, float b, float a) { + int sides = 4; + float angleStep = Mth.TWO_PI / sides; + + for (int i = 0; i < sides; i++) { + float angle1 = i * angleStep; + float angle2 = (i + 1) * angleStep; + + float cos1 = Mth.cos(angle1); + float sin1 = Mth.sin(angle1); + float cos2 = Mth.cos(angle2); + float sin2 = Mth.sin(angle2); + + // First triangle of quad + consumer.vertex(mat, x1 + radius * cos1, y1, z1 + radius * sin1).color(r, g, b, a).endVertex(); + consumer.vertex(mat, x1 + radius * cos2, y1, z1 + radius * sin2).color(r, g, b, a).endVertex(); + consumer.vertex(mat, x2 + radius * cos2, y2, z2 + radius * sin2).color(r, g, b, a).endVertex(); + + // Second triangle of quad + consumer.vertex(mat, x1 + radius * cos1, y1, z1 + radius * sin1).color(r, g, b, a).endVertex(); + consumer.vertex(mat, x2 + radius * cos2, y2, z2 + radius * sin2).color(r, g, b, a).endVertex(); + consumer.vertex(mat, x2 + radius * cos1, y2, z2 + radius * sin1).color(r, g, b, a).endVertex(); + } + } + + @OnlyIn(Dist.CLIENT) + private void renderRings(Direction.Axis upAxis, float totalTick, PoseStack poseStack, MultiBufferSource buffer) { + VertexConsumer consumer = buffer.getBuffer(GTRenderTypes.getLightRing()); + + float xRot = totalTick / 20; + float zRot = Mth.HALF_PI + totalTick / 60; + float yRot = totalTick / 30; + float sinX = Mth.sin(xRot), cosX = Mth.cos(xRot); + float sinY = Mth.sin(yRot), cosY = Mth.cos(yRot); + float sinZ = Mth.sin(zRot), cosZ = Mth.cos(zRot); + + poseStack.pushPose(); + poseStack.mulPose(new Quaternionf().rotateXYZ(sinX, cosY, sinZ)); + RenderBufferHelper.renderRing(poseStack, consumer, + 0, 0, 0, + 2f, 0.1F, 10, 36, + 0.5F, 0, 0, 1, upAxis); + poseStack.popPose(); + + poseStack.pushPose(); + poseStack.mulPose(new Quaternionf().rotateXYZ(cosX, sinY, sinZ)); + RenderBufferHelper.renderRing(poseStack, consumer, + 0, 0, 0, + 1.8f, 0.1F, 10, 36, + 0.4F, 0f, 0, 1, upAxis); + poseStack.popPose(); + + poseStack.pushPose(); + poseStack.mulPose(new Quaternionf().rotateZ(cosZ)); + RenderBufferHelper.renderRing(poseStack, consumer, + 0, 0, 0, + 1.6f, 0.1F, 10, 36, + 0.6F, 0, 0, 1, upAxis); + poseStack.popPose(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/StellarIrisRender.java b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/StellarIrisRender.java index a922e929e..133de3bdc 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/StellarIrisRender.java +++ b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/StellarIrisRender.java @@ -40,8 +40,12 @@ public class StellarIrisRender extends DynamicRender { public static final StellarIrisRender INSTANCE = new StellarIrisRender(); - public String hexColor = "#a262e3"; + // Default star color - will be overridden by machine's customStarColor if set + public static final String DEFAULT_STAR_COLOR = "#FFCC44"; // Golden yellow public static final Codec CODEC = Codec.unit(StellarIrisRender.INSTANCE); + + // Current hex color being used for rendering (set per-render from machine or default) + private String hexColor = DEFAULT_STAR_COLOR; public static final DynamicRenderType TYPE = new DynamicRenderType<>( StellarIrisRender.CODEC); @@ -65,7 +69,6 @@ private StellarIrisRender() { irisRingModel = event.getModels().get(IRIS_MODEL_RING); irisSmallRingModel = event.getModels().get(IRIS_MODEL_RING_WHITE); - // Todo : Figure out why these don't render the ball. starCoreModel = event.getModels().get(STAR_MODEL_CORE); outerStarSphereModel = event.getModels().get(STAR_MODEL_OUTER); innerStarSphereModel = event.getModels().get(STAR_MODEL_INNER); @@ -77,43 +80,39 @@ public DynamicRenderType getType() { return TYPE; } + /** + * Gets the star color from the machine, converting from int to hex string. + * Returns DEFAULT_STAR_COLOR if machine has no custom color set (-1). + */ + private String getStarColorFromMachine(IrisMultiblockMachine machine) { + int customColor = machine.getCustomStarColor(); + if (customColor == -1) { + return DEFAULT_STAR_COLOR; + } + // Convert int color (0xRRGGBB) to hex string (#RRGGBB) + return String.format("#%06X", customColor & 0xFFFFFF); + } + @OnlyIn(Dist.CLIENT) @Override public void render(IrisMultiblockMachine machine, float partialTick, PoseStack poseStack, MultiBufferSource buffer, int packedLight, int packedOverlay) { - if (!machine.isFormed()) return; + // if (!machine.isFormed()) return; + + // Set the star color from the machine's custom color (or default) + this.hexColor = getStarColorFromMachine(machine); float totalTick = (Minecraft.getInstance().player.tickCount + partialTick); VertexConsumer consumer = buffer.getBuffer(Sheets.translucentCullBlockSheet()); poseStack.pushPose(); - Direction front = machine.getFrontFacing(); - Direction upwards = machine.getUpwardsFacing(); - - float x0ffset = 0, y0ffset = -2.5f, z0ffset = 0; - - if (front.getAxis() == Direction.Axis.X) { - if (front.getAxisDirection() == Direction.AxisDirection.POSITIVE) { - x0ffset = -45.5f; - z0ffset = 0.5f; - } else { - x0ffset = 46.5f; - z0ffset = 0.5f; - } - } - - if (front.getAxis() == Direction.Axis.Z) { - if (front.getAxisDirection() == Direction.AxisDirection.POSITIVE) { - z0ffset = -45.55f; - x0ffset = 0.5f; - } else { - z0ffset = 46.5f; - x0ffset = 0.5f; - } - } + // Controller is now on top spire - star renders 23 blocks below controller + // Center offset: controller is at top, star center is 23 blocks down + float x0ffset = 0.5f; + float y0ffset = -23f; + float z0ffset = 0.5f; poseStack.translate(x0ffset, y0ffset, z0ffset); - // poseStack.mulPose(new Quaternionf().rotateAxis(totalTick * Mth.TWO_PI / 80, 0, 1, 0)); poseStack.scale(7.0f, 7, 7); if (machine.getStage() == IrisMultiblockMachine.Stage.STAR) { @@ -124,18 +123,21 @@ public void render(IrisMultiblockMachine machine, float partialTick, PoseStack p poseStack.popPose(); } else if (machine.getStage() == IrisMultiblockMachine.Stage.GROWING) { + poseStack.pushPose(); poseStack.mulPose(new Quaternionf().rotateAxis(-totalTick * Mth.TWO_PI / 80f, 0, 1, 0)); renderStar(poseStack, consumer, totalTick, packedLight, packedOverlay); renderStarInsides(poseStack, consumer, totalTick, packedLight, packedOverlay); renderStarShell(poseStack, consumer, totalTick, packedLight, packedOverlay); + poseStack.popPose(); + renderMultiStarSystemRandomized( machine, poseStack, buffer, totalTick, packedLight, packedOverlay, - /* count */ 5, - /* meanRadius */ 4.5f, - /* radiusJitter */ 0.75f, - /* periodSec */ 2000f, - /* starMin */ 0.05f, /* starMax */ 0.6f, - /* spinSelf */ true); + 10, + 4.5f, + 0.75f, + 5f, + 0.12f, 0.45f, + true); poseStack.popPose(); } else if (machine.getStage() == IrisMultiblockMachine.Stage.SUPERSTAR) { poseStack.scale(2, 2, 2); @@ -146,7 +148,7 @@ public void render(IrisMultiblockMachine machine, float partialTick, PoseStack p } else if (machine.getStage() == IrisMultiblockMachine.Stage.BLACK_HOLE) { renderIris(poseStack, consumer, packedLight, packedOverlay); - renderRing(poseStack, consumer, packedLight, packedOverlay); + renderAccretionDisk(poseStack, consumer, totalTick, packedLight, packedOverlay); poseStack.popPose(); renderRingSmall(machine, poseStack, consumer, totalTick, packedLight, packedOverlay); @@ -163,7 +165,6 @@ public void render(IrisMultiblockMachine machine, float partialTick, PoseStack p BlockPos pos = machine.getPos(); if (!irisFadeStartSec.containsKey(pos)) { - // First frame: draw fully visible and start fade timer PoseStack.Pose pose = poseStack.last(); java.util.List quads = irisCoreModel.getQuads(null, null, random, ModelData.EMPTY, null); for (BakedQuad quad : quads) { @@ -176,10 +177,7 @@ public void render(IrisMultiblockMachine machine, float partialTick, PoseStack p poseStack, consumer, packedLight, packedOverlay, pos, partialTick); if (vanished) { - machine.setStage(IrisMultiblockMachine.Stage.STAR); // TODO: This does NOT set the stage of the - // multi, it sets the render stage to star which - // desyncs it figure out how to set the MACHINES - // STATE and set BOTH to EMPTY! ! ! + machine.setStage(IrisMultiblockMachine.Stage.STAR); } } poseStack.popPose(); @@ -212,11 +210,9 @@ public void renderIris(PoseStack poseStack, VertexConsumer consumer, int packedL } } - // Start time per machine position, in seconds private final java.util.Map irisFadeStartSec = new java.util.HashMap<>(); private static final float IRIS_FADE_DURATION_SEC = 10f; - // Call this once to begin the fading shrink private void startIrisFade(BlockPos pos, float partialTick) { float tSec = (Minecraft.getInstance().player.tickCount + partialTick) / 20.0f; irisFadeStartSec.put(pos, tSec); @@ -258,7 +254,7 @@ private boolean renderIrisFading(PoseStack poseStack, VertexConsumer consumer, float alpha = (1f - k) * (1f - k); poseStack.pushPose(); - poseStack.scale(scale, scale, scale); // shrink while fading + poseStack.scale(scale, scale, scale); PoseStack.Pose pose = poseStack.last(); java.util.List quads = irisCoreModel.getQuads(null, null, random, ModelData.EMPTY, null); for (BakedQuad quad : quads) { @@ -282,34 +278,41 @@ public void renderRing(PoseStack poseStack, VertexConsumer consumer, int packedL poseStack.popPose(); } + /** + * Renders the main accretion disk with rotation around the black hole. + */ @OnlyIn(Dist.CLIENT) - public void renderRingSmall(IrisMultiblockMachine machine, PoseStack poseStack, VertexConsumer consumer, - float totalTick, int packedLight, int packedOverlay) { + public void renderAccretionDisk(PoseStack poseStack, VertexConsumer consumer, + float totalTick, int packedLight, int packedOverlay) { poseStack.pushPose(); - Direction front = machine.getFrontFacing(); - Direction upwards = machine.getUpwardsFacing(); - float x0ffset = 0, y0ffset = -2.3f, z0ffset = 0; + // Offset slightly down to avoid z-fighting with the fast spinning ring + poseStack.translate(0, -0.05f, 0); - if (front.getAxis() == Direction.Axis.X) { - if (front.getAxisDirection() == Direction.AxisDirection.POSITIVE) { - x0ffset = -46.5f; - z0ffset = -0.5f; - } else { - x0ffset = 46.5f; - z0ffset = 0.5f; - } - } + // Slow rotation around Y axis (orbital motion) + float rotationSpeed = totalTick * Mth.TWO_PI / 200f; // Full rotation every 10 seconds + poseStack.mulPose(new Quaternionf().rotateY(rotationSpeed)); - if (front.getAxis() == Direction.Axis.Z) { - if (front.getAxisDirection() == Direction.AxisDirection.POSITIVE) { - z0ffset = -46.5f; - x0ffset = -0.5f; - } else { - z0ffset = 46.5f; - x0ffset = 0.5f; - } + poseStack.scale(2.0f, 2.0f, 2.0f); + + List quads = irisRingModel.getQuads(null, null, random, ModelData.EMPTY, null); + for (BakedQuad quad : quads) { + consumer.putBulkData(poseStack.last(), quad, 1f, 1f, 1f, packedLight, packedOverlay); } + + poseStack.popPose(); + } + + @OnlyIn(Dist.CLIENT) + public void renderRingSmall(IrisMultiblockMachine machine, PoseStack poseStack, VertexConsumer consumer, + float totalTick, int packedLight, int packedOverlay) { + poseStack.pushPose(); + + // Controller is now on top spire - ring renders at star center (23 blocks below controller) + float x0ffset = 0.5f; + float y0ffset = -23f; + float z0ffset = 0.5f; + poseStack.translate(x0ffset, y0ffset, z0ffset); poseStack.mulPose(new Quaternionf().rotateAxis(totalTick * Mth.TWO_PI / 20, 0, 1, 0)); poseStack.scale(13.0f, 13.0f, 13.0f); @@ -364,130 +367,78 @@ private void renderStarAt(PoseStack poseStack, VertexConsumer consumer, private void renderMultiStarSystemRandomized(IrisMultiblockMachine machine, PoseStack poseStack, MultiBufferSource buffer, float totalTick, int packedLight, int packedOverlay, - int count, // 1..6 - float meanRadius, // base ring radius (in your local space) - float radiusJitter, // 0..1 fraction (e.g. 0.35f) - float periodSec, // orbit period in seconds - float starMin, float starMax, // visual size range (e.g. 0.10..0.40) + int count, + float meanRadius, + float radiusJitter, + float periodSec, + float starMin, float starMax, boolean spinSelf) { if (count < 1) return; - if (count > 6) count = 6; + if (count > 5) count = 5; - // --- params controlling look/feel --- - final float holeFrac = 0.15f; // keep at least this fraction of meanRadius clear in the center - final float eccMax = 0.22f; // max eccentricity per-star (subtle ellipse) - final float tiltMax = 0.20f; // max tilt per-star (radians) ~ 11.5° - // ------------------------------------ - - // Deterministic RNG per machine + count long seed = hashPos(machine.getPos()) ^ (count * 0x9E3779B97F4A7C15L); long[] S = new long[] { seed }; - // Masses ~ 0.6..2.0, then normalize → used for size and COM - float[] m = new float[count]; - float mSum = 0f; - for (int i = 0; i < count; i++) { - m[i] = 0.6f + 1.4f * rand01(S); - mSum += m[i]; - } - for (int i = 0; i < count; i++) m[i] /= mSum; + String[] palette = new String[] { "#ffd28a", "#9ad0ff", "#ff9fb0", "#fff6a4", "#b4ffea", "#d2a0ff" }; + VertexConsumer consumer = buffer.getBuffer(Sheets.translucentCullBlockSheet()); + + float innerRadius = 2.5f; + float outerRadius = meanRadius * 0.40f; - // Per-star random base angle (0..2π), speed jitter, radius with jitter, eccentricity, and orbit orientation - float[] baseAng = new float[count]; - float[] wMul = new float[count]; - float[] rad = new float[count]; - float[] ecc = new float[count]; - float[] yaw = new float[count]; // in-plane orientation - float[] tiltX = new float[count]; // small 3D tilt - float[] tiltZ = new float[count]; + float maxStarSize = starMax; + float minSpacing = maxStarSize * 1.8f; - final float minR = Math.max(0.05f, meanRadius * holeFrac); // enforce central hole + float totalSpace = outerRadius - innerRadius; + float neededSpace = minSpacing * (count - 1); + float radiusStep = Math.max(minSpacing, totalSpace / Math.max(1, count - 1)); + + float tSec = totalTick / 20.0f; for (int i = 0; i < count; i++) { - baseAng[i] = rand01(S) * Mth.TWO_PI; // random starting phase - wMul[i] = 0.92f + 0.16f * rand01(S); // ~0.92..1.08 angular speed jitter + float radius = innerRadius + (i * radiusStep); - float rJ = (rand01(S) * 2f - 1f) * radiusJitter; // [-jitter, +jitter] - rad[i] = Math.max(minR, meanRadius * (1f + rJ)); + float orbitTilt = (rand01(S) - 0.5f) * Mth.PI * 0.8f; + float orbitRotation = rand01(S) * Mth.TWO_PI; - ecc[i] = eccMax * rand01(S); // 0..eccMax (mild ellipse) - yaw[i] = rand01(S) * Mth.TWO_PI; // random ellipse orientation in-plane - tiltX[i] = (rand01(S) - 0.5f) * 2f * tiltMax; // small 3D tilt - tiltZ[i] = (rand01(S) - 0.5f) * 2f * tiltMax; - } + float direction = rand01(S) > 0.5f ? 1f : -1f; - // Time → base phase - float tSec = totalTick / 20.0f; - float baseTheta = (tSec / periodSec) * Mth.TWO_PI; + float speedMult = (0.3f + rand01(S) * 2.2f) * direction; - // Compute 3D positions - float[] px = new float[count]; - float[] py = new float[count]; - float[] pz = new float[count]; + float startAngle = rand01(S) * Mth.TWO_PI; - for (int i = 0; i < count; i++) { - // per-star phase - float theta = baseTheta * wMul[i] + baseAng[i]; - - // ellipse axes - float a = Math.max(minR, rad[i] * (1f + 0.5f * ecc[i])); // major - float b = Math.max(minR, rad[i] * (1f - 0.5f * ecc[i])); // minor - - // base ellipse vector in local (x,z) - float ct = Mth.cos(theta), st = Mth.sin(theta); - float ex = a * ct; - float ez = b * st; - - // rotate ellipse within XZ by yaw - float cy = Mth.cos(yaw[i]), sy = Mth.sin(yaw[i]); - float rx = ex * cy - ez * sy; - float rz = ex * sy + ez * cy; - float ry = 0f; - - // apply small tilts to give 3D orbits (X then Z) - float cx = Mth.cos(tiltX[i]), sx = Mth.sin(tiltX[i]); - float cz = Mth.cos(tiltZ[i]), sz = Mth.sin(tiltZ[i]); - - // rotate around X - float ry1 = ry * cx - rz * sx; - float rz1 = ry * sx + rz * cx; - - // rotate around Z - float rx2 = rx * cz - ry1 * sz; - float ry2 = rx * sz + ry1 * cz; - - px[i] = rx2; - py[i] = ry2; - pz[i] = rz1; - } + float orbitalPeriod = periodSec * (1.0f / Math.abs(speedMult)); + float angle = startAngle + (tSec / orbitalPeriod) * Mth.TWO_PI * Math.signum(speedMult); - // Center-of-mass correction in 3D: keep barycenter pinned at origin - float comX = 0f, comY = 0f, comZ = 0f; - for (int i = 0; i < count; i++) { - comX += m[i] * px[i]; - comY += m[i] * py[i]; - comZ += m[i] * pz[i]; - } - for (int i = 0; i < count; i++) { - px[i] -= comX; - py[i] -= comY; - pz[i] -= comZ; - } + float orbitX = radius * Mth.cos(angle); + float orbitY = 0f; + float orbitZ = radius * Mth.sin(angle); - // Colors (fallback palette) - String[] palette = new String[] { "#ffd28a", "#9ad0ff", "#ff9fb0", "#fff6a4", "#b4ffea", "#d2a0ff" }; - VertexConsumer consumer = buffer.getBuffer(Sheets.translucentCullBlockSheet()); + float cosTilt = Mth.cos(orbitTilt); + float sinTilt = Mth.sin(orbitTilt); + float rotX1 = orbitX; + float rotY1 = orbitY * cosTilt - orbitZ * sinTilt; + float rotZ1 = orbitY * sinTilt + orbitZ * cosTilt; + + float cosRot = Mth.cos(orbitRotation); + float sinRot = Mth.sin(orbitRotation); + float finalX = rotX1 * cosRot + rotZ1 * sinRot; + float finalY = rotY1; + float finalZ = -rotX1 * sinRot + rotZ1 * cosRot; + + float sizeRand = rand01(S); + float starSize = Mth.lerp(sizeRand, starMin, starMax); + starSize = Mth.clamp(starSize, starMin, starMax); - // Render stars with size ~ m^(1/3), mapped into [starMin, starMax] - for (int i = 0; i < count; i++) { - float size01 = (float) Math.pow(m[i], 1f / 3f); - float sizeMul = Mth.lerp(size01, starMin, starMax); String color = palette[i % palette.length]; + float spinSpeed = 0.5f + rand01(S) * 2.0f; + float spinOffset = rand01(S) * 1000f; + float uniqueSpinTick = spinSelf ? (totalTick * spinSpeed + spinOffset) : 0f; + poseStack.pushPose(); - poseStack.translate(px[i], py[i], pz[i]); - renderStarAt(poseStack, consumer, totalTick, packedLight, packedOverlay, - sizeMul, color, /* spinSelf= */spinSelf); + poseStack.translate(finalX, finalY, finalZ); + renderStarAt(poseStack, consumer, uniqueSpinTick, packedLight, packedOverlay, + starSize, color, spinSelf); poseStack.popPose(); } } @@ -536,7 +487,6 @@ public void renderStarShell(PoseStack poseStack, VertexConsumer consumer, private long pulseSeed = 0L; private boolean seedInit = false; - // Deterministic hash (like xorshift) to make a seed from block pos private static long hashPos(BlockPos p) { long x = p.getX(), y = p.getY(), z = p.getZ(); long h = x * 0x9E3779B97F4A7C15L ^ (y + 0xC2B2AE3D27D4EB4FL) ^ (z * 0x94D049BB133111EBL); @@ -548,7 +498,6 @@ private static long hashPos(BlockPos p) { return h; } - // Simple LCG for reproducible floats [0,1) private static final long A = 6364136223846793005L, C = 1442695040888963407L; private static long lcg(long s) { @@ -560,7 +509,6 @@ private static float rand01(long[] s) { return ((s[0] >>> 8) & 0xFFFFFF) / (float) (1 << 24); } - // Exponential RNG with mean = 1/lambda (Poisson inter-arrival); clamp U to avoid log(0) private static float expSample(long[] s, float lambda) { float u = Math.max(1e-6f, rand01(s)); return (float) (-Math.log(u) / lambda); @@ -569,33 +517,28 @@ private static float expSample(long[] s, float lambda) { @OnlyIn(Dist.CLIENT) private float erraticPulseEffect(float min, float max, float partial, float intensity, IrisMultiblockMachine machine) { - // absolute time in seconds float tSec = (Minecraft.getInstance().player.tickCount + partial) / 20.0f; - // seed once per machine so multiple instances don't sync - realistically you never have more than one if (!seedInit) { pulseSeed = hashPos(machine.getPos()); seedInit = true; - nextSpikeT = tSec + 0.2f; // first spike soon-ish + nextSpikeT = tSec + 0.2f; } - // real dt (handles multi-pass calls where time didn't advance) float dt; if (Float.isNaN(prevTSec)) dt = 0f; else { dt = tSec - prevTSec; if (dt < 0f) dt = 0f; - if (dt > 0.25f) dt = 0.25f; // clamp long stalls + if (dt > 0.25f) dt = 0.25f; } prevTSec = tSec; - // Map intensity -> spike rate and strength intensity = Mth.clamp(intensity, 0f, 1f); float rateHz = Mth.lerp(intensity, 0.3f, 3.0f); float gain = Mth.lerp(intensity, 0.25f, 0.9f); float decayTau = Mth.lerp(intensity, 0.60f, 0.20f); - // Drive Poisson spike train if (dt > 0f) { long[] s = new long[] { pulseSeed }; while (tSec >= nextSpikeT) { @@ -606,20 +549,17 @@ private float erraticPulseEffect(float min, float max, float partial, float inte pulseSeed = s[0]; } - // exponential decay of envelope float decay = (float) Math.exp(-dt / decayTau); spikeEnv *= decay; } float w = tSec; float jitter = 0.04f * (float) Math.sin(7.23 * w + 0.3) + 0.03f * (float) Math.sin(11.1 * w + 1.7) + - 0.02f * (float) Math.sin(4.7 * w * w + 0.5); // slight chaos + 0.02f * (float) Math.sin(4.7 * w * w + 0.5); jitter = Mth.clamp(jitter, -0.15f, 0.15f); - // Combine: base floor + spikes + jitter, then clamp 0..1 float pulse01 = Mth.clamp(0.12f + spikeEnv + jitter, 0f, 1f); - // Map to [min,max] return Mth.lerp(pulse01, min, max); } @@ -646,7 +586,6 @@ private void renderRings(Direction.Axis upAxis, float totalTick, PoseStack poseS 0, 0, 0, 6.3f, 0.3F, 10, 36, 0F, 0, 0F, 1, upAxis); - poseStack.scale(3, 3, 3); poseStack.popPose(); poseStack.pushPose(); @@ -689,13 +628,13 @@ private void renderRingsSecondary(Direction.Axis upAxis, float totalTick, PoseSt consumer = buffer.getBuffer(GTRenderTypes.getLightRing()); RenderBufferHelper.renderRing(poseStack, consumer, 0, 0, 0, - 5.10f + 0.25f * Mth.sin(totalTick * 0.9f + 0.3f), // radius breath - 0.26F + 0.06F * Mth.sin(totalTick * 0.291f + 1.7f), // thickness breath + 5.10f + 0.25f * Mth.sin(totalTick * 0.9f + 0.3f), + 0.26F + 0.06F * Mth.sin(totalTick * 0.291f + 1.7f), 12, 40, 0F, 0, 0F, - 1, // alpha breath + 1, upAxis); - poseStack.scale(scale * 2.5f, scale * 3.2f, scale * 2.7f); // tie scale to osc (ring 1) + poseStack.scale(scale * 2.5f, scale * 3.2f, scale * 2.7f); poseStack.popPose(); poseStack.pushPose(); @@ -703,7 +642,7 @@ private void renderRingsSecondary(Direction.Axis upAxis, float totalTick, PoseSt consumer = buffer.getBuffer(GTRenderTypes.getLightRing()); RenderBufferHelper.renderRing(poseStack, consumer, 0, 0, 0, - 4.55f + 0.30f * Mth.sin(totalTick * 0.377f + 0.9f), // different rhythm + 4.55f + 0.30f * Mth.sin(totalTick * 0.377f + 0.9f), 0.34F + 0.05F * Mth.sin(totalTick * 0.291f + 1.6f), 11, 30, 0F, 0, 0F, @@ -716,7 +655,7 @@ private void renderRingsSecondary(Direction.Axis upAxis, float totalTick, PoseSt consumer = buffer.getBuffer(GTRenderTypes.getLightRing()); RenderBufferHelper.renderRing(poseStack, consumer, 0, 0, 0, - 5.05f + 0.22f * Mth.sin(totalTick * 0.065f + 1.9f), // third rhythm + 5.05f + 0.22f * Mth.sin(totalTick * 0.065f + 1.9f), 0.28F + 0.05F * Mth.sin(totalTick * 0.15f + 0.2f), 13, 32, 0F, 0, 0F, diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/ae2gt/CosmicInputBusPartMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/ae2gt/CosmicInputBusPartMachine.java new file mode 100644 index 000000000..679533fb8 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/ae2gt/CosmicInputBusPartMachine.java @@ -0,0 +1,220 @@ +package com.ghostipedia.cosmiccore.common.ae2gt; + +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.gui.fancy.FancyMachineUIWidget; +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.feature.IDataStickInteractable; +import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour; +import com.gregtechceu.gtceu.integration.ae2.gui.widget.AEItemConfigWidget; +import com.gregtechceu.gtceu.integration.ae2.machine.MEBusPartMachine; +import com.gregtechceu.gtceu.integration.ae2.slot.ExportOnlyAEItemList; +import com.gregtechceu.gtceu.integration.ae2.slot.ExportOnlyAEItemSlot; +import com.gregtechceu.gtceu.utils.GTMath; + +import com.lowdragmc.lowdraglib.gui.modular.ModularUI; +import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; +import com.lowdragmc.lowdraglib.gui.widget.Widget; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; +import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import com.lowdragmc.lowdraglib.utils.Position; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; + +import appeng.api.config.Actionable; +import appeng.api.stacks.GenericStack; +import appeng.api.storage.MEStorage; + +public class CosmicInputBusPartMachine extends MEBusPartMachine implements IDataStickInteractable, IMachineLife { + + protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( + CosmicInputBusPartMachine.class, + MEBusPartMachine.MANAGED_FIELD_HOLDER); + + protected final static int CONFIG_SIZE = 1; + + protected ExportOnlyAEItemList aeItemHandler; + + public CosmicInputBusPartMachine(IMachineBlockEntity holder, Object... args) { + super(holder, IO.IN, args); + super.circuitSlotEnabled = false; + } + + ///////////////////////////////// + // ***** Machine LifeCycle ****// + ///////////////////////////////// + + @Override + public void onMachineRemoved() { + flushInventory(); + } + + @Override + protected NotifiableItemStackHandler createInventory(Object... args) { + this.aeItemHandler = new ExportOnlyAEItemList(this, CONFIG_SIZE); + return this.aeItemHandler; + } + + @Override + public ManagedFieldHolder getFieldHolder() { + return MANAGED_FIELD_HOLDER; + } + + ///////////////////////////////// + // ********** Sync ME *********// + ///////////////////////////////// + + @Override + public void autoIO() { + if (!this.isWorkingEnabled()) return; + if (!this.shouldSyncME()) return; + + if (this.updateMEStatus()) { + this.syncME(); + this.updateInventorySubscription(); + } + } + + protected void syncME() { + MEStorage networkInv = this.getMainNode().getGrid().getStorageService().getInventory(); + for (ExportOnlyAEItemSlot aeSlot : this.aeItemHandler.getInventory()) { + // Try to clear the wrong item + GenericStack exceedItem = aeSlot.exceedStack(); + if (exceedItem != null) { + long total = exceedItem.amount(); + long inserted = networkInv.insert(exceedItem.what(), exceedItem.amount(), Actionable.MODULATE, + this.actionSource); + if (inserted > 0) { + aeSlot.extractItem(0, GTMath.saturatedCast(inserted), false); + continue; + } else { + aeSlot.extractItem(0, GTMath.saturatedCast(total), false); + } + } + // Fill it + GenericStack reqItem = aeSlot.requestStack(); + if (reqItem != null) { + long extracted = networkInv.extract(reqItem.what(), reqItem.amount(), Actionable.MODULATE, + this.actionSource); + if (extracted != 0) { + aeSlot.addStack(new GenericStack(reqItem.what(), extracted)); + } + } + } + } + + protected void flushInventory() { + var grid = getMainNode().getGrid(); + if (grid != null) { + for (var aeSlot : aeItemHandler.getInventory()) { + GenericStack stock = aeSlot.getStock(); + if (stock != null) { + grid.getStorageService().getInventory().insert(stock.what(), stock.amount(), Actionable.MODULATE, + actionSource); + } + } + } + } + + /////////////////////////////// + // ********** GUI ***********// + /////////////////////////////// + + @Override + public Widget createUIWidget() { + WidgetGroup group = new WidgetGroup(new Position(0, 0)); + // ME Network status + group.addWidget(new LabelWidget(3, 0, () -> this.isOnline ? + "gtceu.gui.me_network.online" : + "gtceu.gui.me_network.offline")); + + // Config slots + group.addWidget(new AEItemConfigWidget(46, 30, this.aeItemHandler)); + + return group; + } + + @Override + public ModularUI createUI(Player entityPlayer) { + return new ModularUI(176, 50, this, entityPlayer).widget(new FancyMachineUIWidget(this, 176, 50)); + } + //////////////////////////////// + // ******* Interaction *******// + //////////////////////////////// + + @Override + public final InteractionResult onDataStickShiftUse(Player player, ItemStack dataStick) { + if (!isRemote()) { + CompoundTag tag = new CompoundTag(); + tag.put("MEInputBus", writeConfigToTag()); + dataStick.setTag(tag); + dataStick.setHoverName(Component.translatable("gtceu.machine.me.item_import.data_stick.name")); + player.sendSystemMessage(Component.translatable("gtceu.machine.me.import_copy_settings")); + } + return InteractionResult.SUCCESS; + } + + @Override + public final InteractionResult onDataStickUse(Player player, ItemStack dataStick) { + CompoundTag tag = dataStick.getTag(); + if (tag == null || !tag.contains("MEInputBus")) { + return InteractionResult.PASS; + } + + if (!isRemote()) { + readConfigFromTag(tag.getCompound("MEInputBus")); + this.updateInventorySubscription(); + player.sendSystemMessage(Component.translatable("gtceu.machine.me.import_paste_settings")); + } + return InteractionResult.sidedSuccess(isRemote()); + } + + //////////////////////////////// + // ****** Configuration ******// + //////////////////////////////// + + protected CompoundTag writeConfigToTag() { + CompoundTag tag = new CompoundTag(); + CompoundTag configStacks = new CompoundTag(); + tag.put("ConfigStacks", configStacks); + for (int i = 0; i < CONFIG_SIZE; i++) { + var slot = this.aeItemHandler.getInventory()[i]; + GenericStack config = slot.getConfig(); + if (config == null) { + continue; + } + CompoundTag stackTag = GenericStack.writeTag(config); + configStacks.put(Integer.toString(i), stackTag); + } + tag.putByte("GhostCircuit", + (byte) IntCircuitBehaviour.getCircuitConfiguration(circuitInventory.getStackInSlot(0))); + tag.putBoolean("DistinctBuses", isDistinct()); + return tag; + } + + protected void readConfigFromTag(CompoundTag tag) { + if (tag.contains("ConfigStacks")) { + CompoundTag configStacks = tag.getCompound("ConfigStacks"); + for (int i = 0; i < CONFIG_SIZE; i++) { + String key = Integer.toString(i); + if (configStacks.contains(key)) { + CompoundTag configTag = configStacks.getCompound(key); + this.aeItemHandler.getInventory()[i].setConfig(GenericStack.readTag(configTag)); + } else { + this.aeItemHandler.getInventory()[i].setConfig(null); + } + } + } + if (tag.contains("GhostCircuit")) { + circuitInventory.setStackInSlot(0, IntCircuitBehaviour.stack(tag.getByte("GhostCircuit"))); + } + if (tag.contains("DistinctBuses")) { + setDistinct(tag.getBoolean("DistinctBuses")); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/ae2gt/CosmicInputHatchPartMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/ae2gt/CosmicInputHatchPartMachine.java new file mode 100644 index 000000000..483178452 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/ae2gt/CosmicInputHatchPartMachine.java @@ -0,0 +1,206 @@ +package com.ghostipedia.cosmiccore.common.ae2gt; + +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.feature.IDataStickInteractable; +import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; +import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.integration.ae2.gui.widget.AEFluidConfigWidget; +import com.gregtechceu.gtceu.integration.ae2.machine.MEHatchPartMachine; +import com.gregtechceu.gtceu.integration.ae2.slot.ExportOnlyAEFluidList; +import com.gregtechceu.gtceu.integration.ae2.slot.ExportOnlyAEFluidSlot; +import com.gregtechceu.gtceu.utils.GTMath; + +import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; +import com.lowdragmc.lowdraglib.gui.widget.Widget; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; +import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import com.lowdragmc.lowdraglib.utils.Position; + +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.fluids.capability.IFluidHandler; + +import appeng.api.config.Actionable; +import appeng.api.stacks.GenericStack; +import appeng.api.storage.MEStorage; + +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +public class CosmicInputHatchPartMachine extends MEHatchPartMachine + implements IDataStickInteractable, IMachineLife, IHasCircuitSlot { + + protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( + CosmicInputHatchPartMachine.class, MEHatchPartMachine.MANAGED_FIELD_HOLDER); + + protected ExportOnlyAEFluidList aeFluidHandler; + + public CosmicInputHatchPartMachine(IMachineBlockEntity holder, Object... args) { + super(holder, IO.IN, args); + super.circuitSlotEnabled = false; + } + + @Override + public void onMachineRemoved() { + flushInventory(); + } + + @Override + protected NotifiableFluidTank createTank(int initialCapacity, int slots, Object... args) { + this.aeFluidHandler = new ExportOnlyAEFluidList(this, slots); + return aeFluidHandler; + } + + @Override + public ManagedFieldHolder getFieldHolder() { + return MANAGED_FIELD_HOLDER; + } + + ///////////////////////////////// + // ********** Sync ME *********// + ///////////////////////////////// + + @Override + protected void autoIO() { + if (!this.isWorkingEnabled()) return; + if (!this.shouldSyncME()) return; + + if (this.updateMEStatus()) { + this.syncME(); + this.updateTankSubscription(); + } + } + + protected void syncME() { + MEStorage networkInv = this.getMainNode().getGrid().getStorageService().getInventory(); + for (ExportOnlyAEFluidSlot aeTank : this.aeFluidHandler.getInventory()) { + // Try to clear the wrong fluid + GenericStack exceedFluid = aeTank.exceedStack(); + if (exceedFluid != null) { + int total = GTMath.saturatedCast(exceedFluid.amount()); + int inserted = GTMath + .saturatedCast(networkInv.insert(exceedFluid.what(), exceedFluid.amount(), Actionable.MODULATE, + this.actionSource)); + if (inserted > 0) { + aeTank.drain(inserted, IFluidHandler.FluidAction.EXECUTE); + continue; + } else { + aeTank.drain(total, IFluidHandler.FluidAction.EXECUTE); + } + } + // Fill it + GenericStack reqFluid = aeTank.requestStack(); + if (reqFluid != null) { + long extracted = networkInv.extract(reqFluid.what(), reqFluid.amount(), Actionable.MODULATE, + this.actionSource); + if (extracted > 0) { + aeTank.addStack(new GenericStack(reqFluid.what(), extracted)); + } + } + } + } + + protected void flushInventory() { + var grid = getMainNode().getGrid(); + if (grid != null) { + for (var aeSlot : aeFluidHandler.getInventory()) { + GenericStack stock = aeSlot.getStock(); + if (stock != null) { + grid.getStorageService().getInventory().insert(stock.what(), stock.amount(), Actionable.MODULATE, + actionSource); + } + } + } + } + + /////////////////////////////// + // ********** GUI ***********// + /////////////////////////////// + + @Override + public Widget createUIWidget() { + WidgetGroup group = new WidgetGroup(new Position(0, 0)); + // ME Network status + group.addWidget(new LabelWidget(3, 0, () -> this.isOnline ? + "gtceu.gui.me_network.online" : + "gtceu.gui.me_network.offline")); + + // Config slots + group.addWidget(new AEFluidConfigWidget(3, 10, this.aeFluidHandler)); + + return group; + } + + //////////////////////////////// + // ******* Interaction *******// + //////////////////////////////// + + @Override + public final InteractionResult onDataStickShiftUse(Player player, ItemStack dataStick) { + if (!isRemote()) { + CompoundTag tag = new CompoundTag(); + tag.put("MEInputHatch", writeConfigToTag()); + dataStick.setTag(tag); + dataStick.setHoverName(Component.translatable("gtceu.machine.me.fluid_import.data_stick.name")); + player.sendSystemMessage(Component.translatable("gtceu.machine.me.import_copy_settings")); + } + return InteractionResult.SUCCESS; + } + + @Override + public final InteractionResult onDataStickUse(Player player, ItemStack dataStick) { + CompoundTag tag = dataStick.getTag(); + if (tag == null || !tag.contains("MEInputHatch")) { + return InteractionResult.PASS; + } + + if (!isRemote()) { + readConfigFromTag(tag.getCompound("MEInputHatch")); + this.updateTankSubscription(); + player.sendSystemMessage(Component.translatable("gtceu.machine.me.import_paste_settings")); + } + return InteractionResult.sidedSuccess(isRemote()); + } + + //////////////////////////////// + // ****** Configuration ******// + //////////////////////////////// + + protected CompoundTag writeConfigToTag() { + CompoundTag tag = new CompoundTag(); + CompoundTag configStacks = new CompoundTag(); + tag.put("ConfigStacks", configStacks); + for (int i = 0; i < CONFIG_SIZE; i++) { + var slot = this.aeFluidHandler.getInventory()[i]; + GenericStack config = slot.getConfig(); + if (config == null) { + continue; + } + CompoundTag stackTag = GenericStack.writeTag(config); + configStacks.put(Integer.toString(i), stackTag); + } + return tag; + } + + protected void readConfigFromTag(CompoundTag tag) { + if (tag.contains("ConfigStacks")) { + CompoundTag configStacks = tag.getCompound("ConfigStacks"); + for (int i = 0; i < CONFIG_SIZE; i++) { + String key = Integer.toString(i); + if (configStacks.contains(key)) { + CompoundTag configTag = configStacks.getCompound(key); + this.aeFluidHandler.getInventory()[i].setConfig(GenericStack.readTag(configTag)); + } else { + this.aeFluidHandler.getInventory()[i].setConfig(null); + } + } + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/ae2gt/CosmicStockingBusPartMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/ae2gt/CosmicStockingBusPartMachine.java new file mode 100644 index 000000000..3a2937ba1 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/ae2gt/CosmicStockingBusPartMachine.java @@ -0,0 +1,396 @@ +package com.ghostipedia.cosmiccore.common.ae2gt; + +import com.gregtechceu.gtceu.api.gui.fancy.ConfiguratorPanel; +import com.gregtechceu.gtceu.api.gui.fancy.TabsWidget; +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.fancyconfigurator.AutoStockingFancyConfigurator; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.integration.ae2.machine.feature.multiblock.IMEStockingPart; +import com.gregtechceu.gtceu.integration.ae2.slot.ExportOnlyAEItemList; +import com.gregtechceu.gtceu.integration.ae2.slot.ExportOnlyAEItemSlot; +import com.gregtechceu.gtceu.integration.ae2.slot.ExportOnlyAESlot; +import com.gregtechceu.gtceu.integration.ae2.slot.IConfigurableSlotList; + +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; +import com.lowdragmc.lowdraglib.syncdata.annotation.DropSaved; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; + +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.BlockHitResult; + +import appeng.api.config.Actionable; +import appeng.api.networking.IGrid; +import appeng.api.stacks.AEItemKey; +import appeng.api.stacks.AEKey; +import appeng.api.stacks.GenericStack; +import appeng.api.storage.MEStorage; +import it.unimi.dsi.fastutil.objects.Object2LongMap; +import lombok.Getter; +import lombok.Setter; +import org.jetbrains.annotations.Nullable; + +import java.util.Comparator; +import java.util.PriorityQueue; +import java.util.function.Predicate; + +public class CosmicStockingBusPartMachine extends CosmicInputBusPartMachine implements IMEStockingPart { + + protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( + CosmicStockingBusPartMachine.class, CosmicInputBusPartMachine.MANAGED_FIELD_HOLDER); + + @DescSynced + @Persisted + @Getter + private boolean autoPull; + + @Getter + @Setter + @Persisted + @DropSaved + private int minStackSize = 1; + @Getter + @Setter + @Persisted + @DropSaved + private int ticksPerCycle = 40; + + @Setter + private Predicate autoPullTest; + + public CosmicStockingBusPartMachine(IMachineBlockEntity holder, Object... args) { + super(holder, args); + this.autoPullTest = $ -> false; + } + ///////////////////////////////// + // ***** Machine LifeCycle ****// + ///////////////////////////////// + + @Override + public void addedToController(IMultiController controller) { + super.addedToController(controller); + IMEStockingPart.super.addedToController(controller); + } + + @Override + public void removedFromController(IMultiController controller) { + IMEStockingPart.super.removedFromController(controller); + super.removedFromController(controller); + } + + @Override + protected NotifiableItemStackHandler createInventory(Object... args) { + this.aeItemHandler = new CosmicStockingBusPartMachine.ExportOnlyAEStockingItemList(this, CONFIG_SIZE); + return this.aeItemHandler; + } + + @Override + public ManagedFieldHolder getFieldHolder() { + return MANAGED_FIELD_HOLDER; + } + + ///////////////////////////////// + // ********** Sync ME *********// + ///////////////////////////////// + + @Override + public void autoIO() { + super.autoIO(); + if (ticksPerCycle == 0) ticksPerCycle = ConfigHolder.INSTANCE.compat.ae2.updateIntervals; // Emergency Check to + // Avoid Crash loops. + if (getOffsetTimer() % ticksPerCycle == 0) { + if (autoPull) { + refreshList(); + } + syncME(); + } + } + + @Override + protected void syncME() { + // Update the visual display for the fake items. This also is important for the item handler's + // getStackInSlot() method, as it uses the cached items set here. + MEStorage networkInv = this.getMainNode().getGrid().getStorageService().getInventory(); + for (ExportOnlyAEItemSlot slot : this.aeItemHandler.getInventory()) { + var config = slot.getConfig(); + if (config != null) { + // Try to fill the slot + var key = config.what(); + long extracted = networkInv.extract(key, Long.MAX_VALUE, Actionable.SIMULATE, actionSource); + if (extracted >= minStackSize) { + slot.setStock(new GenericStack(key, extracted)); + continue; + } + } + slot.setStock(null); + } + } + + @Override + public void attachSideTabs(TabsWidget sideTabs) { + sideTabs.setMainTab(this); // removes the cover configurator, it's pointless and clashes with layout. + } + + @Override + protected void flushInventory() { + // no-op, nothing to send back to the network + } + + @Override + public void setDistinct(boolean isDistinct) { + super.setDistinct(isDistinct); + if (!isRemote() && !isDistinct) { + // Ensure that our configured items won't match any other buses in the multiblock. + // Needed since we allow duplicates in distinct mode on, but not off + validateConfig(); + } + } + + @Override + public IConfigurableSlotList getSlotList() { + return aeItemHandler; + } + + @Override + public boolean testConfiguredInOtherPart(@Nullable GenericStack config) { + if (config == null) return false; + // In distinct mode, we don't need to check other buses since only one bus can run a recipe at a time. + if (!isFormed() || isDistinct()) return false; + + // Otherwise, we need to test for if the item is configured + // in any stocking bus in the multi (besides ourselves). + for (IMultiController controller : getControllers()) { + for (IMultiPart part : controller.getParts()) { + if (part instanceof CosmicStockingBusPartMachine bus) { + // We don't need to check for ourselves, as this case is handled elsewhere. + if (bus == this || bus.isDistinct()) continue; + if (bus.aeItemHandler.hasStackInConfig(config, false)) { + return true; + } + } + } + } + return false; + } + + @Override + public void setAutoPull(boolean autoPull) { + this.autoPull = autoPull; + if (!isRemote()) { + if (!this.autoPull) { + this.aeItemHandler.clearInventory(0); + } else if (updateMEStatus()) { + this.refreshList(); + updateInventorySubscription(); + } + } + } + + /** + * Refresh the configuration list in auto-pull mode. + * Sets the config to the CONFIG_SIZE items with the highest amount in the ME system. + */ + private void refreshList() { + IGrid grid = this.getMainNode().getGrid(); + if (grid == null) { + aeItemHandler.clearInventory(0); + return; + } + + MEStorage networkStorage = grid.getStorageService().getInventory(); + var counter = networkStorage.getAvailableStacks(); + + // Use a PriorityQueue to sort the stacks on size, take the first CONFIG_SIZE + // biggest stacks. + PriorityQueue> topItems = new PriorityQueue<>( + Comparator.comparingLong(Object2LongMap.Entry::getLongValue)); + + for (Object2LongMap.Entry entry : counter) { + long amount = entry.getLongValue(); + AEKey what = entry.getKey(); + + if (amount <= 0) continue; + if (!(what instanceof AEItemKey itemKey)) continue; + + long request = networkStorage.extract(what, amount, Actionable.SIMULATE, actionSource); + if (request == 0) continue; + + // Ensure that it is valid to configure with this stack + if (autoPullTest != null && !autoPullTest.test(new GenericStack(itemKey, amount))) continue; + if (amount >= minStackSize) { + if (topItems.size() < CONFIG_SIZE) { + topItems.offer(entry); + } else if (amount > topItems.peek().getLongValue()) { + topItems.poll(); + topItems.offer(entry); + } + } + } + + // Now, topItems is a PQ with CONFIG_SIZE highest amount items in the system. + int index; + int itemAmount = topItems.size(); + for (index = 0; index < CONFIG_SIZE; index++) { + if (topItems.isEmpty()) break; + Object2LongMap.Entry entry = topItems.poll(); + + AEKey what = entry.getKey(); + long amount = entry.getLongValue(); + + // If we get here, the item has already been checked by the PQ. + long request = networkStorage.extract(what, amount, Actionable.SIMULATE, actionSource); + + // Since we want our items to be displayed from highest to lowest, but poll() returns + // the lowest first, we fill in the slots starting at itemAmount-1 + var slot = this.aeItemHandler.getInventory()[itemAmount - index - 1]; + slot.setConfig(new GenericStack(what, 1)); + slot.setStock(new GenericStack(what, request)); + } + + aeItemHandler.clearInventory(index); + } + + /////////////////////////////// + // ********** GUI ***********// + /////////////////////////////// + + @Override + public void attachConfigurators(ConfiguratorPanel configuratorPanel) { + IMEStockingPart.super.attachConfigurators(configuratorPanel); + // super.attachConfigurators(configuratorPanel); + configuratorPanel.attachConfigurators(new AutoStockingFancyConfigurator(this)); + } + + @Override + protected InteractionResult onScrewdriverClick(Player playerIn, InteractionHand hand, Direction gridSide, + BlockHitResult hitResult) { + if (!isRemote()) { + setAutoPull(!autoPull); + if (autoPull) { + playerIn.sendSystemMessage( + Component.translatable("gtceu.machine.me.stocking_auto_pull_enabled")); + } else { + playerIn.sendSystemMessage( + Component.translatable("gtceu.machine.me.stocking_auto_pull_disabled")); + } + } + return InteractionResult.sidedSuccess(isRemote()); + } + + //////////////////////////////// + // ****** Configuration ******// + //////////////////////////////// + + @Override + protected CompoundTag writeConfigToTag() { + if (!autoPull) { + CompoundTag tag = super.writeConfigToTag(); + tag.putBoolean("AutoPull", false); + return tag; + } + // if in auto-pull, no need to write actual configured slots, but still need to write the ghost circuit + CompoundTag tag = new CompoundTag(); + tag.putBoolean("AutoPull", true); + return tag; + } + + @Override + protected void readConfigFromTag(CompoundTag tag) { + if (tag.getBoolean("AutoPull")) { + // if being set to auto-pull, no need to read the configured slots + this.setAutoPull(true); + return; + } + // set auto pull first to avoid issues with clearing the config after reading from the data stick + this.setAutoPull(false); + super.readConfigFromTag(tag); + } + + private class ExportOnlyAEStockingItemList extends ExportOnlyAEItemList { + + public ExportOnlyAEStockingItemList(MetaMachine holder, int slots) { + super(holder, slots, CosmicStockingBusPartMachine.ExportOnlyAEStockingItemSlot::new); + } + + @Override + public boolean isAutoPull() { + return autoPull; + } + + @Override + public boolean isStocking() { + return true; + } + + @Override + public boolean hasStackInConfig(GenericStack stack, boolean checkExternal) { + boolean inThisBus = super.hasStackInConfig(stack, false); + if (inThisBus) return true; + if (checkExternal) { + return testConfiguredInOtherPart(stack); + } + return false; + } + } + + private class ExportOnlyAEStockingItemSlot extends ExportOnlyAEItemSlot { + + public ExportOnlyAEStockingItemSlot() { + super(); + } + + public ExportOnlyAEStockingItemSlot(@Nullable GenericStack config, @Nullable GenericStack stock) { + super(config, stock); + } + + @Override + public ItemStack extractItem(int slot, int amount, boolean simulate) { + if (slot == 0 && this.stock != null) { + if (this.config != null) { + // Extract the items from the real net to either validate (simulate) + // or extract (modulate) when this is called + if (!isOnline()) return ItemStack.EMPTY; + MEStorage aeNetwork = getMainNode().getGrid().getStorageService().getInventory(); + + Actionable action = simulate ? Actionable.SIMULATE : Actionable.MODULATE; + var key = config.what(); + long extracted = aeNetwork.extract(key, amount, action, actionSource); + + if (extracted > 0) { + ItemStack resultStack = key instanceof AEItemKey itemKey ? + itemKey.toStack((int) extracted) : ItemStack.EMPTY; + if (!simulate) { + // may as well update the display here + this.stock = ExportOnlyAESlot.copy(stock, stock.amount() - extracted); + if (this.stock.amount() == 0) { + this.stock = null; + } + if (this.onContentsChanged != null) { + this.onContentsChanged.run(); + } + } + return resultStack; + } + } + } + return ItemStack.EMPTY; + } + + @Override + public CosmicStockingBusPartMachine.ExportOnlyAEStockingItemSlot copy() { + return new CosmicStockingBusPartMachine.ExportOnlyAEStockingItemSlot( + this.config == null ? null : copy(this.config), + this.stock == null ? null : copy(this.stock)); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/ae2gt/CosmicStockingHatchPartMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/ae2gt/CosmicStockingHatchPartMachine.java new file mode 100644 index 000000000..f9f13b268 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/ae2gt/CosmicStockingHatchPartMachine.java @@ -0,0 +1,382 @@ +package com.ghostipedia.cosmiccore.common.ae2gt; + +import com.gregtechceu.gtceu.api.gui.fancy.ConfiguratorPanel; +import com.gregtechceu.gtceu.api.gui.fancy.TabsWidget; +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.fancyconfigurator.AutoStockingFancyConfigurator; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour; +import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.integration.ae2.machine.feature.multiblock.IMEStockingPart; +import com.gregtechceu.gtceu.integration.ae2.slot.ExportOnlyAEFluidList; +import com.gregtechceu.gtceu.integration.ae2.slot.ExportOnlyAEFluidSlot; +import com.gregtechceu.gtceu.integration.ae2.slot.ExportOnlyAESlot; +import com.gregtechceu.gtceu.integration.ae2.slot.IConfigurableSlotList; +import com.gregtechceu.gtceu.integration.ae2.utils.AEUtil; + +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; +import com.lowdragmc.lowdraglib.syncdata.annotation.DropSaved; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; + +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraftforge.fluids.FluidStack; + +import appeng.api.config.Actionable; +import appeng.api.networking.IGrid; +import appeng.api.stacks.AEFluidKey; +import appeng.api.stacks.AEKey; +import appeng.api.stacks.GenericStack; +import appeng.api.storage.MEStorage; +import it.unimi.dsi.fastutil.objects.Object2LongMap; +import lombok.Getter; +import lombok.Setter; +import org.jetbrains.annotations.Nullable; + +import java.util.Comparator; +import java.util.PriorityQueue; +import java.util.function.Predicate; + +public class CosmicStockingHatchPartMachine extends CosmicInputHatchPartMachine implements IMEStockingPart { + + protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( + CosmicStockingHatchPartMachine.class, CosmicInputHatchPartMachine.MANAGED_FIELD_HOLDER); + + private static final int CONFIG_SIZE = 1; + + @DescSynced + @Persisted + @Getter + private boolean autoPull; + + @Getter + @Setter + @Persisted + @DropSaved + private int minStackSize = 1; + + @Getter + @Setter + @Persisted + @DropSaved + private int ticksPerCycle = 40; + + @Setter + private Predicate autoPullTest; + + public CosmicStockingHatchPartMachine(IMachineBlockEntity holder, Object... args) { + super(holder, args); + this.autoPullTest = $ -> false; + } + + @Override + public void addedToController(IMultiController controller) { + super.addedToController(controller); + IMEStockingPart.super.addedToController(controller); + } + + @Override + public void removedFromController(IMultiController controller) { + IMEStockingPart.super.removedFromController(controller); + super.removedFromController(controller); + } + + @Override + protected NotifiableFluidTank createTank(int initialCapacity, int slots, Object... args) { + this.aeFluidHandler = new CosmicStockingHatchPartMachine.ExportOnlyAEStockingFluidList(this, CONFIG_SIZE); + return this.aeFluidHandler; + } + + @Override + public ManagedFieldHolder getFieldHolder() { + return MANAGED_FIELD_HOLDER; + } + + ///////////////////////////////// + // ********** Sync ME *********// + ///////////////////////////////// + + @Override + public void autoIO() { + super.autoIO(); + if (ticksPerCycle == 0) ticksPerCycle = ConfigHolder.INSTANCE.compat.ae2.updateIntervals; // Emergency Check to + // Avoid Crash loops. + if (getOffsetTimer() % ticksPerCycle == 0) { + if (autoPull) { + refreshList(); + } + syncME(); + } + } + + @Override + protected void syncME() { + MEStorage networkInv = this.getMainNode().getGrid().getStorageService().getInventory(); + for (ExportOnlyAEFluidSlot slot : aeFluidHandler.getInventory()) { + var config = slot.getConfig(); + if (config != null) { + // Try to fill the slot + var key = config.what(); + long extracted = networkInv.extract(key, Long.MAX_VALUE, Actionable.SIMULATE, actionSource); + if (extracted >= minStackSize) { + slot.setStock(new GenericStack(key, extracted)); + continue; + } + } + slot.setStock(null); + } + } + + @Override + public void attachSideTabs(TabsWidget sideTabs) { + sideTabs.setMainTab(this); // removes the cover configurator, it's pointless and clashes with layout. + } + + @Override + protected void flushInventory() { + // no-op, nothing to send back to the network + } + + @Override + public IConfigurableSlotList getSlotList() { + return aeFluidHandler; + } + + @Override + public boolean testConfiguredInOtherPart(@Nullable GenericStack config) { + if (config == null) return false; + if (!isFormed()) return false; + + for (IMultiController controller : getControllers()) { + for (IMultiPart part : controller.getParts()) { + if (part instanceof CosmicStockingHatchPartMachine hatch) { + if (hatch == this) continue; + if (hatch.aeFluidHandler.hasStackInConfig(config, false)) { + return true; + } + } + } + } + return false; + } + + @Override + public void setAutoPull(boolean autoPull) { + this.autoPull = autoPull; + if (!isRemote()) { + if (!this.autoPull) { + this.aeFluidHandler.clearInventory(0); + } else if (updateMEStatus()) { + this.refreshList(); + updateTankSubscription(); + } + } + } + + private void refreshList() { + IGrid grid = this.getMainNode().getGrid(); + if (grid == null) { + aeFluidHandler.clearInventory(0); + return; + } + + MEStorage networkStorage = grid.getStorageService().getInventory(); + var counter = networkStorage.getAvailableStacks(); + + // Use a PriorityQueue to sort the stacks on size, take the first CONFIG_SIZE + // biggest stacks. + PriorityQueue> topFluids = new PriorityQueue<>( + Comparator.comparingLong(Object2LongMap.Entry::getLongValue)); + + for (Object2LongMap.Entry entry : counter) { + long amount = entry.getLongValue(); + AEKey what = entry.getKey(); + + if (amount <= 0) continue; + if (!(what instanceof AEFluidKey fluidKey)) continue; + + long request = networkStorage.extract(what, amount, Actionable.SIMULATE, actionSource); + if (request == 0) continue; + + // Ensure that it is valid to configure with this stack + if (autoPullTest != null && !autoPullTest.test(new GenericStack(fluidKey, amount))) continue; + if (amount >= minStackSize) { + if (topFluids.size() < CONFIG_SIZE) { + topFluids.offer(entry); + } else if (amount > topFluids.peek().getLongValue()) { + topFluids.poll(); + topFluids.offer(entry); + } + } + } + + // Now, topFluids is a PQ with CONFIG_SIZE highest amount fluids in the system. + int index; + int fluidAmount = topFluids.size(); + for (index = 0; index < CONFIG_SIZE; index++) { + if (topFluids.isEmpty()) break; + Object2LongMap.Entry entry = topFluids.poll(); + AEKey what = entry.getKey(); + long amount = entry.getLongValue(); + + // If we get here, the fluid has already been checked by the PQ. + long request = networkStorage.extract(what, amount, Actionable.SIMULATE, actionSource); + + // Since we want our fluids to be displayed from highest to lowest, but poll() returns + // the lowest first, we fill in the slots starting at fluidAmount-1 + var slot = this.aeFluidHandler.getInventory()[fluidAmount - index - 1]; + slot.setConfig(new GenericStack(what, 1)); + slot.setStock(new GenericStack(what, request)); + } + + aeFluidHandler.clearInventory(index); + } + + /////////////////////////////// + // ********** GUI ***********// + /////////////////////////////// + + @Override + public void attachConfigurators(ConfiguratorPanel configuratorPanel) { + IMEStockingPart.super.attachConfigurators(configuratorPanel); + // super.attachConfigurators(configuratorPanel); + configuratorPanel.attachConfigurators(new AutoStockingFancyConfigurator(this)); + } + + //////////////////////////////// + // ******* Interaction *******// + //////////////////////////////// + + @Override + protected InteractionResult onScrewdriverClick(Player playerIn, InteractionHand hand, Direction gridSide, + BlockHitResult hitResult) { + if (!isRemote()) { + setAutoPull(!autoPull); + if (autoPull) { + playerIn.sendSystemMessage( + Component.translatable("gtceu.machine.me.stocking_auto_pull_enabled")); + } else { + playerIn.sendSystemMessage( + Component.translatable("gtceu.machine.me.stocking_auto_pull_disabled")); + } + } + return InteractionResult.sidedSuccess(isRemote()); + } + + //////////////////////////////// + // ****** Configuration ******// + //////////////////////////////// + + @Override + protected CompoundTag writeConfigToTag() { + if (!autoPull) { + CompoundTag tag = super.writeConfigToTag(); + tag.putBoolean("AutoPull", false); + return tag; + } + // if in auto-pull, no need to write actual configured slots, but still need to write the ghost circuit + CompoundTag tag = new CompoundTag(); + tag.putBoolean("AutoPull", true); + tag.putByte("GhostCircuit", + (byte) IntCircuitBehaviour.getCircuitConfiguration(circuitInventory.getStackInSlot(0))); + return tag; + } + + @Override + protected void readConfigFromTag(CompoundTag tag) { + if (tag.getBoolean("AutoPull")) { + // if being set to auto-pull, no need to read the configured slots + this.setAutoPull(true); + circuitInventory.setStackInSlot(0, IntCircuitBehaviour.stack(tag.getByte("GhostCircuit"))); + return; + } + // set auto pull first to avoid issues with clearing the config after reading from the data stick + this.setAutoPull(false); + super.readConfigFromTag(tag); + } + + private class ExportOnlyAEStockingFluidList extends ExportOnlyAEFluidList { + + public ExportOnlyAEStockingFluidList(MetaMachine holder, int slots) { + super(holder, slots, CosmicStockingHatchPartMachine.ExportOnlyAEStockingFluidSlot::new); + } + + @Override + public boolean isAutoPull() { + return autoPull; + } + + @Override + public boolean isStocking() { + return true; + } + + @Override + public boolean hasStackInConfig(GenericStack stack, boolean checkExternal) { + boolean inThisHatch = super.hasStackInConfig(stack, false); + if (inThisHatch) return true; + if (checkExternal) { + return testConfiguredInOtherPart(stack); + } + return false; + } + } + + private class ExportOnlyAEStockingFluidSlot extends ExportOnlyAEFluidSlot { + + public ExportOnlyAEStockingFluidSlot() { + super(); + } + + public ExportOnlyAEStockingFluidSlot(@Nullable GenericStack config, @Nullable GenericStack stock) { + super(config, stock); + } + + @Override + public ExportOnlyAEFluidSlot copy() { + return new CosmicStockingHatchPartMachine.ExportOnlyAEStockingFluidSlot( + this.config == null ? null : copy(this.config), + this.stock == null ? null : copy(this.stock)); + } + + @Override + public FluidStack drain(int maxDrain, FluidAction action) { + if (this.stock != null && this.config != null) { + // Extract the items from the real net to either validate (simulate) + // or extract (modulate) when this is called + if (!isOnline()) return FluidStack.EMPTY; + MEStorage aeNetwork = getMainNode().getGrid().getStorageService().getInventory(); + + Actionable actionable = action.simulate() ? Actionable.SIMULATE : Actionable.MODULATE; + var key = config.what(); + long extracted = aeNetwork.extract(key, maxDrain, actionable, actionSource); + + if (extracted > 0) { + FluidStack resultStack = key instanceof AEFluidKey fluidKey ? + AEUtil.toFluidStack(fluidKey, extracted) : FluidStack.EMPTY; + if (action.execute()) { + // may as well update the display here + this.stock = ExportOnlyAESlot.copy(stock, stock.amount() - extracted); + if (this.stock.amount() == 0) { + this.stock = null; + } + if (this.onContentsChanged != null) { + this.onContentsChanged.run(); + } + } + return resultStack; + } + } + return FluidStack.EMPTY; + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/airControl/IOxygen.java b/src/main/java/com/ghostipedia/cosmiccore/common/airControl/IOxygen.java new file mode 100644 index 000000000..a4c72fe69 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/airControl/IOxygen.java @@ -0,0 +1,19 @@ +package com.ghostipedia.cosmiccore.common.airControl; + +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.Level; + +public interface IOxygen { + + long getOxygenTicks(ResourceKey dimension); + + void setOxygenTicks(ResourceKey dimension, long ticks); + + boolean isConsuming(ResourceKey dimension); + + void setConsuming(ResourceKey dimension, boolean consuming); + + double getRegenBuffer(ResourceKey dimension); + + void setRegenBuffer(ResourceKey dimension, double buffer); +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/airControl/IOxygenProvider.java b/src/main/java/com/ghostipedia/cosmiccore/common/airControl/IOxygenProvider.java new file mode 100644 index 000000000..de3713313 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/airControl/IOxygenProvider.java @@ -0,0 +1,46 @@ +package com.ghostipedia.cosmiccore.common.airControl; + +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; + +/** + * Interface for items that can provide oxygen to the CosmicCore oxygen system. + * Implemented by space suit chestplates, oxygen tanks, etc. + */ +public interface IOxygenProvider { + + /** + * Check if this item can currently provide oxygen. + * + * @param stack The item stack + * @param player The player wearing/holding the item + * @return true if oxygen is available + */ + boolean hasOxygen(ItemStack stack, Player player); + + /** + * Consume oxygen from this provider. + * + * @param stack The item stack + * @param player The player + * @param amount Amount to consume (in millibuckets for fluid tanks, or ticks for other systems) + * @return Amount actually consumed + */ + long consumeOxygen(ItemStack stack, Player player, long amount); + + /** + * Get current oxygen amount. + * + * @param stack The item stack + * @return Current oxygen in millibuckets (or equivalent units) + */ + long getOxygenAmount(ItemStack stack); + + /** + * Get maximum oxygen capacity. + * + * @param stack The item stack + * @return Maximum capacity in millibuckets (or equivalent units) + */ + long getMaxOxygenCapacity(ItemStack stack); +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/airControl/IOxygenSupplyItem.java b/src/main/java/com/ghostipedia/cosmiccore/common/airControl/IOxygenSupplyItem.java new file mode 100644 index 000000000..89ae160a1 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/airControl/IOxygenSupplyItem.java @@ -0,0 +1,13 @@ +package com.ghostipedia.cosmiccore.common.airControl; + +import net.minecraft.world.item.ItemStack; + +public interface IOxygenSupplyItem { + + /** + * Try to provide up to requestTicks of oxygen from this stack. + * + * @return ticks actually provided (0..requestTicks) + */ + int drainOxygenTicks(ItemStack stack, int requestTicks); +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/airControl/OxygenBudget.java b/src/main/java/com/ghostipedia/cosmiccore/common/airControl/OxygenBudget.java new file mode 100644 index 000000000..6573d19d3 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/airControl/OxygenBudget.java @@ -0,0 +1,82 @@ +package com.ghostipedia.cosmiccore.common.airControl; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.Level; + +import java.util.HashMap; +import java.util.Map; + +public class OxygenBudget implements IOxygen { + + private final Map oxygenTicksByDimension = new HashMap<>(); + private final Map consumingByDimension = new HashMap<>(); + private final Map regenBufferByDimension = new HashMap<>(); + + @Override + public long getOxygenTicks(ResourceKey dimension) { + return oxygenTicksByDimension.getOrDefault(dimension.location(), -1L); + } + + @Override + public void setOxygenTicks(ResourceKey dimension, long ticks) { + oxygenTicksByDimension.put(dimension.location(), ticks); + } + + @Override + public boolean isConsuming(ResourceKey dimension) { + return consumingByDimension.getOrDefault(dimension.location(), false); + } + + @Override + public void setConsuming(ResourceKey dimension, boolean consuming) { + consumingByDimension.put(dimension.location(), consuming); + } + + @Override + public double getRegenBuffer(ResourceKey dimension) { + return regenBufferByDimension.getOrDefault(dimension.location(), 0.0); + } + + @Override + public void setRegenBuffer(ResourceKey dimension, double buffer) { + regenBufferByDimension.put(dimension.location(), buffer); + } + + // ---- NBT persistence ---- + + public CompoundTag saveTag() { + CompoundTag root = new CompoundTag(); + ListTag list = new ListTag(); + + for (var entry : oxygenTicksByDimension.entrySet()) { + ResourceLocation dim = entry.getKey(); + CompoundTag tag = new CompoundTag(); + tag.putString("dimension", dim.toString()); + tag.putLong("oxygenTicks", entry.getValue()); + tag.putBoolean("consuming", consumingByDimension.getOrDefault(dim, false)); + tag.putDouble("regenBuffer", regenBufferByDimension.getOrDefault(dim, 0.0)); + list.add(tag); + } + root.put("entries", list); + return root; + } + + public void loadTag(CompoundTag root) { + oxygenTicksByDimension.clear(); + consumingByDimension.clear(); + regenBufferByDimension.clear(); + + ListTag list = root.getList("entries", Tag.TAG_COMPOUND); + for (Tag element : list) { + CompoundTag tag = (CompoundTag) element; + ResourceLocation dim = new ResourceLocation(tag.getString("dimension")); + oxygenTicksByDimension.put(dim, tag.getLong("oxygenTicks")); + consumingByDimension.put(dim, tag.getBoolean("consuming")); + regenBufferByDimension.put(dim, tag.getDouble("regenBuffer")); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/airControl/OxygenBudgetCap.java b/src/main/java/com/ghostipedia/cosmiccore/common/airControl/OxygenBudgetCap.java new file mode 100644 index 000000000..bd9ae1fa6 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/airControl/OxygenBudgetCap.java @@ -0,0 +1,66 @@ +package com.ghostipedia.cosmiccore.common.airControl; + +import com.ghostipedia.cosmiccore.CosmicCore; + +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.entity.Entity; +import net.minecraftforge.common.capabilities.*; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.event.AttachCapabilitiesEvent; +import net.minecraftforge.event.entity.player.PlayerEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; + +import javax.annotation.Nullable; + +@Mod.EventBusSubscriber(modid = CosmicCore.MOD_ID) +public class OxygenBudgetCap { + + private OxygenBudgetCap() {} + + public static final Capability CAP = CapabilityManager.get(new CapabilityToken<>() {}); + + public static class Provider implements ICapabilityProvider, ICapabilitySerializable { + + private final OxygenBudget impl = new OxygenBudget(); + private final LazyOptional opt = LazyOptional.of(() -> impl); + + @Override + public LazyOptional getCapability(Capability cap, @Nullable Direction side) { + return cap == CAP ? opt.cast() : LazyOptional.empty(); + } + + @Override + public CompoundTag serializeNBT() { + return impl.saveTag(); + } + + @Override + public void deserializeNBT(CompoundTag nbt) { + impl.loadTag(nbt); + } + } + + @SubscribeEvent + public static void registerCaps(RegisterCapabilitiesEvent event) { + event.register(IOxygen.class); + } + + @SubscribeEvent + public static void attach(AttachCapabilitiesEvent event) { + if (event.getObject() instanceof net.minecraft.world.entity.player.Player) + event.addCapability(CosmicCore.id("oxygen"), new Provider()); + } + + @SubscribeEvent + public static void clone(PlayerEvent.Clone event) { + event.getOriginal().reviveCaps(); + event.getOriginal().getCapability(CAP).ifPresent(old -> event.getEntity().getCapability(CAP).ifPresent(now -> { + if (now instanceof OxygenBudget newCap && old instanceof OxygenBudget oldCap) { + newCap.loadTag(oldCap.saveTag()); + } + })); + event.getOriginal().invalidateCaps(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/airControl/OxygenConfig.java b/src/main/java/com/ghostipedia/cosmiccore/common/airControl/OxygenConfig.java new file mode 100644 index 000000000..9215ac39f --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/airControl/OxygenConfig.java @@ -0,0 +1,66 @@ +package com.ghostipedia.cosmiccore.common.airControl; + +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.DepthsBargain; + +import net.minecraft.world.entity.player.Player; + +/** + * Configuration constants for the oxygen system. + */ +public final class OxygenConfig { + + private OxygenConfig() {} + + // ------------------------------------------------------------------------- + // Oxygen Budget + // ------------------------------------------------------------------------- + + /** Base maximum oxygen capacity in ticks (90 seconds) */ + public static final long MAX_OXYGEN_TICKS = 20L * 90; + + /** + * Get the effective max oxygen capacity for a player. + * This accounts for bargains that modify capacity (e.g., Depths bargain). + */ + public static long getMaxOxygenTicks(Player player) { + float multiplier = DepthsBargain.getCapacityMultiplier(player); + return (long) (MAX_OXYGEN_TICKS * multiplier); + } + + /** Seconds remaining at which to show warnings */ + public static final int[] WARNING_SECONDS = { 60, 30, 15, 10, 5 }; + + // ------------------------------------------------------------------------- + // Tank Behavior + // ------------------------------------------------------------------------- + + /** Extra ticks tanks can top-up per game tick when protecting player */ + public static final int TANK_TOPUP_TICKS_PER_TICK = 2; + + /** How many oxygen ticks per mB consumed from space suits (higher = suits last longer) */ + public static final int SPACE_SUIT_TICKS_PER_MB = 5; + + // ------------------------------------------------------------------------- + // HUD Sync + // ------------------------------------------------------------------------- + + /** How often to sync oxygen HUD to client (in ticks) */ + public static final int HUD_SYNC_INTERVAL = 10; + + // ------------------------------------------------------------------------- + // Damage + // ------------------------------------------------------------------------- + + /** Interval between suffocation damage ticks */ + public static final int SUFFOCATION_DAMAGE_INTERVAL = 20; + + // ------------------------------------------------------------------------- + // Rebreather Behavior + // ------------------------------------------------------------------------- + + /** Drain reduction multiplier for simple rebreather in THIN air (0.5 = half drain) */ + public static final double SIMPLE_REBREATHER_DRAIN_MULT = 0.5; + + /** Drain reduction multiplier for pressurized rebreather (0.25 = quarter drain) */ + public static final double PRESSURIZED_REBREATHER_DRAIN_MULT = 0.25; +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/airControl/OxygenItemCap.java b/src/main/java/com/ghostipedia/cosmiccore/common/airControl/OxygenItemCap.java new file mode 100644 index 000000000..6f2dc0a4f --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/airControl/OxygenItemCap.java @@ -0,0 +1,19 @@ +package com.ghostipedia.cosmiccore.common.airControl; + +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.CapabilityManager; +import net.minecraftforge.common.capabilities.CapabilityToken; +import net.minecraftforge.common.capabilities.RegisterCapabilitiesEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; + +public class OxygenItemCap { + + private OxygenItemCap() {} + + public static final Capability OXYGEN_SUPPLY = CapabilityManager.get(new CapabilityToken<>() {}); + + @SubscribeEvent + public static void onRegisterCaps(RegisterCapabilitiesEvent event) { + event.register(IOxygenSupplyItem.class); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/airControl/OxygenLogic.java b/src/main/java/com/ghostipedia/cosmiccore/common/airControl/OxygenLogic.java new file mode 100644 index 000000000..47489cd5f --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/airControl/OxygenLogic.java @@ -0,0 +1,367 @@ +package com.ghostipedia.cosmiccore.common.airControl; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.item.armor.SpaceArmorComponentItem; +import com.ghostipedia.cosmiccore.common.airControl.RebreatherHelper.RebreatherType; +import com.ghostipedia.cosmiccore.common.network.CCoreNetwork; +import com.ghostipedia.cosmiccore.common.network.packet.OxygenWarnPacket; +import com.ghostipedia.cosmiccore.common.network.packet.SyncOxygenBarPacket; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.DepthsBargain; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.event.entity.player.PlayerEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; + +import earth.terrarium.adastra.common.items.armor.SpaceSuitItem; +import top.theillusivec4.curios.api.CuriosApi; +import top.theillusivec4.curios.api.type.inventory.IDynamicStackHandler; + +import static com.ghostipedia.cosmiccore.common.airControl.OxygenConfig.*; +import static com.ghostipedia.cosmiccore.common.airControl.OxygenItemCap.OXYGEN_SUPPLY; + +@Mod.EventBusSubscriber(modid = CosmicCore.MOD_ID) +public final class OxygenLogic { + + private OxygenLogic() {} + + // Track the oxygen value at last HUD sync to calculate accurate rate (per-player) + private static final java.util.Map lastSyncOxygenValue = new java.util.concurrent.ConcurrentHashMap<>(); + private static final java.util.Map lastSyncGameTime = new java.util.concurrent.ConcurrentHashMap<>(); + + @SubscribeEvent + public static void onPlayerTick(TickEvent.PlayerTickEvent event) { + if (event.phase != TickEvent.Phase.END || event.player.level().isClientSide) return; + + ServerPlayer player = (ServerPlayer) event.player; + + // Skip oxygen logic for creative/spectator players + if (player.isCreative() || player.isSpectator()) { + // Send hide packet if needed + if ((player.serverLevel().getGameTime() % HUD_SYNC_INTERVAL) == 0) { + long playerMaxOxygen = getMaxOxygenTicks(player); + CCoreNetwork.sendToPlayer(player, + new SyncOxygenBarPacket(playerMaxOxygen, playerMaxOxygen, false, 0.0)); + } + return; + } + + ServerLevel level = player.serverLevel(); + + player.getCapability(OxygenBudgetCap.CAP).ifPresent(cap -> { + // Get player-specific max capacity (may be modified by bargains) + long playerMaxOxygen = getMaxOxygenTicks(player); + + // Initialize if needed + if (cap.getOxygenTicks(level.dimension()) < 0) { + cap.setOxygenTicks(level.dimension(), playerMaxOxygen); + cap.setRegenBuffer(level.dimension(), 0.0); + } + + // Get player's Y and determine air quality + int yValue = player.blockPosition().getY(); + OxygenRules.AirRanges range = OxygenRules.getRanges(level.dimension(), yValue); + + OxygenRules.AirQuality quality; + OxygenRules.Rates rates; + + if (range == null) { + quality = OxygenRules.AirQuality.SAFE; + rates = OxygenRules.QUALITY_RATES.get(quality).copy(); + } else { + quality = range.quality; + rates = range.airRangeRates(); + } + + // Check if player is in a fluid (eyes submerged) + BlockPos eyePos = BlockPos.containing(player.getX(), player.getEyeY(), player.getZ()); + boolean eyesInFluid = !level.getFluidState(eyePos).isEmpty(); + if (eyesInFluid) { + OxygenRules.Rates thinAir = OxygenRules.QUALITY_RATES.get(OxygenRules.AirQuality.THIN).copy(); + rates.oxygenDrainPerTick = Math.max(rates.oxygenDrainPerTick, thinAir.oxygenDrainPerTick); + rates.oxygenRecoveryPerTick = 0.0; // No passive regen while submerged + rates.suffocationDamage = Math.max(rates.suffocationDamage, 2.0f); + quality = OxygenRules.AirQuality.THIN; + } + + long current = cap.getOxygenTicks(level.dimension()); + cap.setConsuming(level.dimension(), rates.oxygenDrainPerTick > 0); + + if (rates.oxygenDrainPerTick > 0) { + // Check for rebreather equipment and apply drain modifiers + RebreatherType rebreather = RebreatherHelper.getEquippedRebreather(player); + double drainMult = 1.0; + + // Apply rebreather effects based on air quality + if (quality == OxygenRules.AirQuality.THIN) { + // Both rebreathers work in THIN air + if (rebreather == RebreatherType.PRESSURIZED) { + drainMult = PRESSURIZED_REBREATHER_DRAIN_MULT; + } else if (rebreather == RebreatherType.SIMPLE) { + drainMult = SIMPLE_REBREATHER_DRAIN_MULT; + } + } else if (quality == OxygenRules.AirQuality.NO_AIR) { + // Only pressurized rebreather works in NO_AIR + if (rebreather == RebreatherType.PRESSURIZED) { + drainMult = PRESSURIZED_REBREATHER_DRAIN_MULT; + } + } + // TOXIC and ABYSS are not affected by rebreathers + + // Apply multiplier to drain rate using fractional accumulation + // This ensures rebreathers actually reduce effective drain (e.g., 0.5x means drain every other tick) + double baseDrain = rates.oxygenDrainPerTick; + double fractionalDrain = baseDrain * drainMult; + + // Use the regen buffer to accumulate fractional drain (stored as negative when draining) + double buffer = cap.getRegenBuffer(level.dimension()); + // If buffer was positive (from regen), reset it since we're now draining + if (buffer > 0) buffer = 0; + // Buffer is stored as negative during drain, so negate to get positive accumulator + double drainAccum = -buffer + fractionalDrain; + int drain = (int) drainAccum; // Integer part is actual drain this tick + double remainder = drainAccum - drain; // Fractional part carries over + cap.setRegenBuffer(level.dimension(), -remainder); // Store negative to indicate drain mode + + // Tanks can only be used with pressurized rebreather + int providedByTanks = 0; + if (rebreather == RebreatherType.PRESSURIZED) { + providedByTanks = drainFromCarriedTanks(player, drain); + } + int cover = Math.min(providedByTanks, drain); + int remainingDrain = Math.max(0, drain - cover); + + long next = current - remainingDrain; + next = Math.max(0, Math.min(playerMaxOxygen, next)); + + cap.setOxygenTicks(level.dimension(), next); + + // Warnings & damage + if (next % 20 == 0) { + int sec = (int) (next / 20); + for (int w : WARNING_SECONDS) { + if (sec == w) { + CCoreNetwork.sendToPlayer(player, new OxygenWarnPacket("cosmiccore.oxygen.warn", w)); + break; + } + } + } + if (next <= 0 && rates.suffocationDamage > 0f && + (level.getGameTime() % SUFFOCATION_DAMAGE_INTERVAL) == 0) { + // Check for Depths bargain - instant death instead of gradual damage + if (DepthsBargain.shouldInstantKillOnSuffocation(player)) { + DepthsBargain.executeInstantSuffocation(player); + } else { + player.hurt(player.damageSources().drown(), rates.suffocationDamage); + } + } + + } else if (rates.oxygenRecoveryPerTick > 0 && current < playerMaxOxygen) { + // Passive recovery in safe air + double buffer = cap.getRegenBuffer(level.dimension()); + // If buffer was negative (from drain mode), reset it since we're now recovering + if (buffer < 0) buffer = 0; + buffer += (rates.oxygenRecoveryPerTick / 20.0); + long gain = (long) (buffer * 20.0); + double rem = buffer - (gain / 20.0); + + if (gain > 0) { + long next = Math.min(playerMaxOxygen, current + gain); + cap.setOxygenTicks(level.dimension(), next); + } + cap.setRegenBuffer(level.dimension(), rem); + } + + // HUD sync - calculate rate based on change since last sync + if ((level.getGameTime() % HUD_SYNC_INTERVAL) == 0) { + long remaining = cap.getOxygenTicks(level.dimension()); + boolean show = (quality != OxygenRules.AirQuality.SAFE) || remaining < playerMaxOxygen; + + // Calculate rate based on actual change over the sync interval + java.util.UUID playerId = player.getUUID(); + double ratePerSecond = 0.0; + long currentGameTime = level.getGameTime(); + Long prevOxygen = lastSyncOxygenValue.get(playerId); + Long prevTime = lastSyncGameTime.get(playerId); + if (prevOxygen != null && prevTime != null) { + long ticksElapsed = currentGameTime - prevTime; + if (ticksElapsed > 0) { + long oxygenChange = remaining - prevOxygen; + // Convert to per-second rate: (change / ticks) * 20 ticks/second + ratePerSecond = (oxygenChange * 20.0) / ticksElapsed; + } + } + + // Update tracking for next sync + lastSyncOxygenValue.put(playerId, remaining); + lastSyncGameTime.put(playerId, currentGameTime); + + CCoreNetwork.sendToPlayer(player, + new SyncOxygenBarPacket(remaining, playerMaxOxygen, show, ratePerSecond)); + } + }); + } + + @SubscribeEvent + public static void onLogin(PlayerEvent.PlayerLoggedInEvent event) { + if (event.getEntity().level().isClientSide) return; + + ServerPlayer player = (ServerPlayer) event.getEntity(); + ServerLevel level = player.serverLevel(); + + // Reset rate tracking for fresh rate calculation + java.util.UUID playerId = player.getUUID(); + lastSyncOxygenValue.remove(playerId); + lastSyncGameTime.remove(playerId); + + player.getCapability(OxygenBudgetCap.CAP).ifPresent(cap -> { + long playerMaxOxygen = getMaxOxygenTicks(player); + if (cap.getOxygenTicks(level.dimension()) < 0) { + cap.setOxygenTicks(level.dimension(), playerMaxOxygen); + cap.setRegenBuffer(level.dimension(), 0.0); + } + long remaining = cap.getOxygenTicks(level.dimension()); + boolean show = remaining < playerMaxOxygen; + CCoreNetwork.sendToPlayer(player, new SyncOxygenBarPacket(remaining, playerMaxOxygen, show, 0.0)); + }); + } + + @SubscribeEvent + public static void onLogout(PlayerEvent.PlayerLoggedOutEvent event) { + // Clean up tracking maps to prevent memory leaks + java.util.UUID playerId = event.getEntity().getUUID(); + lastSyncOxygenValue.remove(playerId); + lastSyncGameTime.remove(playerId); + } + + @SubscribeEvent + public static void onRespawn(PlayerEvent.PlayerRespawnEvent event) { + if (event.getEntity().level().isClientSide) return; + + ServerPlayer player = (ServerPlayer) event.getEntity(); + ServerLevel level = player.serverLevel(); + + player.getCapability(OxygenBudgetCap.CAP).ifPresent(cap -> { + long playerMaxOxygen = getMaxOxygenTicks(player); + cap.setOxygenTicks(level.dimension(), playerMaxOxygen); + cap.setRegenBuffer(level.dimension(), 0.0); + cap.setConsuming(level.dimension(), false); + CCoreNetwork.sendToPlayer(player, new SyncOxygenBarPacket(playerMaxOxygen, playerMaxOxygen, false, 0.0)); + }); + } + + // --- Oxygen provider draining --- + + /** + * Drain oxygen from all available sources. + * Priority: Space suit chestplate > Ad Astra suit > Curios back slot + * Note: Tanks in inventory do NOT work - must be equipped in Curios back slot + */ + private static int drainFromCarriedTanks(ServerPlayer player, int requestTicks) { + if (requestTicks <= 0) return 0; + + int remaining = requestTicks; + + // 1. Check CosmicCore space suit chestplate first (highest priority) + remaining = drainFromSpaceSuit(player, remaining); + if (remaining <= 0) return requestTicks; + + // 2. Check vanilla Ad Astra space suit + remaining = drainFromAdAstraSuit(player, remaining); + if (remaining <= 0) return requestTicks; + + // 3. Check Curios back slot (oxygen tanks worn on back) + // Tanks MUST be equipped in Curios back slot to work - inventory tanks are ignored + remaining = drainFromCuriosBackSlot(player, remaining); + + return requestTicks - remaining; + } + + /** + * Drain from oxygen tanks in Curios back slot. + */ + private static int drainFromCuriosBackSlot(ServerPlayer player, int requestTicks) { + if (requestTicks <= 0) return 0; + + int remaining = requestTicks; + + var curiosCap = CuriosApi.getCuriosInventory(player); + if (curiosCap.isPresent()) { + var curiosHandler = curiosCap.resolve().get(); + var backHandler = curiosHandler.getStacksHandler("back"); + if (backHandler.isPresent()) { + IDynamicStackHandler stacks = backHandler.get().getStacks(); + for (int i = 0; i < stacks.getSlots() && remaining > 0; i++) { + ItemStack stack = stacks.getStackInSlot(i); + remaining = drainFromStack(stack, remaining); + } + } + } + + return remaining; + } + + /** + * Drain from CosmicCore SpaceArmorComponentItem (nano/quantum/sanguine suits). + * Consumes 1 mB every SPACE_SUIT_TICKS_PER_MB game ticks to slow drain rate. + */ + private static int drainFromSpaceSuit(ServerPlayer player, int requestTicks) { + if (requestTicks <= 0) return 0; + + ItemStack chestStack = player.getItemBySlot(EquipmentSlot.CHEST); + if (chestStack.isEmpty()) return requestTicks; + if (!(chestStack.getItem() instanceof SpaceArmorComponentItem suit)) return requestTicks; + + if (!suit.hasOxygen(player)) return requestTicks; + + // Only drain 1 mB every SPACE_SUIT_TICKS_PER_MB game ticks + // This makes suits last much longer than basic tanks + if ((player.serverLevel().getGameTime() % SPACE_SUIT_TICKS_PER_MB) == 0) { + suit.consumeOxygen(chestStack, 1); + } + + // Return 0 remaining if we have oxygen (suit provides full coverage) + return suit.hasOxygen(player) ? 0 : requestTicks; + } + + /** + * Drain from vanilla Ad Astra SpaceSuitItem. + * Consumes 1 mB every SPACE_SUIT_TICKS_PER_MB game ticks to slow drain rate. + */ + private static int drainFromAdAstraSuit(ServerPlayer player, int requestTicks) { + if (requestTicks <= 0) return 0; + + ItemStack chestStack = player.getItemBySlot(EquipmentSlot.CHEST); + if (chestStack.isEmpty()) return requestTicks; + if (!(chestStack.getItem() instanceof SpaceSuitItem suit)) return requestTicks; + + if (!SpaceSuitItem.hasOxygen(player)) return requestTicks; + + // Only drain 1 mB every SPACE_SUIT_TICKS_PER_MB game ticks + if ((player.serverLevel().getGameTime() % SPACE_SUIT_TICKS_PER_MB) == 0) { + suit.consumeOxygen(chestStack, 1); + } + + // Return 0 remaining if suit still has oxygen + return SpaceSuitItem.hasOxygen(player) ? 0 : requestTicks; + } + + /** + * Drain from GTCEu-style oxygen supply tanks via capability. + */ + private static int drainFromStack(ItemStack stack, int requestTicks) { + if (stack.isEmpty() || requestTicks <= 0) return requestTicks; + + return stack.getCapability(OXYGEN_SUPPLY) + .map(provider -> { + int got = Math.max(0, provider.drainOxygenTicks(stack, requestTicks)); + return Math.max(0, requestTicks - got); + }) + .orElse(requestTicks); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/airControl/OxygenRules.java b/src/main/java/com/ghostipedia/cosmiccore/common/airControl/OxygenRules.java new file mode 100644 index 000000000..29572fc0f --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/airControl/OxygenRules.java @@ -0,0 +1,180 @@ +package com.ghostipedia.cosmiccore.common.airControl; + +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.Level; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +public final class OxygenRules { + + private OxygenRules() {} + + public enum AirQuality { + SAFE, + THIN, + TOXIC, + ABYSS, + NO_AIR + } + + public static final class Rates { + + public int oxygenDrainPerTick; + public double oxygenRecoveryPerTick; + public float suffocationDamage; + + public Rates copy() { + Rates rates = new Rates(); + rates.oxygenDrainPerTick = oxygenDrainPerTick; + rates.oxygenRecoveryPerTick = oxygenRecoveryPerTick; + rates.suffocationDamage = suffocationDamage; + return rates; + } + } + + private static Rates rates(int drain, double regen, float dmg) { + Rates result = new Rates(); + result.oxygenDrainPerTick = drain; + result.oxygenRecoveryPerTick = regen; + result.suffocationDamage = dmg; + return result; + } + + public static final Map QUALITY_RATES = Map.of( + AirQuality.SAFE, rates(0, 2.0, 5f), + AirQuality.THIN, rates(1, 0.0, 5f), + AirQuality.TOXIC, rates(1, 0.5, 5f), + AirQuality.ABYSS, rates(8, 0.0, 1000f), + AirQuality.NO_AIR, rates(2, 0.0, 5f)); + + // Air Ranges + + public static final class AirRanges { + + public final int minY; + public final int maxY; + public final AirQuality quality; + + public final Integer drainPerTickOverride; + public final Double regenOverride; + public final Float damageOverride; + + public AirRanges(int minY, int maxY, AirQuality quality) { + this(minY, maxY, quality, null, null, null); + } + + public AirRanges(int minY, int maxY, AirQuality quality, + Integer drainPerTickOverride, + Double regenOverride, + Float damageOverride) { + this.minY = minY; + this.maxY = maxY; + this.quality = quality; + this.drainPerTickOverride = drainPerTickOverride; + this.regenOverride = regenOverride; + this.damageOverride = damageOverride; + } + + public boolean presentAtY(int yValue) { + return yValue >= minY && yValue <= maxY; + } + + public Rates airRangeRates() { + Rates base = QUALITY_RATES.get(quality).copy(); + if (drainPerTickOverride != null) base.oxygenDrainPerTick = drainPerTickOverride; + if (regenOverride != null) base.oxygenRecoveryPerTick = regenOverride; + if (damageOverride != null) base.suffocationDamage = damageOverride; + return base; + } + } + + private static final Map, List> RANGES = new ConcurrentHashMap<>(); + + public static void addRanges(ResourceKey dimension, AirRanges... ranges) { + RANGES.computeIfAbsent(dimension, d -> new ArrayList<>()).addAll(Arrays.asList(ranges)); + RANGES.get(dimension).sort(Comparator.comparingInt(b -> b.minY)); + } + + public static AirRanges getRanges(ResourceKey dimension, int y) { + List airRangesList = RANGES.get(dimension); + if (airRangesList == null || airRangesList.isEmpty()) return null; + for (AirRanges range : airRangesList) { + if (range.presentAtY(y)) return range; + } + return null; + } + + // --- Ad Astra dimension keys --- + private static ResourceKey adAstraDim(String name) { + return ResourceKey.create(Registries.DIMENSION, new ResourceLocation("ad_astra", name)); + } + + public static final ResourceKey MOON = adAstraDim("moon"); + public static final ResourceKey MOON_ORBIT = adAstraDim("moon_orbit"); + public static final ResourceKey MARS = adAstraDim("mars"); + public static final ResourceKey MARS_ORBIT = adAstraDim("mars_orbit"); + public static final ResourceKey VENUS = adAstraDim("venus"); + public static final ResourceKey VENUS_ORBIT = adAstraDim("venus_orbit"); + public static final ResourceKey MERCURY = adAstraDim("mercury"); + public static final ResourceKey MERCURY_ORBIT = adAstraDim("mercury_orbit"); + public static final ResourceKey GLACIO = adAstraDim("glacio"); + public static final ResourceKey GLACIO_ORBIT = adAstraDim("glacio_orbit"); + public static final ResourceKey EARTH_ORBIT = adAstraDim("earth_orbit"); + + // Default range registration + public static void registerAirRanges() { + // --- Overworld --- + addRanges(Level.OVERWORLD, + // y ≤ 0 : THIN air underground + new AirRanges(Integer.MIN_VALUE, 0, AirQuality.THIN, 1, 0.0, 2.0f), + // 1 to 199 : SAFE (faster regen) + new AirRanges(1, 199, AirQuality.SAFE, null, 3.0, null), + // 200+ : THIN at high altitude + new AirRanges(200, Integer.MAX_VALUE, AirQuality.THIN)); + + // --- Space (no atmosphere) --- + // All orbit dimensions have no air at all Y levels + for (ResourceKey orbit : List.of(EARTH_ORBIT, MOON_ORBIT, MARS_ORBIT, VENUS_ORBIT, MERCURY_ORBIT, + GLACIO_ORBIT)) { + addRanges(orbit, new AirRanges(Integer.MIN_VALUE, Integer.MAX_VALUE, AirQuality.NO_AIR)); + } + + // --- Planetary surfaces (no atmosphere) --- + // Moon, Mars, Mercury - no atmosphere + for (ResourceKey airless : List.of(MOON, MARS, MERCURY)) { + addRanges(airless, new AirRanges(Integer.MIN_VALUE, Integer.MAX_VALUE, AirQuality.NO_AIR)); + } + + // Venus - toxic atmosphere + addRanges(VENUS, new AirRanges(Integer.MIN_VALUE, Integer.MAX_VALUE, AirQuality.TOXIC, 2, 0.0, 3.0f)); + + // Glacio - thin but breathable at surface (ice world with some atmosphere) + addRanges(GLACIO, + new AirRanges(Integer.MIN_VALUE, 0, AirQuality.THIN, 1, 0.0, 2.0f), + new AirRanges(1, 127, AirQuality.SAFE, null, 1.5, null), + new AirRanges(128, Integer.MAX_VALUE, AirQuality.THIN)); + } + + public static final class ResolvedAirRange { + + public final AirQuality airQuality; + public final Rates rates; + + public ResolvedAirRange(AirQuality quality, Rates rates) { + this.airQuality = quality; + this.rates = rates; + } + } + + public static ResolvedAirRange resolve(ResourceKey dimension, int yVal) { + AirRanges range = getRanges(dimension, yVal); + if (range == null) { + Rates safe = QUALITY_RATES.get(AirQuality.SAFE).copy(); + return new ResolvedAirRange(AirQuality.SAFE, safe); + } + return new ResolvedAirRange(range.quality, range.airRangeRates()); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/airControl/RebreatherHelper.java b/src/main/java/com/ghostipedia/cosmiccore/common/airControl/RebreatherHelper.java new file mode 100644 index 000000000..d5f5adf52 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/airControl/RebreatherHelper.java @@ -0,0 +1,95 @@ +package com.ghostipedia.cosmiccore.common.airControl; + +import com.ghostipedia.cosmiccore.common.data.CosmicItems; + +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.common.util.LazyOptional; + +import top.theillusivec4.curios.api.CuriosApi; +import top.theillusivec4.curios.api.type.capability.ICuriosItemHandler; +import top.theillusivec4.curios.api.type.inventory.ICurioStacksHandler; +import top.theillusivec4.curios.api.type.inventory.IDynamicStackHandler; + +import java.util.Optional; + +/** + * Helper class for detecting and interacting with rebreather equipment. + */ +public final class RebreatherHelper { + + private RebreatherHelper() {} + + /** + * Rebreather types in order of capability. + */ + public enum RebreatherType { + /** No rebreather equipped */ + NONE, + /** Simple rebreather - slows oxygen drain in THIN air only */ + SIMPLE, + /** Pressurized rebreather - works in NO_AIR, allows tank usage */ + PRESSURIZED + } + + /** + * Get the best rebreather type the player has equipped. + * Checks head curio slot for rebreather items. + * + * @param player The player to check + * @return The best rebreather type found + */ + public static RebreatherType getEquippedRebreather(Player player) { + if (player == null) return RebreatherType.NONE; + + // Check for pressurized first (better) + if (hasCurioItem(player, "head", CosmicItems.PRESSURIZED_REBREATHER.asItem())) { + return RebreatherType.PRESSURIZED; + } + + // Check for simple + if (hasCurioItem(player, "head", CosmicItems.SIMPLE_REBREATHER.asItem())) { + return RebreatherType.SIMPLE; + } + + return RebreatherType.NONE; + } + + /** + * Check if player has a simple rebreather or better equipped. + */ + public static boolean hasSimpleRebreatherOrBetter(Player player) { + RebreatherType type = getEquippedRebreather(player); + return type == RebreatherType.SIMPLE || type == RebreatherType.PRESSURIZED; + } + + /** + * Check if player has a pressurized rebreather equipped. + */ + public static boolean hasPressurizedRebreather(Player player) { + return getEquippedRebreather(player) == RebreatherType.PRESSURIZED; + } + + /** + * Check if a specific item is in a curio slot. + */ + private static boolean hasCurioItem(LivingEntity entity, String slotId, Item item) { + LazyOptional cap = CuriosApi.getCuriosInventory(entity); + if (cap.isPresent()) { + ICuriosItemHandler curioHandler = cap.resolve().get(); + Optional handler = curioHandler.getStacksHandler(slotId); + if (handler.isPresent()) { + IDynamicStackHandler stackHandler = handler.get().getStacks(); + for (int i = 0; i < stackHandler.getSlots(); i++) { + ItemStack stack = stackHandler.getStackInSlot(i); + if (stack.is(item)) { + return true; + } + } + } + } + return false; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/block/DivingBellEscapePad.java b/src/main/java/com/ghostipedia/cosmiccore/common/block/DivingBellEscapePad.java new file mode 100644 index 000000000..3ee707755 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/block/DivingBellEscapePad.java @@ -0,0 +1,151 @@ +package com.ghostipedia.cosmiccore.common.block; + +import com.ghostipedia.cosmiccore.common.teleporter.SafeTeleporter; +import com.ghostipedia.cosmiccore.common.teleporter.TeleportOriginCap; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; + +// Escape Pad block that teleports players back to their origin dimension. Placed automatically by the Diving Bell. +public class DivingBellEscapePad extends Block { + + public DivingBellEscapePad(Properties properties) { + super(properties); + } + + @Override + public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, + InteractionHand hand, BlockHitResult hit) { + if (level.isClientSide) { + return InteractionResult.SUCCESS; + } + + ServerPlayer serverPlayer = (ServerPlayer) player; + serverPlayer.getCapability(TeleportOriginCap.CAP).ifPresent(cap -> { + if (!cap.hasValidOrigin()) { + // No valid origin data - send to respawn point + serverPlayer.displayClientMessage( + Component.translatable("cosmiccore.divingbell.no_return"), true); + teleportToRespawn(serverPlayer); + return; + } + + // Get return destination + var originDim = cap.getOriginDimension(); + Vec3 originPos = cap.getOriginPosition(); + float originYaw = cap.getOriginYaw(); + float originPitch = cap.getOriginPitch(); + + MinecraftServer server = level.getServer(); + if (server == null) return; + + ServerLevel originLevel = server.getLevel(originDim); + if (originLevel == null) { + // Origin dimension doesn't exist + serverPlayer.displayClientMessage( + Component.translatable("cosmiccore.divingbell.invalid_origin"), true); + cap.clearOriginData(); + teleportToRespawn(serverPlayer); + return; + } + + // Validate origin is safe (chunk loaded, not void) + BlockPos originBlockPos = BlockPos.containing(originPos); + if (!isOriginSafe(originLevel, originBlockPos)) { + serverPlayer.displayClientMessage( + Component.translatable("cosmiccore.divingbell.unsafe_origin"), true); + cap.clearOriginData(); + teleportToRespawn(serverPlayer); + return; + } + + // Teleport back to origin + serverPlayer.changeDimension(originLevel, new SafeTeleporter(originBlockPos)); + + // Restore rotation + serverPlayer.setYRot(originYaw); + serverPlayer.setXRot(originPitch); + + // Clear Abyss decay flag + // Don't think this is needed... + // serverPlayer.getCapability(com.ghostipedia.cosmiccore.common.abyss.AbyssBudgetCap.CAP) + // .ifPresent(abyssCap -> { + // abyssCap.setDecaying(AbyssRules.DIM, false); + // }); + + // Success message + serverPlayer.displayClientMessage( + Component.translatable("cosmiccore.divingbell.returned"), true); + + // Clear origin data + cap.clearOriginData(); + }); + + return InteractionResult.CONSUME; + } + + // Check if the origin position is safe to teleport to. + private boolean isOriginSafe(ServerLevel level, BlockPos pos) { + // Check if chunk is loaded + if (!level.isLoaded(pos)) { + return false; + } + + // Check if it's not in void + if (pos.getY() < level.getMinBuildHeight()) { + return false; + } + + // Check 2-block tall air column where player stands + BlockState at = level.getBlockState(pos); + BlockState above = level.getBlockState(pos.above()); + + // if (at.isSuffocating(level, pos)) { + // return false; + // } + // + // if (!at.getFluidState().isEmpty()) { + // return false; + // } + + // Head level: same checks to ensure full 2-block clearance + if (above.isSuffocating(level, pos.above())) { + return false; + } + + if (!above.getFluidState().isEmpty()) { + return false; + } + + return true; + } + + // Teleport player to their respawn point as fallback. + private void teleportToRespawn(ServerPlayer player) { + BlockPos respawn = player.getRespawnPosition(); + ServerLevel respawnLevel = player.server.getLevel(player.getRespawnDimension()); + + if (respawn != null && respawnLevel != null) { + // Teleport to bed/respawn anchor + player.teleportTo(respawnLevel, respawn.getX() + 0.5, respawn.getY(), respawn.getZ() + 0.5, + player.getYRot(), player.getXRot()); + } else { + // Ultimate fallback - overworld spawn (should not fail under normal circumstances) + ServerLevel overworld = player.server.overworld(); + BlockPos spawn = overworld.getSharedSpawnPos(); + player.teleportTo(overworld, spawn.getX() + 0.5, spawn.getY(), spawn.getZ() + 0.5, + player.getYRot(), player.getXRot()); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/block/MothHomeBlock.java b/src/main/java/com/ghostipedia/cosmiccore/common/block/MothHomeBlock.java new file mode 100644 index 000000000..cb15dabcc --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/block/MothHomeBlock.java @@ -0,0 +1,20 @@ +package com.ghostipedia.cosmiccore.common.block; + +import net.minecraft.world.level.block.Block; + +import lombok.Getter; + +/** + * Moth Home block - provides moths for the Cargo Moth system. + * Different tiers provide faster cycles and more moths per home. + */ +public class MothHomeBlock extends Block { + + @Getter + private final int tier; + + public MothHomeBlock(Properties properties, int tier) { + super(properties); + this.tier = tier; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/breath/OxygenHelper.java b/src/main/java/com/ghostipedia/cosmiccore/common/breath/OxygenHelper.java index 3c4e22de0..ec6741412 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/breath/OxygenHelper.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/breath/OxygenHelper.java @@ -1,23 +1,37 @@ package com.ghostipedia.cosmiccore.common.breath; -import net.minecraft.world.entity.LivingEntity; +import com.ghostipedia.cosmiccore.common.airControl.OxygenRules; -import fuzs.thinair.api.v1.AirQualityLevel; -import fuzs.thinair.helper.AirQualityHelperImpl; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.level.Level; +/** + * Helper for checking air quality using CosmicCore's oxygen system. + * Used by Create diving helmet integration. + */ public class OxygenHelper { + /** + * Check if the air quality at the entity's location should activate breathing equipment. + * Returns true if air is not SAFE (i.e., THIN, TOXIC, ABYSS, or NO_AIR). + */ public static boolean airQualityActivatesHelmet(LivingEntity entity) { - final var air = AirQualityHelperImpl.INSTANCE.getAirQualityAtLocation(entity.level(), entity.getEyePosition()); - return air == AirQualityLevel.RED || air == AirQualityLevel.YELLOW; - } + Level level = entity.level(); + BlockPos pos = entity.blockPosition(); - // - // @SubscribeEvent - // public static void aircheck(LivingEvent.LivingTickEvent event){ - // if(event.getEntity() instanceof Player player){ - // - // } - // - // } + // Check if eyes are in fluid - always needs helmet + BlockPos eyePos = BlockPos.containing(entity.getX(), entity.getEyeY(), entity.getZ()); + if (!level.getFluidState(eyePos).isEmpty()) { + return true; + } + + // Check our air quality system + OxygenRules.AirRanges range = OxygenRules.getRanges(level.dimension(), pos.getY()); + if (range == null) { + return false; // No range defined = SAFE + } + + return range.quality != OxygenRules.AirQuality.SAFE; + } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicBeesItemHiveFraming.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicBeesItemHiveFraming.java new file mode 100644 index 000000000..028540eb7 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicBeesItemHiveFraming.java @@ -0,0 +1,198 @@ +package com.ghostipedia.cosmiccore.common.data; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; + +import forestry.api.apiculture.IBeeHousing; +import forestry.api.apiculture.IBeeModifier; +import forestry.api.apiculture.genetics.IBee; +import forestry.api.apiculture.genetics.IBeeSpecies; +import forestry.api.apiculture.hives.IHiveFrame; +import forestry.api.genetics.IGenome; +import forestry.api.genetics.IMutation; +import forestry.core.items.ItemForestry; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.text.DecimalFormat; +import java.util.List; + +public class CosmicBeesItemHiveFraming extends ItemForestry implements IHiveFrame { + + private final Modifier beeMod; + + public CosmicBeesItemHiveFraming(CosmicBeesItemHiveFrameBuilder builder) { + super((new Item.Properties()).durability(builder.maxDmg)); + this.beeMod = new Modifier(builder.ageMult, + builder.speedMult, + builder.pollinationMult, + builder.decayMult, + builder.mutationMult, + builder.isRainproof, + builder.isAlwaysSunny, + builder.isHellish); + } + + @Override + public @NotNull ItemStack frameUsed(IBeeHousing iBeeHousing, ItemStack itemStack, IBee iBee, int i) { + return itemStack.hurt(i, iBeeHousing.getWorldObj().getRandom(), null) ? ItemStack.EMPTY : itemStack; + } + + @Override + public IBeeModifier getBeeModifier(ItemStack itemStack) { + return this.beeMod; + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level world, List tooltip, TooltipFlag advanced) { + super.appendHoverText(stack, world, tooltip, advanced); + DecimalFormat FORMAT = new DecimalFormat("#.##"); + if (beeMod.ageMult != 1) { + tooltip.add(Component.translatable("item.cosmicbees.bee.modifier.aging_multiplier") + .withStyle(ChatFormatting.GRAY) + .append(": ") + .append(Component.literal(FORMAT.format(beeMod.ageMult) + "x") + .withStyle(beeMod.ageMult > 1 ? ChatFormatting.RED : ChatFormatting.GREEN))); + } + + if (!stack.isDamaged()) { + tooltip.add(Component.translatable("item.forestry.durability", new Object[] { stack.getMaxDamage() })); + } + } + + private class Modifier implements IBeeModifier { + + private final float ageMult; + private final float speedMult; + private final float pollinationMult; + private final float decayMult; + private final float mutationMult; + private final boolean isRainproof; + private final boolean isAlwaysSunny; + private final boolean isHellish; + + public Modifier(float ageMult, float speedMult, float pollinationMult, float decayMult, float mutationMult, + boolean isRainproof, boolean isAlwaysSunny, boolean isHellish) { + this.ageMult = ageMult; + this.speedMult = speedMult; + this.pollinationMult = pollinationMult; + this.decayMult = decayMult; + this.mutationMult = mutationMult; + this.isRainproof = isRainproof; + this.isAlwaysSunny = isAlwaysSunny; + this.isHellish = isHellish; + } + + @Override + public float modifyMutationChance(IGenome genome, IGenome mate, IMutation mutation, + float currentChance) { + // mult cap is the base mutation chance to the power of 3. ie. 0.06 -> 0.09 -> 0.135 -> 0.203 -> 0.304, + // capped at 0.5 + float multCap = Math.min((float) (mutation.getChance() * (Math.pow(1.5, 4))), 0.5f); + return Math.min(currentChance * mutationMult, multCap); + } + + @Override + public float modifyAging(IGenome genome, @Nullable IGenome mate, float currentAging) { + return currentAging * ageMult; + } + + @Override + public float modifyProductionSpeed(IGenome genome, float currentSpeed) { + return currentSpeed * speedMult; + } + + @Override + public float modifyPollination(IGenome genome, float currentPollination) { + return currentPollination * pollinationMult; + } + + @Override + public float modifyGeneticDecay(IGenome genome, float currentDecay) { + return currentDecay * decayMult; + } + + @Override + public boolean isSealed() { + return isRainproof; + } + + @Override + public boolean isSunlightSimulated() { + return isAlwaysSunny; + } + + @Override + public boolean isHellish() { + return isHellish; + } + } + + public static class CosmicBeesItemHiveFrameBuilder { + + // required params + private int maxDmg = 64; + + // optional params + private float ageMult = 1; + private float speedMult = 1; + private float pollinationMult = 1; + private float decayMult = 1; + private float mutationMult = 1; + private boolean isRainproof = false; + private boolean isAlwaysSunny = false; + private boolean isHellish = false; + + public CosmicBeesItemHiveFrameBuilder(int maxDmg) { + this.maxDmg = maxDmg; + } + + public CosmicBeesItemHiveFrameBuilder setAgeMult(float ageMult) { + this.ageMult = ageMult; + return this; + } + + public CosmicBeesItemHiveFrameBuilder setSpeedMult(float speedMult) { + this.speedMult = speedMult; + return this; + } + + public CosmicBeesItemHiveFrameBuilder setPollinationMult(float pollinationMult) { + this.pollinationMult = pollinationMult; + return this; + } + + public CosmicBeesItemHiveFrameBuilder setDecayMult(float decayMult) { + this.decayMult = decayMult; + return this; + } + + public CosmicBeesItemHiveFrameBuilder setMutationMult(float mutationMult) { + this.mutationMult = mutationMult; + return this; + } + + public CosmicBeesItemHiveFrameBuilder setIsRainproof(boolean isRainproof) { + this.isRainproof = isRainproof; + return this; + } + + public CosmicBeesItemHiveFrameBuilder setIsAlwaysSunny(boolean isAlwaysSunny) { + this.isAlwaysSunny = isAlwaysSunny; + return this; + } + + public CosmicBeesItemHiveFrameBuilder setIsHellish(boolean isHellish) { + this.isHellish = isHellish; + return this; + } + + public CosmicBeesItemHiveFraming build() { + return new CosmicBeesItemHiveFraming(this); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicBlockEntities.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicBlockEntities.java index 092de65c8..859436247 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicBlockEntities.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicBlockEntities.java @@ -1,6 +1,58 @@ package com.ghostipedia.cosmiccore.common.data; +import com.ghostipedia.cosmiccore.ember.blockentity.CosmicEmberEmitterBlockEntity; +import com.ghostipedia.cosmiccore.ember.blockentity.CosmicEmberReceptorBlockEntity; + +import com.gregtechceu.gtceu.api.GTValues; + +import com.tterrag.registrate.util.entry.BlockEntityEntry; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; + +import java.util.Locale; +import java.util.Map; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.EMBER_EMITTER_BLOCKS; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.EMBER_RECEPTOR_BLOCKS; + public class CosmicBlockEntities { + public static final Map> COSMIC_EMBER_EMITTER_BE = registerEmberEmitters(); + public static final Map> COSMIC_EMBER_RECEIVER_BE = registerEmberReceptors(); + + private static Map> registerEmberEmitters() { + var emitters = new it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap>(); + for (int i = 0; i < 15; i++) { + final int tier = i; + final String key = (i == 0 ? "steam" : GTValues.VN[i].toLowerCase(Locale.ROOT)); + + var be = REGISTRATE.blockEntity( + "cosmic_%s_ember_emitter_be".formatted(key), + (type, pos, state) -> new CosmicEmberEmitterBlockEntity(type, pos, state, tier)) + .validBlock(EMBER_EMITTER_BLOCKS.get(i)) // safe now + .register(); + + emitters.put(i, be); + } + return emitters; + } + + private static Map> registerEmberReceptors() { + var receptors = new Int2ObjectOpenHashMap>(); + for (int i = 0; i < 15; i++) { + final int tier = i; + final String key = (i == 0 ? "steam" : GTValues.VN[i].toLowerCase(Locale.ROOT)); + + var be = REGISTRATE.blockEntity( + "cosmic_%s_ember_receiver_be".formatted(key), + (type, pos, state) -> new CosmicEmberReceptorBlockEntity(type, pos, state, tier)) + .validBlock(EMBER_RECEPTOR_BLOCKS.get(i)) + .register(); + + receptors.put(i, be); + } + return receptors; + } + public static void init() {} } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicBlocks.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicBlocks.java index 2761ac71c..cd2c14d5f 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicBlocks.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicBlocks.java @@ -4,8 +4,12 @@ import com.ghostipedia.cosmiccore.api.CosmicCoreAPI; import com.ghostipedia.cosmiccore.api.block.IMagnetType; import com.ghostipedia.cosmiccore.client.renderer.block.NebulaeCoilRenderer; +import com.ghostipedia.cosmiccore.common.block.DivingBellEscapePad; import com.ghostipedia.cosmiccore.common.block.MagnetBlock; +import com.ghostipedia.cosmiccore.common.block.MothHomeBlock; import com.ghostipedia.cosmiccore.common.blockentity.CosmicCoilBlockEntity; +import com.ghostipedia.cosmiccore.ember.CosmicEmberEmitterBlock; +import com.ghostipedia.cosmiccore.ember.CosmicEmberReceptorBlock; import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTCEuAPI; @@ -18,16 +22,17 @@ import net.minecraft.client.renderer.RenderType; import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.BlockTags; import net.minecraft.world.item.BlockItem; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.GlassBlock; -import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.NoteBlockInstrument; import net.minecraft.world.level.material.MapColor; +import net.minecraftforge.client.model.generators.ConfiguredModel; import net.minecraftforge.client.model.generators.ModelFile; +import com.rekindled.embers.RegistryManager; import com.teamresourceful.resourcefullib.common.registry.RegistryEntry; import com.tterrag.registrate.providers.DataGenContext; import com.tterrag.registrate.providers.RegistrateBlockstateProvider; @@ -36,7 +41,9 @@ import com.tterrag.registrate.util.nullness.NonNullFunction; import com.tterrag.registrate.util.nullness.NonNullSupplier; import earth.terrarium.adastra.common.blocks.GlobeBlock; +import it.unimi.dsi.fastutil.ints.Int2ReferenceArrayMap; +import java.util.Map; import java.util.function.Supplier; import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; @@ -121,6 +128,11 @@ public class CosmicBlocks { public static final BlockEntry HEAVY_FROST_PROOF_CASING = createCasingBlock("heavy_frost_proof_casing", CosmicCore.id("block/casings/solid/heavy_frost_proof_casing")); + public static final BlockEntry SOUL_STAINED_STEEL_ALU_CASING = createCasingBlock( + "soul_stained_steel_aluminium_plated_casing", + CosmicCore.id("block/casings/solid/soul_stained_steel_aluminium_plated_casing")); + public static final BlockEntry LIVING_ROCK_TILES = createCasingBlock("livingrock_tiles", + CosmicCore.id("block/casings/solid/livingrock_tiles")); public static final BlockEntry NEUTRONIUM_BOUEY = createCasingBlock("neutronium_buoy", CosmicCore.id("block/casings/solid/neutronium_buoy")); @@ -130,6 +142,15 @@ public class CosmicBlocks { public static final BlockEntry CYCLOZINE_HIGH_RIGIDITY_CASING = createCasingBlock( "cyclozine_high_rigidity_casing", CosmicCore.id("block/casings/solid/cyclozine_high_rigidity_casing")); + + public static final BlockEntry LIGHT_DAWNSTONE_CASING = createCasingBlock( + "light_dawnstone_casing", + CosmicCore.id("block/casings/solid/light_dawnstone_casing")); + + public static final BlockEntry REINFORCED_DAWNSTONE_CASING = createCasingBlock( + "reinforced_dawnstone_casing", + CosmicCore.id("block/casings/solid/reinforced_dawnstone_casing")); + // public static final BlockEntry SOMAPLASTIC_HEAVY_FRAMES = createCasingBlock("somaplastic_heavy_frames", // CosmicCore.id("block/casings/solid/cyclozine_high_rigidity_casing")); // public static final BlockEntry MOON_DIVE_CASING = createCasingBlock("moon_dive_casing", @@ -186,6 +207,41 @@ public class CosmicBlocks { public static final BlockEntry GEARBOX_NAQUADRIA = createCasingBlock( "machine_casing_gearbox_naquadria", CosmicCore.id("block/casings/gearbox/machine_casing_gearbox_naquadria")); + + public static final BlockEntry RUST_WEAVE_CASING = createCasingBlock( + "rust_weave_casing", + CosmicCore.id("block/casings/solid/rust_weave_casing")); + + public static final BlockEntry RUST_STAINED_CASING = createCasingBlock( + "rust_stained_casing", + CosmicCore.id("block/casings/solid/rust_stained_casing")); + + public static final BlockEntry SOMARUST_CASING = createCasingBlock( + "somarust_casing", + CosmicCore.id("block/casings/solid/somarust_casing")); + + public static final BlockEntry SOUL_MUTED_CASING = createCasingBlock( + "soul_muted_casing", + CosmicCore.id("block/casings/solid/soul_muted_casing")); + + // Star Ladder Casings + + public static final BlockEntry SUPERHEAVY_STEEL_CASING = createCasingBlock( + "superheavy_steel_casing", + CosmicCore.id("block/casings/solid/superheavy_steel_casing")); + + public static final BlockEntry RIGID_HIGH_SPEED_STEEL_CASING = createCasingBlock( + "rigid_high_speed_steel_casing", + CosmicCore.id("block/casings/solid/rigid_high_speed_steel_casing")); + + public static final BlockEntry BOLTED_HEAVY_FRAME_CASING = createCasingBlock( + "bolted_heavy_frame_casing", + CosmicCore.id("block/casings/solid/bolted_heavy_frame_casing")); + + public static final BlockEntry ETHERSTEEL_PLATED_ASH_TILES = createStoneCasingBlock( + "ethersteel_plated_ash_tiles", + CosmicCore.id("block/casings/solid/ethersteel_plated_ash_tiles")); + // I think i deleted the uh, yeah.. public static final BlockEntry CASING_HEAT_VENT = createActiveCasing("heat_fan", "block/variant/heat_fan"); @@ -197,11 +253,472 @@ public class CosmicBlocks { "radioactive_filter_casing", "block/variant/radioactive_filter_casing"); + public static final BlockEntry STEEL_ROSE_LANTERN = createLantern("steel_rose_lantern", + CosmicCore.id("block/lanterns/steel_rose_lantern"), + CosmicCore.id("block/lanterns/steel_rose_lantern_hanging")); + + public static final BlockGroup STEEL_ROSE_LIGHT = createStoneBuildingBlock( + "steel_rose_light", + CosmicCore.id("block/casings/cosmetic/steel_rose_light")); + + public static final BlockGroup IRON_PLATED_DEEPSLATE_BLOCK = createStoneBuildingBlock( + "iron_plated_deepslate_tile", + CosmicCore.id("block/casings/cosmetic/iron_plated_deepslate_tile")); + + public static final Map> EMBER_EMITTER_BLOCKS = new Int2ReferenceArrayMap<>(); + public static final Map> EMBER_RECEPTOR_BLOCKS = new Int2ReferenceArrayMap<>(); + + // RECIEVERS + public static final BlockEntry COSMIC_EMBER_RECEIVER_STEAM = REGISTRATE + .block("steam_ember_receptor", props -> new CosmicEmberReceptorBlock(props, 0)) + .lang("Steam Ember Receptor") + .initialProperties(RegistryManager.EMBER_RECEIVER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("steam_ember_receptor"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_RECEIVER_LV = REGISTRATE + .block("lv_ember_receptor", props -> new CosmicEmberReceptorBlock(props, 1)) + .lang("LV Ember Receptor") + .initialProperties(RegistryManager.EMBER_RECEIVER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("lv_ember_receptor"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_RECEIVER_MV = REGISTRATE + .block("mv_ember_receptor", props -> new CosmicEmberReceptorBlock(props, 2)) + .lang("MV Ember Receptor") + .initialProperties(RegistryManager.EMBER_RECEIVER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("mv_ember_receptor"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_RECEIVER_HV = REGISTRATE + .block("hv_ember_receptor", props -> new CosmicEmberReceptorBlock(props, 3)) + .lang("HV Ember Receptor") + .initialProperties(RegistryManager.EMBER_RECEIVER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("hv_ember_receptor"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_RECEIVER_EV = REGISTRATE + .block("ev_ember_receptor", props -> new CosmicEmberReceptorBlock(props, 4)) + .lang("EV Ember Receptor") + .initialProperties(RegistryManager.EMBER_RECEIVER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("ev_ember_receptor"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_RECEIVER_IV = REGISTRATE + .block("iv_ember_receptor", props -> new CosmicEmberReceptorBlock(props, 5)) + .lang("IV Ember Receptor") + .initialProperties(RegistryManager.EMBER_RECEIVER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("iv_ember_receptor"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_RECEIVER_LUV = REGISTRATE + .block("luv_ember_receptor", props -> new CosmicEmberReceptorBlock(props, 6)) + .lang("LuV Ember Receptor") + .initialProperties(RegistryManager.EMBER_RECEIVER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("luv_ember_receptor"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_RECEIVER_ZPM = REGISTRATE + .block("zpm_ember_receptor", props -> new CosmicEmberReceptorBlock(props, 7)) + .lang("ZPM Ember Receptor") + .initialProperties(RegistryManager.EMBER_RECEIVER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("zpm_ember_receptor"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_RECEIVER_UV = REGISTRATE + .block("uv_ember_receptor", props -> new CosmicEmberReceptorBlock(props, 8)) + .lang("UV Ember Receptor") + .initialProperties(RegistryManager.EMBER_RECEIVER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("uv_ember_receptor"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_RECEIVER_UHV = REGISTRATE + .block("uhv_ember_receptor", props -> new CosmicEmberReceptorBlock(props, 9)) + .lang("UHV Ember Receptor") + .initialProperties(RegistryManager.EMBER_RECEIVER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("uhv_ember_receptor"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_RECEIVER_UEV = REGISTRATE + .block("uev_ember_receptor", props -> new CosmicEmberReceptorBlock(props, 10)) + .lang("UEV Ember Receptor") + .initialProperties(RegistryManager.EMBER_RECEIVER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("uev_ember_receptor"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_RECEIVER_UIV = REGISTRATE + .block("uiv_ember_receptor", props -> new CosmicEmberReceptorBlock(props, 11)) + .lang("UIV Ember Receptor") + .initialProperties(RegistryManager.EMBER_RECEIVER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("uiv_ember_receptor"))); + }) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_RECEIVER_UXV = REGISTRATE + .block("uxv_ember_receptor", props -> new CosmicEmberReceptorBlock(props, 12)) + .lang("UXV Ember Receptor") + .initialProperties(RegistryManager.EMBER_RECEIVER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("uxv_ember_receptor"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_RECEIVER_OPV = REGISTRATE + .block("opv_ember_receptor", props -> new CosmicEmberReceptorBlock(props, 13)) + .lang("OPV Ember Receptor") + .initialProperties(RegistryManager.EMBER_RECEIVER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("opv_ember_receptor"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_RECEIVER_MAX = REGISTRATE + .block("max_ember_receptor", props -> new CosmicEmberReceptorBlock(props, 14)) + .lang("MAX Ember Receptor") + .initialProperties(RegistryManager.EMBER_RECEIVER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("max_ember_receptor"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + // EMITTERS + public static final BlockEntry COSMIC_EMBER_EMITTER_STEAM = REGISTRATE + .block("steam_ember_emitter", props -> new CosmicEmberEmitterBlock(props, 0)) + .lang("Steam Ember Emitter") + .initialProperties(RegistryManager.EMBER_EMITTER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("steam_ember_emitter"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_EMITTER_LV = REGISTRATE + .block("lv_ember_emitter", props -> new CosmicEmberEmitterBlock(props, 1)) + .lang("LV Ember Emitter") + .initialProperties(RegistryManager.EMBER_EMITTER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), prov.models().getExistingFile(CosmicCore.id("lv_ember_emitter"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_EMITTER_MV = REGISTRATE + .block("mv_ember_emitter", props -> new CosmicEmberEmitterBlock(props, 2)) + .lang("MV Ember Emitter") + .initialProperties(RegistryManager.EMBER_EMITTER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), prov.models().getExistingFile(CosmicCore.id("mv_ember_emitter"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_EMITTER_HV = REGISTRATE + .block("hv_ember_emitter", props -> new CosmicEmberEmitterBlock(props, 3)) + .lang("HV Ember Emitter") + .initialProperties(RegistryManager.EMBER_EMITTER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), prov.models().getExistingFile(CosmicCore.id("hv_ember_emitter"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_EMITTER_EV = REGISTRATE + .block("ev_ember_emitter", props -> new CosmicEmberEmitterBlock(props, 4)) + .lang("EV Ember Emitter") + .initialProperties(RegistryManager.EMBER_EMITTER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), prov.models().getExistingFile(CosmicCore.id("ev_ember_emitter"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_EMITTER_IV = REGISTRATE + .block("iv_ember_emitter", props -> new CosmicEmberEmitterBlock(props, 5)) + .lang("IV Ember Emitter") + .initialProperties(RegistryManager.EMBER_EMITTER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), prov.models().getExistingFile(CosmicCore.id("iv_ember_emitter"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_EMITTER_LUV = REGISTRATE + .block("luv_ember_emitter", props -> new CosmicEmberEmitterBlock(props, 6)) + .lang("LuV Ember Emitter") + .initialProperties(RegistryManager.EMBER_EMITTER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("luv_ember_emitter"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_EMITTER_ZPM = REGISTRATE + .block("zpm_ember_emitter", props -> new CosmicEmberEmitterBlock(props, 7)) + .lang("ZPM Ember Emitter") + .initialProperties(RegistryManager.EMBER_EMITTER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("zpm_ember_emitter"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_EMITTER_UV = REGISTRATE + .block("uv_ember_emitter", props -> new CosmicEmberEmitterBlock(props, 8)) + .lang("UV Ember Emitter") + .initialProperties(RegistryManager.EMBER_EMITTER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), prov.models().getExistingFile(CosmicCore.id("uv_ember_emitter"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_EMITTER_UHV = REGISTRATE + .block("uhv_ember_emitter", props -> new CosmicEmberEmitterBlock(props, 9)) + .lang("UHV Ember Emitter") + .initialProperties(RegistryManager.EMBER_EMITTER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("uhv_ember_emitter"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_EMITTER_UEV = REGISTRATE + .block("uev_ember_emitter", props -> new CosmicEmberEmitterBlock(props, 10)) + .lang("UEV Ember Emitter") + .initialProperties(RegistryManager.EMBER_EMITTER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("uev_ember_emitter"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_EMITTER_UIV = REGISTRATE + .block("uiv_ember_emitter", props -> new CosmicEmberEmitterBlock(props, 11)) + .lang("UIV Ember Emitter") + .initialProperties(RegistryManager.EMBER_EMITTER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("uiv_ember_emitter"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_EMITTER_UXV = REGISTRATE + .block("uxv_ember_emitter", props -> new CosmicEmberEmitterBlock(props, 12)) + .lang("UXV Ember Emitter") + .initialProperties(RegistryManager.EMBER_EMITTER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("uxv_ember_emitter"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_EMITTER_OPV = REGISTRATE + .block("opv_ember_emitter", props -> new CosmicEmberEmitterBlock(props, 13)) + .lang("OPV Ember Emitter") + .initialProperties(RegistryManager.EMBER_EMITTER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("opv_ember_emitter"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_EMITTER_MAX = REGISTRATE + .block("max_ember_emitter", props -> new CosmicEmberEmitterBlock(props, 14)) + .lang("MAX Ember Emitter") + .initialProperties(RegistryManager.EMBER_EMITTER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("max_ember_emitter"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + static { + EMBER_EMITTER_BLOCKS.put(0, COSMIC_EMBER_EMITTER_STEAM); + EMBER_EMITTER_BLOCKS.put(1, COSMIC_EMBER_EMITTER_LV); + EMBER_EMITTER_BLOCKS.put(2, COSMIC_EMBER_EMITTER_MV); + EMBER_EMITTER_BLOCKS.put(3, COSMIC_EMBER_EMITTER_HV); + EMBER_EMITTER_BLOCKS.put(4, COSMIC_EMBER_EMITTER_EV); + EMBER_EMITTER_BLOCKS.put(5, COSMIC_EMBER_EMITTER_IV); + EMBER_EMITTER_BLOCKS.put(6, COSMIC_EMBER_EMITTER_LUV); + EMBER_EMITTER_BLOCKS.put(7, COSMIC_EMBER_EMITTER_ZPM); + EMBER_EMITTER_BLOCKS.put(8, COSMIC_EMBER_EMITTER_UV); + EMBER_EMITTER_BLOCKS.put(9, COSMIC_EMBER_EMITTER_UHV); + EMBER_EMITTER_BLOCKS.put(10, COSMIC_EMBER_EMITTER_UEV); + EMBER_EMITTER_BLOCKS.put(11, COSMIC_EMBER_EMITTER_UIV); + EMBER_EMITTER_BLOCKS.put(12, COSMIC_EMBER_EMITTER_UXV); + EMBER_EMITTER_BLOCKS.put(13, COSMIC_EMBER_EMITTER_OPV); + EMBER_EMITTER_BLOCKS.put(14, COSMIC_EMBER_EMITTER_MAX); + + EMBER_RECEPTOR_BLOCKS.put(0, COSMIC_EMBER_RECEIVER_STEAM); + EMBER_RECEPTOR_BLOCKS.put(1, COSMIC_EMBER_RECEIVER_LV); + EMBER_RECEPTOR_BLOCKS.put(2, COSMIC_EMBER_RECEIVER_MV); + EMBER_RECEPTOR_BLOCKS.put(3, COSMIC_EMBER_RECEIVER_HV); + EMBER_RECEPTOR_BLOCKS.put(4, COSMIC_EMBER_RECEIVER_EV); + EMBER_RECEPTOR_BLOCKS.put(5, COSMIC_EMBER_RECEIVER_IV); + EMBER_RECEPTOR_BLOCKS.put(6, COSMIC_EMBER_RECEIVER_LUV); + EMBER_RECEPTOR_BLOCKS.put(7, COSMIC_EMBER_RECEIVER_ZPM); + EMBER_RECEPTOR_BLOCKS.put(8, COSMIC_EMBER_RECEIVER_UV); + EMBER_RECEPTOR_BLOCKS.put(9, COSMIC_EMBER_RECEIVER_UHV); + EMBER_RECEPTOR_BLOCKS.put(10, COSMIC_EMBER_RECEIVER_UEV); + EMBER_RECEPTOR_BLOCKS.put(11, COSMIC_EMBER_RECEIVER_UIV); + EMBER_RECEPTOR_BLOCKS.put(12, COSMIC_EMBER_RECEIVER_UXV); + EMBER_RECEPTOR_BLOCKS.put(13, COSMIC_EMBER_RECEIVER_OPV); + EMBER_RECEPTOR_BLOCKS.put(14, COSMIC_EMBER_RECEIVER_MAX); + } + // GLASS BLOCKS public static final BlockEntry ZBLAN_REINFORCED_GLASS = createGlassCasingBlock( "zblan_glass", CosmicCore.id("block/casings/glass/zblan_glass"), () -> RenderType::translucent); - // This is a Bunch of Rendering Magic I barely understand (See: I Don't understand at all) ~Ghost + public static final BlockEntry DIVING_BELL_ESCAPE_PAD = REGISTRATE + .block("diving_bell_escape_pad", DivingBellEscapePad::new) + .initialProperties(() -> Blocks.STONE) + .exBlockstate(GTModels.cubeAllModel(CosmicCore.id("block/diving_bell_escape_pad"))) + .simpleItem() + .register(); + + // MOTH HOME BLOCKS - For Cargo Moths system + public static final BlockEntry MOTH_HOME_T1 = createMothHomeBlock(1); + public static final BlockEntry MOTH_HOME_T2 = createMothHomeBlock(2); + public static final BlockEntry MOTH_HOME_T3 = createMothHomeBlock(3); + public static final BlockEntry MOTH_HOME_T4 = createMothHomeBlock(4); + + // Moth Station Casing + public static final BlockEntry MOTH_STATION_CASING = createCasingBlock("moth_station_casing", + CosmicCore.id("block/casings/solid/moth_station_casing")); + + private static BlockEntry createMothHomeBlock(int tier) { + return REGISTRATE + .block("moth_home_t" + tier, p -> new MothHomeBlock(p, tier)) + .lang("Moth Home (T" + tier + ")") + .initialProperties(() -> Blocks.IRON_BLOCK) + .properties(p -> p.strength(3.0f, 6.0f)) + .exBlockstate(GTModels.cubeAllModel(CosmicCore.id("block/casings/moth/moth_home_t" + tier))) + .simpleItem() + .register(); + } + private static BlockEntry createGlassCasingBlock(String name, ResourceLocation texture, Supplier> type) { NonNullFunction supplier = GlassBlock::new; @@ -216,6 +733,69 @@ private static BlockEntry createGlassCasingBlock(String name, ResourceLoc .register(); } + public record BlockGroup(BlockEntry block, BlockEntry stairs, BlockEntry slab) {} + + public static BlockGroup createStoneBuildingBlock(String name, ResourceLocation texture) { + return createStoneBuildingBlocks(name, texture, () -> Blocks.DEEPSLATE_BRICKS, + () -> RenderType::solid); + } + + public static BlockGroup createStoneBuildingBlocks(String name, + ResourceLocation texture, + NonNullSupplier properties, + Supplier> type) { + BlockEntry fullBlock = REGISTRATE.block(name, Block::new) + .initialProperties(properties) + .properties(p -> p.isValidSpawn(((blockState, blockGetter, blockPos, entityType) -> false)) + .speedFactor(1.25f) + .requiresCorrectToolForDrops() + .strength(5, 6) + .sound(SoundType.NETHERITE_BLOCK)) + .addLayer(type) + .exBlockstate(GTModels.cubeAllModel(texture)) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + BlockEntry stairBlock = REGISTRATE + .block(name + "_stairs", s -> new StairBlock(() -> fullBlock.get().defaultBlockState(), s)) + .initialProperties(fullBlock) + .properties(p -> p.isValidSpawn(((blockState, blockGetter, blockPos, entityType) -> false)) + .speedFactor(1.25f) + .requiresCorrectToolForDrops() + .strength(5, 6) + .sound(SoundType.NETHERITE_BLOCK)) + .addLayer(type) + .blockstate((ctx, prov) -> prov.stairsBlock(ctx.get(), texture)) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + BlockEntry slabBlock = REGISTRATE.block(name + "_slab", SlabBlock::new) + .initialProperties(fullBlock) + .properties(p -> p.isValidSpawn(((blockState, blockGetter, blockPos, entityType) -> false)) + .speedFactor(1.25f) + .requiresCorrectToolForDrops() + .strength(5, 6) + .sound(SoundType.NETHERITE_BLOCK)) + .addLayer(type) + .blockstate((ctx, prov) -> { + var slab = prov.models().slab(ctx.getName(), texture, texture, texture); + var slabTop = prov.models().slabTop(ctx.getName() + "_top", texture, texture, texture); + var fullModel = prov.models().cubeAll(name, texture); + + prov.slabBlock((SlabBlock) ctx.get(), slab, slabTop, fullModel); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + return new BlockGroup(fullBlock, stairBlock, slabBlock); + } + public static BlockEntry createCasingBlock(String name, ResourceLocation texture) { return createCasingBlock(name, Block::new, texture, () -> Blocks.IRON_BLOCK, () -> RenderType::cutoutMipped); @@ -330,5 +910,77 @@ private static BlockBehaviour.Properties ironProperties() { .sound(SoundType.COPPER); } + public static BlockEntry createLantern(String name, ResourceLocation texture, + ResourceLocation textureHanging) { + return createLantern( + name, + LanternBlock::new, + texture, + textureHanging, + () -> Blocks.LANTERN, + () -> RenderType::cutout, + 15); + } + + public static BlockEntry createLantern(String name, + NonNullFunction blockSupplier, + ResourceLocation texture, ResourceLocation hangingTexture, + NonNullSupplier properties, + java.util.function.Supplier> type, + int lightLevel) { + return REGISTRATE.block(name, blockSupplier) + .initialProperties(properties) + .properties(prop -> prop + .strength(3.5f) + .sound(SoundType.LANTERN) + .requiresCorrectToolForDrops() + .noOcclusion() + .lightLevel(l -> lightLevel)) + .addLayer(type) + .blockstate((context, provider) -> { + + var standing = provider.models() + .withExistingParent(context.getName(), provider.mcLoc("block/lantern")) + .texture("lantern", texture) + .texture("particle", texture); + + var hanging = provider.models() + .withExistingParent(context.getName() + "_hanging", provider.mcLoc("block/lantern_hanging")) + .texture("lantern", hangingTexture) + .texture("particle", hangingTexture); + + provider.getVariantBuilder(context.get()) + .forAllStates(state -> { + boolean isHanging = state.getValue(BlockStateProperties.HANGING); + return new ConfiguredModel[] { + new ConfiguredModel( + isHanging ? hanging : standing) + }; + }); + }) + .tag(BlockTags.MINEABLE_WITH_SHOVEL) + .item(BlockItem::new) + .model((context, provider) -> provider.withExistingParent(context.getName(), + provider.modLoc("block/" + context.getName()))) + .build() + .register(); + } + + public static BlockEntry createStoneCasingBlock(String name, + ResourceLocation texture) { + return REGISTRATE.block(name, Block::new) + .initialProperties(() -> Blocks.DEEPSLATE) + .properties(p -> p.isValidSpawn(((blockState, blockGetter, blockPos, entityType) -> false)) + .requiresCorrectToolForDrops() + .strength(5, 6) + .sound(SoundType.DEEPSLATE_TILES)) + .addLayer(() -> RenderType::solid) + .exBlockstate(GTModels.cubeAllModel(texture)) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + } + public static void init() {} } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicCreativeModeTabs.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicCreativeModeTabs.java index 0a2b1c103..68613f547 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicCreativeModeTabs.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicCreativeModeTabs.java @@ -1,9 +1,16 @@ package com.ghostipedia.cosmiccore.common.data; import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.item.tcon.CosmicCreativeTinkersTab; +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; +import com.gregtechceu.gtceu.api.data.tag.TagPrefix; +import com.ghostipedia.cosmiccore.common.item.tcon.CosmicCreativeTinkersTab; import com.gregtechceu.gtceu.common.data.GTCreativeModeTabs; +import com.gregtechceu.gtceu.common.data.GTMaterials; +import com.gregtechceu.gtceu.common.registry.GTRegistration; import net.minecraft.world.item.CreativeModeTab; import com.tterrag.registrate.util.entry.RegistryEntry; @@ -20,5 +27,17 @@ public class CosmicCreativeModeTabs { .build()) .register(); + public static RegistryEntry COSMIC_CORE_TINKERS_TOOLS = REGISTRATE + .defaultCreativeTab(CosmicCore.MOD_ID, + builder -> builder + .displayItems(CosmicCreativeTinkersTab::addCreativeTabItems) + .title(REGISTRATE.addLang("itemGroup", CosmicCore.id("creative_tab_tinker_tools"), + "Cosmic Core Tinkers Compat")) + .icon(CosmicItems.RUNE_CONJUNCTION_VALKRUTH::asStack) + .build()) + .register(); + + + public static void init() {} } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicGendustryUpgradeType.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicGendustryUpgradeType.java new file mode 100644 index 000000000..c3ffb3c84 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicGendustryUpgradeType.java @@ -0,0 +1,35 @@ +package com.ghostipedia.cosmiccore.common.data; + +import forestry.api.core.IItemSubtype; +import thedarkcolour.gendustry.item.IGendustryUpgradeType; + +import java.util.Locale; + +public enum CosmicGendustryUpgradeType implements IItemSubtype, IGendustryUpgradeType { + + WAILING(1, 2048), + DECAYING(1, 2048); + + private final String name; + private final int maxStackSize; + private final int energyCost; + + private CosmicGendustryUpgradeType(int maxStackSize, int energyCost) { + this.name = this.name().toLowerCase(Locale.ENGLISH); + this.maxStackSize = maxStackSize; + this.energyCost = energyCost; + } + + @Override + public String getSerializedName() { + return this.name; + } + + public int maxStackSize() { + return this.maxStackSize; + } + + public int energyCost() { + return this.energyCost; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicItems.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicItems.java index 0f316f52f..7c271cf8a 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicItems.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicItems.java @@ -7,13 +7,17 @@ import com.ghostipedia.cosmiccore.client.renderer.item.HaloItemRenderer; import com.ghostipedia.cosmiccore.common.data.tag.item.CosmicItemTags; import com.ghostipedia.cosmiccore.common.item.CosmicScytheItem; +import com.ghostipedia.cosmiccore.common.item.OxygenTankItem; import com.ghostipedia.cosmiccore.common.item.armor.ChestSanguineWarptechSuite; import com.ghostipedia.cosmiccore.common.item.armor.HelmetSanguineWarptechSuite; import com.ghostipedia.cosmiccore.common.item.armor.SanguineWarptechSuite; +import com.ghostipedia.cosmiccore.common.item.armor.boots.CosmicBootsArmorLogic; import com.ghostipedia.cosmiccore.common.item.behavior.EffectApplicationBehavior; import com.ghostipedia.cosmiccore.common.item.behavior.InfiniteSprayCanBehavior; +import com.ghostipedia.cosmiccore.common.item.behavior.OxygenSupplyTankBehavior; import com.ghostipedia.cosmiccore.common.item.behavior.StructureWriteBehavior; import com.ghostipedia.cosmiccore.common.item.behavior.WirelessPDABehavior; +import com.ghostipedia.cosmiccore.common.reflection.item.MirrorItem; import com.ghostipedia.cosmiccore.utils.StringUtil; import com.gregtechceu.gtceu.GTCEu; @@ -234,6 +238,43 @@ public class CosmicItems { .defaultModel() .register(); + public static final ItemEntry PALE_SAW = REGISTRATE + .item("pale_saw", ComponentItem::create) + .lang("Pale Saw") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry PALE_SCRAP = REGISTRATE + .item("pale_scrap", ComponentItem::create) + .lang("Pale Scrap") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry ABRASIVE_ROSIN_MILLSTONES = REGISTRATE + .item("abrasive_rosin_millstones", ComponentItem::create) + .lang("Abrasive Rosin Millstones") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry BITUMEN_WAX = REGISTRATE + .item("bitumen_wax", ComponentItem::create) + .lang("Bitumen Wax") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry ENERGIZED_SILK = REGISTRATE + .item("energized_silk", ComponentItem::create) + .lang("Energized Silk") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry HARMONICALLY_TUNED_CIRCUIT_BOARD = REGISTRATE .item("harmonically_tuned_circuit_board", ComponentItem::create) @@ -1025,31 +1066,37 @@ public class CosmicItems { .item("shard_of_perpetuity", ComponentItem::create) .lang("Shard of Perpetuity") .properties(p -> p.stacksTo(64)) - .onRegister(attach(new TooltipBehavior(tooltips -> { - tooltips.add(Component.translatable("cosmiccore.lore.shard_small.0")); - tooltips.add(Component.translatable("cosmiccore.lore.shard_small.1")); - }))) + .onRegister(attach( + new TooltipBehavior(tooltips -> { + tooltips.add(Component.translatable("cosmiccore.lore.shard_small.0")); + tooltips.add(Component.translatable("cosmiccore.lore.shard_small.1")); + }), + new com.ghostipedia.cosmiccore.common.reflection.item.ShardConsumeBehavior(1))) .defaultModel() .register(); public static final ItemEntry PERPETUITY_SHARD_LARGE = REGISTRATE .item("large_shard_of_perpetuity", ComponentItem::create) .lang("Large Shard of Perpetuity") .properties(p -> p.stacksTo(64)) - .onRegister(attach(new TooltipBehavior(tooltips -> { - tooltips.add(Component.translatable("cosmiccore.lore.shard_large.0")); - tooltips.add(Component.translatable("cosmiccore.lore.shard_large.1")); - }))) + .onRegister(attach( + new TooltipBehavior(tooltips -> { + tooltips.add(Component.translatable("cosmiccore.lore.shard_large.0")); + tooltips.add(Component.translatable("cosmiccore.lore.shard_large.1")); + }), + new com.ghostipedia.cosmiccore.common.reflection.item.CapacityShardBehavior(10))) .defaultModel() .register(); public static final ItemEntry PERPETUITY_SHARD_MASSIVE = REGISTRATE .item("cluster_of_perpetuity", ComponentItem::create) .lang("Cluster of Perpetuity") - .properties(p -> p.stacksTo(60)) - .onRegister(attach(new TooltipBehavior(tooltips -> { - tooltips.add(Component.translatable("cosmiccore.lore.shard_huge.0")); - tooltips.add(Component.translatable("cosmiccore.lore.shard_huge.1")); - tooltips.add(Component.translatable("cosmiccore.lore.shard_huge.2")); - }))) + .properties(p -> p.stacksTo(16)) + .onRegister(attach( + new TooltipBehavior(tooltips -> { + tooltips.add(Component.translatable("cosmiccore.lore.shard_huge.0")); + tooltips.add(Component.translatable("cosmiccore.lore.shard_huge.1")); + tooltips.add(Component.translatable("cosmiccore.lore.shard_huge.2")); + }), + new com.ghostipedia.cosmiccore.common.reflection.item.ScarRemovalBehavior())) .defaultModel() .register(); public static final ItemEntry WIRELESS_PDA = REGISTRATE @@ -1159,6 +1206,25 @@ public boolean isFoil(ItemStack stack) { }))) .register(); + public static ItemEntry SIMPLE_REBREATHER = REGISTRATE + .item("simple_rebreather", ComponentItem::create) + .lang("Simple Rebreather") + .properties(p -> p.stacksTo(1).fireResistant()) + .onRegister(attach(new TooltipBehavior(list -> { + list.add(Component.translatable("item.cosmiccore.simple_rebreather.tooltip")); + }))) + .register(); + + public static ItemEntry PRESSURIZED_REBREATHER = REGISTRATE + .item("pressurized_rebreather", ComponentItem::create) + .lang("Pressurized Rebreather") + .properties(p -> p.stacksTo(1).fireResistant()) + .onRegister(attach(new TooltipBehavior(list -> { + list.add(Component.translatable("item.cosmiccore.simple_rebreather.tooltip")); + list.add(Component.translatable("item.cosmiccore.pressurized_rebreather.tooltip")); + }))) + .register(); + public static final ItemEntry WAXED_LEATHER = REGISTRATE.item("waxed_leather", ComponentItem::create) .lang("Waxed Leather") .properties(p -> p.stacksTo(64)) @@ -1181,6 +1247,57 @@ public boolean isFoil(ItemStack stack) { .properties(p -> p.stacksTo(64)) .defaultModel() .register(); + + public static final ItemEntry RUNEWOVEN_PCB = REGISTRATE + .item("runewoven_plastic_circuit_board", ComponentItem::create) + .lang("Runewoven Plastic Circuit Board") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry MANA_PCB = REGISTRATE + .item("plastic_circuit_board", ComponentItem::create) + .lang("Mana-doped Plastic Circuit Board") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry ENTHELIC_BOARD = REGISTRATE + .item("multilayered_enthel_circuit_board", ComponentItem::create) + .lang("Multilayered Enthel Circuit Board") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry ENTHELIC_PCB = REGISTRATE + .item("spirit_engraved_enthel_circuit_board", ComponentItem::create) + .lang("Spirit Engraved Enthel Circuit Board") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + + public static final ItemEntry ENTHEL_CPU = REGISTRATE + .item("spirit_runed_enthel_cpu", ComponentItem::create) + .lang("Spirit Runed Enthel CPU") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry ENTHEL_CPU_WAFER = REGISTRATE + .item("spirit_runed_enthel_cpu_wafer", ComponentItem::create) + .lang("Spirit Runed Enthel CPU Wafer") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + + public static final ItemEntry RUNIC_HEX_CPU = REGISTRATE.item("runic_hex_cpu", ComponentItem::create) + .lang("Hex Etched CPU Chip") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry RUNIC_HEX_CPU_WAFER = REGISTRATE + .item("runic_hex_cpu_wafer", ComponentItem::create) + .lang("Hex Etched CPU Wafer") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry BLACKSTONE_PUSTULE = REGISTRATE .item("blackstone_pustule", ComponentItem::create) .lang("Blackstone Pustule") @@ -1196,6 +1313,96 @@ public boolean isFoil(ItemStack stack) { // .register(); // New Circuits + + // Hex circuits + public static final ItemEntry HEX_PROCESSOR = REGISTRATE + .item("hex_processor", ComponentItem::create) + .lang("Hex Processor") + .tag(CustomTags.MV_CIRCUITS) + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry HEX_PROCESSOR_ASSEMBLY = REGISTRATE + .item("hex_processor_assembly", ComponentItem::create) + .lang("Hex Processor Assembly") + .tag(CustomTags.HV_CIRCUITS) + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry HEX_PROCESSOR_SUPERCOMPUTER = REGISTRATE + .item("hex_processor_supercomputer", ComponentItem::create) + .lang("Hex Processor Supercomputer") + .tag(CustomTags.EV_CIRCUITS) + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry HEX_PROCESSOR_MAINFRAME = REGISTRATE + .item("hex_processor_mainframe", ComponentItem::create) + .lang("Hex Processor Mainframe") + .tag(CustomTags.IV_CIRCUITS) + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + // Enthelic + public static final ItemEntry ENTHELIC_PROCESSOR = REGISTRATE + .item("enthelic_processor", ComponentItem::create) + .lang("Enthelic Processor") + .tag(CustomTags.HV_CIRCUITS) + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry ENTHELIC_PROCESSOR_ASSEMBLY = REGISTRATE + .item("enthelic_processor_assembly", ComponentItem::create) + .lang("Enthelic Processor Assembly") + .tag(CustomTags.EV_CIRCUITS) + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry ENTHELIC_PROCESSOR_SUPERCOMPUTER = REGISTRATE + .item("enthelic_processor_supercomputer", ComponentItem::create) + .lang("Enthelic Processor Supercomputer") + .tag(CustomTags.IV_CIRCUITS) + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry ENTHELIC_PROCESSOR_MAINFRAME = REGISTRATE + .item("enthelic_processor_mainframe", ComponentItem::create) + .lang("Enthelic Processor Mainframe") + .tag(CustomTags.LuV_CIRCUITS) + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + + // Lucidic + public static final ItemEntry LUCIDIC_PROCESSOR = REGISTRATE + .item("lucidic_processor", ComponentItem::create) + .lang("Lucidic Processor") + .tag(CustomTags.EV_CIRCUITS) + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry LUCIDIC_PROCESSOR_ASSEMBLY = REGISTRATE + .item("lucidic_processor_assembly", ComponentItem::create) + .lang("Lucidic Processor Assembly") + .tag(CustomTags.IV_CIRCUITS) + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry LUCIDIC_PROCESSOR_SUPERCOMPUTER = REGISTRATE + .item("lucidic_processor_supercomputer", ComponentItem::create) + .lang("Lucidic Processor Supercomputer") + .tag(CustomTags.LuV_CIRCUITS) + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry LUCIDIC_PROCESSOR_MAINFRAME = REGISTRATE + .item("lucidic_processor_mainframe", ComponentItem::create) + .lang("Lucidic Processor Mainframe") + .tag(CustomTags.ZPM_CIRCUITS) + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + // Harmonic (ZPM-UEV) public static final ItemEntry SONAR_PROCESSOR = REGISTRATE .item("harmonic_processor", ComponentItem::create) @@ -1789,6 +1996,412 @@ public boolean isFoil(ItemStack stack) { .defaultModel() .register(); + // WildFire Cores + public static final ItemEntry LV_WILDFIRE_CORE = REGISTRATE + .item("lv_wildfire_core", ComponentItem::create) + .lang("LV Wildfire Core") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry MV_WILDFIRE_CORE = REGISTRATE + .item("mv_wildfire_core", ComponentItem::create) + .lang("MV Wildfire Core") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry HV_WILDFIRE_CORE = REGISTRATE + .item("hv_wildfire_core", ComponentItem::create) + .lang("HV Wildfire Core") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry EV_WILDFIRE_CORE = REGISTRATE + .item("ev_wildfire_core", ComponentItem::create) + .lang("EV Wildfire Core") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry IV_WILDFIRE_CORE = REGISTRATE + .item("iv_wildfire_core", ComponentItem::create) + .lang("IV Wildfire Core") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry LUV_WILDFIRE_CORE = REGISTRATE + .item("luv_wildfire_core", ComponentItem::create) + .lang("LuV Wildfire Core") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry ZPM_WILDFIRE_CORE = REGISTRATE + .item("zpm_wildfire_core", ComponentItem::create) + .lang("ZPM Wildfire Core") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + + public static final ItemEntry BASIC_GENE_KIT = REGISTRATE + .item("basic_gene_kit", ComponentItem::create) + .lang("Basic Gene Kit") + .properties(p -> p.stacksTo(16)) + .defaultModel() + .register(); + + public static final ItemEntry INTERMEDIATE_GENE_KIT = REGISTRATE + .item("intermediate_gene_kit", ComponentItem::create) + .lang("Intermediate Gene Kit") + .properties(p -> p.stacksTo(16)) + .defaultModel() + .register(); + + public static final ItemEntry ADVANCED_GENE_KIT = REGISTRATE + .item("advanced_gene_kit", ComponentItem::create) + .lang("Advanced Gene Kit") + .properties(p -> p.stacksTo(16)) + .defaultModel() + .register(); + + // MANA WAFERS AND CHIPS + public static final ItemEntry LATENT_CAPACITY_WAFER = REGISTRATE + .item("latent_capacity_wafer", ComponentItem::create) + .lang("Latent Capacity Wafer") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry LATENT_EFFICACY_WAFER = REGISTRATE + .item("latent_efficacy_wafer", ComponentItem::create) + .lang("Latent Efficacy Wafer") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry LATENT_POTENCY_WAFER = REGISTRATE + .item("latent_potency_wafer", ComponentItem::create) + .lang("Latent Potency Wafer") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry LATENT_VERBOSITY_WAFER = REGISTRATE + .item("latent_verbosity_wafer", ComponentItem::create) + .lang("Latent Verbosity Wafer") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + // BOULE AND WAFER + public static final ItemEntry LIVINGROCK_ALUMINATE_BOULE = REGISTRATE + .item("livingrock_aluminate_boule", ComponentItem::create) + .lang("Livingrock Aluminate Boule") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry LIVINGROCK_ALUMINATE_WAFER = REGISTRATE + .item("livirock_aluminite_wafer", ComponentItem::create) + .lang("Livingrock Aluminate Wafer") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + // CHIPS + public static final ItemEntry CAPACITY_CHIP = REGISTRATE + .item("capacity_chip", ComponentItem::create) + .lang("Capacity Chip") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry EFFICACY_CHIP = REGISTRATE + .item("efficacy_chip", ComponentItem::create) + .lang("Efficacy Chip") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry POTENCY_CHIP = REGISTRATE + .item("potency_chip", ComponentItem::create) + .lang("Potency Chip") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry VERBOSITY_CHIP = REGISTRATE + .item("verbosity_chip", ComponentItem::create) + .lang("Verbosity Chip") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + + // Project Star Eater + + public static final ItemEntry HAULER_PROBE_GRADE_1 = REGISTRATE + .item("freight_beetle_grade_1", ComponentItem::create) + .lang("Hauler Probe Mk.1") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry ARMORED_HAULER_PROBE_GRADE_1 = REGISTRATE + .item("armored_freight_beetle_grade_1", ComponentItem::create) + .lang("Armored Hauler Probe Mk.1") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry CRUSHER_WASPS_GRADE_1 = REGISTRATE + .item("crusher_wasps_grade_1", ComponentItem::create) + .lang("Crusher Wasps Mk.1") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry RAZOR_HORNET_GRADE_1 = REGISTRATE + .item("razor_hornet_grade_1", ComponentItem::create) + .lang("Razor Hornet Mk.1") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry PULVERIZING_BEETLE_GRADE_1 = REGISTRATE + .item("pulverizing_beetle_grade_1", ComponentItem::create) + .lang("Pulverizing Beetle Mk.1") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry CRUCIBLE_MANTIS_GRADE_1 = REGISTRATE + .item("crucible_mantis_grade_1", ComponentItem::create) + .lang("Crucible Mantis Mk.1") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry HAULER_PROBE_GRADE_2 = REGISTRATE + .item("freight_beetle_grade_2", ComponentItem::create) + .lang("Hauler Probe Mk.2") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry ARMORED_HAULER_PROBE_GRADE_2 = REGISTRATE + .item("armored_freight_beetle_grade_2", ComponentItem::create) + .lang("Armored Hauler Probe Mk.2") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry CRUSHER_WASPS_GRADE_2 = REGISTRATE + .item("crusher_wasps_grade_2", ComponentItem::create) + .lang("Crusher Wasps Mk.2") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry RAZOR_HORNET_GRADE_2 = REGISTRATE + .item("razor_hornet_grade_2", ComponentItem::create) + .lang("Razor Hornet Mk.2") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry PULVERIZING_BEETLE_GRADE_2 = REGISTRATE + .item("pulverizing_beetle_grade_2", ComponentItem::create) + .lang("Pulverizing Beetle Mk.2") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry CRUCIBLE_MANTIS_GRADE_2 = REGISTRATE + .item("razor_hornet_grade_2", ComponentItem::create) + .lang("Crucible Mantis Mk.2") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + // GRADE 3 + + public static final ItemEntry HAULER_PROBE_GRADE_3 = REGISTRATE + .item("freight_beetle_grade_3", ComponentItem::create) + .lang("Hauler Probe Mk.3") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry ARMORED_HAULER_PROBE_GRADE_3 = REGISTRATE + .item("armored_freight_beetle_grade_3", ComponentItem::create) + .lang("Armored Hauler Probe Mk.3") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry CRUSHER_WASPS_GRADE_3 = REGISTRATE + .item("crusher_wasps_grade_3", ComponentItem::create) + .lang("Crusher Wasps Mk.3") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry RAZOR_HORNET_GRADE_3 = REGISTRATE + .item("razor_hornet_grade_3", ComponentItem::create) + .lang("Razor Hornet Mk.3") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry PULVERIZING_BEETLE_GRADE_3 = REGISTRATE + .item("pulverizing_beetle_grade_3", ComponentItem::create) + .lang("Pulverizing Beetle Mk.3") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry CRUCIBLE_MANTIS_GRADE_3 = REGISTRATE + .item("razor_hornet_grade_3", ComponentItem::create) + .lang("Crucible Mantis Mk.3") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + // GRADE 4 + + public static final ItemEntry HAULER_PROBE_GRADE_4 = REGISTRATE + .item("freight_beetle_grade_4", ComponentItem::create) + .lang("Hauler Probe Mk.4") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry ARMORED_HAULER_PROBE_GRADE_4 = REGISTRATE + .item("armored_freight_beetle_grade_4", ComponentItem::create) + .lang("Armored Hauler Probe Mk.4") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry CRUSHER_WASPS_GRADE_4 = REGISTRATE + .item("crusher_wasps_grade_4", ComponentItem::create) + .lang("Crusher Wasps Mk.4") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry RAZOR_HORNET_GRADE_4 = REGISTRATE + .item("razor_hornet_grade_4", ComponentItem::create) + .lang("Razor Hornet Mk.4") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry PULVERIZING_BEETLE_GRADE_4 = REGISTRATE + .item("pulverizing_beetle_grade_4", ComponentItem::create) + .lang("Pulverizing Beetle Mk.4") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry CRUCIBLE_MANTIS_GRADE_4 = REGISTRATE + .item("razor_hornet_grade_4", ComponentItem::create) + .lang("Crucible Mantis Mk.4") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry HAULER_PROBE_GRADE_5 = REGISTRATE + .item("freight_beetle_grade_5", ComponentItem::create) + .lang("Hauler Probe Mk.5") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry ARMORED_HAULER_PROBE_GRADE_5 = REGISTRATE + .item("armored_freight_beetle_grade_5", ComponentItem::create) + .lang("Armored Hauler Probe Mk.5") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry CRUSHER_WASPS_GRADE_5 = REGISTRATE + .item("crusher_wasps_grade_5", ComponentItem::create) + .lang("Crusher Wasps Mk.5") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry RAZOR_HORNET_GRADE_5 = REGISTRATE + .item("razor_hornet_grade_5", ComponentItem::create) + .lang("Razor Hornet Mk.5") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry PULVERIZING_BEETLE_GRADE_5 = REGISTRATE + .item("pulverizing_beetle_grade_5", ComponentItem::create) + .lang("Pulverizing Beetle Mk.5") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry CRUCIBLE_MANTIS_GRADE_5 = REGISTRATE + .item("razor_hornet_grade_5", ComponentItem::create) + .lang("Crucible Mantis Mk.5") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + + public static final ItemEntry WRENCH_CAST_GOLD = REGISTRATE + .item("wrench_head_cast", ComponentItem::create) + .lang("Wrench Head Cast") + .properties(p -> p.stacksTo(1)) + .tag(CosmicItemTags.WRENCH_HEAD_CAST_MULTI) + .defaultModel() + .register(); + public static final ItemEntry WRENCH_CAST_SAND = REGISTRATE + .item("wrench_head_sand_cast", ComponentItem::create) + .lang("Wrench Head Sand Cast") + .tag(CosmicItemTags.WRENCH_HEAD_CAST_SINGLE) + .properties(p -> p.stacksTo(1)) + .defaultModel() + .register(); + + public static final ItemEntry SCREWDRIVER_CAST_GOLD = REGISTRATE + .item("screwdriver_head_cast", ComponentItem::create) + .lang("Screwdriver Head Cast") + .properties(p -> p.stacksTo(1)) + .tag(CosmicItemTags.SCREWDRIVER_HEAD_CAST_MULTI) + .defaultModel() + .register(); + public static final ItemEntry SCREWDRIVER_CAST_SAND = REGISTRATE + .item("screwdriver_head_sand_cast", ComponentItem::create) + .lang("Screwdriver Head Sand Cast") + .tag(CosmicItemTags.SCREWDRIVER_HEAD_CAST_SINGLE) + .properties(p -> p.stacksTo(1)) + .defaultModel() + .register(); + public static ItemEntry LINKED_TERMINAL = REGISTRATE .item("linked_terminal", ComponentItem::create) .lang("Linked Terminal") @@ -1800,6 +2413,233 @@ public boolean isFoil(ItemStack stack) { .onRegister(attach(new LinkedTerminalBehavior())) .register(); + public static final ItemEntry CARBON_ASTEROID = REGISTRATE + .item("carbon_asteroid_base", AsteroidItem::new) + .lang("Carbonic Asteroid") + .properties(p -> p.stacksTo(1)) + .tag() + .defaultModel() + .onRegister(attachRenderer(() -> RadianceItemRenderer.INSTANCE)) + .register(); + public static final ItemEntry FERRIC_ASTEROID = REGISTRATE + .item("ferric_asteroid", AsteroidItem::new) + .lang("Ferric Asteroid") + .properties(p -> p.stacksTo(1)) + .tag() + .defaultModel() + .onRegister(attachRenderer(() -> RadianceItemRenderer.INSTANCE)) + .register(); + + public static final ItemEntry RARE_METAL_ASTEROID = REGISTRATE + .item("rare_metals_asteroid", AsteroidItem::new) + .lang("Exotic Metals Asteroid") + .properties(p -> p.stacksTo(1)) + .tag() + .defaultModel() + .onRegister(attachRenderer(() -> RadianceItemRenderer.INSTANCE)) + .register(); + + public static final ItemEntry AURIC_ASTEROID = REGISTRATE + .item("auric_asteroid", AsteroidItem::new) + .lang("Auric Asteroid") + .properties(p -> p.stacksTo(1)) + .tag() + .defaultModel() + .onRegister(attachRenderer(() -> RadianceItemRenderer.INSTANCE)) + .register(); + + public static final ItemEntry BRIMSTONE_ASTEROID = REGISTRATE + .item("brimstone_asteroid", AsteroidItem::new) + .lang("Brimstone Asteroid") + .properties(p -> p.stacksTo(1)) + .tag() + .defaultModel() + .onRegister(attachRenderer(() -> RadianceItemRenderer.INSTANCE)) + .register(); + + public static final ItemEntry LITH_ASTEROID = REGISTRATE + .item("lith_asteroid", AsteroidItem::new) + .lang("Lith Asteroid") + .properties(p -> p.stacksTo(1)) + .tag() + .defaultModel() + .onRegister(attachRenderer(() -> RadianceItemRenderer.INSTANCE)) + .register(); + + public static final ItemEntry MAFIC_ASTEROID = REGISTRATE + .item("mafic_asteroid", AsteroidItem::new) + .lang("Mafic Asteroid") + .properties(p -> p.stacksTo(1)) + .tag() + .defaultModel() + .onRegister(attachRenderer(() -> RadianceItemRenderer.INSTANCE)) + .register(); + + public static final ItemEntry MOSSY_ASTEROID = REGISTRATE + .item("mossy_asteroid", AsteroidItem::new) + .lang("Mossy Asteroid") + .properties(p -> p.stacksTo(1)) + .tag() + .defaultModel() + .onRegister(attachRenderer(() -> RadianceItemRenderer.INSTANCE)) + .register(); + + public static final ItemEntry OCCULT_ASTEROID = REGISTRATE + .item("occult_asteroid", AsteroidItem::new) + .lang("Occult Asteroid") + .properties(p -> p.stacksTo(1)) + .tag() + .defaultModel() + .onRegister(attachRenderer(() -> RadianceItemRenderer.INSTANCE)) + .register(); + + public static final ItemEntry OXIDE_ASTEROID = REGISTRATE + .item("oxide_asteroid", AsteroidItem::new) + .lang("Oxide Asteroid") + .properties(p -> p.stacksTo(1)) + .tag() + .defaultModel() + .onRegister(attachRenderer(() -> RadianceItemRenderer.INSTANCE)) + .register(); + + public static final ItemEntry SANGUINE_ASTEROID = REGISTRATE + .item("sanguine_asteroid", AsteroidItem::new) + .lang("Sanguine Asteroid") + .properties(p -> p.stacksTo(1)) + .tag() + .defaultModel() + .onRegister(attachRenderer(() -> RadianceItemRenderer.INSTANCE)) + .register(); + + public static final ItemEntry WASTELAND_ASTEROID = REGISTRATE + .item("wasteland_asteroid", AsteroidItem::new) + .lang("Wasteland Asteroid") + .properties(p -> p.stacksTo(1)) + .tag() + .defaultModel() + .onRegister(attachRenderer(() -> RadianceItemRenderer.INSTANCE)) + .register(); + + public static final ItemEntry TUNGSTENSTEEL_NANOLATTICE_SPOOL = REGISTRATE + .item("tungstensteel_nanolattice_spool", ComponentItem::create) + .lang("Tungstensteel Nanolattice Spool") + .properties(p -> p.stacksTo(16)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry TRINAVINE_NANOLATTICE_SPOOL = REGISTRATE + .item("trinavine_nanolattice_spool", ComponentItem::create) + .lang("Trinavine Nanolattice Spool") + .properties(p -> p.stacksTo(16)) + .tag() + .defaultModel() + .register(); + // What we'd write our NBT ON and Read in LARVA + public static final ItemEntry TARGETING_CHIP = REGISTRATE + .item("asteroid_targeting_chip", props -> new AsteroidTargetingChipItem(props.stacksTo(1))) + .lang("Asteroid Targeting Chip") + .properties(p -> p.stacksTo(1)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry FLESH_PACKED_PLUTONIUM_FUEL = REGISTRATE + .item("flesh_packed_plutonium_fuel", ComponentItem::create) + .lang("Flesh Packed Plutonium Fuel") + .properties(p -> p.stacksTo(1)) + .defaultModel() + .register(); + + public static final ItemEntry FLESH_PACKED_URANIUM_FUEL = REGISTRATE + .item("flesh_packed_uranium_fuel", ComponentItem::create) + .lang("Flesh Packed Uranium Fuel") + .properties(p -> p.stacksTo(1)) + .defaultModel() + .register(); + + public static final ItemEntry FLESH_PACKED_NEPTUNIUM_FUEL = REGISTRATE + .item("flesh_packed_neptunium_fuel", ComponentItem::create) + .lang("Flesh Packed Neptunium Fuel") + .properties(p -> p.stacksTo(1)) + .defaultModel() + .register(); + + public static final ItemEntry SPENT_FLESH_PACKED_PLUTONIUM_FUEL = REGISTRATE + .item("spent_flesh_packed_plutonium_fuel", ComponentItem::create) + .lang("Spent Flesh Packed Plutonium Fuel") + .properties(p -> p.stacksTo(1)) + .defaultModel() + .register(); + + public static final ItemEntry SPENT_FLESH_PACKED_URANIUM_FUEL = REGISTRATE + .item("spent_flesh_packed_uranium_fuel", ComponentItem::create) + .lang("Spent Flesh Packed Uranium Fuel") + .properties(p -> p.stacksTo(1)) + .defaultModel() + .register(); + + public static final ItemEntry SPENT_FLESH_PACKED_NEPTUNIUM_FUEL = REGISTRATE + .item("spent_flesh_packed_neptunium_fuel", ComponentItem::create) + .lang("Spent Flesh Packed Neptunium Fuel") + .properties(p -> p.stacksTo(1)) + .defaultModel() + .register(); + + public static final ItemEntry SUPERHEATED_FUEL_ROD = REGISTRATE + .item("superheated_fuel_rod", ComponentItem::create) + .lang("Superheated Fuel Rod") + .properties(p -> p.stacksTo(1)) + .defaultModel() + .register(); + + public static final ItemEntry EMPTY_FUEL_ROD = REGISTRATE + .item("empty_fuel_rod", ComponentItem::create) + .lang("Empty Fuel Rod") + .properties(p -> p.stacksTo(16)) + .defaultModel() + .register(); + + public static final ItemEntry FLESH_WASTE_URANIUM = REGISTRATE + .item("fleshy_uranium_waste", ComponentItem::create) + .lang("Bio-Metallic Fleshy Uranium Waste") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + + public static final ItemEntry FLESH_WASTE_PLUTONIUM = REGISTRATE + .item("fleshy_plutonium_waste", ComponentItem::create) + .lang("Bio-Metallic Fleshy Plutonium Waste") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + + public static final ItemEntry FLESH_WASTE_NEPTUNIUM = REGISTRATE + .item("fleshy_neptunium_waste", ComponentItem::create) + .lang("Bio-Metallic Fleshy Neptunium Waste") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + + // ------------------------------------------------------------------------- + // Oxygen Supply Tanks + // ------------------------------------------------------------------------- + + public static final ItemEntry OXYGEN_SUPPLY_TANK_BRONZE = REGISTRATE + .item("bronze_supply_tank", OxygenTankItem::new) + .lang("Bronze Supply Tank") + .properties(p -> p.stacksTo(1)) + .onRegister(attach(new OxygenSupplyTankBehavior(1000, 5, 10))) + .defaultModel() + .register(); + + public static final ItemEntry OXYGEN_SUPPLY_TANK_STEEL = REGISTRATE + .item("steel_supply_tank", OxygenTankItem::new) + .lang("Steel Supply Tank") + .properties(p -> p.stacksTo(1)) + .onRegister(attach(new OxygenSupplyTankBehavior(2500, 5, 15))) + .defaultModel() + .register(); + public static ICustomDescriptionId cellName() { return new ICustomDescriptionId() { @@ -1816,6 +2656,107 @@ public static NonNullConsumer attach(IItemComponent return item -> item.attachComponents(components); } + // ------------------------------------------------------------------------- + // Cosmic Boots - Additive movement bonuses that stack with Quake movement + // Tiers: Hydraulic (LV), Nano (HV), Quark (IV), Sanguine (ZPM) + // All boots have +1 step height via attribute modifier + // ------------------------------------------------------------------------- + + // Hydraulic Boots (LV) - Entry level mobility boots + // Feels like a nice upgrade from vanilla - snappy and responsive + public static ItemEntry HYDRAULIC_BOOTS = REGISTRATE + .item("hydraulic_boots", + (p) -> new ArmorComponentItem(GTArmorMaterials.ARMOR, ArmorItem.Type.BOOTS, p) + .setArmorLogic(new CosmicBootsArmorLogic( + 128, // energyPerUse + 400_000L, // capacity (LV tier) + 1, // tier (LV) + 0.8, // maxSpeed cap (b/t) + 2.0, // groundAcceleration bonus + 0.5, // groundDeceleration + 0.8, // airControl bonus + 3.0, // jumpPower - ~4 blocks high + true, // fallNegation + "textures/armor/hydraulic_boots.png"))) + .lang("Hydraulic Globetrotters Boots") + .properties(p -> p.rarity(Rarity.UNCOMMON)) + .tag(CustomTags.PPE_ARMOR) + .register(); + + // Nano Boots (HV) - Mid-tier, noticeably quick + // Clear upgrade from Hydraulic - you feel the difference immediately + public static ItemEntry NANO_BOOTS = REGISTRATE + .item("nano_boots", + (p) -> new ArmorComponentItem(GTArmorMaterials.ARMOR, ArmorItem.Type.BOOTS, p) + .setArmorLogic(new CosmicBootsArmorLogic( + 512, // energyPerUse + 6_400_000L, // capacity (HV tier) + 3, // tier (HV) + 1.5, // maxSpeed cap (b/t) + 4.0, // groundAcceleration bonus + 0.6, // groundDeceleration + 1.0, // airControl bonus + 4.0, // jumpPower - ~5 blocks high + true, // fallNegation + "textures/armor/nano_boots.png"))) + .lang("NanoMuscle\u2122 Globetrotters Boots") + .properties(p -> p.rarity(Rarity.RARE)) + .tag(CustomTags.PPE_ARMOR) + .register(); + + // Quark Boots (IV) - High-tier, fast as hell + // Like riding a motorcycle - exhilarating speed with control + public static ItemEntry QUARK_BOOTS = REGISTRATE + .item("quark_boots", + (p) -> new ArmorComponentItem(GTArmorMaterials.ARMOR, ArmorItem.Type.BOOTS, p) + .setArmorLogic(new CosmicBootsArmorLogic( + 2048, // energyPerUse + 25_600_000L, // capacity (IV tier) + 5, // tier (IV) + 1.25, // maxSpeed cap (b/t) + 3.5, // groundAcceleration bonus + 0.75, // groundDeceleration + 1.2, // airControl bonus + 3.5, // jumpPower - ~4.5 blocks high + true, // fallNegation + "textures/armor/quark_boots.png"))) + .lang("QuarkTech\u2122 Globetrotters Boots") + .properties(p -> p.rarity(Rarity.EPIC)) + .tag(CustomTags.PPE_ARMOR) + .register(); + + // Sanguine Boots (ZPM) - Ultimate tier, very fast + // Shot out of a cannon - high speed with great control + public static ItemEntry SANGUINE_BOOTS = REGISTRATE + .item("sanguine_boots", + (p) -> new ArmorComponentItem(GTArmorMaterials.ARMOR, ArmorItem.Type.BOOTS, p) + .setArmorLogic(new CosmicBootsArmorLogic( + 8192, // energyPerUse + 409_600_000L, // capacity (ZPM tier) + 7, // tier (ZPM) + 2.25, // maxSpeed cap (b/t) + 6.0, // groundAcceleration bonus + 0.9, // groundDeceleration - can stop on a dime + 1.5, // airControl bonus - full air control + 6.5, // jumpPower - ~8 blocks high + true, // fallNegation + "textures/armor/sanguine_boots.png"))) + .lang("Sanguine Globetrotters Boots") + .properties(p -> p.rarity(Rarity.EPIC)) + .tag(CustomTags.PPE_ARMOR) + .register(); + + // ------------------------------------------------------------------------- + // Reflection System + // ------------------------------------------------------------------------- + + public static final ItemEntry REFLECTION_MIRROR = REGISTRATE + .item("reflection_mirror", MirrorItem::new) + .lang("Mirror of Erosion") + .properties(p -> p.stacksTo(1)) + .defaultModel() + .register(); + public static NonNullConsumer modelPredicate(ResourceLocation predicate, Function property) { return item -> { diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicMachines.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicMachines.java index 341341e3f..6cf807d16 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicMachines.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicMachines.java @@ -1,6 +1,7 @@ package com.ghostipedia.cosmiccore.common.data; import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.capability.recipe.EmberRecipeCapability; import com.ghostipedia.cosmiccore.api.machine.multiblock.DimensionalEnergyCapacitor; import com.ghostipedia.cosmiccore.api.machine.multiblock.DimensionalEnergyInterface; import com.ghostipedia.cosmiccore.api.machine.part.CosmicPartAbility; @@ -9,7 +10,10 @@ import com.ghostipedia.cosmiccore.api.machine.part.WirelessEnergyHatchPartMachine; import com.ghostipedia.cosmiccore.api.registries.CosmicRegistration; import com.ghostipedia.cosmiccore.client.renderer.machine.CosmicDynamicRenderHelpers; +import com.ghostipedia.cosmiccore.common.ae2gt.CosmicStockingBusPartMachine; +import com.ghostipedia.cosmiccore.common.ae2gt.CosmicStockingHatchPartMachine; import com.ghostipedia.cosmiccore.common.block.debug.CreativeThermiaContainerMachine; +import com.ghostipedia.cosmiccore.common.machine.IndustrialApiaryMachine; import com.ghostipedia.cosmiccore.common.machine.WirelessChargerMachine; import com.ghostipedia.cosmiccore.common.machine.multiblock.electric.hpca.HPCAMachine; import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.WirelessDataBankMachine; @@ -23,10 +27,7 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; import com.gregtechceu.gtceu.api.data.RotationState; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; -import com.gregtechceu.gtceu.api.machine.MachineDefinition; -import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.*; import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.machine.steam.SimpleSteamMachine; @@ -36,6 +37,7 @@ import com.gregtechceu.gtceu.api.pattern.Predicates; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; +import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifierList; import com.gregtechceu.gtceu.api.registry.registrate.MachineBuilder; import com.gregtechceu.gtceu.client.util.TooltipHelper; import com.gregtechceu.gtceu.common.data.*; @@ -45,6 +47,8 @@ import com.gregtechceu.gtceu.common.machine.multiblock.electric.ActiveTransformerMachine; import com.gregtechceu.gtceu.common.machine.multiblock.electric.FusionReactorMachine; import com.gregtechceu.gtceu.common.machine.multiblock.electric.PowerSubstationMachine; +import com.gregtechceu.gtceu.common.machine.multiblock.part.EnergyHatchPartMachine; +import com.gregtechceu.gtceu.common.machine.multiblock.part.FluidHatchPartMachine; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.utils.FormattingUtil; @@ -63,16 +67,24 @@ import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.*; import static com.ghostipedia.cosmiccore.common.data.CosmicMachinesUtils.*; +import static com.ghostipedia.cosmiccore.common.data.recipe.CosmicRecipeModifiers.COSMIC_MODULES; import static com.ghostipedia.cosmiccore.common.machine.multiblock.electric.hpca.HPCAMachine.*; +import static com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes.BIO_LAB; import static com.gregtechceu.gtceu.api.GTValues.*; +import static com.gregtechceu.gtceu.api.capability.recipe.IO.IN; +import static com.gregtechceu.gtceu.api.capability.recipe.IO.OUT; +import static com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties.*; import static com.gregtechceu.gtceu.api.pattern.Predicates.*; import static com.gregtechceu.gtceu.api.pattern.util.RelativeDirection.*; import static com.gregtechceu.gtceu.common.data.GCYMBlocks.*; import static com.gregtechceu.gtceu.common.data.GTBlocks.*; import static com.gregtechceu.gtceu.common.data.GTMachines.CREATIVE_TOOLTIPS; +import static com.gregtechceu.gtceu.common.data.GTMachines.ITEM_IMPORT_BUS; +import static com.gregtechceu.gtceu.common.data.GTRecipeModifiers.*; import static com.gregtechceu.gtceu.common.data.GTRecipeTypes.CENTRIFUGE_RECIPES; import static com.gregtechceu.gtceu.common.data.GTRecipeTypes.DUMMY_RECIPES; import static com.gregtechceu.gtceu.common.data.machines.GTMachineUtils.*; +import static com.gregtechceu.gtceu.common.data.machines.GTMachineUtils.registerTieredMachines; import static com.gregtechceu.gtceu.common.data.machines.GTMultiMachines.FUSION_REACTOR; import static com.gregtechceu.gtceu.common.data.models.GTMachineModels.*; @@ -162,20 +174,217 @@ public class CosmicMachines { .register(), ZPM, UV, UHV, UEV, UIV); + public static final MachineDefinition[] COSMIC_MODULE_HATCH = registerTieredMachines("module_hatch", + ModuleHatchPartMachine::new, + (tier, builder) -> builder + .langValue(switch (tier) { + case 8 -> "Basic"; + case 9 -> "Advanced"; + case 10 -> "Elite"; + default -> "Simple"; + } + " Module Hatch") + .rotationState(RotationState.ALL) + .modelProperty(GTMachineModelProperties.IS_FORMED, false) + .abilities(CosmicPartAbility.MODULE_HATCH) + // TODO for ghosti: give tooltip and model + .overlayTieredHullModel("module_hatch") + .tooltips(Component.translatable("gtceu.machine.parallel_hatch_mk_1.tooltip")) + .register(), + UV, UHV, UEV); + public static final MachineDefinition[] CALX_REACTOR = registerTieredMachines("calx_reactor", + (holder, tier) -> new SimpleTieredMachine(holder, tier, defaultTankSizeFunction), + (tier, builder) -> builder + .recipeType(CENTRIFUGE_RECIPES) + .editableUI(SimpleTieredMachine.EDITABLE_UI_CREATOR.apply(CosmicCore.id("calx_reactor"), + CosmicRecipeTypes.CALX_REACTOR)) + .tooltipBuilder((stack, list) -> { + list.add(Component.translatable("cosmiccore.calx_reactor.desc")); + }) + .tooltips(workableTiered(tier, GTValues.V[tier], GTValues.V[tier] * 64, + CosmicRecipeTypes.CALX_REACTOR, + defaultTankSizeFunction.applyAsInt(tier), true)) + .workableTieredHullModel(CosmicCore.id("block/overlay/machine/calx_reactor")) + .register(), + ELECTRIC_TIERS); + + public static final MachineDefinition[] MANA_LEACHING_TUB = registerTieredMachines("mana_leaching_tub", + (holder, tier) -> new SimpleTieredMachine(holder, tier, defaultTankSizeFunction), + (tier, builder) -> builder.recipeType(CENTRIFUGE_RECIPES) + .editableUI(SimpleTieredMachine.EDITABLE_UI_CREATOR.apply(CosmicCore.id("mana_leaching_tub"), + CosmicRecipeTypes.MANA_LEACHING_TUB)) + .tooltipBuilder((stack, list) -> { + list.add(Component.translatable("cosmiccore.mana_leaching_tub.desc")); + }) + .tooltips(workableTiered(tier, GTValues.V[tier], GTValues.V[tier] * 64, + CosmicRecipeTypes.MANA_LEACHING_TUB, + defaultTankSizeFunction.applyAsInt(tier), true)) + .workableTieredHullModel(CosmicCore.id("block/overlay/machine/mana_leaching_tub")) + .register(), + ELECTRIC_TIERS); + + public static final MachineDefinition[] ROASTER = registerTieredMachines("roaster", + (holder, tier) -> new SimpleTieredMachine(holder, tier, defaultTankSizeFunction), + (tier, builder) -> builder.recipeType(CENTRIFUGE_RECIPES) + .editableUI(SimpleTieredMachine.EDITABLE_UI_CREATOR.apply(CosmicCore.id("roaster"), + CosmicRecipeTypes.ROASTER)) + .tooltipBuilder((stack, list) -> { + list.add(Component.translatable("cosmiccore.roaster.desc")); + }) + .tooltips(workableTiered(tier, GTValues.V[tier], GTValues.V[tier] * 64, CosmicRecipeTypes.ROASTER, + defaultTankSizeFunction.applyAsInt(tier), true)) + .workableTieredHullModel(CosmicCore.id("block/overlay/machine/roaster")) + .register(), + ELECTRIC_TIERS); + + public static final MachineDefinition[] THERMOMAG = registerTieredMachines("thermomagnitizer", + (holder, tier) -> new SimpleTieredMachine(holder, tier, defaultTankSizeFunction), + (tier, builder) -> builder.recipeType(CENTRIFUGE_RECIPES) + .editableUI(SimpleTieredMachine.EDITABLE_UI_CREATOR.apply(CosmicCore.id("thermomagnitizer"), + CosmicRecipeTypes.THERMOMAG)) + .tooltipBuilder((stack, list) -> { + list.add(Component.translatable("cosmiccore.thermomagnitizer.desc")); + }) + .tooltips(workableTiered(tier, GTValues.V[tier], GTValues.V[tier] * 64, CosmicRecipeTypes.THERMOMAG, + defaultTankSizeFunction.applyAsInt(tier), true)) + .workableTieredHullModel(CosmicCore.id("block/overlay/machine/thermomagnitizer")) + .register(), + ELECTRIC_TIERS); + + public static final MachineDefinition[] VAC_BUBBLER = registerTieredMachines("vacuum_bubbler", + (holder, tier) -> new SimpleTieredMachine(holder, tier, defaultTankSizeFunction), + (tier, builder) -> builder + .recipeType(CENTRIFUGE_RECIPES) + .editableUI(SimpleTieredMachine.EDITABLE_UI_CREATOR.apply(CosmicCore.id("vacuum_bubbler"), + CosmicRecipeTypes.VAC_BUBBLER)) + .tooltipBuilder((stack, list) -> { + list.add(Component.translatable("cosmiccore.vacuum_bubbler.desc")); + }) + .tooltips( + workableTiered(tier, GTValues.V[tier], GTValues.V[tier] * 64, CosmicRecipeTypes.VAC_BUBBLER, + defaultTankSizeFunction.applyAsInt(tier), true)) + .workableTieredHullModel(CosmicCore.id("block/overlay/machine/vacuum_bubbler")) + .register(), + ELECTRIC_TIERS); + public static final MachineDefinition[] WIRELESS_CHARGER = registerTieredMachines("wireless_charger", WirelessChargerMachine::new, (tier, builder) -> builder .langValue("%s Wireless Charger".formatted(VN[tier])) .tooltipBuilder((stack, list) -> { list.add(Component.translatable("cosmiccore.wireless_charger.range.single", - FormattingUtil.formatNumbers(2048L * (tier - GTValues.HV)))); + FormattingUtil.formatNumbers(2048L * (tier - GTValues.MV)))); list.add(Component.translatable("cosmiccore.wireless_charger.range.mixed", - FormattingUtil.formatNumbers(1024L * (tier - GTValues.HV)))); + FormattingUtil.formatNumbers(1024L * (tier - GTValues.MV)))); }) .workableTieredHullModel(CosmicCore.id("block/overlay/machine/wireless_charger")) .register(), GTValues.tiersBetween(HV, UIV)); + public static final MachineDefinition[] INDUSTRIAL_APIARY = registerTieredMachines("electric_apiary", + IndustrialApiaryMachine::new, + (tier, builder) -> builder + .langValue("%s Industrial Production Apiary".formatted(VN[tier])) + .tooltipBuilder((stack, list) -> { + list.add(Component.translatable("cosmiccore.industrial_apiary.tier.description.0")); + list.add(Component.translatable("cosmiccore.industrial_apiary.tier.description.1")); + list.add(Component.translatable("cosmiccore.industrial_apiary.tier.description.2")); + list.add(Component.translatable("cosmiccore.industrial_apiary.tier.description.3")); + list.add(Component.translatable("cosmiccore.industrial_apiary.tier.description.4")); + list.add(Component.translatable("cosmiccore.industrial_apiary.tier.description.5")); + }) + .recipeType(CosmicRecipeTypes.BEES) + .workableTieredHullModel(CosmicCore.id("block/overlay/machine/industrial_apiary")) + .register(), + GTValues.tiersBetween(LV, LuV)); + + public static final MachineDefinition[] BIO_LAB_SINGLE = registerTieredMachines("biolab", + (holder, tier) -> new SimpleTieredMachine(holder, tier, defaultTankSizeFunction), (tier, builder) -> builder + .langValue("%s Bio Lab %s".formatted(VLVH[tier], VLVT[tier])) + .editableUI(SimpleTieredMachine.EDITABLE_UI_CREATOR.apply(GTCEu.id("biolab"), + BIO_LAB)) + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(BIO_LAB) + .recipeModifier(OC_NON_PERFECT) + .workableTieredHullModel(GTCEu.id("block/machines/brewery")) + .tooltips(workableTiered(tier, GTValues.V[tier], GTValues.V[tier] * 64, + BIO_LAB, defaultTankSizeFunction.applyAsInt(tier), true)) + .register(), + EV, IV, LuV, ZPM, UV); + + public final static MachineDefinition COSMIC_STOCKING_ME_PART_BUS = REGISTRATE + .machine("cosmic_me_assemblyline_bus", CosmicStockingBusPartMachine::new) + .langValue("ME Assembly Line Bus") + .tier(UV) + .rotationState(RotationState.ALL) + .abilities(ME_ASSEMBLY_PARTS) + .modelProperty(GTMachineModelProperties.IS_FORMED, false) + .overlayTieredHullModel("item_me_assemblyline") + .tooltips( + Component.translatable("cosmiccore.machine.me.stocking_item.tooltip.0"), + Component.translatable("cosmiccore.machine.me.stocking_item.tooltip.1"), + Component.translatable("cosmiccore.machine.me.stocking_item.tooltip.2"), + Component.translatable("cosmiccore.machine.me.stocking_item.tooltip.3"), + Component.translatable("cosmiccore.machine.me.stocking_item.tooltip.4"), + Component.translatable("cosmiccore.machine.me.stocking_item.tooltip.5"), + Component.translatable("cosmiccore.machine.me.stocking_item.tooltip.6"), + Component.translatable("gtceu.part_sharing.enabled")) + .register(); + + public final static MachineDefinition COSMIC_STOCKING_ME_PART_HATCH = REGISTRATE + .machine("cosmic_me_assemblyline_hatch", CosmicStockingHatchPartMachine::new) + .langValue("ME Assembly Line Hatch") + .tier(UV) + .rotationState(RotationState.ALL) + .abilities(ME_ASSEMBLY_PARTS_FLUID) + .modelProperty(GTMachineModelProperties.IS_FORMED, false) + .overlayTieredHullModel("fluid_me_assemblyline") + .tooltips( + Component.translatable("cosmiccore.machine.me.stocking_item.tooltip.0"), + Component.translatable("cosmiccore.machine.me.stocking_item.tooltip.1"), + Component.translatable("cosmiccore.machine.me.stocking_item.tooltip.2"), + Component.translatable("cosmiccore.machine.me.stocking_item.tooltip.3"), + Component.translatable("cosmiccore.machine.me.stocking_item.tooltip.4"), + Component.translatable("cosmiccore.machine.me.stocking_item.tooltip.5"), + Component.translatable("cosmiccore.machine.me.stocking_item.tooltip.6"), + Component.translatable("gtceu.part_sharing.enabled")) + .register(); + + public static final MachineDefinition[] ENERGY_OUTPUT_HATCH_4A = registerTieredMachines("energy_output_hatch_4a", + (holder, tier) -> new EnergyHatchPartMachine(holder, tier, OUT, 4), + (tier, builder) -> builder + .langValue(VNF[tier] + " 4A Dynamo Hatch") + .rotationState(RotationState.ALL) + .abilities(PartAbility.OUTPUT_ENERGY) + .modelProperty(IS_FORMED, false) + .tooltips(Component.translatable("gtceu.universal.tooltip.voltage_out", + FormattingUtil.formatNumbers(V[tier]), VNF[tier]), + Component.translatable("gtceu.universal.tooltip.amperage_out", 4), + Component.translatable("gtceu.universal.tooltip.energy_storage_capacity", + FormattingUtil + .formatNumbers(EnergyHatchPartMachine.getHatchEnergyCapacity(tier, 4))), + Component.translatable("gtceu.machine.energy_hatch.output_hi_amp.tooltip")) + .overlayTieredHullModel("energy_output_hatch_4a") + .register(), + GTValues.tiersBetween(ULV, HV)); + + public static final MachineDefinition[] ENERGY_OUTPUT_HATCH_16A = registerTieredMachines("energy_output_hatch_16a", + (holder, tier) -> new EnergyHatchPartMachine(holder, tier, OUT, 16), + (tier, builder) -> builder + .langValue(VNF[tier] + " 16A Dynamo Hatch") + .rotationState(RotationState.ALL) + .abilities(PartAbility.OUTPUT_ENERGY) + .modelProperty(IS_FORMED, false) + .tooltips(Component.translatable("gtceu.universal.tooltip.voltage_out", + FormattingUtil.formatNumbers(V[tier]), VNF[tier]), + Component.translatable("gtceu.universal.tooltip.amperage_out", 16), + Component.translatable("gtceu.universal.tooltip.energy_storage_capacity", + FormattingUtil + .formatNumbers(EnergyHatchPartMachine.getHatchEnergyCapacity(tier, 16))), + Component.translatable("gtceu.machine.energy_hatch.output_hi_amp.tooltip")) + .overlayTieredHullModel("energy_output_hatch_16a") + .register(), + GTValues.tiersBetween(ULV, HV)); + // Enable If needed Inside of Dev // public static final MultiblockMachineDefinition SOUL_TESTER = REGISTRATE.multiblock("soul_tester", // PrimitiveWorkableMachine::new) @@ -360,6 +569,19 @@ private static MachineDefinition[] registerThermiaTieredHatch(String name, Strin })) .register(); + public static final MachineDefinition BEE_HOLDER = REGISTRATE.machine("bee_holder", BeeHolderPartMachine::new) + .langValue("Bee Holder") + .tier(UV) + .rotationState(RotationState.NON_Y_AXIS) + .modelProperty(GTMachineModelProperties.IS_FORMED, false) + .abilities(CosmicPartAbility.BEE_HOLDER) + .modelProperty(RecipeLogic.STATUS_PROPERTY, RecipeLogic.Status.IDLE) + .model(createWorkableTieredHullMachineModel(GTCEu.id("block/machines/object_holder")) + .andThen((ctx, prov, model) -> { + model.addReplaceableTextures("bottom", "top", "side"); + })) + .register(); + public static final MachineDefinition SENSOR_HATCH = REGISTRATE.machine("sensor_hatch", WirelessDataSensor::new) .langValue("Sensor Hatch") .rotationState(RotationState.ALL) @@ -382,7 +604,7 @@ private static MachineDefinition[] registerThermiaTieredHatch(String name, Strin private static MachineDefinition[] registerTieredMachines(String name, BiFunction factory, - BiFunction, MachineDefinition> builder, + BiFunction, MachineDefinition> builder, int... tiers) { MachineDefinition[] definitions = new MachineDefinition[GTValues.TIER_COUNT]; for (int tier : tiers) { @@ -502,6 +724,7 @@ private static MachineDefinition[] registerTieredMachines(String name, new ResourceLocation(GTCEu.MOD_ID, "block/overlay/machine/overlay_fluid_hatch"), new ResourceLocation(GTCEu.MOD_ID, "block/overlay/machine/overlay_fluid_hatch")) .tooltips(Component.translatable("gtceu.machine.steam_fluid_hatch_notice")) + .modelProperty(GTMachineModelProperties.IS_FORMED, false) .langValue("Fluid Input Hatch (Steam)") .register(); public static final MachineDefinition STEAM_EXPORT_HATCH = REGISTRATE @@ -511,6 +734,7 @@ private static MachineDefinition[] registerTieredMachines(String name, .colorOverlaySteamHullModel(new ResourceLocation(GTCEu.MOD_ID, "block/overlay/machine/overlay_pipe"), new ResourceLocation(GTCEu.MOD_ID, "block/overlay/machine/overlay_fluid_hatch"), new ResourceLocation(GTCEu.MOD_ID, "block/overlay/machine/overlay_fluid_hatch")) + .modelProperty(GTMachineModelProperties.IS_FORMED, false) .langValue("Fluid Output Hatch (Steam)") .register(); @@ -621,8 +845,7 @@ private static MachineDefinition[] registerTieredMachines(String name, .appearanceBlock(CASING_PALLADIUM_SUBSTATION) .recipeType(GTRecipeTypes.DUMMY_RECIPES) .tooltips(Component.translatable("cosmiccore.machine.capacitor_array.tooltip.0"), - Component.translatable("cosmiccore.machine.capacitor_array.tooltip.1"), - Component.translatable("cosmiccore.machine.capacitor_array.tooltip.2")) + Component.translatable("cosmiccore.machine.capacitor_array.tooltip.1")) .pattern(definition -> FactoryBlockPattern.start(RIGHT, BACK, UP) .aisle("ACA", "AAA", "AAA") .aisle("ABA", "BDB", "ABA") @@ -684,7 +907,32 @@ private static MachineDefinition[] registerTieredMachines(String name, .abilities(STERILIZE_HATCH) .register(); + public static final MachineDefinition[] FLUID_IMPORT_HATCH_4X_HV = CosmicMachinesUtils.registerFluidHatches( + "input_hatch_4x", "Quadruple Input Hatch", "fluid_hatch.import", + IO.IN, FluidHatchPartMachine.INITIAL_TANK_CAPACITY_4X, 4, + new int[] { GTValues.HV }, + PartAbility.IMPORT_FLUIDS, PartAbility.IMPORT_FLUIDS_4X); + + public static final MachineDefinition[] FLUID_EXPORT_HATCH_4X_HV = CosmicMachinesUtils.registerFluidHatches( + "output_hatch_4x", "Quadruple Output Hatch", "fluid_hatch.export", + IO.OUT, FluidHatchPartMachine.INITIAL_TANK_CAPACITY_4X, 4, + new int[] { GTValues.HV }, // only HV + PartAbility.EXPORT_FLUIDS, PartAbility.EXPORT_FLUIDS_4X); + + public static final MultiblockMachineDefinition LARGE_STEAM_TURBINE = registerLargeTurbineCosmic( + "steam_large_turbine", + HV, + GTRecipeTypes.STEAM_TURBINE_FUELS, + CASING_STEEL_TURBINE, CASING_STEEL_GEARBOX, + GTCEu.id("block/casings/mechanic/machine_casing_turbine_steel"), + GTCEu.id("block/multiblock/generator/large_steam_turbine"), + false); + + // Dreamer's Basin is now registered in DreamersBasin.java + public static void init() { + // Initialize DreamersBasin + com.ghostipedia.cosmiccore.common.machine.multiblock.multi.DreamersBasin.init(); GTMultiMachines.LARGE_COMBUSTION_ENGINE.setRecipeTypes(new GTRecipeType[] { DUMMY_RECIPES }); GTMultiMachines.LARGE_COMBUSTION_ENGINE.setRenderXEIPreview(false); GTMultiMachines.LARGE_COMBUSTION_ENGINE.setRenderWorldPreview(false); @@ -694,11 +942,19 @@ public static void init() { GTMultiMachines.EXTREME_COMBUSTION_ENGINE.setRecipeTypes(new GTRecipeType[] { DUMMY_RECIPES }); GTMultiMachines.EXTREME_COMBUSTION_ENGINE.setRenderXEIPreview(false); GTMultiMachines.EXTREME_COMBUSTION_ENGINE.setRenderWorldPreview(false); - // GCYMMachines.MEGA_BLAST_FURNACE.setRecipeTypes(new GTRecipeType[] { DUMMY_RECIPES }); - // GCYMMachines.MEGA_BLAST_FURNACE.setRenderXEIPreview(false); - // GCYMMachines.MEGA_BLAST_FURNACE.setRenderWorldPreview(false); + GTMultiMachines.ASSEMBLY_LINE.setRecipeModifier(new RecipeModifierList(COSMIC_MODULES, OC_NON_PERFECT)); + GTMultiMachines.ASSEMBLY_LINE.setAlwaysTryModifyRecipe(true); + GTRecipeTypes.MIXER_RECIPES.setMaxSize(IO.IN, EmberRecipeCapability.CAP, 1); + GCYMMachines.MEGA_BLAST_FURNACE.setRecipeTypes(new GTRecipeType[] { DUMMY_RECIPES }); + GCYMMachines.MEGA_BLAST_FURNACE.setRenderXEIPreview(false); + GCYMMachines.MEGA_BLAST_FURNACE.setRenderWorldPreview(false); GTMultiMachines.POWER_SUBSTATION.setRenderXEIPreview(false); GTMultiMachines.POWER_SUBSTATION.setRenderWorldPreview(false); + + GTMultiMachines.LARGE_STEAM_TURBINE.setRecipeTypes(new GTRecipeType[] { DUMMY_RECIPES }); + GTMultiMachines.LARGE_STEAM_TURBINE.setRenderXEIPreview(false); + GTMultiMachines.LARGE_STEAM_TURBINE.setRenderWorldPreview(false); + for (MultiblockMachineDefinition definition : FUSION_REACTOR) { if (definition == null) continue; definition.setPatternFactory(() -> { @@ -736,7 +992,6 @@ public static void init() { .build(); }); } - GCYMMachines.LARGE_CENTRIFUGE.setPatternFactory(() -> FactoryBlockPattern.start() .aisle("#XXX#", "XXXXX", "#XXX#") .aisle("XXXXX", "XAPAX", "XXXXX") @@ -752,5 +1007,32 @@ public static void init() { .where('A', Predicates.air()) .where('#', Predicates.any()) .build()); + + GTMultiMachines.ASSEMBLY_LINE.setPatternFactory(() -> FactoryBlockPattern.start(BACK, UP, RIGHT) + .aisle("FIF", "RTR", "SAG", "#Y#") + .aisle("FIF", "RTR", "DAG", "#Y#").setRepeatable(3, 15) + .aisle("FOF", "RTR", "DAG", "#Y#") + .where('S', Predicates.controller(blocks(GTMultiMachines.ASSEMBLY_LINE.getBlock()))) + .where('F', blocks(CASING_STEEL_SOLID.get()) + .or(Predicates.abilities(PartAbility.IMPORT_FLUIDS_1X, ME_ASSEMBLY_PARTS_FLUID) + .setMaxGlobalLimited(4))) + .where('O', + Predicates.abilities(PartAbility.EXPORT_ITEMS) + .addTooltips(Component.translatable("gtceu.multiblock.pattern.location_end"))) + .where('Y', + blocks(CASING_STEEL_SOLID.get()).or(Predicates.abilities(PartAbility.INPUT_ENERGY) + .setMinGlobalLimited(1).setMaxGlobalLimited(2))) + .where('I', blocks(ITEM_IMPORT_BUS[0].getBlock()).or(Predicates.abilities(ME_ASSEMBLY_PARTS))) + .where('G', blocks(CASING_GRATE.get())) + .where('A', blocks(CASING_ASSEMBLY_CONTROL.get())) + .where('R', blocks(CASING_LAMINATED_GLASS.get())) + .where('T', blocks(CASING_ASSEMBLY_LINE.get())) + .where('D', + Predicates.abilities(PartAbility.DATA_ACCESS, PartAbility.OPTICAL_DATA_RECEPTION) + .setExactLimit(1) + .or(Predicates.abilities(MODULE_HATCH).setMaxGlobalLimited(1, 1)) + .or(blocks(CASING_GRATE.get()))) + .where('#', Predicates.any()) + .build()); } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicMachinesUtils.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicMachinesUtils.java index cfbd91e2e..311544839 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicMachinesUtils.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicMachinesUtils.java @@ -1,23 +1,32 @@ package com.ghostipedia.cosmiccore.common.data; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.CosmicLargeTurbineMachine; import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.ExoticCombustionEngineMachine; import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; import com.gregtechceu.gtceu.api.data.RotationState; import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.api.machine.*; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IRotorHolderMachine; import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.TraceabilityPredicate; +import com.gregtechceu.gtceu.api.pattern.predicates.SimplePredicate; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.api.registry.registrate.MachineBuilder; import com.gregtechceu.gtceu.common.data.GTMaterialItems; import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.common.data.GTRecipeTypes; +import com.gregtechceu.gtceu.common.machine.multiblock.part.FluidHatchPartMachine; import com.gregtechceu.gtceu.utils.FormattingUtil; +import com.lowdragmc.lowdraglib.utils.BlockInfo; + import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.ItemLike; @@ -37,6 +46,8 @@ import static com.gregtechceu.gtceu.api.pattern.Predicates.*; import static com.gregtechceu.gtceu.api.pattern.Predicates.blocks; import static com.gregtechceu.gtceu.common.data.machines.GTMachineUtils.workableTiered; +import static com.gregtechceu.gtceu.common.data.models.GTMachineModels.OVERLAY_FLUID_HATCH_HALF_PX_TEX; +import static com.gregtechceu.gtceu.common.data.models.GTMachineModels.OVERLAY_FLUID_HATCH_TEX; import static com.gregtechceu.gtceu.utils.FormattingUtil.toEnglishName; public class CosmicMachinesUtils { @@ -92,6 +103,56 @@ public static MultiblockMachineDefinition registerCosmicLargeCombustionEngine(St .register(); } + public static MultiblockMachineDefinition registerLargeTurbineCosmic( + String name, int tier, GTRecipeType recipeType, + Supplier casing, + Supplier gear, + ResourceLocation casingTexture, + ResourceLocation overlayModel, + boolean needsMuffler) { + return REGISTRATE.multiblock(name, holder -> new CosmicLargeTurbineMachine(holder, tier)) + .rotationState(RotationState.ALL) + .recipeType(recipeType) + .generator(true) + .recipeModifier(CosmicLargeTurbineMachine::recipeModifier, true) + .appearanceBlock(casing) + .pattern(definition -> FactoryBlockPattern.start() + .aisle("CCCC", "CHHC", "CCCC") + .aisle("CHHC", "RGGR", "CHHC") + .aisle("CCCC", "CSHC", "CCCC") + .where('S', controller(blocks(definition.getBlock()))) + .where('G', blocks(gear.get())) + .where('C', blocks(casing.get())) + .where('R', + new TraceabilityPredicate( + new SimplePredicate( + state -> MetaMachine.getMachine(state.getWorld(), + state.getPos()) instanceof IRotorHolderMachine rotorHolder && + state.getWorld() + .getBlockState(state.getPos() + .relative(rotorHolder.self().getFrontFacing())) + .isAir(), + () -> PartAbility.ROTOR_HOLDER.getAllBlocks().stream() + .map(BlockInfo::fromBlock).toArray(BlockInfo[]::new))) + .addTooltips(Component.translatable("gtceu.multiblock.pattern.clear_amount_3")) + .addTooltips(Component.translatable("gtceu.multiblock.pattern.error.limited.1", + VN[tier])) + .setExactLimit(1) + .or(abilities(PartAbility.OUTPUT_ENERGY)).setExactLimit(1)) + .where('H', blocks(casing.get()) + .or(autoAbilities(definition.getRecipeTypes(), false, false, true, true, true, true)) + .or(autoAbilities(true, needsMuffler, false))) + .build()) + .recoveryItems( + () -> new ItemLike[] { + GTMaterialItems.MATERIAL_ITEMS.get(TagPrefix.dustTiny, GTMaterials.Ash).get() }) + .workableCasingModel(casingTexture, overlayModel) + .tooltips( + Component.translatable("gtceu.universal.tooltip.base_production_eut", 3072), + Component.translatable("gtceu.multiblock.turbine.efficiency_tooltip", VNF[tier])) + .register(); + } + public static MachineDefinition[] registerSimpleGenerator(String name, GTRecipeType recipeType, Int2IntFunction tankScalingFunction, @@ -115,9 +176,16 @@ public static MachineDefinition[] registerSimpleGenerator(String name, tiers); } + public static MachineDefinition[] registerTieredSingleBlockMachines(String name, + BiFunction factory, + BiFunction, MachineDefinition> builder, + int... tiers) { + return registerTieredMachines(name, factory, builder, tiers); + } + public static MachineDefinition[] registerTieredMachines(String name, BiFunction factory, - BiFunction, MachineDefinition> builder, + BiFunction, MachineDefinition> builder, int... tiers) { MachineDefinition[] definitions = new MachineDefinition[GTValues.TIER_COUNT]; for (int tier : tiers) { @@ -132,7 +200,7 @@ public static MachineDefinition[] registerTieredMachines(String name, public static Pair registerSteamMachines(String name, BiFunction factory, - BiFunction, MachineDefinition> builder) { + BiFunction, MachineDefinition> builder) { MachineDefinition lowTier = builder.apply(false, REGISTRATE.machine("lp_%s".formatted(name), holder -> factory.apply(holder, false)) .langValue("I DO NOT EXIST") @@ -143,4 +211,44 @@ public static Pair registerSteamMachines(S .tier(1)); return Pair.of(lowTier, highTier); } + + /** Fluid hatch helper that uses our mod's REGISTRATE (keeps datagen happy). */ + public static MachineDefinition[] registerFluidHatches(String name, String displayName, String tooltip, + IO io, int initialCapacity, int slots, + int[] tiers, PartAbility... abilities) { + final String pipeOverlay; + if (slots >= 9) { + pipeOverlay = "overlay_pipe_9x"; + } else if (slots >= 4) { + pipeOverlay = "overlay_pipe_4x"; + } else { + pipeOverlay = null; + } + final String ioOverlay = io == IO.OUT ? "overlay_pipe_out_emissive" : "overlay_pipe_in_emissive"; + final String emissiveOverlay = slots > 4 ? OVERLAY_FLUID_HATCH_HALF_PX_TEX : OVERLAY_FLUID_HATCH_TEX; + + return registerTieredMachines( + name, + (holder, tier) -> new FluidHatchPartMachine(holder, tier, io, initialCapacity, slots), + (tier, builder) -> builder + .langValue(VNF[tier] + ' ' + displayName) + .rotationState(RotationState.ALL) + .colorOverlayTieredHullModel(ioOverlay, pipeOverlay, emissiveOverlay) + .abilities(abilities) + .modelProperty(GTMachineModelProperties.IS_FORMED, false) + .tooltips(Component.translatable("gtceu.machine." + tooltip + ".tooltip")) + .allowCoverOnFront(true) + .tooltips( + slots == 1 ? Component.translatable( + "gtceu.universal.tooltip.fluid_storage_capacity", + FormattingUtil.formatNumbers( + FluidHatchPartMachine.getTankCapacity(initialCapacity, tier))) : + Component.translatable( + "gtceu.universal.tooltip.fluid_storage_capacity_mult", + slots, + FormattingUtil.formatNumbers( + FluidHatchPartMachine.getTankCapacity(initialCapacity, tier)))) + .register(), + tiers); + } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicModularMachines.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicModularMachines.java index 69760a689..0ec68ecef 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicModularMachines.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicModularMachines.java @@ -50,7 +50,7 @@ public class CosmicModularMachines { public static MultiblockMachineDefinition[] registerTieredModules( String name, BiFunction factory, - BiFunction builder, + BiFunction, MultiblockMachineDefinition> builder, int... tiers) { MultiblockMachineDefinition[] definitions = new MultiblockMachineDefinition[GTValues.TIER_COUNT]; for (int tier : tiers) { diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicSounds.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicSounds.java index 2a37eee19..6fe4940bc 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicSounds.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicSounds.java @@ -19,6 +19,7 @@ public class CosmicSounds { public static final SoundEntry ORBITAL_FORGE = REGISTRATE.sound(CosmicCore.id("orbital_forge")).build(); public static final SoundEntry CHEMVAT = REGISTRATE.sound(CosmicCore.id("icv")).build(); public static final SoundEntry VOARX = REGISTRATE.sound(CosmicCore.id("vorax")).build(); + public static final SoundEntry DAWN_FORGE_SFX = REGISTRATE.sound(CosmicCore.id("dawnforge")).build(); public static void init() {} } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicDataGenerators.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicDataGenerators.java index 82a0af8ec..eaf6eb238 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicDataGenerators.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicDataGenerators.java @@ -1,6 +1,9 @@ package com.ghostipedia.cosmiccore.common.data.datagen; import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.item.tcon.TinkersMaterials; +import com.ghostipedia.cosmiccore.common.item.tcon.modifiers.CosmicModifierProvider; +import com.ghostipedia.cosmiccore.common.item.tcon.modifiers.CosmicModifierProvider; import com.gregtechceu.gtceu.api.registry.registrate.SoundEntryBuilder; @@ -19,7 +22,24 @@ public static void gatherData(GatherDataEvent event) { DataGenerator generator = event.getGenerator(); PackOutput packOutput = generator.getPackOutput(); ExistingFileHelper existingFileHelper = event.getExistingFileHelper(); - var registries = event.getLookupProvider(); + + boolean server = event.includeServer(); + generator.addProvider(server, new CosmicModifierProvider(packOutput)); + TinkersMaterials.init(); + var materials = new CosmicTinkersMaterials(packOutput); + var traits = new CosmicMaterialTraits(packOutput, materials); + var stats = new CosmicMaterialStats(packOutput, materials); + var spriteProvider = new CosmicMaterialSpriteProvider(); + var renderInfoProvider = new CosmicMaterialRenderInfoProvider(packOutput, spriteProvider, existingFileHelper); + var materialRecipeProvider = new CosmicTinkersRecipeProvider(packOutput); + + // TODO DATAGEN FOR Materials + stats + traits (server) + + generator.addProvider(server, materials); + generator.addProvider(server, traits); + generator.addProvider(server, stats); + generator.addProvider(server, renderInfoProvider); + generator.addProvider(server, materialRecipeProvider); if (event.includeClient()) { generator.addProvider(true, new SoundEntryBuilder.SoundEntryProvider(packOutput, CosmicCore.MOD_ID)); } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicMaterialRenderInfoProvider.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicMaterialRenderInfoProvider.java new file mode 100644 index 000000000..7b506f965 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicMaterialRenderInfoProvider.java @@ -0,0 +1,34 @@ +package com.ghostipedia.cosmiccore.common.data.datagen; + +import com.ghostipedia.cosmiccore.common.data.materials.tinkers.TinkersMaterial; + +import net.minecraft.data.PackOutput; +import net.minecraftforge.common.data.ExistingFileHelper; + +import org.jetbrains.annotations.Nullable; +import slimeknights.tconstruct.library.client.data.material.AbstractMaterialRenderInfoProvider; +import slimeknights.tconstruct.library.client.data.material.AbstractMaterialSpriteProvider; + +public class CosmicMaterialRenderInfoProvider extends AbstractMaterialRenderInfoProvider { + + public CosmicMaterialRenderInfoProvider(PackOutput packOutput, + @Nullable AbstractMaterialSpriteProvider materialSprites, + @Nullable ExistingFileHelper existingFileHelper) { + super(packOutput, materialSprites, existingFileHelper); + } + + @Override + protected void addMaterialRenderInfo() { + for (TinkersMaterial material : TinkersMaterial.MATERIALS) { + buildRenderInfo(material.getMaterialLocation()) + .color(material.getColor()) + .fallbacks(material.getFallbacks().toArray(new String[0])); + + } + } + + @Override + public String getName() { + return "cosmic material render provider"; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicMaterialSpriteProvider.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicMaterialSpriteProvider.java new file mode 100644 index 000000000..10ae49df6 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicMaterialSpriteProvider.java @@ -0,0 +1,24 @@ +package com.ghostipedia.cosmiccore.common.data.datagen; + +import com.ghostipedia.cosmiccore.common.data.materials.tinkers.TinkersMaterial; + +import slimeknights.tconstruct.library.client.data.material.AbstractMaterialSpriteProvider; +import slimeknights.tconstruct.tools.stats.StatlessMaterialStats; + +public class CosmicMaterialSpriteProvider extends AbstractMaterialSpriteProvider { + + @Override + public String getName() { + return ""; + } + + @Override + protected void addAllMaterials() { + for (TinkersMaterial material : TinkersMaterial.MATERIALS) { + buildMaterial(material.getMaterialLocation()) + .colorMapper(material.getColorMapping()) + .repairKit().statType(StatlessMaterialStats.BINDING.getIdentifier()); + + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicMaterialStats.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicMaterialStats.java new file mode 100644 index 000000000..192889109 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicMaterialStats.java @@ -0,0 +1,28 @@ +package com.ghostipedia.cosmiccore.common.data.datagen; + +import com.ghostipedia.cosmiccore.common.data.materials.tinkers.TinkersMaterial; + +import net.minecraft.data.PackOutput; + +import slimeknights.tconstruct.library.data.material.AbstractMaterialDataProvider; +import slimeknights.tconstruct.library.data.material.AbstractMaterialStatsDataProvider; +import slimeknights.tconstruct.library.materials.stats.IMaterialStats; + +public class CosmicMaterialStats extends AbstractMaterialStatsDataProvider { + + public CosmicMaterialStats(PackOutput packOutput, AbstractMaterialDataProvider materials) { + super(packOutput, materials); + } + + @Override + protected void addMaterialStats() { + for (TinkersMaterial material : TinkersMaterial.MATERIALS) { + addMaterialStats(material.getMaterialLocation(), material.getStats().toArray(new IMaterialStats[0])); + } + } + + @Override + public String getName() { + return "cosmic Material Stats"; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicMaterialTraits.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicMaterialTraits.java new file mode 100644 index 000000000..3fca9033b --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicMaterialTraits.java @@ -0,0 +1,60 @@ +package com.ghostipedia.cosmiccore.common.data.datagen; + +import com.ghostipedia.cosmiccore.common.data.materials.tinkers.TinkersMaterial; +import com.ghostipedia.cosmiccore.common.item.tcon.modifiers.CosmicCoreModifiers; + +import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; +import com.gregtechceu.gtceu.api.data.tag.TagPrefix; +import com.gregtechceu.gtceu.common.data.GTMaterials; + +import net.minecraft.data.PackOutput; +import net.minecraft.world.item.Tiers; +import net.minecraft.world.item.crafting.Ingredient; + +import slimeknights.tconstruct.library.client.data.spritetransformer.GreyToColorMapping; +import slimeknights.tconstruct.library.data.material.AbstractMaterialDataProvider; +import slimeknights.tconstruct.library.data.material.AbstractMaterialTraitDataProvider; +import slimeknights.tconstruct.library.materials.MaterialRegistry; +import slimeknights.tconstruct.library.materials.stats.MaterialStatsId; +import slimeknights.tconstruct.library.modifiers.ModifierEntry; +import slimeknights.tconstruct.library.modifiers.util.LazyModifier; +import slimeknights.tconstruct.tools.TinkerModifiers; +import slimeknights.tconstruct.tools.stats.StatlessMaterialStats; + +import java.util.Map; +import java.util.Set; + +public class CosmicMaterialTraits extends AbstractMaterialTraitDataProvider { + + public CosmicMaterialTraits(PackOutput packOutput, AbstractMaterialDataProvider materials) { + super(packOutput, materials); + } + + @Override + protected void addMaterialTraits() { + for (TinkersMaterial material : TinkersMaterial.MATERIALS) { + noTraits(material.getMaterialLocation()); + Set defaultTraits = material.getDefaultTraits(); + if (!defaultTraits.isEmpty()) { + for (var defaultTrait : defaultTraits) { + addDefaultTraits(material.getMaterialLocation(), defaultTrait); + } + } + Map> statTraits = material.getTraits(); + if (!statTraits.isEmpty()) { + for (Map.Entry> entry : statTraits.entrySet()) { + addTraits( + material.getMaterialLocation(), + entry.getKey(), + entry.getValue().toArray(new ModifierEntry[0])); + } + } + + } + } + + @Override + public String getName() { + return "Cosmic Material Traits "; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicTinkersMaterials.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicTinkersMaterials.java new file mode 100644 index 000000000..edd76e504 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicTinkersMaterials.java @@ -0,0 +1,31 @@ +package com.ghostipedia.cosmiccore.common.data.datagen; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.materials.tinkers.TinkersMaterial; + +import net.minecraft.data.PackOutput; +import net.minecraft.resources.ResourceLocation; + +import slimeknights.tconstruct.library.data.material.AbstractMaterialDataProvider; + +public class CosmicTinkersMaterials extends AbstractMaterialDataProvider { + + public static final ResourceLocation SCREWDRIVERIUM = CosmicCore.id("neutronite"); + + public CosmicTinkersMaterials(PackOutput out) { + super(out); + } + + @Override + protected void addMaterials() { + for (TinkersMaterial material : TinkersMaterial.MATERIALS) { + addMaterial(material.getMaterialLocation(), material.getTier(), material.getSortOrder(), + material.isCraftable()); + } + } + + @Override + public String getName() { + return "Cosmic Core Materials"; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicTinkersRecipeProvider.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicTinkersRecipeProvider.java new file mode 100644 index 000000000..a36f6ce55 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicTinkersRecipeProvider.java @@ -0,0 +1,36 @@ +package com.ghostipedia.cosmiccore.common.data.datagen; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.materials.tinkers.TinkersMaterial; + +import net.minecraft.data.PackOutput; +import net.minecraft.data.recipes.FinishedRecipe; +import net.minecraft.data.recipes.RecipeProvider; + +import slimeknights.mantle.recipe.data.IRecipeHelper; +import slimeknights.tconstruct.library.data.recipe.IMaterialRecipeHelper; + +import java.util.function.Consumer; + +import static slimeknights.tconstruct.library.recipe.material.MaterialRecipeBuilder.materialRecipe; + +public class CosmicTinkersRecipeProvider extends RecipeProvider implements IRecipeHelper, IMaterialRecipeHelper { + + public CosmicTinkersRecipeProvider(PackOutput generator) { + super(generator); + } + + @Override + protected void buildRecipes(Consumer consumer) { + for (TinkersMaterial tinkersMaterial : TinkersMaterial.MATERIALS) { + String folder = "tinkers/tools/material/"; + materialRecipe(consumer, tinkersMaterial.getMaterialLocation(), tinkersMaterial.getIngredient(), + tinkersMaterial.getValue(), tinkersMaterial.getNeeded(), folder + tinkersMaterial.getName()); + } + } + + @Override + public String getModId() { + return CosmicCore.MOD_ID; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/lang/CosmicLangHandler.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/lang/CosmicLangHandler.java index 6d2540db1..47166f9b9 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/lang/CosmicLangHandler.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/lang/CosmicLangHandler.java @@ -64,6 +64,12 @@ public static void init(RegistrateLangProvider provider) { "§6Accepts Laser hatches.", "§6Accepts Cosmic Parallel Hatches."); + multiLang(provider, "cosmiccore.multiblock.star_ladder.tooltip", + "§cThe peaks of creation reach out into the stars", + "§c§lDANGER: DATA LOSS PRESENT", + "§c§lDANGER: RECOVERY IS POSSIBLE", + "§aPinacle Multiblock : The Final Goal of ACT1 (Steam to IV)"); + multiLang(provider, "cosmiccore.multiblock.iris.tooltip", "§cYour Mind Shatters Trying to Understand This", "§c§lDANGER: DO NOT RENDER THE JEI PREVIEW", @@ -96,6 +102,8 @@ public static void init(RegistrateLangProvider provider) { "§7Can use any capacitor and be expanded vertically up to 18 times§r", "§7Accepts §6Laser Hatches§r"); + provider.add("emi.category.cosmiccore.asteroid_mining", "Asteroid Mining Operations"); + // recipe stuff provider.add("cosmiccore.recipe.soul_in", "Soul Input: %s"); provider.add("cosmiccore.recipe.soul_out", "Soul Output: %s"); @@ -116,6 +124,25 @@ public static void init(RegistrateLangProvider provider) { provider.add("cosmiccore.multiblock.magnetic_regen", "§aField Recovery Rate§f:§6 %sT/t"); provider.add("gtceu.titan_fusion", "Titan Fusion Reactor"); // recipe type lang + // SB Flavor Texts + provider.add("cosmiccore.vaccum_bubbler.desc", "Floatation Station Machination"); + provider.add("cosmiccore.thermomagnitizer.desc", "Heating and Magnets, what could go wrong"); + provider.add("cosmiccore.calx_reactor.desc", "Working wonders with the Arcane"); + provider.add("cosmiccore.mana_leaching_tub.desc", "Mana Soaker 9000"); + provider.add("cosmiccore.roaster.desc", "Marshmallows not included"); + + provider.add("tooltip.cosmiccore.asteroid_chip.unprogrammed", "Unprogrammed — no target data"); + provider.add("tooltip.cosmiccore.asteroid_chip.type", "Type: %s"); + provider.add("tooltip.cosmiccore.asteroid_chip.target", "Target ID: %s"); + provider.add("tooltip.cosmiccore.asteroid_chip.tier", "Acquisition Tier: %s"); + provider.add("tooltip.cosmiccore.asteroid_chip.lock", "Lock Strength: %s%%"); + provider.add("tooltip.cosmiccore.asteroid_chip.sector", "Sector: %s"); + provider.add("tooltip.cosmiccore.asteroid_chip.mode", "Mode: %s"); + + provider.add("tooltip.cosmiccore.asteroid.tiny", "Asteroid Size: Unknown"); + provider.add("tooltip.cosmiccore.asteroid.tier", "Asteroid Size: %s Kilotons"); + provider.add("cosmiccore.recipe.asteroid_weight_greater_1", "Greater Yields\nfrom Larger Asteroids"); + // gui lines provider.add("gui.cosmiccore.soul_hatch.label.import", "Soul Input Hatch"); provider.add("gui.cosmiccore.soul_hatch.label.export", "Soul Output Hatch"); @@ -135,6 +162,21 @@ public static void init(RegistrateLangProvider provider) { provider.add("cosmiccore.recipe.fieldSlam", "§fField Consumed: %sT"); provider.add("cosmiccore.recipe.condition.titan.tooltip", "Requires Titan Reactor Tier: %s"); + // Linked Partner Condition + provider.add("cosmiccore.recipe.condition.linked_partner.tooltip", "Requires %s linked partner(s)"); + provider.add("cosmiccore.recipe.condition.linked_partner.formed", + "Requires %s linked partner(s) with valid structure"); + provider.add("cosmiccore.recipe.condition.linked_partner.working", + "Requires %s linked partner(s) actively working"); + provider.add("cosmiccore.recipe.condition.linked_partner_dimension.tooltip", "Requires linked partner in %s"); + provider.add("cosmiccore.recipe.condition.linked_partner_dimension_item.tooltip", + "Requires %sx %s in partner in %s"); + provider.add("cosmiccore.recipe.condition.linked_partner_dimension_fluid.tooltip", + "Requires %smB %s in partner in %s"); + + provider.add("cosmiccore.multiblock.heat_value", "§6Current Heat: %s"); + provider.add("cosmiccore.multiblock.heat_capacity", "§cMax Heat: %s"); + provider.add("cosmiccore.multiblock.current_contagion", "§6Contagion Strength: %s"); provider.add("cosmiccore.multiblock.contagion_rate", "§cContagion Rate: %s/t"); provider.add("cosmiccore.multiblock.cleaning_status", "§aCleaning Status: %s"); @@ -160,7 +202,7 @@ public static void init(RegistrateLangProvider provider) { provider.add("cosmiccore.multiblock.iris.star_stage_sustain", "§cStar Requires \n§r%s \n§cto avoid §lcataclysmic failure!"); provider.add("cosmiccore.multiblock.advanced.star_ladder_tier", - "§aVomahine StarLadder Tether Tier§f: §b%s \n §aMax Research Modules§f: §b%s"); + "§aVomahine StarLadderOld Tether Tier§f: §b%s \n §aMax Research Modules§f: §b%s"); provider.add("tagprefix.leached_ore", "Leached %s Ore"); provider.add("tagprefix.prisma_frothed_ore", "Prisma Frothed %s Ore"); provider.add("tagprefix.ultradense_plate", "Ultradense %s Plate"); @@ -168,6 +210,9 @@ public static void init(RegistrateLangProvider provider) { provider.add("tagprefix.modular_shelling", "%s Modular Shelling"); provider.add("tagprefix.plasmites", "%s Plasmites"); provider.add("tagprefix.wire_spool", "%s Wire Spool"); + provider.add("tagprefix.shape_memory_foil", "%s Shaping Memory Foil"); + provider.add("tagprefix.alve_foil_insulator", "%s Alve Insulator"); + provider.add("tagprefix.raw_ore_cubic", "Cubic %s Ore"); provider.add("cosmiccore.multiblock.reboot_powergrid", "§aReboot All Connected Machines"); provider.add("cosmiccore.multiblock.sleep_powergrid", "§cSuspend All Connected Machines"); @@ -241,6 +286,10 @@ public static void init(RegistrateLangProvider provider) { provider.add("cosmiccore.conjuct_valkruth_emotion.1", "§bE.R.A - Convergence"); provider.add("gtceu.hellfire_foundry", "§cHellfire Foundry"); + // embers lang + provider.add("cosmiccore.ember.capacity", "§cEmber Capacity:§6 %s"); + provider.add("cosmiccore.ember.transfer", "§cEmber Transfer Rate:§6 %s"); + multiLang(provider, "item.cosmiccore.the_one_ring.tooltip", "§6§oOne Ring to rule them all, One Ring to find them, One Ring to bring them all and in the darkness bind them.§r", "You might find it hard to take off."); @@ -286,11 +335,6 @@ public static void init(RegistrateLangProvider provider) { provider.add("cosmiccore.lore.broken_virtue.0", "Perpetuity Shudders Softly"); provider.add("cosmiccore.lore.broken_virtue.1", "Something has gone very wrong."); - provider.add("coscore.pattern.multiply", "§b%dx§f"); - provider.add("coscore.pattern.div", "§c%d÷§f"); - provider.add("coscore.pattern.tooltip.div", "Divides contents by §b%d§f"); - provider.add("coscore.pattern.tooltip.multiply", "Multiplies contents by §c%d§f"); - // Sanguine Warptech provider.add("cosmiccore.armor.sanguinewarptech.hud.LP", "§4Life Force: §c%s"); provider.add("cosmiccore.armor.sanguinewarptech.hud.shieldstate", "Sanguine Shield: %s"); @@ -372,5 +416,1352 @@ public static void init(RegistrateLangProvider provider) { provider.add("cosmiccore.item.spraycan.tooltip.solvent_mode", "Spraycan in SOLVENT mode"); provider.add("cosmiccore.item.linked_terminal.boundTo", "Bound to %s"); + + // Tinkers + provider.add("item.cosmiccore.wire_cutter", "Wire Cutters"); + provider.add("item.cosmiccore.wire_cutter.description", "Snip wires cleanly with these cutters."); + + + + + + provider.add("allele.forestry.bee_species.cosmiccore.bee_oxygen", "Lofty Oxygen"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_hydrogen", "Lofty Hydrogen"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_nitrogen", "Lofty Nitrogen"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_argon", "Lofty Argon"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_rose_polymer", "Rose Polymer"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_citrus_polymer", "Citrus Polymer"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_waxy_polymer", "Waxy Polymer"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_pale", "Pale"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_soul", "Soul"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_runic", "Runic"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_ambrosic", "Ambrosic"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_biohazard", "Biohazard"); + + provider.add("allele.forestry.bee_species.cosmiccore.bee_abrasive", "Abrasive"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_energized", "Energized"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_slick", "Slick"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_pyrolytic", "Pyrolytic"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_lunar", "Lunar"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_solar", "Solar"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_cosmos", "Cosmos"); + + provider.add("allele.forestry.bee_species.cosmiccore.bee_hadal", "Hadal"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_shaman", "Shaman"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_ashen", "Ashen"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_fracking", "Fracking"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_fate", "Fate"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_grand_garden", "Grand Garden"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_architect", "Architect"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_inquisitive", "Inquisitive"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_hellsmith", "Hellsmith"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_radoxia", "Radoxia"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_absent", "Absent"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_illusive", "Illusive"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_constructive", "Constructive"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_prismatic", "Prismatic"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_hydraulic", "Hydraulic"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_cobbled", "Cobbled"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_exhaustive", "Exhaustive"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_virtue", "Virtue"); + + provider.add("item.cosmiccore.bee_comb_lofty_oxygen", "Lofty Oxygen Comb"); + provider.add("item.cosmiccore.bee_comb_lofty_hydrogen", "Lofty Hydrogen Comb"); + provider.add("item.cosmiccore.bee_comb_lofty_nitrogen", "Lofty Nitrogen Comb"); + provider.add("item.cosmiccore.bee_comb_lofty_argon", "Lofty Argon Comb"); + provider.add("item.cosmiccore.bee_comb_rose_polymer", "Rose Polymer Comb"); + provider.add("item.cosmiccore.bee_comb_citrus_polymer", "Citrus Polymer Comb"); + provider.add("item.cosmiccore.bee_comb_waxy_polymer", "Waxy Polymer Comb"); + provider.add("item.cosmiccore.bee_comb_pale", "Pale Comb"); + provider.add("item.cosmiccore.bee_comb_soul", "Soul Comb"); + provider.add("item.cosmiccore.bee_comb_runic", "Runic Comb"); + provider.add("item.cosmiccore.bee_comb_ambrosic", "Ambrosic Comb"); + provider.add("item.cosmiccore.bee_comb_biohazard", "Biohazard Comb"); + + provider.add("item.cosmiccore.bee_comb_abrasive", "Abrasive Comb"); + provider.add("item.cosmiccore.bee_comb_energized", "Energized Comb"); + provider.add("item.cosmiccore.bee_comb_slick", "Slick Comb"); + provider.add("item.cosmiccore.bee_comb_pyrolytic", "Pyrolytic Comb"); + provider.add("item.cosmiccore.bee_comb_lunar", "Lunar Comb"); + provider.add("item.cosmiccore.bee_comb_solar", "Solar Comb"); + provider.add("item.cosmiccore.bee_comb_cosmos", "Cosmos Comb"); + + provider.add("item.cosmiccore.bee_comb_hadal", "Hadal Comb"); + provider.add("item.cosmiccore.bee_comb_shaman", "Shaman Comb"); + provider.add("item.cosmiccore.bee_comb_ashen", "Ashen Comb"); + provider.add("item.cosmiccore.bee_comb_fracking", "Fracking Comb"); + provider.add("item.cosmiccore.bee_comb_fate", "Fate Comb"); + provider.add("item.cosmiccore.bee_comb_grand_garden", "Grand Garden Comb"); + provider.add("item.cosmiccore.bee_comb_architect", "Architect Comb"); + provider.add("item.cosmiccore.bee_comb_inquisitive", "Inquisitive Comb"); + provider.add("item.cosmiccore.bee_comb_hellsmith", "Hellsmith Comb"); + provider.add("item.cosmiccore.bee_comb_radoxia", "Radoxia Comb"); + provider.add("item.cosmiccore.bee_comb_absent", "Absent Comb"); + provider.add("item.cosmiccore.bee_comb_illusive", "Illusive Comb"); + provider.add("item.cosmiccore.bee_comb_constructive", "Constructive Comb"); + provider.add("item.cosmiccore.bee_comb_prismatic", "Prismatic Comb"); + provider.add("item.cosmiccore.bee_comb_hydraulic", "Hydraulic Comb"); + provider.add("item.cosmiccore.bee_comb_cobbled", "Cobbled Comb"); + provider.add("item.cosmiccore.bee_comb_exhaustive", "Exhaustive Comb"); + provider.add("item.cosmiccore.bee_comb_virtue", "Virtue Comb"); + + provider.add("gui.cosmiccore.iapiary", "Industrial Apiary"); + provider.add("gui.cosmiccore.iapiary.yield", "Yield: %d"); + provider.add("gui.cosmiccore.iapiary.duration", "Duration: %d"); + provider.add("gui.cosmiccore.iapiary.production_amp", "Production Amp: %d"); + + provider.add("item.cosmicbees.bee.modifier.aging_multiplier", "Age Multiplier"); + provider.add("item.cosmiccore.decaying_cosmic_upgrade", "Decaying Upgrade"); + provider.add("item.cosmiccore.decaying_cosmic_upgrade.tooltip", + "§cInstantly Kills Bees and overloads the lifetime cycle"); + + provider.add("item.cosmiccore.wailing_cosmic_upgrade", "Wailing Upgrade"); + provider.add("item.cosmiccore.wailing_cosmic_upgrade.tooltip", "§cMaximum Mutation"); + + multiLang(provider, "cosmiccore.machine.me.stocking_item.tooltip", + "§fAutomatically pulls products into a singular item slot§r", + "§bAllows Advanced Automation of the Assembly line§r", + "§fCan be set to automatically pull the first item from AE2§r", + "§bor manually filtered.§r", + "§fFilter data can be copy/pasted with a data stick§r", + "§b'If you're wondering how to parallel assembly lines§r", + "§fthis is how. Welcome to subnets!§r"); + + // Cross-Dimensional Multiblock Linking + provider.add("cosmiccore.datastick.link_copied", "Link: %s"); + provider.add("cosmiccore.link.copied", "Link data copied from %s"); + provider.add("cosmiccore.link.established", "Link established: %s ↔ %s"); + + // Link validation errors + provider.add("cosmiccore.link.not_ready", "Machine not ready for linking"); + provider.add("cosmiccore.link.invalid_data", "Invalid link data on datastick"); + provider.add("cosmiccore.link.cannot_self_link", "Cannot link a machine to itself"); + provider.add("cosmiccore.link.partner_not_loaded", "Partner machine must be loaded to establish link"); + provider.add("cosmiccore.link.partner_missing", "Partner machine no longer exists"); + provider.add("cosmiccore.link.not_linkable", "Target machine does not support linking"); + provider.add("cosmiccore.link.different_owner", "Cannot link machines owned by different teams"); + provider.add("cosmiccore.link.incompatible_roles", "Incompatible link roles: %s cannot link to %s"); + provider.add("cosmiccore.link.limit_reached_self", "This machine has reached its link limit"); + provider.add("cosmiccore.link.limit_reached_partner", "Partner machine has reached its link limit"); + provider.add("cosmiccore.link.incompatible_self", "This machine cannot link to that type"); + provider.add("cosmiccore.link.incompatible_partner", "Partner machine cannot link to this type"); + provider.add("cosmiccore.link.already_linked", "These machines are already linked"); + provider.add("cosmiccore.link.too_far", "Partner is too far away to force-load for linking"); + + // Link runtime status + provider.add("cosmiccore.recipe.waiting_for_partner", "Waiting for linked partner"); + provider.add("cosmiccore.link.partner_offline", "Linked partner offline"); + provider.add("cosmiccore.multiblock.drone_station_machine.tier.0", "Plasmatic"); + provider.add("cosmiccore.multiblock.drone_station_machine.tier.1", "Sanguine"); + provider.add("cosmiccore.multiblock.drone_station_machine.tier.2", "Industrial"); + provider.add("cosmiccore.multiblock.drone_station_machine.tier.3", "Robust"); + provider.add("cosmiccore.multiblock.drone_station_machine.tier.4", "Rusty"); + provider.add("cosmiccore.multiblock.drone_station_machine.tier.5", "None"); + provider.add("cosmiccore.calorific.tooltip.prefix", "§5Calorific:§r %s"); + provider.add("cosmiccore.lubricant.tooltip.prefix", "§6Lubricant:§r Tier %s"); + provider.add("cosmiccore.booster.tooltip.prefix", "§bBooster:§r Tier %s"); + "§bAllows Advanced Automation of the Assembly line§r", + "§fCan be set to automatically pull the first item from AE2§r", + "§bor manually filtered.§r", + "§fFilter data can be copy/pasted with a data stick§r", + "§b'If you're wondering how to parallel assembly lines§r", + "§fthis is how. Welcome to subnets!§r" + ); + + + + + // Tinkers + provider.add("item.cosmiccore.wire_cutter", "Wire Cutters"); + provider.add("item.cosmiccore.wire_cutter.description", "Snip wires cleanly with these cutters."); + + provider.add("item.cosmiccore.wrench", "Wrench"); + provider.add("item.cosmiccore.wrench_head", "Wrench Head"); + provider.add("item.cosmiccore.wrench.description", "Rotate the World!"); + + provider.add("cosmiccore.stellar.module.max_eut", "Max EU/t"); + provider.add("cosmiccore.stellar.module.parallel", "Parallel"); + provider.add("cosmiccore.stellar.module.parallel_max", "%sx (max %s)"); + provider.add("cosmiccore.stellar.module.current", "Current"); + provider.add("cosmiccore.stellar.module.speed_bonus", "Speed Bonus"); + provider.add("cosmiccore.stellar.module.iris_limit", "Iris Limit"); + provider.add("cosmiccore.stellar.module.stage", "Stage"); + provider.add("cosmiccore.stellar.module.waiting_iris", "Waiting for Iris"); + provider.add("cosmiccore.stellar.module.not_linked", "Not linked to Stellar Iris"); + provider.add("cosmiccore.stellar.module.config", "Module Config"); + + provider.add("cosmiccore.stellar.power.title", "Power Control Panel"); + provider.add("cosmiccore.stellar.power.max_parallel", "Maximum Parallel"); + provider.add("cosmiccore.stellar.power.voltage_per_parallel", "Voltage Per Parallel"); + + provider.add("cosmiccore.stellar.stage.initialization", "INITIALIZATION"); + provider.add("cosmiccore.stellar.stage.stellar_ignition", "STELLAR IGNITION"); + provider.add("cosmiccore.stellar.stage.stellar_operations", "STELLAR OPERATIONS"); + provider.add("cosmiccore.stellar.stage.critical_mass", "CRITICAL MASS"); + provider.add("cosmiccore.stellar.stage.singularity_control", "SINGULARITY CONTROL"); + provider.add("cosmiccore.stellar.stage.emergency_protocols", "EMERGENCY PROTOCOLS"); + provider.add("cosmiccore.stellar.stage.controlled_shutdown", "CONTROLLED SHUTDOWN"); + + provider.add("cosmiccore.stellar.context.empty_line1", "Insert star seed and"); + provider.add("cosmiccore.stellar.context.empty_line2", "provide stellar gases"); + provider.add("cosmiccore.stellar.context.empty_line3", "to begin ignition."); + provider.add("cosmiccore.stellar.context.growing_line1", "Stellar fusion"); + provider.add("cosmiccore.stellar.context.growing_line2", "initiating..."); + provider.add("cosmiccore.stellar.context.star_line1", "Stable fusion active"); + provider.add("cosmiccore.stellar.context.star_line2", "Processing available"); + provider.add("cosmiccore.stellar.context.superstar_line1", "WARNING: Critical mass"); + provider.add("cosmiccore.stellar.context.superstar_line2", "Collapse imminent"); + provider.add("cosmiccore.stellar.context.blackhole_line1", "Singularity contained"); + provider.add("cosmiccore.stellar.context.blackhole_line2", "Exotic processing"); + provider.add("cosmiccore.stellar.context.death_line1", "CRITICAL FAILURE"); + provider.add("cosmiccore.stellar.context.death_line2", "SOUL FUSE ENGAGED"); + provider.add("cosmiccore.stellar.context.death_graceful_line1", "Controlled shutdown"); + provider.add("cosmiccore.stellar.context.death_graceful_line2", "in progress..."); + + provider.add("cosmiccore.stellar.slot.star_seed", "Star Seed"); + + // ========================================================================= + // REFLECTION SYSTEM + // ========================================================================= + initReflectionLang(provider); + } + + private static void initReflectionLang(RegistrateLangProvider provider) { + // UI Elements - Basic + provider.add("reflection.cosmiccore.ui.void_title", "The Void Between"); + provider.add("reflection.cosmiccore.ui.constellation_title", "The Constellation of Bargains"); + provider.add("reflection.cosmiccore.ui.available_bargains", "Available Bargains"); + provider.add("reflection.cosmiccore.ui.your_bargains", "Your Bargains"); + provider.add("reflection.cosmiccore.ui.defiance", "Defiance"); + provider.add("reflection.cosmiccore.ui.continue", "[Continue]"); + provider.add("reflection.cosmiccore.ui.acknowledge", "[I understand]"); + provider.add("reflection.cosmiccore.ui.back", "[Back]"); + provider.add("reflection.cosmiccore.ui.exit", "[Leave]"); + provider.add("reflection.cosmiccore.ui.leave", "[Leave this place]"); + provider.add("reflection.cosmiccore.ui.view_bargains", "[View Available Bargains]"); + provider.add("reflection.cosmiccore.ui.view_active", "[View Your Bargains]"); + provider.add("reflection.cosmiccore.ui.enter_defiance", "[Enter Defiance Mode]"); + provider.add("reflection.cosmiccore.ui.defy_bargain", "[Defy This Bargain]"); + provider.add("reflection.cosmiccore.ui.confirm_defiance", "[Confirm Defiance]"); + provider.add("reflection.cosmiccore.ui.cancel", "[Cancel]"); + provider.add("reflection.cosmiccore.ui.select", "[Select]"); + provider.add("reflection.cosmiccore.ui.no_bargains", "No bargains accepted yet."); + provider.add("reflection.cosmiccore.ui.defiance_warning", + "Defying a bargain will cost you power but restore some of your soul."); + provider.add("reflection.cosmiccore.ui.powers", "Powers:"); + provider.add("reflection.cosmiccore.ui.drawbacks", "Drawbacks:"); + provider.add("reflection.cosmiccore.ui.soul_erosion", "Soul Erosion: %d%%"); + provider.add("reflection.cosmiccore.ui.soul_erosion_display", "Soul Erosion: %s%%"); + provider.add("reflection.cosmiccore.ui.soul_label", "Soul"); + provider.add("reflection.cosmiccore.ui.dialogue_continue", "Click to continue..."); + provider.add("reflection.cosmiccore.ui.no_available_bargains", "The void has nothing to offer you... for now."); + provider.add("reflection.cosmiccore.ui.select_to_view", "Select a bargain to view details"); + provider.add("reflection.cosmiccore.ui.cost", "Cost: %d erosion"); + provider.add("reflection.cosmiccore.ui.erosion", "erosion"); + provider.add("reflection.cosmiccore.ui.of", "of"); + provider.add("reflection.cosmiccore.ui.defy", "Defy"); + provider.add("reflection.cosmiccore.ui.tooltip.no_details", "No additional details"); + + // Scroll indicators + provider.add("reflection.cosmiccore.ui.scroll_up", "\u25B2 Scroll up"); + provider.add("reflection.cosmiccore.ui.scroll_down", "\u25BC Scroll down"); + + // Hub menu options + provider.add("reflection.cosmiccore.ui.review_bargains", "[Review your %s bargains]"); + provider.add("reflection.cosmiccore.ui.browse_bargains", "[Browse %s available bargains]"); + provider.add("reflection.cosmiccore.ui.gaze_constellation", "[Gaze upon the constellation]"); + provider.add("reflection.cosmiccore.ui.just_look", "[Just... look at yourself]"); + provider.add("reflection.cosmiccore.ui.unlock_cost", "Cost: %d soul erosion"); + provider.add("reflection.cosmiccore.ui.defiance_cost", "Defiance will cost %d erosion"); + + // Hub option details + provider.add("reflection.cosmiccore.ui.hub.review.power", "See what you've given away"); + provider.add("reflection.cosmiccore.ui.hub.review.drawback", "Consider defying a bargain"); + provider.add("reflection.cosmiccore.ui.hub.browse.power", "See what the void offers"); + provider.add("reflection.cosmiccore.ui.hub.browse.response", "So many choices... so little soul."); + provider.add("reflection.cosmiccore.ui.hub.browse.response_empty", "Nothing for you. Yet."); + provider.add("reflection.cosmiccore.ui.hub.reflect.power", "Contemplate your existence"); + provider.add("reflection.cosmiccore.ui.hub.review_response", "Let's see what you've become."); + provider.add("reflection.cosmiccore.ui.hub.reflect_response", "Gazing into the abyss, are we?"); + provider.add("reflection.cosmiccore.ui.hub.leave_response", "Running away? How predictable."); + + // Hub greetings + provider.add("reflection.cosmiccore.ui.hub.greeting.many_bargains_high.0", "Look at you. So much given away."); + provider.add("reflection.cosmiccore.ui.hub.greeting.many_bargains_high.1", + "Do you even remember what you were?"); + provider.add("reflection.cosmiccore.ui.hub.greeting.many_bargains.0", "Back again. Of course you are."); + provider.add("reflection.cosmiccore.ui.hub.greeting.many_bargains.1", "Your soul grows thinner each time."); + provider.add("reflection.cosmiccore.ui.hub.greeting.has_bargains.0", "Ah, you return. Hungry for more?"); + provider.add("reflection.cosmiccore.ui.hub.greeting.has_bargains.1", "I have plenty left to offer."); + provider.add("reflection.cosmiccore.ui.hub.greeting.has_scars.0", "I see the scars of defiance."); + provider.add("reflection.cosmiccore.ui.hub.greeting.has_scars.1", "You took power, then threw it away."); + provider.add("reflection.cosmiccore.ui.hub.greeting.has_scars.2", "Was the cost of keeping it too high?"); + provider.add("reflection.cosmiccore.ui.hub.greeting.erosion_no_bargains.0", + "Erosion without bargains? Curious."); + provider.add("reflection.cosmiccore.ui.hub.greeting.erosion_no_bargains.1", + "Something else has been taking from you."); + provider.add("reflection.cosmiccore.ui.hub.greeting.erosion_no_bargains.2", + "Perhaps you should let me help instead."); + provider.add("reflection.cosmiccore.ui.hub.greeting.fresh.0", "A pristine soul. How rare."); + provider.add("reflection.cosmiccore.ui.hub.greeting.fresh.1", "Don't worry. That won't last."); + provider.add("reflection.cosmiccore.ui.hub.greeting.question", "What brings you to my domain?"); + + // Reflection dialogues (erosion-based) + provider.add("reflection.cosmiccore.ui.reflection.no_erosion.0", "Untouched. Pure. How boring."); + provider.add("reflection.cosmiccore.ui.reflection.no_erosion.1", "You come here with nothing to show?"); + provider.add("reflection.cosmiccore.ui.reflection.no_erosion.2", "That will change. They always change."); + provider.add("reflection.cosmiccore.ui.reflection.low_erosion.0", "Just a taste. That's how it starts."); + provider.add("reflection.cosmiccore.ui.reflection.low_erosion.1", "You'll be back for more."); + provider.add("reflection.cosmiccore.ui.reflection.mid_erosion.0", "Getting comfortable with the darkness?"); + provider.add("reflection.cosmiccore.ui.reflection.mid_erosion.1", "I can see it settling into you."); + provider.add("reflection.cosmiccore.ui.reflection.high_erosion.0", "So much of you is gone now."); + provider.add("reflection.cosmiccore.ui.reflection.high_erosion.1", "Do you remember what you were?"); + provider.add("reflection.cosmiccore.ui.reflection.extreme_erosion.0", "Almost nothing left. Almost."); + provider.add("reflection.cosmiccore.ui.reflection.extreme_erosion.1", + "One more push and you're mine completely."); + provider.add("reflection.cosmiccore.ui.reflection.has_bargains.0", "I see you've made some... arrangements."); + provider.add("reflection.cosmiccore.ui.reflection.has_bargains.1", "Each one a piece of you given away."); + + // Browsing bargains + provider.add("reflection.cosmiccore.ui.browse.interesting_choice", "An interesting choice. Let me show you."); + + // Defiance UI + provider.add("reflection.cosmiccore.ui.defiance.question", "You wish to break this bargain?"); + provider.add("reflection.cosmiccore.ui.defiance.lose_power", "You will lose all powers from this bargain"); + provider.add("reflection.cosmiccore.ui.defiance.scar_remains", "A scar will remain on your soul forever"); + provider.add("reflection.cosmiccore.ui.defiance.confirm", "[Yes, I defy this bargain]"); + provider.add("reflection.cosmiccore.ui.defiance.cancel", "[No, I've changed my mind]"); + provider.add("reflection.cosmiccore.ui.defiance.so_be_it", "So be it. Feel the pain of reclamation."); + provider.add("reflection.cosmiccore.ui.defiance.wise", "Wise. The power is worth more than your principles."); + provider.add("reflection.cosmiccore.ui.defiance.will_lose", "You will lose: %s"); + provider.add("reflection.cosmiccore.ui.defiance.cost_amount", "This will cost you %d erosion"); + provider.add("reflection.cosmiccore.ui.defiance.cannot_undo", "This cannot be undone"); + provider.add("reflection.cosmiccore.ui.defiance.warning1", "You would break the bargain of %s?"); + provider.add("reflection.cosmiccore.ui.defiance.warning2", "The cost of defiance is %d erosion."); + provider.add("reflection.cosmiccore.ui.defiance.warning3", "The power will leave you. The scar will not."); + provider.add("reflection.cosmiccore.ui.defiance.warning4", "Are you certain?"); + + // Constellation UI + provider.add("reflection.cosmiccore.ui.forever_scarred", "Forever Scarred"); + provider.add("reflection.cosmiccore.ui.click_to_bargain", "Click to bargain"); + provider.add("reflection.cosmiccore.ui.click_to_defy", "Click to defy (%d erosion)"); + provider.add("reflection.cosmiccore.ui.power", "Power"); + provider.add("reflection.cosmiccore.ui.drawback", "Drawback"); + + // ========================================================================= + // BARGAINS + // ========================================================================= + + // --- Quake Movement Bargain (quake_movement) --- + // Answers: yes, refuse | Dialogues: 4 + provider.add("reflection.cosmiccore.bargain.quake_movement.name", "Velocity"); + provider.add("reflection.cosmiccore.bargain.quake_movement.description", + "Master momentum itself through unnatural locomotion"); + provider.add("reflection.cosmiccore.bargain.quake_movement.dialogue.0", + "You move like prey. Hesitant. Fearful."); + provider.add("reflection.cosmiccore.bargain.quake_movement.dialogue.1", + "I remember when things moved differently. Before physics became so... rigid."); + provider.add("reflection.cosmiccore.bargain.quake_movement.dialogue.2", + "I can teach your legs to remember that older way."); + provider.add("reflection.cosmiccore.bargain.quake_movement.dialogue.3", + "But once they learn, they will never be content with stillness again."); + provider.add("reflection.cosmiccore.bargain.quake_movement.question", + "Will you embrace the velocity that waits within you?"); + provider.add("reflection.cosmiccore.bargain.quake_movement.answer.yes.text", "Teach me to move like the wind."); + provider.add("reflection.cosmiccore.bargain.quake_movement.answer.yes.response", + "Feel it now - your muscles rewiring, learning trajectories they were never meant to know."); + provider.add("reflection.cosmiccore.bargain.quake_movement.answer.yes.power.0", + "Bunny hopping preserves and builds momentum"); + provider.add("reflection.cosmiccore.bargain.quake_movement.answer.yes.power.1", + "Air strafing for mid-air direction control"); + provider.add("reflection.cosmiccore.bargain.quake_movement.answer.yes.drawback.0", + "Movement feels unnatural to observers"); + provider.add("reflection.cosmiccore.bargain.quake_movement.answer.refuse.text", + "My feet know their own rhythm."); + provider.add("reflection.cosmiccore.bargain.quake_movement.answer.refuse.response", + "Such faith in the pedestrian. We shall see how long that serves you."); + provider.add("reflection.cosmiccore.bargain.quake_movement.on_accept", + "Your joints crack and reform. Movement becomes instinct."); + provider.add("reflection.cosmiccore.bargain.quake_movement.on_defy", + "Your legs remember what it was to walk normally. The speed fades like a dream."); + + // --- Depths Bargain (depths) --- + // Answers: embrace, refuse | Dialogues: 6 + provider.add("reflection.cosmiccore.bargain.depths.name", "The Depths"); + provider.add("reflection.cosmiccore.bargain.depths.description", "Enhanced breath with fatal consequences"); + provider.add("reflection.cosmiccore.bargain.depths.dialogue.0", + "You've felt the water closing over your head."); + provider.add("reflection.cosmiccore.bargain.depths.dialogue.1", + "That desperate burn in your lungs. The panic."); + provider.add("reflection.cosmiccore.bargain.depths.dialogue.2", + "I can remake those fragile organs. Give them capacity beyond mortal limits."); + provider.add("reflection.cosmiccore.bargain.depths.dialogue.3", + "Your breath will stretch to fill the void between heartbeats."); + provider.add("reflection.cosmiccore.bargain.depths.dialogue.4", + "But understand - when they finally empty, there will be no warning."); + provider.add("reflection.cosmiccore.bargain.depths.dialogue.5", + "No desperate gasps. No gradual fading. Just... silence."); + provider.add("reflection.cosmiccore.bargain.depths.question", "Will you let me reshape your breath?"); + provider.add("reflection.cosmiccore.bargain.depths.answer.embrace.text", "Remake me for the depths."); + provider.add("reflection.cosmiccore.bargain.depths.answer.embrace.response", + "Your chest feels hollow now. That's normal. The new capacity needs room."); + provider.add("reflection.cosmiccore.bargain.depths.answer.embrace.power.0", "5x oxygen capacity underwater"); + provider.add("reflection.cosmiccore.bargain.depths.answer.embrace.power.1", + "Extended breath in toxic atmospheres"); + provider.add("reflection.cosmiccore.bargain.depths.answer.embrace.drawback.0", + "Instant death when oxygen fully depletes"); + provider.add("reflection.cosmiccore.bargain.depths.answer.embrace.drawback.1", + "No drowning damage warning - just death"); + provider.add("reflection.cosmiccore.bargain.depths.answer.refuse.text", "I'll keep my mortal breath."); + provider.add("reflection.cosmiccore.bargain.depths.answer.refuse.response", + "The depths wait patiently. They always have."); + provider.add("reflection.cosmiccore.bargain.depths.on_accept", + "Something shifts in your chest. The air tastes different now."); + provider.add("reflection.cosmiccore.bargain.depths.on_defy", + "You gasp - your lungs remember panic, remember struggle. You are mortal again."); + + // --- Swiftness Bargain (swiftness) --- + // Answers: accept, refuse | Dialogues: 3 + provider.add("reflection.cosmiccore.bargain.swiftness.name", "Swiftness"); + provider.add("reflection.cosmiccore.bargain.swiftness.description", + "Supernatural speed courses through your veins"); + provider.add("reflection.cosmiccore.bargain.swiftness.dialogue.0", + "The world moves so slowly around you, doesn't it?"); + provider.add("reflection.cosmiccore.bargain.swiftness.dialogue.1", + "Everyone else trudging through molasses while you ache to run."); + provider.add("reflection.cosmiccore.bargain.swiftness.dialogue.2", + "I can accelerate you. Make the world blur past like a fading dream."); + provider.add("reflection.cosmiccore.bargain.swiftness.question", "Do you wish to leave the slow world behind?"); + provider.add("reflection.cosmiccore.bargain.swiftness.answer.accept.text", "Make me swift beyond measure."); + provider.add("reflection.cosmiccore.bargain.swiftness.answer.accept.response", + "Your blood sings now. Feel it racing faster than any heart should allow."); + provider.add("reflection.cosmiccore.bargain.swiftness.answer.accept.power.0", "+40% movement speed"); + provider.add("reflection.cosmiccore.bargain.swiftness.answer.accept.power.1", "Sprint without hunger drain"); + provider.add("reflection.cosmiccore.bargain.swiftness.answer.accept.drawback.0", + "Increased hunger when standing still"); + provider.add("reflection.cosmiccore.bargain.swiftness.answer.refuse.text", "I am content with my pace."); + provider.add("reflection.cosmiccore.bargain.swiftness.answer.refuse.response", + "Content. Such a mortal sentiment. It will fade."); + provider.add("reflection.cosmiccore.bargain.swiftness.on_accept", + "Lightning arcs through your muscles. You twitch with restless energy."); + provider.add("reflection.cosmiccore.bargain.swiftness.on_defy", + "The world speeds up around you. You are merely human once more."); + + // --- Stride Bargain (stride) --- + // Answers: accept, suspicious, refuse | Dialogues: 4 + provider.add("reflection.cosmiccore.bargain.stride.name", "Stride"); + provider.add("reflection.cosmiccore.bargain.stride.description", "Walk over obstacles as if they were nothing"); + provider.add("reflection.cosmiccore.bargain.stride.dialogue.0", + "Every ledge. Every block. Every small obstacle."); + provider.add("reflection.cosmiccore.bargain.stride.dialogue.1", "They mock you with their need to be climbed."); + provider.add("reflection.cosmiccore.bargain.stride.dialogue.2", + "What if the world simply... accommodated your stride?"); + provider.add("reflection.cosmiccore.bargain.stride.dialogue.3", + "Your feet need never leave the ground. The ground will rise to meet them."); + provider.add("reflection.cosmiccore.bargain.stride.question", "Shall obstacles bow before your passage?"); + provider.add("reflection.cosmiccore.bargain.stride.answer.accept.text", "Let the world flatten before me."); + provider.add("reflection.cosmiccore.bargain.stride.answer.accept.response", + "Walk now. Feel how terrain reshapes itself for your convenience."); + provider.add("reflection.cosmiccore.bargain.stride.answer.accept.power.0", "Auto step-up to 1 block height"); + provider.add("reflection.cosmiccore.bargain.stride.answer.accept.power.1", "Smooth terrain traversal"); + provider.add("reflection.cosmiccore.bargain.stride.answer.accept.drawback.0", "Cannot crouch-walk off edges"); + provider.add("reflection.cosmiccore.bargain.stride.answer.refuse.text", "I'll climb my own way."); + provider.add("reflection.cosmiccore.bargain.stride.answer.refuse.response", + "Such determination. It will erode. They always do."); + provider.add("reflection.cosmiccore.bargain.stride.on_accept", + "The earth seems to shift slightly, eager to smooth your path."); + provider.add("reflection.cosmiccore.bargain.stride.on_defy", + "Gravity reasserts itself. Every ledge is a challenge again."); + + // --- Darksight Bargain (darksight) --- + // Answers: yes, refuse | Dialogues: 5 + provider.add("reflection.cosmiccore.bargain.darksight.name", "Darksight"); + provider.add("reflection.cosmiccore.bargain.darksight.description", "See through the deepest darkness"); + provider.add("reflection.cosmiccore.bargain.darksight.dialogue.0", + "You fear the dark. Every creature does, at first."); + provider.add("reflection.cosmiccore.bargain.darksight.dialogue.1", + "But darkness is merely the absence of something. Not presence."); + provider.add("reflection.cosmiccore.bargain.darksight.dialogue.2", + "I can teach your eyes to drink the shadow. To see what lurks unseen."); + provider.add("reflection.cosmiccore.bargain.darksight.dialogue.3", + "Every hidden corner will surrender its secrets to you."); + provider.add("reflection.cosmiccore.bargain.darksight.dialogue.4", + "But be warned - the light will begin to burn."); + provider.add("reflection.cosmiccore.bargain.darksight.question", + "Will you trade the sun for the gift of shadow-sight?"); + provider.add("reflection.cosmiccore.bargain.darksight.answer.yes.text", "Let me see in the darkness."); + provider.add("reflection.cosmiccore.bargain.darksight.answer.yes.response", + "Your pupils dilate... and keep dilating. The dark becomes your domain."); + provider.add("reflection.cosmiccore.bargain.darksight.answer.yes.power.0", "Permanent Night Vision effect"); + provider.add("reflection.cosmiccore.bargain.darksight.answer.yes.power.1", "See in complete darkness"); + provider.add("reflection.cosmiccore.bargain.darksight.answer.yes.drawback.0", + "Blindness effect in bright sunlight"); + provider.add("reflection.cosmiccore.bargain.darksight.answer.yes.drawback.1", + "Must wear helmet or stay underground during day"); + provider.add("reflection.cosmiccore.bargain.darksight.answer.refuse.text", "The light serves me well enough."); + provider.add("reflection.cosmiccore.bargain.darksight.answer.refuse.response", + "Cling to your torch then. See how long it lasts in the deep places."); + provider.add("reflection.cosmiccore.bargain.darksight.on_accept", + "The shadows retreat from your vision. You see everything now."); + provider.add("reflection.cosmiccore.bargain.darksight.on_defy", + "Light floods back. The darkness closes its secrets to you once more."); + + // --- Carapace Bargain (carapace) --- + // Answers: survive, feel | Dialogues: 5 + provider.add("reflection.cosmiccore.bargain.carapace.name", "Carapace"); + provider.add("reflection.cosmiccore.bargain.carapace.description", "Your flesh hardens into living armor"); + provider.add("reflection.cosmiccore.bargain.carapace.dialogue.0", "Your skin is so soft. So vulnerable."); + provider.add("reflection.cosmiccore.bargain.carapace.dialogue.1", + "Every blade, every claw, every falling stone - they all threaten you."); + provider.add("reflection.cosmiccore.bargain.carapace.dialogue.2", + "I can harden your flesh. Make it something more... enduring."); + provider.add("reflection.cosmiccore.bargain.carapace.dialogue.3", + "Blows will glance off. Damage will diminish."); + provider.add("reflection.cosmiccore.bargain.carapace.dialogue.4", + "But you will feel less. Touch will become... distant."); + provider.add("reflection.cosmiccore.bargain.carapace.question", "Will you sacrifice sensation for survival?"); + provider.add("reflection.cosmiccore.bargain.carapace.answer.survive.text", "Harden me. I choose survival."); + provider.add("reflection.cosmiccore.bargain.carapace.answer.survive.response", + "Your skin tightens. Hardens. You are becoming something more durable."); + provider.add("reflection.cosmiccore.bargain.carapace.answer.survive.power.0", + "+8 armor points (4 full armor icons)"); + provider.add("reflection.cosmiccore.bargain.carapace.answer.survive.power.1", "Stacks with worn armor"); + provider.add("reflection.cosmiccore.bargain.carapace.answer.survive.drawback.0", + "-20% healing from all sources"); + provider.add("reflection.cosmiccore.bargain.carapace.answer.survive.drawback.1", + "Reduced potion effectiveness"); + provider.add("reflection.cosmiccore.bargain.carapace.answer.refuse.text", + "I would rather feel than merely endure."); + provider.add("reflection.cosmiccore.bargain.carapace.answer.refuse.response", + "Feeling. How fragile. How mortal. How temporary."); + provider.add("reflection.cosmiccore.bargain.carapace.on_accept", + "Your flesh ripples and tightens. It doesn't hurt. That's the point."); + provider.add("reflection.cosmiccore.bargain.carapace.on_defy", + "Sensation floods back - every breeze, every texture. You are soft again."); + + // --- Soft Landing Bargain (soft_landing) --- + // Answers: yes, careful | Dialogues: 5 + provider.add("reflection.cosmiccore.bargain.soft_landing.name", "Soft Landing"); + provider.add("reflection.cosmiccore.bargain.soft_landing.description", + "The ground welcomes you gently from any height"); + provider.add("reflection.cosmiccore.bargain.soft_landing.dialogue.0", + "Heights terrify you. The primal fear of falling."); + provider.add("reflection.cosmiccore.bargain.soft_landing.dialogue.1", + "That sickening moment when gravity claims you."); + provider.add("reflection.cosmiccore.bargain.soft_landing.dialogue.2", "But what if the ground... forgave you?"); + provider.add("reflection.cosmiccore.bargain.soft_landing.dialogue.3", + "What if every fall ended softly, no matter the height?"); + provider.add("reflection.cosmiccore.bargain.soft_landing.dialogue.4", "You need never fear the drop again."); + provider.add("reflection.cosmiccore.bargain.soft_landing.question", "Will you let the earth catch you?"); + provider.add("reflection.cosmiccore.bargain.soft_landing.answer.yes.text", "Take away my fear of falling."); + provider.add("reflection.cosmiccore.bargain.soft_landing.answer.yes.response", + "Jump. Go ahead. The ground will embrace you like a mother."); + provider.add("reflection.cosmiccore.bargain.soft_landing.answer.yes.power.0", "Complete fall damage immunity"); + provider.add("reflection.cosmiccore.bargain.soft_landing.answer.yes.power.1", "Safe drops from any height"); + provider.add("reflection.cosmiccore.bargain.soft_landing.answer.yes.drawback.0", + "+15% damage taken from all sources"); + provider.add("reflection.cosmiccore.bargain.soft_landing.answer.yes.drawback.1", + "Reduced knockback resistance"); + provider.add("reflection.cosmiccore.bargain.soft_landing.answer.refuse.text", + "Fear keeps me cautious. I'll keep it."); + provider.add("reflection.cosmiccore.bargain.soft_landing.answer.refuse.response", + "Caution. A slow path to nowhere. But walk it if you must."); + provider.add("reflection.cosmiccore.bargain.soft_landing.on_accept", + "Your relationship with gravity shifts. It still pulls, but gently now."); + provider.add("reflection.cosmiccore.bargain.soft_landing.on_defy", + "Weight crashes back into your bones. Every fall matters again."); + + // --- Cinder Bargain (cinder) --- + // Answers: burn, refuse | Dialogues: 5 + provider.add("reflection.cosmiccore.bargain.cinder.name", "Cinder"); + provider.add("reflection.cosmiccore.bargain.cinder.description", "Fire cannot harm what has already burned"); + provider.add("reflection.cosmiccore.bargain.cinder.dialogue.0", + "Fire consumes. It is in its nature to destroy."); + provider.add("reflection.cosmiccore.bargain.cinder.dialogue.1", + "Every flame that touches you leaves its mark."); + provider.add("reflection.cosmiccore.bargain.cinder.dialogue.2", + "But what if you had already burned? Completely. Utterly."); + provider.add("reflection.cosmiccore.bargain.cinder.dialogue.3", + "Fire cannot consume what is already ash and ember."); + provider.add("reflection.cosmiccore.bargain.cinder.dialogue.4", + "Let me burn away your vulnerability. You will walk through infernos unscathed."); + provider.add("reflection.cosmiccore.bargain.cinder.question", + "Will you let the flame claim you, so it can never hurt you again?"); + provider.add("reflection.cosmiccore.bargain.cinder.answer.burn.text", "Burn me completely. Make me immune."); + provider.add("reflection.cosmiccore.bargain.cinder.answer.burn.response", + "It hurts. Just for a moment. Then the pain becomes a memory, and fire becomes a friend."); + provider.add("reflection.cosmiccore.bargain.cinder.answer.burn.power.0", "Complete fire and lava immunity"); + provider.add("reflection.cosmiccore.bargain.cinder.answer.burn.power.1", "Can swim in lava safely"); + provider.add("reflection.cosmiccore.bargain.cinder.answer.burn.drawback.0", + "2x damage from freezing and cold sources"); + provider.add("reflection.cosmiccore.bargain.cinder.answer.burn.drawback.1", + "Water extinguishes slower, feels unpleasant"); + provider.add("reflection.cosmiccore.bargain.cinder.answer.refuse.text", + "Fire should be respected, not befriended."); + provider.add("reflection.cosmiccore.bargain.cinder.answer.refuse.response", + "Respect. For something that would consume you without thought. How noble."); + provider.add("reflection.cosmiccore.bargain.cinder.on_accept", + "Heat floods through you, then recedes. Fire will never frighten you again."); + provider.add("reflection.cosmiccore.bargain.cinder.on_defy", + "The warmth drains away. Flames flicker hungrily when they see you now."); + + // --- Vitality Bargain (vitality) --- + // Answers: accept, refuse | Dialogues: 5 + provider.add("reflection.cosmiccore.bargain.vitality.name", "Vitality"); + provider.add("reflection.cosmiccore.bargain.vitality.description", "Life force beyond mortal limits"); + provider.add("reflection.cosmiccore.bargain.vitality.dialogue.0", + "Your body has limits. A fixed amount of life."); + provider.add("reflection.cosmiccore.bargain.vitality.dialogue.1", + "When it empties, you die. Simple. Brutal. Final."); + provider.add("reflection.cosmiccore.bargain.vitality.dialogue.2", + "I can give you more. Stretch your life force beyond its natural bounds."); + provider.add("reflection.cosmiccore.bargain.vitality.dialogue.3", + "More blood. More breath. More heartbeats before the end."); + provider.add("reflection.cosmiccore.bargain.vitality.dialogue.4", + "But maintaining excess takes effort. You will heal... slower."); + provider.add("reflection.cosmiccore.bargain.vitality.question", "Will you trade recovery for resilience?"); + provider.add("reflection.cosmiccore.bargain.vitality.answer.accept.text", "Give me more life to spend."); + provider.add("reflection.cosmiccore.bargain.vitality.answer.accept.response", + "Your heart swells. Literally. It has more to pump now."); + provider.add("reflection.cosmiccore.bargain.vitality.answer.accept.power.0", "+10 max health (5 extra hearts)"); + provider.add("reflection.cosmiccore.bargain.vitality.answer.accept.power.1", + "Increased damage absorption buffer"); + provider.add("reflection.cosmiccore.bargain.vitality.answer.accept.drawback.0", + "-50% natural regeneration rate"); + provider.add("reflection.cosmiccore.bargain.vitality.answer.accept.drawback.1", + "Healing potions 30% less effective"); + provider.add("reflection.cosmiccore.bargain.vitality.answer.refuse.text", "I'll work with what I was given."); + provider.add("reflection.cosmiccore.bargain.vitality.answer.refuse.response", + "Given. As if anyone gave you anything. You simply are. For now."); + provider.add("reflection.cosmiccore.bargain.vitality.on_accept", + "Your veins surge with new vigor. Everything feels more... present."); + provider.add("reflection.cosmiccore.bargain.vitality.on_defy", + "The excess drains away. You are mortal-sized once more."); + + // --- Satiated Bargain (satiated) --- + // Answers: empty, food | Dialogues: 5 + provider.add("reflection.cosmiccore.bargain.satiated.name", "Satiated"); + provider.add("reflection.cosmiccore.bargain.satiated.description", "Hunger becomes a distant memory"); + provider.add("reflection.cosmiccore.bargain.satiated.dialogue.0", + "The constant gnawing. The endless need to consume."); + provider.add("reflection.cosmiccore.bargain.satiated.dialogue.1", "Your stomach rules you like a tyrant."); + provider.add("reflection.cosmiccore.bargain.satiated.dialogue.2", + "What if I could silence it? Make fullness your natural state?"); + provider.add("reflection.cosmiccore.bargain.satiated.dialogue.3", + "You would eat for taste, for ritual - never for need."); + provider.add("reflection.cosmiccore.bargain.satiated.dialogue.4", + "But taste itself would fade. Food becomes... fuel. Nothing more."); + provider.add("reflection.cosmiccore.bargain.satiated.question", + "Will you trade the pleasure of eating for freedom from hunger?"); + provider.add("reflection.cosmiccore.bargain.satiated.answer.empty.text", "Free me from this hunger."); + provider.add("reflection.cosmiccore.bargain.satiated.answer.empty.response", + "The emptiness fades. You will never truly need to eat again."); + provider.add("reflection.cosmiccore.bargain.satiated.answer.empty.power.0", "Hunger depletes 80% slower"); + provider.add("reflection.cosmiccore.bargain.satiated.answer.empty.power.1", "Food provides 3x saturation"); + provider.add("reflection.cosmiccore.bargain.satiated.answer.empty.drawback.0", + "Food restores 50% less hunger bars"); + provider.add("reflection.cosmiccore.bargain.satiated.answer.empty.drawback.1", + "Cannot benefit from food-based buffs"); + provider.add("reflection.cosmiccore.bargain.satiated.answer.refuse.text", + "I enjoy my meals. I'll keep the hunger."); + provider.add("reflection.cosmiccore.bargain.satiated.answer.refuse.response", + "Enjoy. Such a mortal word. The hunger will remind you of your place."); + provider.add("reflection.cosmiccore.bargain.satiated.on_accept", + "The gnawing stops. Silence in your belly. Freedom."); + provider.add("reflection.cosmiccore.bargain.satiated.on_defy", + "Hunger returns with a vengeance. You remember what need feels like."); + + // --- Back Bargain (back) --- + // Answers: accept, refuse | Dialogues: 3 + provider.add("reflection.cosmiccore.bargain.back.name", "The Way Back"); + provider.add("reflection.cosmiccore.bargain.back.description", "Return to where you fell"); + provider.add("reflection.cosmiccore.bargain.back.dialogue.0", + "Death scatters you. Sends you back to beds, to spawns, to arbitrary points."); + provider.add("reflection.cosmiccore.bargain.back.dialogue.1", + "But what if you could return to where you fell?"); + provider.add("reflection.cosmiccore.bargain.back.dialogue.2", + "I can teach you to remember. To reach back through death itself."); + provider.add("reflection.cosmiccore.bargain.back.question", "Will you learn to retrace death's path?"); + provider.add("reflection.cosmiccore.bargain.back.answer.accept.text", "Teach me to find my way back."); + provider.add("reflection.cosmiccore.bargain.back.answer.accept.response", + "Death becomes a waypoint now. Not an ending - a detour."); + provider.add("reflection.cosmiccore.bargain.back.answer.accept.power.0", + "Teleport to death location (once per death)"); + provider.add("reflection.cosmiccore.bargain.back.answer.accept.power.1", "Death marker visible through walls"); + provider.add("reflection.cosmiccore.bargain.back.answer.accept.drawback.0", "5 erosion cost per teleport use"); + provider.add("reflection.cosmiccore.bargain.back.answer.accept.drawback.1", "Marker fades after 10 minutes"); + provider.add("reflection.cosmiccore.bargain.back.answer.refuse.text", "Death should have consequences."); + provider.add("reflection.cosmiccore.bargain.back.answer.refuse.response", + "Consequences. You'll have plenty of those regardless."); + provider.add("reflection.cosmiccore.bargain.back.on_accept", + "A thread connects you to your last breath. You can follow it back."); + provider.add("reflection.cosmiccore.bargain.back.on_defy", "The thread snaps. Death becomes final once more."); + + // --- Home Bargain (home) --- + // Answers: accept, refuse | Dialogues: 3 + provider.add("reflection.cosmiccore.bargain.home.name", "Homeward"); + provider.add("reflection.cosmiccore.bargain.home.description", "The way home is always open"); + provider.add("reflection.cosmiccore.bargain.home.dialogue.0", "Home. Such a powerful concept for mortals."); + provider.add("reflection.cosmiccore.bargain.home.dialogue.1", + "The place you return to. The anchor that grounds you."); + provider.add("reflection.cosmiccore.bargain.home.dialogue.2", + "I can make that connection stronger. Instant. Unbreakable."); + provider.add("reflection.cosmiccore.bargain.home.question", + "Will you bind yourself to your home with chains of void?"); + provider.add("reflection.cosmiccore.bargain.home.answer.accept.text", "Bind me to my home."); + provider.add("reflection.cosmiccore.bargain.home.answer.accept.response", + "Feel the pull now? Home is never more than a thought away."); + provider.add("reflection.cosmiccore.bargain.home.answer.accept.power.0", "Instant teleport to spawn/bed point"); + provider.add("reflection.cosmiccore.bargain.home.answer.accept.power.1", "5 minute cooldown between uses"); + provider.add("reflection.cosmiccore.bargain.home.answer.accept.drawback.0", "10 erosion cost per teleport"); + provider.add("reflection.cosmiccore.bargain.home.answer.accept.drawback.1", "-10% XP gain while far from home"); + provider.add("reflection.cosmiccore.bargain.home.answer.refuse.text", "Home should be earned, not summoned."); + provider.add("reflection.cosmiccore.bargain.home.answer.refuse.response", + "Earned. Through miles of walking. How charmingly primitive."); + provider.add("reflection.cosmiccore.bargain.home.on_accept", + "A cord of void stretches between you and home. Pull it anytime."); + provider.add("reflection.cosmiccore.bargain.home.on_defy", + "The cord dissolves. Home is a journey again, not a destination."); + + // --- Ascension Bargain (ascension) --- + // Answers: ready, refuse | Dialogues: 6 + provider.add("reflection.cosmiccore.bargain.ascension.name", "Ascension"); + provider.add("reflection.cosmiccore.bargain.ascension.description", "Rise above the crawling earth"); + provider.add("reflection.cosmiccore.bargain.ascension.dialogue.0", + "You are bound to the ground. Chained by gravity's petty tyranny."); + provider.add("reflection.cosmiccore.bargain.ascension.dialogue.1", "You dream of flight. All mortals do."); + provider.add("reflection.cosmiccore.bargain.ascension.dialogue.2", "I can sever those chains. Let you rise."); + provider.add("reflection.cosmiccore.bargain.ascension.dialogue.3", + "Not gliding. Not falling with style. True flight."); + provider.add("reflection.cosmiccore.bargain.ascension.dialogue.4", "The sky will open to you like a door."); + provider.add("reflection.cosmiccore.bargain.ascension.dialogue.5", + "But the ground... the ground will become alien. Uncomfortable. Wrong."); + provider.add("reflection.cosmiccore.bargain.ascension.question", "Will you abandon the earth for the sky?"); + provider.add("reflection.cosmiccore.bargain.ascension.answer.ready.text", "I am ready to fly."); + provider.add("reflection.cosmiccore.bargain.ascension.answer.ready.response", + "Then rise. The ground has no claim on you anymore."); + provider.add("reflection.cosmiccore.bargain.ascension.answer.ready.power.0", + "Creative-style flight (toggle with jump while airborne)"); + provider.add("reflection.cosmiccore.bargain.ascension.answer.ready.power.1", + "Fly indefinitely without hunger or stamina cost"); + provider.add("reflection.cosmiccore.bargain.ascension.answer.ready.power.2", + "Full 3D movement control while flying"); + provider.add("reflection.cosmiccore.bargain.ascension.answer.ready.power.3", + "No fall damage while flight is active"); + provider.add("reflection.cosmiccore.bargain.ascension.answer.ready.drawback.0", + "-30% movement speed when not flying"); + provider.add("reflection.cosmiccore.bargain.ascension.answer.ready.drawback.1", + "Vulnerable in no-fly zones or enclosed spaces"); + provider.add("reflection.cosmiccore.bargain.ascension.answer.refuse.text", "The ground has served me well."); + provider.add("reflection.cosmiccore.bargain.ascension.answer.refuse.response", + "Served. Like a servant. How long until you realize you were the servant all along?"); + provider.add("reflection.cosmiccore.bargain.ascension.on_accept", + "Weight leaves you. The sky opens. You are no longer earth-bound."); + provider.add("reflection.cosmiccore.bargain.ascension.on_defy", + "Gravity reclaims you. The ground welcomes you back, possessively."); + + // --- Violence Bargain (violence) --- + // Answers: accept, refuse | Dialogues: 5 + provider.add("reflection.cosmiccore.bargain.violence.name", "Violence"); + provider.add("reflection.cosmiccore.bargain.violence.description", + "Strike with the force of something terrible"); + provider.add("reflection.cosmiccore.bargain.violence.dialogue.0", "Your blows are so... restrained. Hesitant."); + provider.add("reflection.cosmiccore.bargain.violence.dialogue.1", + "You hold back. Every swing. Some part of you fears the damage."); + provider.add("reflection.cosmiccore.bargain.violence.dialogue.2", + "I can remove that restraint. Let your violence flow freely."); + provider.add("reflection.cosmiccore.bargain.violence.dialogue.3", "Your enemies will shatter before you."); + provider.add("reflection.cosmiccore.bargain.violence.dialogue.4", + "But violence is a river that flows both ways."); + provider.add("reflection.cosmiccore.bargain.violence.question", + "Will you embrace true, unrestrained violence?"); + provider.add("reflection.cosmiccore.bargain.violence.answer.accept.text", "Remove my restraints."); + provider.add("reflection.cosmiccore.bargain.violence.answer.accept.response", + "Feel it now? The urge to destroy? Don't fight it. It's yours."); + provider.add("reflection.cosmiccore.bargain.violence.answer.accept.power.0", "+30% melee damage dealt"); + provider.add("reflection.cosmiccore.bargain.violence.answer.accept.power.1", "+15% attack speed"); + provider.add("reflection.cosmiccore.bargain.violence.answer.accept.drawback.0", + "+20% damage taken from all sources"); + provider.add("reflection.cosmiccore.bargain.violence.answer.accept.drawback.1", "Cannot use shields"); + provider.add("reflection.cosmiccore.bargain.violence.answer.refuse.text", "Restraint is its own strength."); + provider.add("reflection.cosmiccore.bargain.violence.answer.refuse.response", + "Restraint. A leash you put on yourself. How adorable."); + provider.add("reflection.cosmiccore.bargain.violence.on_accept", + "Power surges through your arms. Everything looks so... breakable now."); + provider.add("reflection.cosmiccore.bargain.violence.on_defy", + "The rage drains away. Your blows return to mortal weight."); + + // --- Reach Bargain (reach) --- + // Answers: further, practical, refuse | Dialogues: 4 + provider.add("reflection.cosmiccore.bargain.reach.name", "Reach"); + provider.add("reflection.cosmiccore.bargain.reach.description", "Your grasp extends beyond natural limits"); + provider.add("reflection.cosmiccore.bargain.reach.dialogue.0", + "So close, yet so far. The eternal frustration of short arms."); + provider.add("reflection.cosmiccore.bargain.reach.dialogue.1", + "Everything just slightly out of reach. Mocking you."); + provider.add("reflection.cosmiccore.bargain.reach.dialogue.2", + "I can extend you. Stretch your grasp beyond mortal limits."); + provider.add("reflection.cosmiccore.bargain.reach.dialogue.3", + "Your arms will find what they seek. But others may find them... unsettling."); + provider.add("reflection.cosmiccore.bargain.reach.question", "Will you extend your reach into the unnatural?"); + provider.add("reflection.cosmiccore.bargain.reach.answer.further.text", + "Stretch me further. I want to grasp everything."); + provider.add("reflection.cosmiccore.bargain.reach.answer.further.response", + "There. Don't look at your hands too closely. It's easier that way."); + provider.add("reflection.cosmiccore.bargain.reach.answer.further.power.0", + "+3 block reach (build from further)"); + provider.add("reflection.cosmiccore.bargain.reach.answer.further.power.1", "+2 attack reach"); + provider.add("reflection.cosmiccore.bargain.reach.answer.further.drawback.0", "-15% mining speed"); + provider.add("reflection.cosmiccore.bargain.reach.answer.further.drawback.1", "Item pickup range reduced"); + provider.add("reflection.cosmiccore.bargain.reach.answer.refuse.text", "My reach is sufficient."); + provider.add("reflection.cosmiccore.bargain.reach.answer.refuse.response", + "For now. But you'll want more. They always do."); + provider.add("reflection.cosmiccore.bargain.reach.on_accept", + "Something shifts in your shoulders. Your arms remember being longer."); + provider.add("reflection.cosmiccore.bargain.reach.on_defy", + "Your arms contract back to normal. The world feels close and small again."); + + // --- Void Anchor Bargain (void_anchor) --- + // Answers: anchor, refuse | Dialogues: 6 + provider.add("reflection.cosmiccore.bargain.void_anchor.name", "Void Anchor"); + provider.add("reflection.cosmiccore.bargain.void_anchor.description", + "The void cannot claim what is already its own"); + provider.add("reflection.cosmiccore.bargain.void_anchor.dialogue.0", + "You've felt it. The pull of the void beneath the world."); + provider.add("reflection.cosmiccore.bargain.void_anchor.dialogue.1", + "That endless fall. That final darkness that swallows everything."); + provider.add("reflection.cosmiccore.bargain.void_anchor.dialogue.2", + "I dwell there. In that space between existence and nothing."); + provider.add("reflection.cosmiccore.bargain.void_anchor.dialogue.3", + "I can mark you. Make you mine. And what is mine, the void cannot destroy."); + provider.add("reflection.cosmiccore.bargain.void_anchor.dialogue.4", + "Fall as far as you like. The darkness will recognize you. Welcome you."); + provider.add("reflection.cosmiccore.bargain.void_anchor.dialogue.5", + "But being marked by the void... it changes how existence sees you."); + provider.add("reflection.cosmiccore.bargain.void_anchor.question", "Will you become an anchor in the nothing?"); + provider.add("reflection.cosmiccore.bargain.void_anchor.answer.anchor.text", "Mark me. Make me yours."); + provider.add("reflection.cosmiccore.bargain.void_anchor.answer.anchor.response", + "Done. The void knows your name now. It will not harm what belongs to it."); + provider.add("reflection.cosmiccore.bargain.void_anchor.answer.anchor.power.0", "Void damage immunity (Y < 0)"); + provider.add("reflection.cosmiccore.bargain.void_anchor.answer.anchor.power.1", + "Teleport to surface when entering void"); + provider.add("reflection.cosmiccore.bargain.void_anchor.answer.anchor.drawback.0", + "-25% damage in lit areas (sky access)"); + provider.add("reflection.cosmiccore.bargain.void_anchor.answer.anchor.drawback.1", + "Takes damage from direct sunlight exposure"); + provider.add("reflection.cosmiccore.bargain.void_anchor.answer.refuse.text", + "I'll stay in the light, thank you."); + provider.add("reflection.cosmiccore.bargain.void_anchor.answer.refuse.response", + "The light. Yes. Such a thin shield against the endless dark. Good luck."); + provider.add("reflection.cosmiccore.bargain.void_anchor.on_accept", + "Something cold touches your soul. Marks it. The void knows you now."); + provider.add("reflection.cosmiccore.bargain.void_anchor.on_defy", + "The mark burns away. The void forgets you. It will not be merciful next time."); + + // ========================================================================= + // THRESHOLD ENCOUNTERS + // ========================================================================= + + // --- Threshold 0 (10% erosion) --- + provider.add("reflection.cosmiccore.threshold.0.dialogue.0", "You took something that wasn't freely given."); + provider.add("reflection.cosmiccore.threshold.0.dialogue.1", "Did it feel good? The power flooding in?"); + provider.add("reflection.cosmiccore.threshold.0.dialogue.2", "Of course it did. That's the point."); + provider.add("reflection.cosmiccore.threshold.0.dialogue.3", + "I'll be watching now. We have business together."); + provider.add("reflection.cosmiccore.threshold.0.question", "Do you understand what you've started?"); + provider.add("reflection.cosmiccore.threshold.0.response", "Good. Or not. It doesn't matter now."); + + // --- Threshold 1 (20% erosion) --- + provider.add("reflection.cosmiccore.threshold.1.dialogue.0", "Already back for more. I'm not surprised."); + provider.add("reflection.cosmiccore.threshold.1.dialogue.1", "Your soul stretches thinner. Can you feel it?"); + provider.add("reflection.cosmiccore.threshold.1.dialogue.2", "Like taffy. Like mist. Like a memory fading."); + provider.add("reflection.cosmiccore.threshold.1.dialogue.3", "Don't worry. You have plenty left. For now."); + provider.add("reflection.cosmiccore.threshold.1.question", "Still comfortable?"); + provider.add("reflection.cosmiccore.threshold.1.response", "Comfort is overrated anyway."); + + // --- Threshold 2 (30% erosion) --- + provider.add("reflection.cosmiccore.threshold.2.dialogue.0", "A third of you belongs to me now."); + provider.add("reflection.cosmiccore.threshold.2.dialogue.1", "That's not metaphor. I can see it. Taste it."); + provider.add("reflection.cosmiccore.threshold.2.dialogue.2", "Your edges blur. Your definition softens."); + provider.add("reflection.cosmiccore.threshold.2.dialogue.3", "Others might start to notice soon."); + provider.add("reflection.cosmiccore.threshold.2.question", "Having second thoughts?"); + provider.add("reflection.cosmiccore.threshold.2.response", + "Second thoughts require a first. You never had one."); + + // --- Threshold 3 (40% erosion) --- + provider.add("reflection.cosmiccore.threshold.3.dialogue.0", "The dreams are starting, aren't they?"); + provider.add("reflection.cosmiccore.threshold.3.dialogue.1", "The ones where you fall and never land."); + provider.add("reflection.cosmiccore.threshold.3.dialogue.2", + "Where you look in a mirror and something else looks back."); + provider.add("reflection.cosmiccore.threshold.3.dialogue.3", "That's not a dream. That's prophecy."); + provider.add("reflection.cosmiccore.threshold.3.question", "Do you still know who you are?"); + provider.add("reflection.cosmiccore.threshold.3.response", "Keep telling yourself that name means something."); + + // --- Threshold 4 (50% erosion) --- + provider.add("reflection.cosmiccore.threshold.4.dialogue.0", "Halfway. The point of no return approaches."); + provider.add("reflection.cosmiccore.threshold.4.dialogue.1", "Half of you, gone. Given away for trinkets."); + provider.add("reflection.cosmiccore.threshold.4.dialogue.2", "Was it worth it? Don't answer. I don't care."); + provider.add("reflection.cosmiccore.threshold.4.dialogue.3", "What matters is what comes next."); + provider.add("reflection.cosmiccore.threshold.4.question", "Ready to see what's on the other side?"); + provider.add("reflection.cosmiccore.threshold.4.response", "No one ever is. But they cross anyway."); + + // --- Threshold 5 (60% erosion) --- + provider.add("reflection.cosmiccore.threshold.5.dialogue.0", "More of you is mine than yours now."); + provider.add("reflection.cosmiccore.threshold.5.dialogue.1", "Does that frighten you? It should."); + provider.add("reflection.cosmiccore.threshold.5.dialogue.2", "I know thoughts you haven't had yet."); + provider.add("reflection.cosmiccore.threshold.5.dialogue.3", "I feel feelings you've forgotten."); + provider.add("reflection.cosmiccore.threshold.5.question", "Who's really in control?"); + provider.add("reflection.cosmiccore.threshold.5.response", "Keep pretending you still have choice."); + + // --- Threshold 6 (70% erosion) --- + provider.add("reflection.cosmiccore.threshold.6.dialogue.0", "Your reflection doesn't quite match anymore."); + provider.add("reflection.cosmiccore.threshold.6.dialogue.1", "The delay is slight. Others might not notice."); + provider.add("reflection.cosmiccore.threshold.6.dialogue.2", "But you know. You feel it."); + provider.add("reflection.cosmiccore.threshold.6.question", "What stares back at you in mirrors?"); + provider.add("reflection.cosmiccore.threshold.6.response", "Me. Always me now."); + + // --- Threshold 7 (80% erosion) --- + provider.add("reflection.cosmiccore.threshold.7.dialogue.0", "So little left of what you were."); + provider.add("reflection.cosmiccore.threshold.7.dialogue.1", "Fragments. Echoes. Shadows of intention."); + provider.add("reflection.cosmiccore.threshold.7.dialogue.2", "The body walks. The mind calculates."); + provider.add("reflection.cosmiccore.threshold.7.dialogue.3", "But the soul? The soul is almost spent."); + provider.add("reflection.cosmiccore.threshold.7.question", "Can you remember your mother's face?"); + provider.add("reflection.cosmiccore.threshold.7.response", "No. You can't. I took that already."); + + // --- Threshold 8 (90% erosion) --- + provider.add("reflection.cosmiccore.threshold.8.dialogue.0", "One step from the edge now."); + provider.add("reflection.cosmiccore.threshold.8.dialogue.1", "Ten percent. A sliver. A thread."); + provider.add("reflection.cosmiccore.threshold.8.dialogue.2", "That's all that separates you from... me."); + provider.add("reflection.cosmiccore.threshold.8.dialogue.3", "One more bargain. Just one more."); + provider.add("reflection.cosmiccore.threshold.8.question", "Will you take that final step?"); + provider.add("reflection.cosmiccore.threshold.8.response", "We both know you will. The question is when."); + + // --- Threshold 9 (100% erosion) --- + provider.add("reflection.cosmiccore.threshold.9.dialogue.0", "Finally."); + provider.add("reflection.cosmiccore.threshold.9.dialogue.1", "You gave everything. Every last piece."); + provider.add("reflection.cosmiccore.threshold.9.dialogue.2", "There's nothing left of what walked in here."); + provider.add("reflection.cosmiccore.threshold.9.dialogue.3", "Only power. Only hunger. Only me."); + provider.add("reflection.cosmiccore.threshold.9.question", "What do you see when you look at yourself?"); + provider.add("reflection.cosmiccore.threshold.9.response", "Nothing. Because there's nothing left to see."); + + // Stellar Iris Module System + provider.add("cosmiccore.multiblock.stellar_module.not_connected", "§cNot Connected to Stellar Iris"); + provider.add("cosmiccore.multiblock.stellar_module.iris_not_formed", "§cStellar Iris Not Formed"); + provider.add("cosmiccore.multiblock.stellar_module.iris_not_ready", "§eStellar Iris Not Ready"); + provider.add("cosmiccore.multiblock.stellar_module.connected", "§aConnected to Stellar Iris"); + provider.add("cosmiccore.multiblock.stellar_module.stage", "§7Iris Stage: §e%s"); + provider.add("cosmiccore.multiblock.stellar_module.speed_bonus", "§7Speed Bonus: §a%s"); + provider.add("cosmiccore.multiblock.stellar_module.parallel", "§7Parallel Limit: §b%s"); + provider.add("cosmiccore.multiblock.stellar_module.no_wireless", "§cNo Wireless Energy Network"); + provider.add("cosmiccore.multiblock.stellar_module.energy_usage", "§eWireless EU/t: §f%s"); + provider.add("cosmiccore.multiblock.stellar_module.loading", "§7Loading..."); + provider.add("cosmiccore.multiblock.stellar_module.power_failure", "§c§lPOWER FAILURE - Insufficient Energy!"); + provider.add("cosmiccore.multiblock.stellar_module.power_config", "§7Config: §b%s §7@ §a%dx §7Parallel"); + provider.add("cosmiccore.multiblock.pattern.stellar_module_slot", "§7Module Slot (Air or Formed Module)"); + + // JADE Stellar Module Provider + provider.add("cosmiccore.jade.stellar_module.not_connected", "Iris: Not Connected"); + provider.add("cosmiccore.jade.stellar_module.iris_not_ready", "Iris: Not Ready"); + provider.add("cosmiccore.jade.stellar_module.connected", "Iris: Connected"); + provider.add("cosmiccore.jade.stellar_module.stage", "Stage: %s"); + provider.add("cosmiccore.jade.stellar_module.speed_bonus", "Speed: %s"); + provider.add("cosmiccore.jade.stellar_module.no_wireless", "No Wireless Network"); + provider.add("cosmiccore.jade.stellar_module.energy_usage", "Usage: %s"); + + // Stellar Iris GUI - Module Toggle + provider.add("cosmiccore.gui.stellar.show_star", "Show Star View"); + provider.add("cosmiccore.gui.stellar.show_modules", "Show Module Control"); + + // EMI Bookmark Keybinds + provider.add("key.categories.cosmiccore.emi", "CosmicCore - EMI"); + provider.add("key.cosmiccore.emi.next_bookmark_group", "Next Bookmark Group"); + provider.add("key.cosmiccore.emi.prev_bookmark_group", "Previous Bookmark Group"); + provider.add("key.cosmiccore.emi.create_bookmark_group", "Create Bookmark Group"); + + // ========================================================================= + // STELLAR IRIS UPGRADE TREE + // ========================================================================= + + // Branch names + provider.add("cosmiccore.stellar.branch.ignition", "Ignition"); + provider.add("cosmiccore.stellar.branch.fusion", "Fusion"); + provider.add("cosmiccore.stellar.branch.collapse", "Collapse"); + provider.add("cosmiccore.stellar.branch.void", "Void"); + + // UI strings + provider.add("cosmiccore.stellar.convergence.title", "Stellar Convergence"); + provider.add("cosmiccore.stellar.upgrade.cost", "Cost: %d pts"); + provider.add("cosmiccore.stellar.upgrade.tier_required", "Requires Tier %d"); + provider.add("cosmiccore.stellar.upgrade.level", "Level %d / %d"); + provider.add("cosmiccore.stellar.upgrade.max_level", "MAX LEVEL"); + provider.add("cosmiccore.stellar.upgrade.owned", "OWNED"); + provider.add("cosmiccore.stellar.upgrade.available", "Click to unlock"); + provider.add("cosmiccore.stellar.upgrade.locked", "Locked"); + provider.add("cosmiccore.stellar.upgrade.tier_locked", "Tier too low"); + provider.add("cosmiccore.stellar.upgrade.not_enough_points", "Not enough points"); + provider.add("cosmiccore.stellar.upgrade.prereqs_needed", "Prerequisites needed"); + + // === IGNITION BRANCH (Star Lifecycle) === + provider.add("cosmiccore.stellar.upgrade.thermal_stabilizer", "Thermal Stabilizer"); + provider.add("cosmiccore.stellar.upgrade.thermal_stabilizer.desc", "Stars decay 15% slower"); + + provider.add("cosmiccore.stellar.upgrade.plasma_conduits", "Plasma Conduits"); + provider.add("cosmiccore.stellar.upgrade.plasma_conduits.desc", "-10% fuel consumption per tick"); + + provider.add("cosmiccore.stellar.upgrade.fusion_catalyst", "Fusion Catalyst"); + provider.add("cosmiccore.stellar.upgrade.fusion_catalyst.desc", "Stars grow to next stage 25% faster"); + + provider.add("cosmiccore.stellar.upgrade.magnetic_confinement", "Magnetic Confinement"); + provider.add("cosmiccore.stellar.upgrade.magnetic_confinement.desc", + "Star stage cannot drop during active processing"); + + provider.add("cosmiccore.stellar.upgrade.core_harmonics", "Core Harmonics"); + provider.add("cosmiccore.stellar.upgrade.core_harmonics.desc", "-20% additional fuel consumption"); + + provider.add("cosmiccore.stellar.upgrade.proton_recycler", "Proton Recycler"); + provider.add("cosmiccore.stellar.upgrade.proton_recycler.desc", "8% chance to not consume fuel on tick"); + + provider.add("cosmiccore.stellar.upgrade.stellar_regeneration", "Stellar Regeneration"); + provider.add("cosmiccore.stellar.upgrade.stellar_regeneration.desc", + "3% chance per tick for star to gain stage"); + + provider.add("cosmiccore.stellar.upgrade.eternal_ember", "Eternal Ember"); + provider.add("cosmiccore.stellar.upgrade.eternal_ember.desc", "Stars at STAR stage never naturally decay"); + + provider.add("cosmiccore.stellar.upgrade.phoenix_protocol", "Phoenix Protocol"); + provider.add("cosmiccore.stellar.upgrade.phoenix_protocol.desc", + "When star would die, 25% chance to return to STAR stage instead"); + + provider.add("cosmiccore.stellar.upgrade.solar_dominion", "Solar Dominion"); + provider.add("cosmiccore.stellar.upgrade.solar_dominion.desc", "All star lifecycle bonuses increased by 50%"); + + provider.add("cosmiccore.stellar.upgrade.perpetual_ignition", "Perpetual Ignition"); + provider.add("cosmiccore.stellar.upgrade.perpetual_ignition.desc", + "Stars are immune to decay. Fuel costs halved."); + + provider.add("cosmiccore.stellar.upgrade.supernova_core", "Supernova Core"); + provider.add("cosmiccore.stellar.upgrade.supernova_core.desc", + "Stars at SUPERSTAR+ generate bonus prestige shards passively"); + + provider.add("cosmiccore.stellar.upgrade.plasma_hurricane", "Plasma Hurricane"); + provider.add("cosmiccore.stellar.upgrade.plasma_hurricane.desc", + "Star growth speed increased by 40%"); + + provider.add("cosmiccore.stellar.upgrade.stellar_nursery", "Stellar Nursery"); + provider.add("cosmiccore.stellar.upgrade.stellar_nursery.desc", + "New stars begin at GROWING stage instead of EMPTY"); + + provider.add("cosmiccore.stellar.upgrade.corona_expansion", "Corona Expansion"); + provider.add("cosmiccore.stellar.upgrade.corona_expansion.desc", + "Module connection range doubled"); + + provider.add("cosmiccore.stellar.upgrade.helios_forge", "Helios Forge"); + provider.add("cosmiccore.stellar.upgrade.helios_forge.desc", + "Unlock Helios-tier recipes requiring extreme stellar conditions"); + + provider.add("cosmiccore.stellar.upgrade.fusion_overdrive", "Fusion Overdrive"); + provider.add("cosmiccore.stellar.upgrade.fusion_overdrive.desc", + "+50% processing speed, +25% fuel consumption"); + + provider.add("cosmiccore.stellar.upgrade.dyson_lattice", "Dyson Lattice"); + provider.add("cosmiccore.stellar.upgrade.dyson_lattice.desc", + "Passive energy generation scales with star stage (up to 32k EU/t)"); + + provider.add("cosmiccore.stellar.upgrade.solar_genesis", "Solar Genesis"); + provider.add("cosmiccore.stellar.upgrade.solar_genesis.desc", + "Can spawn secondary micro-stars that provide bonus parallels"); + + provider.add("cosmiccore.stellar.upgrade.primordial_flame", "Primordial Flame"); + provider.add("cosmiccore.stellar.upgrade.primordial_flame.desc", + "The first fire. All Ignition bonuses doubled. Stars cannot die."); + + // === FUSION BRANCH (Processing Power) === + provider.add("cosmiccore.stellar.upgrade.graviton_lens", "Graviton Lens"); + provider.add("cosmiccore.stellar.upgrade.graviton_lens.desc", "+1 parallel per star stage"); + + provider.add("cosmiccore.stellar.upgrade.superconducting_grid", "Superconducting Grid"); + provider.add("cosmiccore.stellar.upgrade.superconducting_grid.desc", "-10% energy cost for all recipes"); + + provider.add("cosmiccore.stellar.upgrade.temporal_acceleration", "Temporal Acceleration"); + provider.add("cosmiccore.stellar.upgrade.temporal_acceleration.desc", "+15% processing speed"); + + provider.add("cosmiccore.stellar.upgrade.parallel_manifold", "Parallel Manifold"); + provider.add("cosmiccore.stellar.upgrade.parallel_manifold.desc", "+2 base parallel limit"); + + provider.add("cosmiccore.stellar.upgrade.stellar_compression", "Stellar Compression"); + provider.add("cosmiccore.stellar.upgrade.stellar_compression.desc", "+25% speed at SUPERSTAR or higher"); + + provider.add("cosmiccore.stellar.upgrade.mass_efficiency", "Mass Efficiency"); + provider.add("cosmiccore.stellar.upgrade.mass_efficiency.desc", "-15% additional energy cost"); + + provider.add("cosmiccore.stellar.upgrade.relativistic_processing", "Relativistic Processing"); + provider.add("cosmiccore.stellar.upgrade.relativistic_processing.desc", + "Recipes under 20 ticks complete instantly"); + + provider.add("cosmiccore.stellar.upgrade.quantum_tunneling", "Quantum Tunneling"); + provider.add("cosmiccore.stellar.upgrade.quantum_tunneling.desc", "10% chance to complete recipe instantly"); + + provider.add("cosmiccore.stellar.upgrade.hyperdense_core", "Hyperdense Core"); + provider.add("cosmiccore.stellar.upgrade.hyperdense_core.desc", "+50% parallel limit from all sources"); + + provider.add("cosmiccore.stellar.upgrade.tachyon_weave", "Tachyon Weave"); + provider.add("cosmiccore.stellar.upgrade.tachyon_weave.desc", "+30% processing speed, stacks additively"); + + provider.add("cosmiccore.stellar.upgrade.singularity_engine", "Singularity Engine"); + provider.add("cosmiccore.stellar.upgrade.singularity_engine.desc", + "Double all speed/parallel bonuses. Energy costs -40%."); + + provider.add("cosmiccore.stellar.upgrade.neutron_cascade", "Neutron Cascade"); + provider.add("cosmiccore.stellar.upgrade.neutron_cascade.desc", + "Recipe completions have 15% chance to trigger twice"); + + provider.add("cosmiccore.stellar.upgrade.warp_field_matrix", "Warp Field Matrix"); + provider.add("cosmiccore.stellar.upgrade.warp_field_matrix.desc", + "Items teleport directly to output buses (no transport needed)"); + + provider.add("cosmiccore.stellar.upgrade.particle_storm", "Particle Storm"); + provider.add("cosmiccore.stellar.upgrade.particle_storm.desc", + "+4 base parallels, unlocks particle storm recipes"); + + provider.add("cosmiccore.stellar.upgrade.subspace_harmonics", "Subspace Harmonics"); + provider.add("cosmiccore.stellar.upgrade.subspace_harmonics.desc", + "Energy costs scale inversely with recipe duration"); + + provider.add("cosmiccore.stellar.upgrade.antimatter_injection", "Antimatter Injection"); + provider.add("cosmiccore.stellar.upgrade.antimatter_injection.desc", + "Unlock antimatter fuel. +100% speed when fueled with antimatter"); + + provider.add("cosmiccore.stellar.upgrade.zero_point_tap", "Zero Point Tap"); + provider.add("cosmiccore.stellar.upgrade.zero_point_tap.desc", + "5% of energy cost is refunded after recipe completion"); + + provider.add("cosmiccore.stellar.upgrade.quark_gluon_plasma", "Quark-Gluon Plasma"); + provider.add("cosmiccore.stellar.upgrade.quark_gluon_plasma.desc", + "Unlock QGP recipes. +8 parallels for QGP recipes only"); + + provider.add("cosmiccore.stellar.upgrade.planck_resonance", "Planck Resonance"); + provider.add("cosmiccore.stellar.upgrade.planck_resonance.desc", + "Minimum recipe time reduced to 1 tick"); + + provider.add("cosmiccore.stellar.upgrade.omega_compression", "Omega Compression"); + provider.add("cosmiccore.stellar.upgrade.omega_compression.desc", + "Ultimate processing. All Fusion bonuses tripled. Unlock Omega recipes."); + + // === COLLAPSE BRANCH (Prestige & Points) === + provider.add("cosmiccore.stellar.upgrade.shard_collector", "Shard Collector"); + provider.add("cosmiccore.stellar.upgrade.shard_collector.desc", "+20% prestige points earned"); + + provider.add("cosmiccore.stellar.upgrade.resonant_sacrifice", "Resonant Sacrifice"); + provider.add("cosmiccore.stellar.upgrade.resonant_sacrifice.desc", + "Prestige at SUPERSTAR gives BLACK_HOLE rewards"); + + provider.add("cosmiccore.stellar.upgrade.early_harvest", "Early Harvest"); + provider.add("cosmiccore.stellar.upgrade.early_harvest.desc", "Can prestige at STAR stage (50% points)"); + + provider.add("cosmiccore.stellar.upgrade.efficient_consumption", "Efficient Consumption"); + provider.add("cosmiccore.stellar.upgrade.efficient_consumption.desc", + "15% chance prestige doesn't consume prestige item"); + + provider.add("cosmiccore.stellar.upgrade.point_amplifier", "Point Amplifier"); + provider.add("cosmiccore.stellar.upgrade.point_amplifier.desc", + "+30% prestige points (stacks with Shard Collector)"); + + provider.add("cosmiccore.stellar.upgrade.dual_sacrifice", "Dual Sacrifice"); + provider.add("cosmiccore.stellar.upgrade.dual_sacrifice.desc", "Can consume 2 prestige items for 2.5x points"); + + provider.add("cosmiccore.stellar.upgrade.prestige_momentum", "Prestige Momentum"); + provider.add("cosmiccore.stellar.upgrade.prestige_momentum.desc", + "Each consecutive prestige gives +10% points (max 50%)"); + + provider.add("cosmiccore.stellar.upgrade.echo_of_collapse", "Echo of Collapse"); + provider.add("cosmiccore.stellar.upgrade.echo_of_collapse.desc", + "Prestige grants a temporary 20% speed boost for 5 minutes"); + + provider.add("cosmiccore.stellar.upgrade.entropy_harvest", "Entropy Harvest"); + provider.add("cosmiccore.stellar.upgrade.entropy_harvest.desc", + "Gain bonus points based on star lifetime before prestige"); + + provider.add("cosmiccore.stellar.upgrade.infinite_recursion", "Infinite Recursion"); + provider.add("cosmiccore.stellar.upgrade.infinite_recursion.desc", + "Prestige gives 2x points. 25% chance to keep prestige item."); + + provider.add("cosmiccore.stellar.upgrade.cascading_collapse", "Cascading Collapse"); + provider.add("cosmiccore.stellar.upgrade.cascading_collapse.desc", + "Prestige triggers grant bonus points to connected modules"); + + provider.add("cosmiccore.stellar.upgrade.temporal_echo", "Temporal Echo"); + provider.add("cosmiccore.stellar.upgrade.temporal_echo.desc", + "Store up to 3 prestige charges, release all at once for 3x value"); + + provider.add("cosmiccore.stellar.upgrade.mass_conversion", "Mass Conversion"); + provider.add("cosmiccore.stellar.upgrade.mass_conversion.desc", + "Convert excess materials into prestige points (1000:1 ratio)"); + + provider.add("cosmiccore.stellar.upgrade.stellar_debt", "Stellar Debt"); + provider.add("cosmiccore.stellar.upgrade.stellar_debt.desc", + "Borrow prestige points from future prestiges (150% payback)"); + + provider.add("cosmiccore.stellar.upgrade.entropy_engine", "Entropy Engine"); + provider.add("cosmiccore.stellar.upgrade.entropy_engine.desc", + "Failed recipes contribute to prestige point pool"); + + provider.add("cosmiccore.stellar.upgrade.sacrifice_amplifier", "Sacrifice Amplifier"); + provider.add("cosmiccore.stellar.upgrade.sacrifice_amplifier.desc", + "Prestige items give 4x points but are always consumed"); + + provider.add("cosmiccore.stellar.upgrade.cosmic_tithe", "Cosmic Tithe"); + provider.add("cosmiccore.stellar.upgrade.cosmic_tithe.desc", + "Passively generate prestige points (1/min per tier)"); + + provider.add("cosmiccore.stellar.upgrade.annihilation_yield", "Annihilation Yield"); + provider.add("cosmiccore.stellar.upgrade.annihilation_yield.desc", + "BLACK_HOLE prestige gives 5x base points, destroys the star"); + + provider.add("cosmiccore.stellar.upgrade.heat_death", "Heat Death"); + provider.add("cosmiccore.stellar.upgrade.heat_death.desc", + "The end of all things. All Collapse bonuses tripled. Prestige is instant."); + + // === VOID BRANCH (Exotic Abilities) === + provider.add("cosmiccore.stellar.upgrade.hawking_radiator", "Hawking Radiator"); + provider.add("cosmiccore.stellar.upgrade.hawking_radiator.desc", "BLACK_HOLE generates 2048 EU/t passively"); + + provider.add("cosmiccore.stellar.upgrade.chromatic_tuning", "Chromatic Tuning"); + provider.add("cosmiccore.stellar.upgrade.chromatic_tuning.desc", + "Custom star color provides +5% to matching element recipes"); + + provider.add("cosmiccore.stellar.upgrade.exotic_matter_tap", "Exotic Matter Tap"); + provider.add("cosmiccore.stellar.upgrade.exotic_matter_tap.desc", "Unlock exotic matter processing recipes"); + + provider.add("cosmiccore.stellar.upgrade.void_whispers", "Void Whispers"); + provider.add("cosmiccore.stellar.upgrade.void_whispers.desc", "BLACK_HOLE stage provides +50% speed bonus"); + + provider.add("cosmiccore.stellar.upgrade.event_horizon_lock", "Event Horizon Lock"); + provider.add("cosmiccore.stellar.upgrade.event_horizon_lock.desc", "BLACK_HOLE never decays to DEATH"); + + provider.add("cosmiccore.stellar.upgrade.singularity_siphon", "Singularity Siphon"); + provider.add("cosmiccore.stellar.upgrade.singularity_siphon.desc", + "BLACK_HOLE stage reduces recipe energy cost by 20%"); + + provider.add("cosmiccore.stellar.upgrade.gravitational_mastery", "Gravitational Mastery"); + provider.add("cosmiccore.stellar.upgrade.gravitational_mastery.desc", + "BLACK_HOLE stage grants +3 parallels"); + + provider.add("cosmiccore.stellar.upgrade.void_harvester", "Void Harvester"); + provider.add("cosmiccore.stellar.upgrade.void_harvester.desc", "BLACK_HOLE prestige gives 3x base points"); + + provider.add("cosmiccore.stellar.upgrade.eldritch_insight", "Eldritch Insight"); + provider.add("cosmiccore.stellar.upgrade.eldritch_insight.desc", + "Reveals hidden recipe bonuses based on star configuration"); + + provider.add("cosmiccore.stellar.upgrade.abyss_walker", "Abyss Walker"); + provider.add("cosmiccore.stellar.upgrade.abyss_walker.desc", + "Void energy passively accumulates, boosting exotic recipes"); + + provider.add("cosmiccore.stellar.upgrade.eternal_void", "Eternal Void"); + provider.add("cosmiccore.stellar.upgrade.eternal_void.desc", + "All BLACK_HOLE bonuses are doubled. Void effects persist 30s after leaving BLACK_HOLE."); + + provider.add("cosmiccore.stellar.upgrade.dark_matter_lens", "Dark Matter Lens"); + provider.add("cosmiccore.stellar.upgrade.dark_matter_lens.desc", + "BLACK_HOLE passively produces Dark Matter (1/min)"); + + provider.add("cosmiccore.stellar.upgrade.negative_mass", "Negative Mass"); + provider.add("cosmiccore.stellar.upgrade.negative_mass.desc", + "Recipes in BLACK_HOLE have inverted energy costs (gain EU)"); + + provider.add("cosmiccore.stellar.upgrade.vacuum_decay", "Vacuum Decay"); + provider.add("cosmiccore.stellar.upgrade.vacuum_decay.desc", + "Chance to void input items for 10x output"); + + provider.add("cosmiccore.stellar.upgrade.photon_sphere", "Photon Sphere"); + provider.add("cosmiccore.stellar.upgrade.photon_sphere.desc", + "Light-based recipes get +200% speed in BLACK_HOLE"); + + provider.add("cosmiccore.stellar.upgrade.schwarzschild_radius", "Schwarzschild Radius"); + provider.add("cosmiccore.stellar.upgrade.schwarzschild_radius.desc", + "Increase BLACK_HOLE event horizon - more items can process simultaneously"); + + provider.add("cosmiccore.stellar.upgrade.ergosphere_tap", "Ergosphere Tap"); + provider.add("cosmiccore.stellar.upgrade.ergosphere_tap.desc", + "Extract rotational energy from BLACK_HOLE (8192 EU/t passive)"); + + provider.add("cosmiccore.stellar.upgrade.penrose_process", "Penrose Process"); + provider.add("cosmiccore.stellar.upgrade.penrose_process.desc", + "Throw matter into BLACK_HOLE to extract 130% of its energy value"); + + provider.add("cosmiccore.stellar.upgrade.kerr_extraction", "Kerr Extraction"); + provider.add("cosmiccore.stellar.upgrade.kerr_extraction.desc", + "Spinning BLACK_HOLE grants +6 parallels and exotic byproducts"); + + provider.add("cosmiccore.stellar.upgrade.false_vacuum", "False Vacuum"); + provider.add("cosmiccore.stellar.upgrade.false_vacuum.desc", + "Reality unravels. All Void bonuses tripled. Unlock False Vacuum recipes."); + + // === REPEATABLE UPGRADES === + provider.add("cosmiccore.stellar.upgrade.stellar_efficiency", "Stellar Efficiency"); + provider.add("cosmiccore.stellar.upgrade.stellar_efficiency.desc", "+2% speed per level (max 10 levels)"); + + provider.add("cosmiccore.stellar.upgrade.parallel_threading", "Parallel Threading"); + provider.add("cosmiccore.stellar.upgrade.parallel_threading.desc", "+1 parallel per level (max 8 levels)"); + + provider.add("cosmiccore.stellar.upgrade.energy_optimization", "Energy Optimization"); + provider.add("cosmiccore.stellar.upgrade.energy_optimization.desc", + "-3% energy cost per level (max 10 levels)"); + + provider.add("cosmiccore.stellar.upgrade.fuel_efficiency", "Fuel Efficiency"); + provider.add("cosmiccore.stellar.upgrade.fuel_efficiency.desc", + "-2% fuel consumption per level (max 10 levels)"); + + provider.add("cosmiccore.stellar.upgrade.prestige_amplifier", "Prestige Amplifier"); + provider.add("cosmiccore.stellar.upgrade.prestige_amplifier.desc", + "+5% prestige points per level (max 10 levels)"); + + provider.add("cosmiccore.stellar.upgrade.decay_resistance", "Decay Resistance"); + provider.add("cosmiccore.stellar.upgrade.decay_resistance.desc", + "+3% decay resistance per level (max 10 levels)"); + + provider.add("cosmiccore.stellar.upgrade.growth_catalyst", "Growth Catalyst"); + provider.add("cosmiccore.stellar.upgrade.growth_catalyst.desc", "+3% growth speed per level (max 10 levels)"); + + provider.add("cosmiccore.stellar.upgrade.void_attunement", "Void Attunement"); + provider.add("cosmiccore.stellar.upgrade.void_attunement.desc", + "+2% bonus from void effects per level (max 10 levels)"); + + // Cosmic Boots + provider.add("key.categories.cosmiccore.boots", "Cosmic Boots"); + provider.add("key.cosmiccore.boots.speed_increase", "Boots: Increase Speed"); + provider.add("key.cosmiccore.boots.speed_decrease", "Boots: Decrease Speed"); + provider.add("key.cosmiccore.boots.jump_increase", "Boots: Increase Jump"); + provider.add("key.cosmiccore.boots.jump_decrease", "Boots: Decrease Jump"); + provider.add("key.cosmiccore.boots.toggle_step", "Boots: Toggle Step Assist"); + provider.add("key.cosmiccore.boots.toggle_inertia", "Boots: Toggle Inertia Dampening"); + + // Boot tooltips + provider.add("cosmiccore.boots.speed_modifier", "Speed Modifier: %s"); + provider.add("cosmiccore.boots.jump_modifier", "Jump Modifier: %s"); + provider.add("cosmiccore.boots.step_assist", "Step Assist: %s"); + provider.add("cosmiccore.boots.inertia_cancel", "Inertia Dampening: %s"); + + // Boot HUD + provider.add("cosmiccore.boots.hud.speed", "Speed: %s %s"); + provider.add("cosmiccore.boots.hud.speed_simple", "Speed: %s"); + provider.add("cosmiccore.boots.hud.jump", "Jump: %s"); + + // Boot action messages + provider.add("cosmiccore.boots.message.speed", "Speed Modifier: %s"); + provider.add("cosmiccore.boots.message.jump", "Jump Modifier: %s"); + provider.add("cosmiccore.boots.message.step", "Step Assist: %s"); + provider.add("cosmiccore.boots.message.inertia", "Inertia Dampening: %s"); + + // Max speed tooltip + provider.add("cosmiccore.boots.max_speed", "Max Speed: %s"); + + provider.add("item.cosmiccore.wrench", "Wrench"); + provider.add("item.cosmiccore.wrench_head", "Wrench Head"); + provider.add("item.cosmiccore.wrench.description", "Rotate the World!"); + + provider.add("item.cosmiccore.screwdriver", "Screwdriver"); + provider.add("item.cosmiccore.screwdriver_head", "Screwdriver Head"); + provider.add("item.cosmiccore.screwdriver.description", "Twist and Turn!"); } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/materials/CosmicMaterialSet.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/materials/CosmicMaterialSet.java index f597221ca..288df28be 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/materials/CosmicMaterialSet.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/materials/CosmicMaterialSet.java @@ -16,6 +16,8 @@ public class CosmicMaterialSet { public static final MaterialIconSet NEVRAMITE = new MaterialIconSet("nevramite", DULL); public static final MaterialIconSet VOIDSPARK = new MaterialIconSet("voidspark", DULL); public static final MaterialIconSet SOL = new MaterialIconSet("sol", DULL); + public static final MaterialIconSet CRYSTAL = new MaterialIconSet("crystal", DULL); + public static final MaterialIconSet MAGIC = new MaterialIconSet("magic", DULL); public static void init() {} } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/materials/CosmicMaterials.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/materials/CosmicMaterials.java index 2e3af6126..dedf7014f 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/materials/CosmicMaterials.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/materials/CosmicMaterials.java @@ -14,6 +14,7 @@ import com.gregtechceu.gtceu.api.fluids.FluidState; import com.gregtechceu.gtceu.api.fluids.store.FluidStorageKeys; +import static com.ghostipedia.cosmiccore.common.data.materials.CosmicMaterialSet.MAGIC; import static com.gregtechceu.gtceu.api.data.chemical.material.info.MaterialFlags.*; import static com.gregtechceu.gtceu.common.data.GTMaterials.*; @@ -53,8 +54,93 @@ public class CosmicMaterials { public static Material SolSteel; public static Material StarMetal; public static Material Nevramite; + public static Material PaleSteel; + public static Material PaleOil; + public static Material PaleOreBad; + public static Material Moondrop; + public static Material Somanone; + + public static Material AuricForcinium; + public static Material SuperheavyBedrockAlloy; + public static Material Chlorophyte; + public static Material DraconicTarragon; + public static Material Kuvite; + public static Material BlinkwardAlloy; + + public static Material Lumium; + public static Material Signalum; + public static Material Enderium; + public static Material Tenbrium; + public static Material Halizine; + public static Material Rosmotosin; + + public static Material VibrantAlloy; + public static Material EnergeticAlloy; + public static Material MelodicAlloy; + public static Material StarstruckHalite; + + public static Material Lignite; + public static Material Anthracene; + + // Homage Fluids + public static Material EssenceOfTerraFirmaGreg; + public static Material EssenceOfMoni; + + public static Material basicNutrientProductionFluid; + public static Material advancedNutrientProductionFluid; + public static Material superNutrientProductionFluid; + public static Material perfectedNutrientProductionFluid; + + public static Material basicNutrientOverclockFluid; + public static Material advancedNutrientOverclockFluid; + public static Material superNutrientOverclockFluid; + public static Material perfectedNutrientOverclockFluid; public static void register() { + // Nutrient Fluids (Production) + + basicNutrientProductionFluid = new Material.Builder(CosmicCore.id("basic_production_nutrient")) + .liquid(new FluidBuilder().state(FluidState.LIQUID).customStill()) + .formula("\uD80C\uDDA6") + .langValue("Basic Production Nutrient") + .buildAndRegister(); + advancedNutrientProductionFluid = new Material.Builder(CosmicCore.id("advanced_production_nutrient")) + .liquid(new FluidBuilder().state(FluidState.LIQUID).customStill()) + .formula("\uD80C\uDDA6") + .langValue("Advanced Production Nutrient") + .buildAndRegister(); + superNutrientProductionFluid = new Material.Builder(CosmicCore.id("super_production_nutrient")) + .liquid(new FluidBuilder().state(FluidState.LIQUID).customStill()) + .formula("\uD80C\uDDA6") + .langValue("Super Production Nutrient") + .buildAndRegister(); + perfectedNutrientProductionFluid = new Material.Builder(CosmicCore.id("perfect_production_nutrient")) + .liquid(new FluidBuilder().state(FluidState.LIQUID).customStill()) + .formula("\uD80C\uDDA6") + .langValue("Perfect Production Nutrient") + .buildAndRegister(); + + basicNutrientOverclockFluid = new Material.Builder(CosmicCore.id("basic_overclock_nutrient")) + .liquid(new FluidBuilder().state(FluidState.LIQUID).customStill()) + .formula("\uD80C\uDDA6") + .langValue("Basic Overclocking Nutrient") + .buildAndRegister(); + advancedNutrientOverclockFluid = new Material.Builder(CosmicCore.id("advanced_overclock_nutrient")) + .liquid(new FluidBuilder().state(FluidState.LIQUID).customStill()) + .formula("\uD80C\uDDA6") + .langValue("Advanced Overclocking Nutrient") + .buildAndRegister(); + superNutrientOverclockFluid = new Material.Builder(CosmicCore.id("super_overclock_nutrient")) + .liquid(new FluidBuilder().state(FluidState.LIQUID).customStill()) + .formula("\uD80C\uDDA6") + .langValue("Super Overclocking Nutrient") + .buildAndRegister(); + perfectedNutrientOverclockFluid = new Material.Builder(CosmicCore.id("perfect_overclock_nutrient")) + .liquid(new FluidBuilder().state(FluidState.LIQUID).customStill()) + .formula("\uD80C\uDDA6") + .langValue("Perfected Overclocking Nutrient") + .buildAndRegister(); + Prisma = new Material.Builder(CosmicCore.id("prisma")) .liquid(new FluidBuilder().state(FluidState.LIQUID).customStill()) .formula("֍") @@ -71,6 +157,13 @@ public static void register() { .components(Prisma, 1, Water, 4) .flags(DISABLE_DECOMPOSITION) .buildAndRegister(); + Moondrop = new Material.Builder(CosmicCore.id("moondrop")) + .formula("☽") + .ore() + .gem() + .dust() + .color(0xE8F1FF).secondaryColor(0x2A2F6E).iconSet(MaterialIconSet.EMERALD) + .buildAndRegister(); Virtue = new Material.Builder(CosmicCore.id("virtue_meld")) .liquid(new FluidBuilder().temperature(666)) .formula("߷") @@ -96,6 +189,146 @@ public static void register() { .blastTemp(3600, BlastProperty.GasTier.HIGH, GTValues.VA[GTValues.EV], 1200) .buildAndRegister(); + EnergeticAlloy = new Material.Builder(CosmicCore.id("energetic_alloy")) + .ingot() + .liquid(new FluidBuilder().temperature(933)) + .color(0xffb545).secondaryColor(0xe13923).iconSet(MaterialIconSet.METALLIC) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE, GENERATE_DENSE) + .components(Gold, 1, RedSteel, 1, Glowstone, 4) + .blastTemp(2700, BlastProperty.GasTier.HIGH, GTValues.VA[GTValues.HV], 1200) + .buildAndRegister(); + + VibrantAlloy = new Material.Builder(CosmicCore.id("vibrant_alloy")) + .ingot() + .formula( + "Au((CuAu4)(ZnCu3)Fe2(Ni(AuAgCu3)Fe3)4)?4(Ma2FeMnNi(Si(Fe2S2)5(Cr2(ZiAbAl)Hg3)(Ti2LPt)(BeK4N5)(CS)", + true) + .liquid(new FluidBuilder().temperature(1100)) + .color(0xa4ff70).secondaryColor(0x24e048).iconSet(MaterialIconSet.METALLIC) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE, GENERATE_DENSE) + .blastTemp(3600, BlastProperty.GasTier.HIGH, GTValues.VA[GTValues.EV], 1200) + .buildAndRegister(); + + MelodicAlloy = new Material.Builder(CosmicCore.id("melodic_alloy")) + .ingot() + .liquid(new FluidBuilder().temperature(1340)) + .color(0xc48aff).secondaryColor(0x6A3CBF).iconSet(MaterialIconSet.METALLIC) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE, GENERATE_DENSE) + .components(BlackSteel, 2, Moondrop, 4, EnderPearl, 2, Hafnium, 3) + .blastTemp(4500, BlastProperty.GasTier.HIGHER, GTValues.VA[GTValues.IV], 2430) + .buildAndRegister(); + + SuperheavyBedrockAlloy = new Material.Builder(CosmicCore.id("superheavy_bedrock_alloy")) + .ingot() + .liquid(new FluidBuilder().temperature(1340)) + .color(0x2F2C3A).secondaryColor(0x424145).iconSet(MAGIC) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE, GENERATE_DENSE) + .blastTemp(4500, BlastProperty.GasTier.HIGH, GTValues.VA[GTValues.EV], 1200) + .buildAndRegister(); + + Chlorophyte = new Material.Builder(CosmicCore.id("chlorophyte")) + .ingot() + .liquid(new FluidBuilder().temperature(1340)) + .color(0x3A8F5B).secondaryColor(0x6BB78A).iconSet(MaterialIconSet.METALLIC) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE, GENERATE_DENSE) + .blastTemp(4500, BlastProperty.GasTier.HIGH, GTValues.VA[GTValues.EV], 1200) + .buildAndRegister(); + + DraconicTarragon = new Material.Builder(CosmicCore.id("draconic_tarragon")) + .ingot() + .liquid(new FluidBuilder().temperature(1340)) + .color(0x86045).secondaryColor(0xA0684E).iconSet(MAGIC) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE, GENERATE_DENSE) + .blastTemp(4500, BlastProperty.GasTier.HIGH, GTValues.VA[GTValues.EV], 1200) + .buildAndRegister(); + + Kuvite = new Material.Builder(CosmicCore.id("kuvite")) + .ingot() + .liquid(new FluidBuilder().temperature(1340)) + .color(0xff6a4d).secondaryColor(0xa1311b).iconSet(CosmicMaterialSet.CRYSTAL) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE, GENERATE_DENSE) + .blastTemp(4500, BlastProperty.GasTier.HIGH, GTValues.VA[GTValues.EV], 1200) + .buildAndRegister(); + + BlinkwardAlloy = new Material.Builder(CosmicCore.id("blinkward_alloy")) + .ingot() + .liquid(new FluidBuilder().temperature(1340)) + .color(0xb4c267).secondaryColor(0x2abd6c).iconSet(CosmicMaterialSet.CRYSTAL) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE, GENERATE_DENSE) + .blastTemp(4500, BlastProperty.GasTier.HIGH, GTValues.VA[GTValues.EV], 1200) + .buildAndRegister(); + + StarstruckHalite = new Material.Builder(CosmicCore.id("starstruck_halite")) + .ingot() + .liquid(new FluidBuilder().temperature(1340)) + .color(0x45a2ff).secondaryColor(0x3fa115).iconSet(CosmicMaterialSet.CRYSTAL) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE, GENERATE_DENSE) + .blastTemp(4500, BlastProperty.GasTier.HIGH, GTValues.VA[GTValues.EV], 1200) + .buildAndRegister(); + + Lumium = new Material.Builder(CosmicCore.id("lumium")) + .ingot() + .liquid(new FluidBuilder().temperature(1340)) + .color(0xf6ff99).secondaryColor(0xff7400).iconSet(MaterialIconSet.SHINY) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE, GENERATE_DENSE) + .blastTemp(4500, BlastProperty.GasTier.HIGH, GTValues.VA[GTValues.EV], 1200) + .buildAndRegister(); + + Signalum = new Material.Builder(CosmicCore.id("signalum")) + .ingot() + .liquid(new FluidBuilder().temperature(1340)) + .color(0xff6b0f).secondaryColor(0xc32e00).iconSet(MaterialIconSet.SHINY) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE, GENERATE_DENSE) + .blastTemp(4500, BlastProperty.GasTier.HIGH, GTValues.VA[GTValues.EV], 1200) + .buildAndRegister(); + + Enderium = new Material.Builder(CosmicCore.id("enderium")) + .ingot() + .liquid(new FluidBuilder().temperature(1340)) + .color(0x1f6b62).secondaryColor(0x16455f).iconSet(MaterialIconSet.SHINY) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE, GENERATE_DENSE) + .blastTemp(4500, BlastProperty.GasTier.HIGH, GTValues.VA[GTValues.EV], 1200) + .buildAndRegister(); + + Tenbrium = new Material.Builder(CosmicCore.id("tenbrium")) + .ingot() + .liquid(new FluidBuilder().temperature(1340)) + .color(0x8a8a8a).secondaryColor(0x404040).iconSet(MaterialIconSet.SHINY) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE, GENERATE_DENSE) + .blastTemp(4500, BlastProperty.GasTier.HIGH, GTValues.VA[GTValues.EV], 1200) + .buildAndRegister(); + + Halizine = new Material.Builder(CosmicCore.id("halizine")) + .ingot() + .liquid(new FluidBuilder().temperature(1340)) + .color(0x8b1a7d).secondaryColor(0x3d0835).iconSet(MaterialIconSet.SHINY) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE, GENERATE_DENSE) + .blastTemp(4500, BlastProperty.GasTier.HIGH, GTValues.VA[GTValues.EV], 1200) + .buildAndRegister(); + + Rosmotosin = new Material.Builder(CosmicCore.id("rosmotosin")) + .ingot() + .liquid(new FluidBuilder().temperature(1340)) + .color(0xdc143c).secondaryColor(0x8b0000).iconSet(CosmicMaterialSet.CRYSTAL) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE, GENERATE_DENSE) + .blastTemp(4500, BlastProperty.GasTier.HIGH, GTValues.VA[GTValues.EV], 1200) + .buildAndRegister(); + VoidSpark = new Material.Builder(CosmicCore.id("voidspark")) .ingot() .liquid(new FluidBuilder().temperature(933)) @@ -306,7 +539,7 @@ public static void register() { Chronon = new Material.Builder(CosmicCore.id("chronon")) .ingot() .liquid(new FluidBuilder().temperature(100000000)) - .iconSet(CosmicMaterialSet.CHRONON) + .iconSet(CCoreMaterialIconSet.CHRONIC) .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE) .cableProperties(GTValues.V[12], 64, 0, true) @@ -373,6 +606,36 @@ public static void register() { .liquid(new FluidBuilder().temperature(10)) .color(0xdb5e5e).secondaryColor(0x5e0f3d).iconSet(MaterialIconSet.SHINY) .buildAndRegister(); + + PaleSteel = new Material.Builder(CosmicCore.id("pale_steel")) + .formula("✧⚙") + .ingot() + .liquid(new FluidBuilder().temperature(50)) + .flags(GENERATE_ROTOR, GENERATE_FRAME, GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, + GENERATE_SMALL_GEAR, GENERATE_RING, GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, + GENERATE_FINE_WIRE) + .color(0xE8F3FF).secondaryColor(0x1F2A36).iconSet(MaterialIconSet.METALLIC) + .buildAndRegister(); + PaleOil = new Material.Builder(CosmicCore.id("pale_oil")) + .formula("✧⚙") + .liquid(new FluidBuilder().state(FluidState.LIQUID).customStill()) + .color(0xE8F3FF).secondaryColor(0x1F2A36).iconSet(MaterialIconSet.METALLIC) + .buildAndRegister(); + PaleOreBad = new Material.Builder(CosmicCore.id("reclaimed_pale_ore")) + .formula("✧⚙") + .ore() + .flags(DISABLE_DECOMPOSITION, NO_SMELTING, NO_UNIFICATION, NO_SMELTING, NO_ORE_SMELTING, + NO_ORE_PROCESSING_TAB, NO_SMASHING) + .color(0xE8F3FF).secondaryColor(0x1F2A36).iconSet(MaterialIconSet.METALLIC) + .buildAndRegister(); + + Somanone = new Material.Builder(CosmicCore.id("somanone")) + .formula("✧+") + .ore() + .gem() + .dust() + .color(0x36E3C3).secondaryColor(0x111827).iconSet(MaterialIconSet.DIAMOND) + .buildAndRegister(); } public static void modifyMaterials() { diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/materials/tinkers/TinkersMaterial.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/materials/tinkers/TinkersMaterial.java new file mode 100644 index 000000000..68aae9430 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/materials/tinkers/TinkersMaterial.java @@ -0,0 +1,209 @@ +package com.ghostipedia.cosmiccore.common.data.materials.tinkers; + +import net.minecraft.world.item.Tier; +import net.minecraft.world.item.crafting.Ingredient; + +import lombok.Getter; +import slimeknights.tconstruct.library.client.data.spritetransformer.IColorMapping; +import slimeknights.tconstruct.library.materials.definition.MaterialId; +import slimeknights.tconstruct.library.materials.stats.IMaterialStats; +import slimeknights.tconstruct.library.materials.stats.MaterialStatsId; +import slimeknights.tconstruct.library.modifiers.Modifier; +import slimeknights.tconstruct.library.modifiers.ModifierEntry; +import slimeknights.tconstruct.library.modifiers.ModifierId; +import slimeknights.tconstruct.library.modifiers.util.LazyModifier; +import slimeknights.tconstruct.library.tools.stat.ToolStats; +import slimeknights.tconstruct.tools.stats.*; + +import java.util.*; +import java.util.function.Supplier; + +@Getter +public class TinkersMaterial { + + public static final Set MATERIALS = new HashSet<>(); + private String name; + private Set defaultTraits = new HashSet<>(); + private Map> traits = new HashMap<>(); + private int materialValue; + private HeadMaterialStats headMaterialStats; + private HandleMaterialStats handleMaterialStats; + private GripMaterialStats gripMaterialStats; + private Set statlessMaterialStats; + private Map>> statSpecificTraits = new HashMap<>(); + private List stats; + private int sortOrder; + private boolean craftable; + private int tier; + private IColorMapping colorMapping; + private int color; + private List fallbacks; + private Ingredient ingredient; + private int value; + private int needed; + + public MaterialId getMaterialLocation() { + return new MaterialId("cosmiccore", this.name); + } + + private TinkersMaterial(Builder builder) { + this.name = builder.name; + this.materialValue = builder.materialValue; + this.headMaterialStats = builder.headMaterialStats; + this.handleMaterialStats = builder.handleMaterialStats; + this.gripMaterialStats = builder.gripMaterialStats; + this.statlessMaterialStats = builder.statlessMaterialStats; + this.sortOrder = builder.sortOrder; + this.craftable = builder.craftable; + this.tier = builder.tier; + this.stats = builder.stats; + this.defaultTraits = builder.defaultTraits; + this.colorMapping = builder.colorMapping; + this.traits = new HashMap<>(); + this.color = builder.color; + this.fallbacks = new ArrayList<>(builder.fallbacks); + this.ingredient = builder.ingredient; + this.value = builder.value; + this.needed = builder.needed; + } + + public static final class Builder { + + private IColorMapping colorMapping; + private boolean craftable = false; + private int tier = 0; + private String name; + private Set modifiers = new HashSet<>(); + private int materialValue = 1; + private int sortOrder = 0; + private final List stats = new ArrayList<>(); + private HeadMaterialStats headMaterialStats; + private HandleMaterialStats handleMaterialStats; + private GripMaterialStats gripMaterialStats; + private final Set statlessMaterialStats = new HashSet<>(); + private SkullStats skullStats; + private ToolStats toolStats; + private final Set defaultTraits = new HashSet<>(); + private final Map>> statSpecificTraits = new HashMap<>(); + private int color; + private final List fallbacks = new ArrayList<>(); + private Ingredient ingredient; + private int value; + private int needed; + + public Builder(String name) { + this.name = name; + } + + public Builder Ingredient(Ingredient ingredient, int value, int needed) { + this.ingredient = ingredient; + this.value = value; + this.needed = needed; + return this; + } + + public Builder tier(int tier) { + this.tier = tier; + return this; + } + + public Builder color(int color) { + this.color = color; + return this; + } + + public Builder craftable(boolean craftable) { + this.craftable = craftable; + return this; + } + + public Builder modifier(Modifier modifier) { + modifiers.add(modifier); + return this; + } + + public Builder materialValue(int materialValue) { + this.materialValue = materialValue; + return this; + } + + public Builder sortOrder(int sortOrder) { + this.sortOrder = sortOrder; + return this; + } + + public Builder headMaterialStats(int durability, float miningSpeed, Tier miningLevel, float attack) { + this.headMaterialStats = new HeadMaterialStats(durability, miningSpeed, miningLevel, attack); + this.stats.add(this.headMaterialStats); + return this; + } + + public Builder handleMaterialStats(float durability, float attackDamage, float attackSpeed, float miningSpeed) { + this.handleMaterialStats = new HandleMaterialStats(durability, attackDamage, attackSpeed, miningSpeed); + this.stats.add(this.handleMaterialStats); + return this; + } + + public Builder gripMaterialStats(float durability, float attackSpeed, float meleeAttack) { + this.gripMaterialStats = new GripMaterialStats(durability, attackSpeed, meleeAttack); + this.stats.add(this.gripMaterialStats); + return this; + } + + public Builder addStatlessType(StatlessMaterialStats type) { + this.statlessMaterialStats.add(type); + this.stats.add(type); + return this; + } + + public Builder toolStats(ToolStats toolStats) { + this.toolStats = toolStats; + return this; + } + + public Builder defaultTrait(ModifierId modifier) { + this.defaultTraits.add(new LazyModifier(modifier)); + return this; + } + + public Builder defaultTrait(Modifier modifier) { + this.defaultTraits.add(new LazyModifier(modifier.getId())); + return this; + } + + public Builder trait(Modifier modifier, int level, MaterialStatsId statsId) { + List> traits = this.statSpecificTraits.computeIfAbsent(statsId, + k -> new ArrayList<>()); + traits.add(() -> new ModifierEntry(modifier, level)); + return this; + } + + public Builder trait(Supplier modifier, MaterialStatsId statsId) { + List> traits = this.statSpecificTraits.computeIfAbsent(statsId, + k -> new ArrayList<>()); + traits.add(modifier); + return this; + } + + public Builder colorMapping(IColorMapping colorMapping) { + this.colorMapping = colorMapping; + return this; + } + + public Builder fallback(String fallback) { + this.fallbacks.add(fallback); + return this; + } + + public Builder fallbacks(Collection fallbacks) { + this.fallbacks.addAll(fallbacks); + return this; + } + + public TinkersMaterial build() { + TinkersMaterial material = new TinkersMaterial(this); + TinkersMaterial.MATERIALS.add(material); + return material; + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/recipe/CosmicCoreOreRecipeHandler.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/recipe/CosmicCoreOreRecipeHandler.java index a8bda6ac5..d968e4169 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/recipe/CosmicCoreOreRecipeHandler.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/recipe/CosmicCoreOreRecipeHandler.java @@ -1,5 +1,7 @@ package com.ghostipedia.cosmiccore.common.data.recipe; +import com.ghostipedia.cosmiccore.common.data.CosmicItems; + import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; import com.gregtechceu.gtceu.api.data.chemical.material.Material; @@ -24,11 +26,13 @@ public class CosmicCoreOreRecipeHandler { public static void init(Consumer provider, @NotNull Material material) { - processcrushedLeached(provider, material); + processCrushedLeachedBad(provider, material); + processCrushedLeachedGood(provider, material); processRefinedFrothed(provider, material); processLeachedRefined(provider, material); processFrothedPure(provider, material); processRawOretoFinalStates(provider, material); + processRawOretoFinalStatesAugmented(provider, material); // todo old // crushed.executeHandler(provider, PropertyKey.ORE, CosmicCoreOreRecipeHandler::processcrushedLeached); // crushedRefined.executeHandler(provider, PropertyKey.ORE, CosmicCoreOreRecipeHandler::processRefinedFrothed); @@ -36,7 +40,7 @@ public static void init(Consumer provider, @NotNull Material mat // prismaFrothed.executeHandler(provider, PropertyKey.ORE, CosmicCoreOreRecipeHandler::processFrothedPure); } - public static void processcrushedLeached(Consumer provider, Material material) { + public static void processCrushedLeachedBad(Consumer provider, Material material) { if (!material.shouldGenerateRecipesFor(crushed) || !material.hasProperty(PropertyKey.ORE)) return; var property = material.getProperty(PropertyKey.ORE); ItemStack leachedStack = ChemicalHelper.get(crushedLeached, material); @@ -48,6 +52,7 @@ public static void processcrushedLeached(Consumer provider, Mate .inputItems(crushedPurified, material) .inputFluids(Water.getFluid(100)) .inputFluids(SulfuricAcid.getFluid(200)) + .circuitMeta(1) .outputItems(leachedStack) .chancedOutput(leachedStack, 5500, 750); if (byproduct != GTMaterials.NULL && !ChemicalHelper.get(dustPure, byproduct).isEmpty()) { @@ -60,6 +65,31 @@ public static void processcrushedLeached(Consumer provider, Mate builder.duration(60).EUt(GTValues.VA[GTValues.HV]).save(provider); } + public static void processCrushedLeachedGood(Consumer provider, Material material) { + if (!material.shouldGenerateRecipesFor(crushed) || !material.hasProperty(PropertyKey.ORE)) return; + var property = material.getProperty(PropertyKey.ORE); + ItemStack leachedStack = ChemicalHelper.get(crushedLeached, material); + + Material byproduct = property.getOreByProduct(0); + Material byproduct2 = property.getOreByProduct(1); + + var builder = LEACHING_PLANT.recipeBuilder("crushed_" + material.getName() + "_to_crushedleached_optimized") + .inputItems(crushedPurified, material) + .chancedInput(CosmicItems.ABRASIVE_ROSIN_MILLSTONES.asStack(), 2500, 0) + .inputFluids(Water.getFluid(100)) + .inputFluids(SulfuricAcid.getFluid(200)) + .circuitMeta(2) + .outputItems(leachedStack, 2); + if (byproduct != GTMaterials.NULL && !ChemicalHelper.get(dustPure, byproduct).isEmpty()) { + builder.chancedOutput(dustPure, byproduct, 1500, 1350); + } + if (byproduct2 != GTMaterials.NULL && !ChemicalHelper.get(dustPure, byproduct2).isEmpty()) { + builder.chancedOutput(dustPure, byproduct2, 2200, 1150); + } + builder.outputFluids(DilutedSulfuricAcid.getFluid(300)); + builder.duration(60).EUt(GTValues.VA[GTValues.HV]).save(provider); + } + public static void processRefinedFrothed(Consumer provider, Material material) { if (!material.shouldGenerateRecipesFor(crushedRefined) || !material.hasProperty(PropertyKey.ORE)) return; var property = material.getProperty(PropertyKey.ORE); @@ -141,6 +171,7 @@ public static void processRawOretoFinalStates(Consumer provider, .inputItems(rawOre, material) .inputFluids(GTMaterials.Blaze.getFluid(250)) .inputFluids(Water.getFluid(2750)) + .circuitMeta(1) .outputItems(frothedStack.copyWithCount(6)); if (byproduct != GTMaterials.NULL && !ChemicalHelper.get(dust, byproduct).isEmpty()) { builder.chancedOutput(dust, byproduct, 3, 3500, 0); @@ -156,4 +187,36 @@ public static void processRawOretoFinalStates(Consumer provider, } builder.duration(40).EUt(GTValues.V[GTValues.HV]).save(provider); } + + public static void processRawOretoFinalStatesAugmented(Consumer provider, Material material) { + if (!material.shouldGenerateRecipesFor(rawOre) || !material.hasProperty(PropertyKey.ORE)) return; + var property = material.getProperty(PropertyKey.ORE); + ItemStack frothedStack = ChemicalHelper.get(dust, material); + + Material byproduct = property.getOreByProduct(0); + Material byproduct2 = property.getOreByProduct(1); + Material byproduct3 = property.getOreByProduct(2); + Material byproduct4 = property.getOreByProduct(Integer.MAX_VALUE); + + var builder = PRISMA_FOUNDRY.recipeBuilder("raw_ore_prismf_" + material.getName() + "_to_dusts_improved") + .inputItems(rawOre, material) + .chancedInput(CosmicItems.ABRASIVE_ROSIN_MILLSTONES.asStack(), 5500, 0) + .inputFluids(GTMaterials.Blaze.getFluid(25)) + .inputFluids(Water.getFluid(2750)) + .circuitMeta(2) + .outputItems(frothedStack.copyWithCount(9)); + if (byproduct != GTMaterials.NULL && !ChemicalHelper.get(dust, byproduct).isEmpty()) { + builder.chancedOutput(dust, byproduct, 5, 5500, 0); + } + if (byproduct2 != GTMaterials.NULL && !ChemicalHelper.get(dust, byproduct2).isEmpty()) { + builder.chancedOutput(dust, byproduct2, 5, 5500, 0); + } + if (byproduct3 != GTMaterials.NULL && !ChemicalHelper.get(dust, byproduct3).isEmpty()) { + builder.chancedOutput(dust, byproduct3, 5, 5500, 0); + } + if (byproduct4 != GTMaterials.NULL && !ChemicalHelper.get(dust, byproduct4).isEmpty()) { + builder.chancedOutput(dust, byproduct4, 5, 5500, 0); + } + builder.duration(40).EUt(GTValues.V[GTValues.HV]).save(provider); + } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/recipe/CosmicMaterialRecipeHandlers.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/recipe/CosmicMaterialRecipeHandlers.java index 4d3283e2d..836859e76 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/recipe/CosmicMaterialRecipeHandlers.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/recipe/CosmicMaterialRecipeHandlers.java @@ -53,7 +53,7 @@ private static void processModularShelling(@NotNull Consumer pro HEAVY_ASSEMBLER.recipeBuilder("heavy_assemble_" + material.getName() + "_modular_shelling") .inputItems(frameGt, material, 4) - .outputItems(heavyBeam, 4) + .inputItems(heavyBeam, material, 4) .inputItems(plate, material, 16) .inputItems(bolt, material, 32) .outputItems(modularShelling, material, 1) diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/recipe/CosmicRecipeModifiers.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/recipe/CosmicRecipeModifiers.java index 6eda814c9..e1c56978c 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/recipe/CosmicRecipeModifiers.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/recipe/CosmicRecipeModifiers.java @@ -1,31 +1,121 @@ package com.ghostipedia.cosmiccore.common.data.recipe; +import com.ghostipedia.cosmiccore.api.machine.multiblock.StellarBaseModule; +import com.ghostipedia.cosmiccore.common.data.CosmicItems; import com.ghostipedia.cosmiccore.common.machine.multiblock.electric.MagneticFieldMachine; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.LarvaMachine; import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.TitanFusionReactorMachine; +import com.ghostipedia.cosmiccore.common.machine.multiblock.part.ModuleHatchPartMachine; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; import com.gregtechceu.gtceu.api.recipe.content.ContentModifier; import com.gregtechceu.gtceu.api.recipe.modifier.ModifierFunction; import com.gregtechceu.gtceu.api.recipe.modifier.ParallelLogic; import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; +import com.gregtechceu.gtceu.common.data.GTRecipeTypes; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import org.jetbrains.annotations.NotNull; import java.util.Collections; +import java.util.Map; public class CosmicRecipeModifiers { + public static final RecipeModifier COSMIC_MODULES = CosmicRecipeModifiers::moduleParallel; + + /** + * Recipe modifier for Stellar Modules. + * Uses the module's configured voltage and parallel settings. + * - Applies overclocking based on configured voltage per parallel + * - Applies parallelization up to the effective parallel limit (min of configured and Iris limit) + */ + public static final RecipeModifier STELLAR_MODULE_OVERCLOCK = CosmicRecipeModifiers::stellarModuleOverclock; + + /** + * Stellar module overclock logic. + * Uses configuredVoltagePerParallel for OC tier and configuredMaxParallel for parallels. + */ + public static @NotNull ModifierFunction stellarModuleOverclock(MetaMachine machine, GTRecipe recipe) { + if (!(machine instanceof StellarBaseModule module)) { + return ModifierFunction.NULL; + } + + // Check if recipe tier is within our configured tier + int recipeTier = RecipeHelper.getRecipeEUtTier(recipe); + int moduleTier = module.getOverclockTier(); + if (recipeTier > moduleTier) { + return ModifierFunction.NULL; // Recipe requires higher tier than configured + } + + // Get the effective parallel limit (min of user config and Iris limit) + int maxParallels = module.getEffectiveParallelLimit(); + + // Calculate actual parallels based on available resources + int actualParallels = ParallelLogic.getParallelAmount(machine, recipe, maxParallels); + if (actualParallels == 0) { + return ModifierFunction.NULL; + } + + // Calculate maximum voltage for overclocking + // Total voltage = voltage per parallel * number of parallels + long maxVoltage = module.getConfiguredVoltagePerParallel() * actualParallels; + + // Apply overclock using non-perfect subtick logic + // This uses the configured voltage as the maximum + var ocModifier = OverclockingLogic.NON_PERFECT_OVERCLOCK_SUBTICK.getModifier( + machine, recipe, maxVoltage, false); // Don't let OC logic add more parallels + + // Apply parallel modifier + if (actualParallels > 1) { + var parallelModifier = ModifierFunction.builder() + .modifyAllContents(ContentModifier.multiplier(actualParallels)) + .eutMultiplier(actualParallels) + .parallels(actualParallels) + .build(); + return ocModifier.andThen(parallelModifier); + } + + return ocModifier; + } + + public static ModifierFunction asteroidYieldModifier(MetaMachine machine, GTRecipe recipe) { + if (!(machine instanceof IRecipeLogicMachine recipeLogicMachine)) { + return ModifierFunction.NULL; + } + int size = 1; + var handlers = recipeLogicMachine.getCapabilitiesFlat(IO.IN, ItemRecipeCapability.CAP); + for (var handler : handlers) { + for (var content : handler.getContents()) { + if (content instanceof ItemStack stack && !stack.isEmpty()) { + size = Math.max(size, LarvaMachine.getAsteroidSize(stack)); + + } + } + } + if (size == 1) return ModifierFunction.IDENTITY; + int cap = ParallelLogic.limitByOutputMerging(recipeLogicMachine, recipe, size, + recipeLogicMachine::canVoidRecipeOutputs, Collections.emptyList()); + if (cap <= 1) return ModifierFunction.IDENTITY; + + return ModifierFunction.builder() + .outputModifier(ContentModifier.multiplier(cap)) + .build(); + } + public static ModifierFunction vomahineReactorOC(MetaMachine machine, GTRecipe recipe) { if (!(machine instanceof MagneticFieldMachine magnetMachine)) { return RecipeModifier.nullWrongType(MagneticFieldMachine.class, machine); @@ -66,7 +156,7 @@ public static ModifierFunction chemicalVatLogic(MetaMachine machine, GTRecipe re .modifyAllContents(ContentModifier.multiplier(actualParallel)) .eutMultiplier(actualParallel * 0.75F) .parallels(actualParallel) - .durationMultiplier(actualParallel / 8F) + .durationMultiplier(actualParallel / 4F) .build(); } } @@ -90,12 +180,13 @@ public static ModifierFunction chemicalVatLogic(MetaMachine machine, GTRecipe re int multiplier = ParallelLogic.limitByOutputMerging(rlm, recipe, count, rlm::canVoidRecipeOutputs, Collections.emptyList()); if (multiplier == 1) return ModifierFunction.IDENTITY; + if (multiplier == 0) return ModifierFunction.NULL; return ModifierFunction.builder() .outputModifier(ContentModifier.multiplier(multiplier)) .build(); } - public static @NotNull ModifierFunction innateParallel(MetaMachine machine, GTRecipe recipe) { + public static @NotNull ModifierFunction innateParallel4x(MetaMachine machine, GTRecipe recipe) { if (machine instanceof WorkableMultiblockMachine parallelMachine) { if (parallelMachine.getParallelHatch().isPresent()) { int actualParallel = ParallelLogic.getParallelAmount(parallelMachine, recipe, @@ -105,7 +196,6 @@ public static ModifierFunction chemicalVatLogic(MetaMachine machine, GTRecipe re .modifyAllContents(ContentModifier.multiplier(actualParallel)) .eutMultiplier(actualParallel) .parallels(actualParallel) - // .durationMultiplier(actualParallel/4f) .build(); } } @@ -124,6 +214,62 @@ public static ModifierFunction chemicalVatLogic(MetaMachine machine, GTRecipe re } return ModifierFunction.IDENTITY; } + + private static Map moduleParallels = null; + + public static Map getModuleParallels() { + if (moduleParallels == null) { + moduleParallels = new Object2IntOpenHashMap<>(); + moduleParallels.put(CosmicItems.PARA_MOD_1.asItem().getDescriptionId(), 16); + moduleParallels.put(CosmicItems.PARA_MOD_2.asItem().getDescriptionId(), 32); + moduleParallels.put(CosmicItems.PARA_MOD_3.asItem().getDescriptionId(), 64); + moduleParallels.put(CosmicItems.PARA_MOD_4.asItem().getDescriptionId(), 256); + } + return moduleParallels; + } + + public static @NotNull ModifierFunction moduleParallel(MetaMachine machine, GTRecipe recipe) { + if (!(machine instanceof MultiblockControllerMachine multi)) return ModifierFunction.IDENTITY; + int extraParallels = 0; + for (var part : multi.getParts()) { + if (part instanceof ModuleHatchPartMachine modulePart) { + for (int i = 0; i < modulePart.getInventory().getSlots(); i++) { + ItemStack stack = modulePart.getInventory().getStackInSlot(i); + extraParallels += getModuleParallels().getOrDefault(stack.getDescriptionId(), 0); + } + } + } + if (extraParallels == 0) return ModifierFunction.IDENTITY; + + final int finalExtraParallels = extraParallels; + return (functionRecipe) -> { + // If we are at only 1 parallel so far, + // set the max parallels to extraParallels instead of adding to functionRecipe.parallels + int actualParallel; + if (functionRecipe.parallels == 1) { + actualParallel = ParallelLogic.getParallelAmount(machine, recipe, finalExtraParallels); + } else { + actualParallel = ParallelLogic.getParallelAmount(machine, recipe, + functionRecipe.parallels + finalExtraParallels); + + } + + if (recipe.getType() == GTRecipeTypes.ASSEMBLY_LINE_RECIPES) { + if (actualParallel > 64) { + actualParallel = 64; + } + } + + // Set the contents to actualParallel, which means adding actualParallel-1 + var newRecipe = ModifierFunction.builder() + .modifyAllContents(ContentModifier.addition(actualParallel - 1)) + .eutModifier(ContentModifier.addition(actualParallel - 1)) + .parallels(actualParallel - 1) + .build().apply(functionRecipe); + newRecipe.parallels = actualParallel; + return newRecipe; + }; + } /* * public static @NotNull BiFunction sterileHatch(FluidStack stack, boolean * perTick) { diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/recipe/TinkersRecipeTest.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/recipe/TinkersRecipeTest.java new file mode 100644 index 000000000..6e75b6929 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/recipe/TinkersRecipeTest.java @@ -0,0 +1,23 @@ +package com.ghostipedia.cosmiccore.common.data.recipe; + +import com.ghostipedia.cosmiccore.api.recipe.ingredient.TinkerIngredient; + +import com.gregtechceu.gtceu.data.recipe.VanillaRecipeHelper; + +import net.minecraft.data.recipes.FinishedRecipe; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; + +import slimeknights.tconstruct.tools.ToolDefinitions; + +import java.util.function.Consumer; + +public class TinkersRecipeTest { + + public static void init(Consumer provider) { + VanillaRecipeHelper.addShapedRecipe(provider, "tinkertest", + new ItemStack(Items.STRING), "BK ", " ", " ", + 'B', Items.OAK_PLANKS, + 'K', new TinkerIngredient(ToolDefinitions.SCYTHE)); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/tag/item/CosmicItemTags.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/tag/item/CosmicItemTags.java index 4d92d583a..bb003201d 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/tag/item/CosmicItemTags.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/tag/item/CosmicItemTags.java @@ -9,4 +9,10 @@ public class CosmicItemTags { public static final TagKey NANOMUSCLE_SPACE_SUITE = TagUtil.createModItemTag("nano_space_suite"); public static final TagKey QUARKTECH_SPACE_SUITE = TagUtil.createModItemTag("quantum_space_suite"); + public static final TagKey WRENCH_HEAD_CAST_MULTI = TagUtil.createModItemTag("casts/multi_use/wrench_head"); + public static final TagKey WRENCH_HEAD_CAST_SINGLE = TagUtil.createModItemTag("casts/single_use/wrench_head"); + public static final TagKey SCREWDRIVER_HEAD_CAST_SINGLE = TagUtil + .createModItemTag("casts/single_use/screwdriver_head"); + public static final TagKey SCREWDRIVER_HEAD_CAST_MULTI = TagUtil + .createModItemTag("casts/multi_use/screwdriver_head_sand"); } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/AsteroidItem.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/AsteroidItem.java new file mode 100644 index 000000000..46a442e31 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/AsteroidItem.java @@ -0,0 +1,42 @@ +package com.ghostipedia.cosmiccore.common.item; + +import com.gregtechceu.gtceu.api.item.ComponentItem; + +import net.minecraft.ChatFormatting; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; + +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class AsteroidItem extends ComponentItem { + + public AsteroidItem(Properties properties) { + super(properties); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltipComponents, + TooltipFlag isAdvanced) { + CompoundTag tag = stack.getTag(); + + if (tag == null || tag.isEmpty()) { + tooltipComponents.add(Component.translatable("tooltip.cosmiccore.asteroid.tiny") + .withStyle(ChatFormatting.GRAY, ChatFormatting.ITALIC)); + return; + } + + int size = tag.getInt("Size"); + + if (size > 0) { + tooltipComponents.add(Component.translatable("tooltip.cosmiccore.asteroid.tier", size) + .withStyle(ChatFormatting.AQUA)); + } + + super.appendHoverText(stack, level, tooltipComponents, isAdvanced); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/AsteroidTargetingChipItem.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/AsteroidTargetingChipItem.java new file mode 100644 index 000000000..387c45091 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/AsteroidTargetingChipItem.java @@ -0,0 +1,92 @@ +package com.ghostipedia.cosmiccore.common.item; + +import net.minecraft.ChatFormatting; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; + +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.Locale; + +public class AsteroidTargetingChipItem extends Item { + + public AsteroidTargetingChipItem(Properties props) { + super(props); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltipComponents, + TooltipFlag isAdvanced) { + CompoundTag tag = stack.getTag(); + + if (tag == null || tag.isEmpty()) { + tooltipComponents.add(Component.translatable("tooltip.cosmiccore.asteroid_chip.unprogrammed") + .withStyle(ChatFormatting.GRAY, ChatFormatting.ITALIC)); + return; + } + + String rawType = tag.getString("AsteroidType"); + String asteroidType = prettyType(rawType); + int tier = tag.getInt("Tier"); + + tooltipComponents.add(Component.translatable("tooltip.cosmiccore.asteroid_chip.type", asteroidType) + .withStyle(ChatFormatting.YELLOW)); + + if (tier > 0) { + tooltipComponents.add(Component.translatable("tooltip.cosmiccore.asteroid_chip.tier", tier) + .withStyle(ChatFormatting.AQUA)); + } + } + + private static String prettyType(String key) { + if (key == null || key.isBlank()) return "Unknown"; + String k = key.toLowerCase(Locale.ROOT); + + return switch (k) { + // Carbonic + case "carbon", "carbonic", "carbon_asteroid", "carbon_asteroid_base" -> "Carbonic Asteroid"; + + // Ferric + case "ferric", "ferric_asteroid" -> "Ferric Asteroid"; + + // Exotic / Rare Metals + case "rare", "rare_metal", "rare_metals", "rare_metal_asteroid", "exotic", "exotic_metals" -> "Rare Metals Asteroid"; + + // Auric + case "auric", "auric_asteroid" -> "Auric Asteroid"; + + // Brimstone + case "brimstone", "brimstone_asteroid", "sulfuric" -> // Might use this for sulfur, unsure! + "Brimstone Asteroid"; + + // Lith + case "lith", "lith_asteroid" -> "Lith Asteroid"; + + // Mafic + case "mafic", "mafic_asteroid" -> "Mafic Asteroid"; + + // Mossy + case "mossy", "mossy_asteroid" -> "Mossy Asteroid"; + + // Occult + case "occult", "occult_asteroid" -> "Occult Asteroid"; + + // Oxide + case "oxide", "oxide_asteroid" -> "Oxide Asteroid"; + + // Sanguine + case "sanguine", "sanguine_asteroid" -> "Sanguine Asteroid"; + + // Wasteland + case "wasteland", "wasteland_asteroid" -> "Wasteland Asteroid"; + default -> + // Fallback: title-case single word keys like "basalt" -> "Basalt" + k.isEmpty() ? "Unknown" : Character.toUpperCase(k.charAt(0)) + k.substring(1); + }; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/CosmicBeesHoneyComb.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/CosmicBeesHoneyComb.java new file mode 100644 index 000000000..81301585d --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/CosmicBeesHoneyComb.java @@ -0,0 +1,83 @@ +package com.ghostipedia.cosmiccore.common.item; + +import net.minecraft.util.StringRepresentable; + +import forestry.api.core.IItemSubtype; + +import java.awt.*; +import java.util.Locale; + +public enum CosmicBeesHoneyComb implements StringRepresentable, IItemSubtype { + + LOFTY_OXYGEN(new Color(0x8080FF), new Color(0x4242FF)), + LOFTY_HYDROGEN(new Color(0x80FFE1), new Color(0x4242FF)), + LOFTY_NITROGEN(new Color(0xFF80F9), new Color(0x4242FF)), + LOFTY_ARGON(new Color(0x97FF80), new Color(0x4242FF)), + + ROSE_POLYMER(new Color(0xFF4E6F), new Color(0x5D5D5D)), + CITRUS_POLYMER(new Color(0xFF9900), new Color(0x5D5D5D)), + WAXY_POLYMER(new Color(0xA100FF), new Color(0x5D5D5D)), + + BIOHAZARD(new Color(0x00FF33), new Color(0x082C00)), + PALE(new Color(0xC8E7F1), new Color(0x3F3F3F)), + SOUL(new Color(0x3FEBF1), new Color(0x3A3A3A)), + RUNIC(new Color(0xA68941), new Color(0xA2A2A2)), + AMBROSIC(new Color(0xD7C238), new Color(0x314234)), + + ABRASIVE(new Color(0x834500), new Color(0x312E2B)), + ENERGIZED(new Color(0xD7C238), new Color(0x312E2B)), + SLICK(new Color(0x251531), new Color(0x312E2B)), + PYROLYTIC(new Color(0x5B4B3F), new Color(0x312E2B)), + LUNAR(new Color(0x10735F), new Color(0x223149)), + SOLAR(new Color(0xF3DC4C), new Color(0x223149)), + COSMOS(new Color(0xA276CB), new Color(0x223149)), + + HADAL(new Color(0x01015B), new Color(0x000000)), + SHAMAN(new Color(0xE0099B), new Color(0x720303)), + ASHEN(new Color(0x6D6872), new Color(0x223149)), + FRACKING(new Color(0xDAD3B8), new Color(0x223149)), + FATE(new Color(0x06B64D), new Color(0x193D05)), + GRAND_GARDEN(new Color(0x42801D), new Color(0x1D5703)), + ARCHITECT(new Color(0xD0FFE9), new Color(0x003588)), + INQUISITIVE(new Color(0xDCA260), new Color(0x666C77)), + HELLSMITH(new Color(0xEA5555), new Color(0x640529)), + RADOXIA(new Color(0x4D0E88), new Color(0x55647E)), + ABSENT(new Color(0xE1E1E1), new Color(0x9A9A9A)), + ILLUSIVE(new Color(0xEFFAAC), new Color(0x7C92B6)), + CONSTRUCTIVE(new Color(0xCBA676), new Color(0x464922)), + PRISMATIC(new Color(0x76CB87), new Color(0x436CAD)), + HYDRAULIC(new Color(0x715F81), new Color(0x0F521F)), + COBBLED(new Color(0x6A6272), new Color(0x323741)), + EXHAUSTIVE(new Color(0x4F625B), new Color(0x3A4350)), + VIRTUE(new Color(0x6BD1D5), new Color(0x223149)), + + ; + + public static final CosmicBeesHoneyComb[] VALUES = values(); + + public final String name; + public final int primaryColor; + public final int secondaryColor; + + CosmicBeesHoneyComb(Color primary, Color secondary) { + this(primary, secondary, null); + } + + CosmicBeesHoneyComb(Color primary, Color secondary, String compatName) { + this.name = toString().toLowerCase(Locale.ENGLISH); + this.primaryColor = primary.getRGB(); + this.secondaryColor = secondary.getRGB(); + } + + @Override + public String getSerializedName() { + return name; + } + + public static CosmicBeesHoneyComb get(int meta) { + if (meta >= VALUES.length) { + meta = 0; + } + return VALUES[meta]; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/CosmicBeesItemHoneyComb.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/CosmicBeesItemHoneyComb.java new file mode 100644 index 000000000..4988dac2a --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/CosmicBeesItemHoneyComb.java @@ -0,0 +1,30 @@ +package com.ghostipedia.cosmiccore.common.item; + +import net.minecraft.world.item.ItemStack; + +import forestry.core.items.ItemForestry; +import forestry.core.items.definitions.IColoredItem; + +public class CosmicBeesItemHoneyComb extends ItemForestry implements IColoredItem { + + private final CosmicBeesHoneyComb type; + + public CosmicBeesItemHoneyComb(CosmicBeesHoneyComb type) { + this.type = type; + } + + public CosmicBeesHoneyComb getType() { + return type; + } + + @Override + public int getColorFromItemStack(ItemStack itemstack, int tintIndex) { + CosmicBeesHoneyComb honeyComb = this.type; + + if (tintIndex == 1) { + return honeyComb.primaryColor; + } else { + return honeyComb.secondaryColor; + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/OxygenTankItem.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/OxygenTankItem.java new file mode 100644 index 000000000..fdda47b1a --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/OxygenTankItem.java @@ -0,0 +1,106 @@ +package com.ghostipedia.cosmiccore.common.item; + +import com.gregtechceu.gtceu.api.item.ComponentItem; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.fluids.capability.IFluidHandlerItem; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class OxygenTankItem extends ComponentItem { + + public OxygenTankItem(Properties props) { + super(props); + } + + @Override + public boolean isBarVisible(@NotNull ItemStack stack) { + return true; + } + + @Override + public int getBarWidth(@NotNull ItemStack stack) { + IFluidHandlerItem h = stack.getCapability(ForgeCapabilities.FLUID_HANDLER_ITEM).orElse(null); + if (h == null) return 0; + int amount = h.getFluidInTank(0).getAmount(); + int cap = Math.max(1, h.getTankCapacity(0)); + return Math.round(13.0f * amount / cap); + } + + @Override + public int getBarColor(@NotNull ItemStack stack) { + return 0x55D8FF; // Light blue for oxygen + } + + @Override + public void appendHoverText(@NotNull ItemStack stack, @Nullable Level level, + @NotNull List tooltip, @NotNull TooltipFlag flag) { + IFluidHandlerItem h = stack.getCapability(ForgeCapabilities.FLUID_HANDLER_ITEM).orElse(null); + if (h == null) return; + + int amt = h.getFluidInTank(0).getAmount(); + int cap = h.getTankCapacity(0); + tooltip.add(line("Oxygen", amt + " / " + cap + " mB", ChatFormatting.AQUA)); + + // Read tuning written by the behavior into NBT + var tag = stack.getOrCreateTag().getCompound("CosmicCoreO2"); + int ticksPerMb = tag.getInt("TicksPerMb"); + int transferPerTick = tag.getInt("TransferPerTick"); + + // Fallbacks if capability hasn't been touched yet + if (ticksPerMb <= 0 || transferPerTick < 0) { + stack.getCapability(ForgeCapabilities.FLUID_HANDLER_ITEM).orElse(null); + tag = stack.getOrCreateTag().getCompound("CosmicCoreO2"); + ticksPerMb = Math.max(1, tag.getInt("TicksPerMb")); + transferPerTick = Math.max(0, tag.getInt("TransferPerTick")); + } + + int ticksPerSec = transferPerTick * 20; + + // Fluid use at max output + double mbPerTickAtMax = Math.min(1.0, transferPerTick / (double) ticksPerMb); + double mbPerSecAtMax = mbPerTickAtMax * 20.0; + + tooltip.add(line("Max Output", transferPerTick + " O\u2082/t (" + ticksPerSec + "/s)", ChatFormatting.GRAY)); + tooltip.add(line("Conversion", ticksPerMb + " O\u2082-ticks per mB", ChatFormatting.GRAY)); + tooltip.add(line("Use @ Max", fmt(mbPerTickAtMax) + " mB/t (" + fmt(mbPerSecAtMax) + " mB/s)", + ChatFormatting.DARK_GRAY)); + + if (cap > 0 && transferPerTick > 0) { + long totalOTicks = (long) amt * (long) ticksPerMb; + long runGTicks = (long) Math.floor(totalOTicks / (double) transferPerTick); + tooltip.add(line("Est. Runtime @ Max", formatDurationSeconds(runGTicks / 20.0), ChatFormatting.DARK_GREEN)); + } + + // Requirement warning + tooltip.add(Component.empty()); + tooltip.add(Component.literal("Requires Pressurized Rebreather").withStyle(ChatFormatting.RED)); + } + + private static Component line(String label, String value, ChatFormatting color) { + return Component.literal(label + ": ").withStyle(ChatFormatting.WHITE) + .append(Component.literal(value).withStyle(color)); + } + + private static String fmt(double d) { + if (d >= 10) return String.format("%.0f", d); + if (d >= 1) return String.format("%.2f", d); + return String.format("%.3f", d); + } + + private static String formatDurationSeconds(double seconds) { + if (seconds < 60) return String.format("%.1fs", seconds); + int s = (int) Math.floor(seconds); + int m = s / 60; + int r = s % 60; + return String.format("%dm %02ds", m, r); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/armor/boots/CosmicBootsArmorLogic.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/armor/boots/CosmicBootsArmorLogic.java new file mode 100644 index 000000000..8b78af589 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/armor/boots/CosmicBootsArmorLogic.java @@ -0,0 +1,315 @@ +package com.ghostipedia.cosmiccore.common.item.armor.boots; + +import com.ghostipedia.cosmiccore.CosmicCore; + +import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; +import com.gregtechceu.gtceu.api.capability.IElectricItem; +import com.gregtechceu.gtceu.api.item.armor.ArmorLogicSuite; + +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.Mth; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.AttributeInstance; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.common.ForgeMod; + +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.UUID; + +public class CosmicBootsArmorLogic extends ArmorLogicSuite implements ICosmicBoots { + + protected static final UUID STEP_HEIGHT_UUID = UUID.fromString("c05a1cb0-b007-5433-9000-57e93e190001"); + protected static final UUID SWIM_SPEED_UUID = UUID.fromString("c05a1cb0-b007-5433-9000-57e93e190002"); + + protected final double maxSpeed; + protected final double groundAcceleration; + protected final double groundDeceleration; + protected final double airControl; + protected final double jumpPower; + protected final boolean fallNegation; + protected final String texturePath; + + private static final double SPRINT_BOOST = 2.5; + + public CosmicBootsArmorLogic(int energyPerUse, long maxCapacity, int tier, + double maxSpeed, double groundAcceleration, + double groundDeceleration, double airControl, + double jumpPower, boolean fallNegation, + String texturePath) { + super(energyPerUse, maxCapacity, tier, ArmorItem.Type.BOOTS); + this.maxSpeed = maxSpeed; + this.groundAcceleration = groundAcceleration; + this.groundDeceleration = groundDeceleration; + this.airControl = airControl; + this.jumpPower = jumpPower; + this.fallNegation = fallNegation; + this.texturePath = texturePath; + } + + @Override + public double getMaxSpeed() { + return maxSpeed; + } + + @Override + public double getGroundAcceleration() { + return groundAcceleration; + } + + @Override + public double getGroundDeceleration() { + return groundDeceleration; + } + + @Override + public double getAirControl() { + return airControl; + } + + @Override + public double getJumpPower() { + return jumpPower; + } + + @Override + public boolean negatesFallDamage() { + return fallNegation; + } + + @Override + public boolean hasStepAssist() { + return true; + } + + @Override + public void onArmorTick(Level level, Player player, @NotNull ItemStack boots) { + IElectricItem electric = GTCapabilityHelper.getElectricItem(boots); + if (electric == null) return; + + boolean hasEnergy = electric.getCharge() > 0; + + if (hasEnergy) { + boolean canApplyMovement = !player.getAbilities().flying && !player.isFallFlying(); + + if (player.isInWater() || player.isInLava()) { + applySwimSpeed(player, boots); + } else { + removeSwimSpeed(player); + if (canApplyMovement) { + applyMovementBonus(player, boots); + } + } + + if (ICosmicBoots.isStepAssistEnabled(boots)) { + applyStepHeight(player); + } else { + removeStepHeight(player); + } + + if (!level.isClientSide()) { + Vec3 motion = player.getDeltaMovement(); + double horizontalSpeed = Math.sqrt(motion.x * motion.x + motion.z * motion.z); + if (horizontalSpeed > 0.4) { + spawnCloudTrail(level, player, horizontalSpeed); + } + if (horizontalSpeed > 0.2) { + electric.discharge(energyPerUse / 100L, tier, true, false, false); + } + } + } else { + removeStepHeight(player); + removeSwimSpeed(player); + } + } + + protected void applyStepHeight(Player player) { + AttributeInstance attribute = player.getAttribute(ForgeMod.STEP_HEIGHT_ADDITION.get()); + if (attribute != null && attribute.getModifier(STEP_HEIGHT_UUID) == null) { + attribute.addPermanentModifier(new AttributeModifier( + STEP_HEIGHT_UUID, + "Cosmic Boots Step Height", + 1.0, + AttributeModifier.Operation.ADDITION)); + } + } + + protected void removeStepHeight(Player player) { + AttributeInstance attribute = player.getAttribute(ForgeMod.STEP_HEIGHT_ADDITION.get()); + if (attribute != null) { + attribute.removeModifier(STEP_HEIGHT_UUID); + } + } + + protected void applySwimSpeed(Player player, ItemStack boots) { + double speedMod = ICosmicBoots.getSpeedModifier(boots); + if (speedMod <= 0) { + removeSwimSpeed(player); + return; + } + + double swimBoost = groundAcceleration * speedMod * 0.5; + + AttributeInstance attribute = player.getAttribute(ForgeMod.SWIM_SPEED.get()); + if (attribute != null) { + attribute.removeModifier(SWIM_SPEED_UUID); + attribute.addTransientModifier(new AttributeModifier( + SWIM_SPEED_UUID, + "Cosmic Boots Swim Speed", + swimBoost, + AttributeModifier.Operation.MULTIPLY_TOTAL)); + } + } + + protected void removeSwimSpeed(Player player) { + AttributeInstance attribute = player.getAttribute(ForgeMod.SWIM_SPEED.get()); + if (attribute != null) { + attribute.removeModifier(SWIM_SPEED_UUID); + } + } + + protected void applyMovementBonus(Player player, ItemStack boots) { + double speedMod = ICosmicBoots.getSpeedModifier(boots); + if (speedMod <= 0) { + return; + } + + Vec3 motion = player.getDeltaMovement(); + + float forward = player.zza; + float strafe = player.xxa; + boolean hasInput = forward != 0 || strafe != 0; + boolean isSprinting = player.isSprinting(); + + double effectiveMaxSpeed = getEffectiveMaxSpeed(boots); + double effectiveAccel = groundAcceleration * speedMod; + + if (isSprinting) { + effectiveAccel *= SPRINT_BOOST; + effectiveMaxSpeed *= SPRINT_BOOST; + } + + double newX = motion.x; + double newZ = motion.z; + + if (hasInput) { + float yaw = player.getYRot() * ((float) Math.PI / 180F); + double sinYaw = Mth.sin(yaw); + double cosYaw = Mth.cos(yaw); + + double wishX = (strafe * cosYaw - forward * sinYaw); + double wishZ = (forward * cosYaw + strafe * sinYaw); + + double wishLen = Math.sqrt(wishX * wishX + wishZ * wishZ); + if (wishLen > 0.01) { + wishX /= wishLen; + wishZ /= wishLen; + } + + double boostAmount; + if (player.onGround()) { + boostAmount = effectiveAccel * 0.08; + } else { + boostAmount = airControl * effectiveAccel * 0.07; + } + + newX += wishX * boostAmount; + newZ += wishZ * boostAmount; + + } else if (ICosmicBoots.isInertiaCancelEnabled(boots) && player.onGround()) { + double decelAmount = groundDeceleration; + + if (Math.abs(newX) > 0.001) { + newX *= (1.0 - decelAmount); + } else { + newX = 0; + } + if (Math.abs(newZ) > 0.001) { + newZ *= (1.0 - decelAmount); + } else { + newZ = 0; + } + } + + double newSpeed = Math.sqrt(newX * newX + newZ * newZ); + if (newSpeed > effectiveMaxSpeed) { + double scale = effectiveMaxSpeed / newSpeed; + newX *= scale; + newZ *= scale; + } + + player.setDeltaMovement(newX, motion.y, newZ); + } + + protected void spawnCloudTrail(Level level, Player player, double speed) { + if (!(level instanceof ServerLevel serverLevel)) return; + + Vec3 pos = player.position(); + Vec3 motion = player.getDeltaMovement(); + + int particleCount = (int) Math.min(4, speed * 3); + + double offsetX = -motion.x * 1.5; + double offsetZ = -motion.z * 1.5; + + serverLevel.sendParticles( + ParticleTypes.CLOUD, + pos.x + offsetX + (level.random.nextDouble() - 0.5) * 0.5, + pos.y + 0.15, + pos.z + offsetZ + (level.random.nextDouble() - 0.5) * 0.5, + particleCount, + 0.12, 0.06, 0.12, + 0.02); + } + + @Override + public int damageArmor(LivingEntity entity, ItemStack boots, DamageSource source, int damage, + EquipmentSlot slot) { + IElectricItem electric = GTCapabilityHelper.getElectricItem(boots); + if (electric != null) { + electric.discharge((long) energyPerUse * damage, tier, true, false, false); + } + return 0; + } + + @Override + public ResourceLocation getArmorTexture(ItemStack stack, Entity entity, EquipmentSlot slot, String type) { + return CosmicCore.id(texturePath); + } + + @Override + public void addInfo(ItemStack stack, List lines) { + super.addInfo(stack, lines); + + double speedMod = ICosmicBoots.getSpeedModifier(stack); + double jumpMod = ICosmicBoots.getJumpModifier(stack); + boolean stepEnabled = ICosmicBoots.isStepAssistEnabled(stack); + boolean inertiaEnabled = ICosmicBoots.isInertiaCancelEnabled(stack); + + lines.add(Component.translatable("cosmiccore.boots.speed_modifier", + String.format("%.0f%%", speedMod * 100))); + lines.add(Component.translatable("cosmiccore.boots.jump_modifier", + String.format("%.0f%%", jumpMod * 100))); + + lines.add(Component.translatable("cosmiccore.boots.step_assist", + stepEnabled ? "\u00a7aON" : "\u00a7cOFF")); + + lines.add(Component.translatable("cosmiccore.boots.inertia_cancel", + inertiaEnabled ? "\u00a7aON" : "\u00a7cOFF")); + + lines.add(Component.translatable("cosmiccore.boots.max_speed", + String.format("%.1f", getEffectiveMaxSpeed(stack) * 20) + " b/s")); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/armor/boots/ICosmicBoots.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/armor/boots/ICosmicBoots.java new file mode 100644 index 000000000..02e3c9883 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/armor/boots/ICosmicBoots.java @@ -0,0 +1,100 @@ +package com.ghostipedia.cosmiccore.common.item.armor.boots; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.ItemStack; + +public interface ICosmicBoots { + + String TAG_SPEED_MODIFIER = "cosmicboots:speed_mod"; + String TAG_JUMP_MODIFIER = "cosmicboots:jump_mod"; + String TAG_STEP_ASSIST = "cosmicboots:step_assist"; + String TAG_INERTIA_CANCEL = "cosmicboots:inertia_cancel"; + + double MODIFIER_INCREMENT = 0.25; + + double getMaxSpeed(); + + double getGroundAcceleration(); + + double getGroundDeceleration(); + + double getAirControl(); + + double getJumpPower(); + + default boolean negatesFallDamage() { + return true; + } + + default boolean hasStepAssist() { + return true; + } + + static double getSpeedModifier(ItemStack stack) { + if (stack.isEmpty()) return 1.0; + CompoundTag tag = stack.getTag(); + if (tag == null || !tag.contains(TAG_SPEED_MODIFIER)) return 1.0; + return tag.getDouble(TAG_SPEED_MODIFIER); + } + + static double getJumpModifier(ItemStack stack) { + if (stack.isEmpty()) return 1.0; + CompoundTag tag = stack.getTag(); + if (tag == null || !tag.contains(TAG_JUMP_MODIFIER)) return 1.0; + return tag.getDouble(TAG_JUMP_MODIFIER); + } + + static boolean isStepAssistEnabled(ItemStack stack) { + if (stack.isEmpty()) return true; + CompoundTag tag = stack.getTag(); + if (tag == null || !tag.contains(TAG_STEP_ASSIST)) return true; + return tag.getBoolean(TAG_STEP_ASSIST); + } + + static boolean isInertiaCancelEnabled(ItemStack stack) { + if (stack.isEmpty()) return true; + CompoundTag tag = stack.getTag(); + if (tag == null || !tag.contains(TAG_INERTIA_CANCEL)) return true; + return tag.getBoolean(TAG_INERTIA_CANCEL); + } + + static double changeSpeedModifier(ItemStack stack, double delta) { + CompoundTag tag = stack.getOrCreateTag(); + double current = getSpeedModifier(stack); + double newValue = Math.max(0.0, Math.min(1.0, current + delta)); + newValue = Math.round(newValue / MODIFIER_INCREMENT) * MODIFIER_INCREMENT; + tag.putDouble(TAG_SPEED_MODIFIER, newValue); + return newValue; + } + + static double changeJumpModifier(ItemStack stack, double delta) { + CompoundTag tag = stack.getOrCreateTag(); + double current = getJumpModifier(stack); + double newValue = Math.max(0.0, Math.min(1.0, current + delta)); + newValue = Math.round(newValue / MODIFIER_INCREMENT) * MODIFIER_INCREMENT; + tag.putDouble(TAG_JUMP_MODIFIER, newValue); + return newValue; + } + + static boolean toggleStepAssist(ItemStack stack) { + CompoundTag tag = stack.getOrCreateTag(); + boolean current = isStepAssistEnabled(stack); + tag.putBoolean(TAG_STEP_ASSIST, !current); + return !current; + } + + static boolean toggleInertiaCancel(ItemStack stack) { + CompoundTag tag = stack.getOrCreateTag(); + boolean current = isInertiaCancelEnabled(stack); + tag.putBoolean(TAG_INERTIA_CANCEL, !current); + return !current; + } + + default double getEffectiveMaxSpeed(ItemStack stack) { + return getMaxSpeed() * getSpeedModifier(stack); + } + + default double getEffectiveJumpPower(ItemStack stack) { + return getJumpPower() * getJumpModifier(stack); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/OxygenSupplyTankBehavior.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/OxygenSupplyTankBehavior.java new file mode 100644 index 000000000..2ada0306a --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/OxygenSupplyTankBehavior.java @@ -0,0 +1,120 @@ +package com.ghostipedia.cosmiccore.common.item.behavior; + +import com.ghostipedia.cosmiccore.common.airControl.IOxygenSupplyItem; +import com.ghostipedia.cosmiccore.common.airControl.OxygenItemCap; + +import com.gregtechceu.gtceu.api.item.component.IItemComponent; +import com.gregtechceu.gtceu.api.item.component.forge.IComponentCapability; +import com.gregtechceu.gtceu.common.data.GTMaterials; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.IFluidHandlerItem; +import net.minecraftforge.fluids.capability.templates.FluidHandlerItemStack; + +import lombok.Getter; +import org.jetbrains.annotations.NotNull; + +public class OxygenSupplyTankBehavior implements IItemComponent, IComponentCapability { + + private static final String TAG_ROOT = "CosmicCoreO2"; + private static final String TAG_BUF = "TickBuffer"; + private static final String TAG_CAP = "CapacityMb"; + private static final String TAG_TPT = "TransferPerTick"; + private static final String TAG_TPM = "TicksPerMb"; + + @Getter + private final int capacityMb; + @Getter + private final int transferPerTick; + @Getter + private final int ticksPerMb; + + public OxygenSupplyTankBehavior(int capacityMb, int transferPerTick, int ticksPerMb) { + this.capacityMb = capacityMb; + this.transferPerTick = Math.max(0, transferPerTick); + this.ticksPerMb = Math.max(1, ticksPerMb); + } + + /** + * Drains oxygen ticks from the tank's internal buffer, refilling from fluid as needed. + */ + public int drainTicks(ItemStack stack, int requestTicks) { + if (requestTicks <= 0) return 0; + + int outLimit = Math.min(requestTicks, transferPerTick); + + IFluidHandlerItem fluidHandler = getFluidHandler(stack); + if (fluidHandler == null) return 0; + + int buffer = getTickBuffer(stack); + + // If buffer can't satisfy the output limit, top-up by draining 1 mB + if (buffer < outLimit) { + FluidStack drained = fluidHandler.drain( + new FluidStack(GTMaterials.Oxygen.getFluid(), 1), + IFluidHandlerItem.FluidAction.EXECUTE); + if (!drained.isEmpty()) { + buffer += drained.getAmount() * ticksPerMb; + } + } + + int provided = Math.min(outLimit, buffer); + if (provided > 0) { + setTickBuffer(stack, buffer - provided); + } + return provided; + } + + private IFluidHandlerItem getFluidHandler(ItemStack stack) { + return stack.getCapability(ForgeCapabilities.FLUID_HANDLER_ITEM).orElse(null); + } + + private int getTickBuffer(ItemStack stack) { + CompoundTag compoundTag = stack.getOrCreateTag().getCompound(TAG_ROOT); + return compoundTag.getInt(TAG_BUF); + } + + private void setTickBuffer(ItemStack stack, int value) { + CompoundTag tag = stack.getOrCreateTag(); + CompoundTag compoundTag = tag.getCompound(TAG_ROOT); + compoundTag.putInt(TAG_BUF, Math.max(0, value)); + tag.put(TAG_ROOT, compoundTag); + } + + private void ensureConfigWritten(ItemStack stack) { + CompoundTag tag = stack.getOrCreateTag(); + CompoundTag compoundTag = tag.getCompound(TAG_ROOT); + compoundTag.putInt(TAG_CAP, capacityMb); + compoundTag.putInt(TAG_TPT, transferPerTick); + compoundTag.putInt(TAG_TPM, ticksPerMb); + tag.put(TAG_ROOT, compoundTag); + } + + @Override + public @NotNull LazyOptional getCapability(ItemStack stack, @NotNull Capability cap) { + ensureConfigWritten(stack); + + if (cap == ForgeCapabilities.FLUID_HANDLER_ITEM) { + return ForgeCapabilities.FLUID_HANDLER_ITEM.orEmpty(cap, + LazyOptional.of(() -> new FluidHandlerItemStack(stack, capacityMb) { + + @Override + public boolean isFluidValid(int tank, FluidStack fluidStack) { + return fluidStack.getFluid() == GTMaterials.Oxygen.getFluid(); + } + })); + } + + if (cap == OxygenItemCap.OXYGEN_SUPPLY) { + IOxygenSupplyItem provider = (stk, req) -> drainTicks(stk, req); + return OxygenItemCap.OXYGEN_SUPPLY.orEmpty(cap, LazyOptional.of(() -> provider)); + } + + return LazyOptional.empty(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/StructureWriteBehavior.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/StructureWriteBehavior.java index 9c793dec7..eb52cd5ad 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/StructureWriteBehavior.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/StructureWriteBehavior.java @@ -126,6 +126,16 @@ private void exportLog(HeldItemUIFactory.HeldItemHolder playerInventoryHolder) { builder.append(".aisle(\"%s\")\n".formatted(Joiner.on("\", \"").join(strings))); } + // Add legend mapping characters to block resource locations + builder.append("\n// Block Legend:\n"); + blockPattern.charToBlockMap.forEach((character, resourceLocation) -> { + if (character == ' ') { + builder.append("// ' ' (space) - %s\n".formatted(resourceLocation)); + } else { + builder.append("// %c - %s\n".formatted(character, resourceLocation)); + } + }); + GTCEu.LOGGER.info("\n" + builder.toString()); } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/WarpStaffBehavior.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/WarpStaffBehavior.java new file mode 100644 index 000000000..5693dacf3 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/WarpStaffBehavior.java @@ -0,0 +1,10 @@ +package com.ghostipedia.cosmiccore.common.item.behavior; + +import net.minecraft.world.item.Item; + +public class WarpStaffBehavior extends Item { + + public WarpStaffBehavior(Properties properties) { + super(properties); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicCreativeTinkersTab.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicCreativeTinkersTab.java new file mode 100644 index 000000000..8b6e2c9f2 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicCreativeTinkersTab.java @@ -0,0 +1,46 @@ +package com.ghostipedia.cosmiccore.common.item.tcon; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.CosmicItems; +import com.tterrag.registrate.util.entry.RegistryEntry; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.ItemStack; + +import slimeknights.mantle.registration.object.EnumObject; +import slimeknights.tconstruct.library.tools.helper.ToolBuildHandler; +import slimeknights.tconstruct.library.tools.item.IModifiable; +import slimeknights.tconstruct.library.tools.part.IMaterialItem; + +import java.util.function.Consumer; +import java.util.function.Supplier; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; + +public class CosmicCreativeTinkersTab { + + + + + public static void addCreativeTabItems(CreativeModeTab.ItemDisplayParameters itemDisplayParameters, + CreativeModeTab.Output tab) { + Consumer output = tab::accept; + acceptTool(output, CosmicTinkerTools.wireCutter); + acceptTool(output, CosmicTinkerTools.wrench); + acceptTool(output, CosmicTinkerTools.screwdriver); + + acceptPart(output, CosmicTinkerToolPart.wrenchHead); + acceptPart(output, CosmicTinkerToolPart.screwdriverHead); + } + + private static void acceptTool(Consumer output, Supplier tool) { + ToolBuildHandler.addVariants(output, tool.get(), ""); + } + + public static void acceptPart(Consumer output, Supplier item) { + item.get().addVariants(output, ""); + } + + private static void acceptTools(Consumer output, EnumObject tools) { + tools.forEach(tool -> ToolBuildHandler.addVariants(output, tool, "")); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTconBlockTagProvider.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTconBlockTagProvider.java new file mode 100644 index 000000000..3c27326ca --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTconBlockTagProvider.java @@ -0,0 +1,21 @@ +package com.ghostipedia.cosmiccore.common.item.tcon; + +import com.ghostipedia.cosmiccore.CosmicCore; + +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.minecraftforge.common.data.BlockTagsProvider; +import net.minecraftforge.common.data.ExistingFileHelper; + +import java.util.concurrent.CompletableFuture; + +public class CosmicTconBlockTagProvider extends BlockTagsProvider { + + public CosmicTconBlockTagProvider(PackOutput packOutput, CompletableFuture registries, + ExistingFileHelper existingFileHelper) { + super(packOutput, registries, CosmicCore.MOD_ID, existingFileHelper); + } + + @Override + protected void addTags(HolderLookup.Provider provider) {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTconItemTagProvider.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTconItemTagProvider.java new file mode 100644 index 000000000..7f44c275c --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTconItemTagProvider.java @@ -0,0 +1,60 @@ +package com.ghostipedia.cosmiccore.common.item.tcon; + +import com.ghostipedia.cosmiccore.CosmicCore; + +import com.gregtechceu.gtceu.data.recipe.CustomTags; + +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.minecraft.data.tags.ItemTagsProvider; +import net.minecraft.tags.ItemTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.block.Block; +import net.minecraftforge.common.data.ExistingFileHelper; +import slimeknights.tconstruct.TConstruct; +import slimeknights.tconstruct.tools.TinkerTools; + +import java.util.concurrent.CompletableFuture; + +import static net.minecraft.tags.ItemTags.CLUSTER_MAX_HARVESTABLES; +import static slimeknights.tconstruct.common.TinkerTags.Items.*; + + +public class CosmicTconItemTagProvider extends ItemTagsProvider { + + public CosmicTconItemTagProvider(PackOutput output, CompletableFuture lookupProvider, + CompletableFuture> blockTagProvider, + ExistingFileHelper existingFileHelper) { + super(output, lookupProvider, blockTagProvider, CosmicCore.MOD_ID, existingFileHelper); + } + + @Override + protected void addTags(HolderLookup.Provider provider) { + this.addTools(); + } + + + private void addTools() { + addToolTags(CosmicTinkerTools.wireCutter, MULTIPART_TOOL, DURABILITY, HARVEST_PRIMARY, CustomTags.WIRE_CUTTERS, + CustomTags.CRAFTING_WIRE_CUTTERS, MELEE_WEAPON, INTERACTABLE_RIGHT, AOE, CLUSTER_MAX_HARVESTABLES, + SMALL_TOOLS, BONUS_SLOTS); + addToolTags(CosmicTinkerTools.wrench, MULTIPART_TOOL, DURABILITY, HARVEST_PRIMARY, CustomTags.WRENCHES, + CustomTags.CRAFTING_WRENCHES, MELEE_WEAPON, INTERACTABLE_RIGHT, AOE, CLUSTER_MAX_HARVESTABLES, + SMALL_TOOLS, BONUS_SLOTS); + + addToolTags(CosmicTinkerTools.screwdriver, MULTIPART_TOOL, DURABILITY, HARVEST_PRIMARY, CustomTags.SCREWDRIVERS, + CustomTags.CRAFTING_SCREWDRIVERS, MELEE_WEAPON, INTERACTABLE_RIGHT, AOE, CLUSTER_MAX_HARVESTABLES, + SMALL_TOOLS, BONUS_SLOTS); + } + + + @SafeVarargs + private void addToolTags(ItemLike tool, TagKey... tags) { + Item item = tool.asItem(); + for (TagKey tag : tags) { + this.tag(tag).add(item); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerToolPart.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerToolPart.java new file mode 100644 index 000000000..bfb621f18 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerToolPart.java @@ -0,0 +1,45 @@ +package com.ghostipedia.cosmiccore.common.item.tcon; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.CosmicCreativeModeTabs; + +import com.ghostipedia.cosmiccore.common.data.CosmicCreativeModeTabs; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; + +import slimeknights.mantle.registration.object.ItemObject; +import slimeknights.tconstruct.common.registration.ItemDeferredRegisterExtension; +import slimeknights.tconstruct.library.tools.part.IMaterialItem; +import slimeknights.tconstruct.library.tools.part.ToolPartItem; +import slimeknights.tconstruct.tools.stats.HeadMaterialStats; + +import java.util.function.Consumer; +import java.util.function.Supplier; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; + +public class CosmicTinkerToolPart { + + static { + REGISTRATE.creativeModeTab(() -> CosmicCreativeModeTabs.COSMIC_CORE_TINKERS_TOOLS); + } + // Tinkers uses Protected in their Registry class to seal it, we should do the same to avoid conflicts!! + protected static final ItemDeferredRegisterExtension COSMIC_TINKER_PARTS = new ItemDeferredRegisterExtension( + CosmicCore.MOD_ID); + protected static final Item.Properties ITEM_PROPS = new Item.Properties(); + + public static final ItemObject wrenchHead = COSMIC_TINKER_PARTS.register("wrench_head", + () -> new ToolPartItem(ITEM_PROPS, HeadMaterialStats.ID)); + + public static final ItemObject screwdriverHead = COSMIC_TINKER_PARTS.register("screwdriver_head", + () -> new ToolPartItem(ITEM_PROPS, HeadMaterialStats.ID)); + + public static void init() { + COSMIC_TINKER_PARTS.register(FMLJavaModLoadingContext.get().getModEventBus()); + } + + private static void accept(Consumer output, Supplier item) { + item.get().addVariants(output, ""); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerTools.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerTools.java new file mode 100644 index 000000000..3c0b4d65e --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerTools.java @@ -0,0 +1,64 @@ +package com.ghostipedia.cosmiccore.common.item.tcon; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.item.tcon.base.ChargableModifiableItem; +import com.ghostipedia.cosmiccore.common.item.tcon.modifiers.CosmicCoreModifiers; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.LevelReader; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; + +import slimeknights.mantle.registration.object.ItemObject; +import slimeknights.tconstruct.common.registration.ItemDeferredRegisterExtension; +import slimeknights.tconstruct.library.tools.item.ModifiableItem; +import slimeknights.tconstruct.tools.ToolDefinitions; + +public class CosmicTinkerTools { + + protected static final ItemDeferredRegisterExtension COSMIC_TINKER_ITEM = new ItemDeferredRegisterExtension( + CosmicCore.MOD_ID); + protected static final ItemDeferredRegisterExtension COSMIC_TINKER_ITEM = new ItemDeferredRegisterExtension(CosmicCore.MOD_ID); + + + private static final Item.Properties UNSTACKABLE_PROPS = new Item.Properties().stacksTo(1); + + public static final ItemObject file = COSMIC_TINKER_ITEM.register("file", + () -> new ModifiableItem(UNSTACKABLE_PROPS, CosmicToolDefinitions.FILES)); + public static final ItemObject saw = COSMIC_TINKER_ITEM.register("saw", + () -> new ModifiableItem(UNSTACKABLE_PROPS, CosmicToolDefinitions.SAWS)); + public static final ItemObject drill = COSMIC_TINKER_ITEM.register("drill", + () -> new ModifiableItem(UNSTACKABLE_PROPS, CosmicToolDefinitions.DRILLS)); + public static final ItemObject screwdriver = COSMIC_TINKER_ITEM.register("screwdriver", + () -> new ModifiableItem(UNSTACKABLE_PROPS, CosmicToolDefinitions.SCREWDRIVERS)); + public static final ItemObject softMallet = COSMIC_TINKER_ITEM.register("soft_mallet", + () -> new ModifiableItem(UNSTACKABLE_PROPS, CosmicToolDefinitions.SOFT_MALLETS)); + public static final ItemObject plunger = COSMIC_TINKER_ITEM.register("plunger", + () -> new ModifiableItem(UNSTACKABLE_PROPS, CosmicToolDefinitions.PLUNGERS)); + public static final ItemObject crowbar = COSMIC_TINKER_ITEM.register("crowbar", + () -> new ModifiableItem(UNSTACKABLE_PROPS, CosmicToolDefinitions.CROWBARS)); + + public static final ItemObject wireCutter = COSMIC_TINKER_ITEM.register("wire_cutter", + () -> new ModifiableItem(UNSTACKABLE_PROPS, CosmicToolDefinitions.WIRE_CUTTERS)); + + public static final ItemObject screwdriver = COSMIC_TINKER_ITEM.register("screwdriver", + () -> new ModifiableItem(UNSTACKABLE_PROPS, CosmicToolDefinitions.SCREWDRIVER)); + + public static final ItemObject wrench = COSMIC_TINKER_ITEM.register("wrench", + () -> new ChargableModifiableItem(UNSTACKABLE_PROPS, CosmicToolDefinitions.WRENCHES) { + + @Override + public boolean doesSneakBypassUse(ItemStack stack, LevelReader level, BlockPos pos, Player player) { + return true; + } + }); + public static final ItemObject wireCutter = COSMIC_TINKER_ITEM.register("wire_cutter", () -> new ModifiableItem(UNSTACKABLE_PROPS, ToolDefinitions.PICKAXE)); + + + public static void init() { + COSMIC_TINKER_ITEM.register(FMLJavaModLoadingContext.get().getModEventBus()); + CosmicCoreModifiers.init(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefinitionProvider.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefinitionProvider.java new file mode 100644 index 000000000..4197d4813 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefinitionProvider.java @@ -0,0 +1,91 @@ +package com.ghostipedia.cosmiccore.common.item.tcon; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.item.tcon.modifiers.CosmicCoreModifiers; +import com.gregtechceu.gtceu.data.recipe.CustomTags; + +import net.minecraft.data.PackOutput; + +import slimeknights.tconstruct.library.data.tinkering.AbstractToolDefinitionDataProvider; +import slimeknights.tconstruct.library.materials.RandomMaterial; +import slimeknights.tconstruct.library.tools.definition.module.build.SetStatsModule; +import slimeknights.tconstruct.library.tools.definition.module.build.ToolTraitsModule; +import slimeknights.tconstruct.library.tools.definition.module.material.DefaultMaterialsModule; +import slimeknights.tconstruct.library.tools.definition.module.material.PartStatsModule; +import slimeknights.tconstruct.library.tools.definition.module.mining.IsEffectiveModule; +import slimeknights.tconstruct.library.tools.nbt.StatsNBT; +import slimeknights.tconstruct.library.tools.stat.ToolStats; + +import static com.ghostipedia.cosmiccore.common.item.tcon.CosmicTinkerToolPart.screwdriverHead; +import static com.ghostipedia.cosmiccore.common.item.tcon.CosmicTinkerToolPart.wrenchHead; +import static slimeknights.tconstruct.tools.TinkerToolParts.*; + +public class CosmicToolDefinitionProvider extends AbstractToolDefinitionDataProvider { + + + public CosmicToolDefinitionProvider(PackOutput packOutput) { + super(packOutput, CosmicCore.MOD_ID); + } + + @Override + protected void addToolDefinitions() { + RandomMaterial tier1Material = RandomMaterial.random().tier(1).build(); + RandomMaterial randomMaterial = RandomMaterial.random().allowHidden().build(); + DefaultMaterialsModule defaultTwoParts = DefaultMaterialsModule.builder().material(tier1Material, tier1Material) + .build(); + DefaultMaterialsModule defaultThreeParts = DefaultMaterialsModule.builder() + .material(tier1Material, tier1Material, tier1Material).build(); + DefaultMaterialsModule defaultFourParts = DefaultMaterialsModule.builder() + .material(tier1Material, tier1Material, tier1Material, tier1Material).build(); + DefaultMaterialsModule defaultFiveParts = DefaultMaterialsModule.builder() + .material(tier1Material, tier1Material, tier1Material, tier1Material, tier1Material).build(); + DefaultMaterialsModule ancientTwoParts = DefaultMaterialsModule.builder() + .material(randomMaterial, randomMaterial).build(); + DefaultMaterialsModule ancientThreeParts = DefaultMaterialsModule.builder() + .material(randomMaterial, randomMaterial, randomMaterial).build(); + + // pickaxes + + + define(CosmicToolDefinitions.WIRE_CUTTERS) + .module(PartStatsModule.parts() + .part(smallBlade) + .part(smallBlade) + .part(toolBinding) + .part(toolHandle) + .part(toolHandle).build()) + .module(defaultFourParts) + .module(new SetStatsModule(StatsNBT.builder() + .set(ToolStats.ATTACK_SPEED, 0.9f) + .build())) + .module(IsEffectiveModule.tag(CustomTags.MINEABLE_WITH_WIRE_CUTTER)); + + define(CosmicToolDefinitions.SCREWDRIVER) + .module(PartStatsModule.parts() + .part(screwdriverHead) + .part(toolHandle) + .build()) + .module(defaultTwoParts) + .module(new SetStatsModule(StatsNBT.builder() + .set(ToolStats.ATTACK_SPEED, 0.9f) + + .build())); + + define(CosmicToolDefinitions.WRENCHES) + .module(PartStatsModule.parts() + .part(wrenchHead) + .part(toughBinding) + .part(toolHandle).build()) + .module(defaultThreeParts) + .module(new SetStatsModule(StatsNBT.builder() + .set(ToolStats.ATTACK_SPEED, 0.9f) + .build())) + .module(IsEffectiveModule.tag(CustomTags.MINEABLE_WITH_CONFIG_VALID_PICKAXE_WRENCH)) + .module(ToolTraitsModule.builder().trait(CosmicCoreModifiers.wrenchModeSwitch).build()); + } + + @Override + public String getName() { + return "Cosmic Core Tinker's Construct Tool Definition Data Generator"; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefinitions.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefinitions.java new file mode 100644 index 000000000..59a6c1b55 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefinitions.java @@ -0,0 +1,25 @@ +package com.ghostipedia.cosmiccore.common.item.tcon; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import slimeknights.tconstruct.library.tools.definition.ToolDefinition; +import slimeknights.tconstruct.tools.TinkerTools; + + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class CosmicToolDefinitions { + + + + public static final ToolDefinition WIRE_CUTTERS = ToolDefinition.create(CosmicTinkerTools.wireCutter); + public static final ToolDefinition WRENCHES = ToolDefinition.create(CosmicTinkerTools.wrench); + public static final ToolDefinition FILES = ToolDefinition.create(CosmicTinkerTools.file); + public static final ToolDefinition SAWS = ToolDefinition.create(CosmicTinkerTools.saw); + public static final ToolDefinition DRILLS = ToolDefinition.create(CosmicTinkerTools.drill); + public static final ToolDefinition SCREWDRIVERS = ToolDefinition.create(CosmicTinkerTools.screwdriver); + public static final ToolDefinition SOFT_MALLETS = ToolDefinition.create(CosmicTinkerTools.softMallet); + public static final ToolDefinition PLUNGERS = ToolDefinition.create(CosmicTinkerTools.plunger); + public static final ToolDefinition CROWBARS = ToolDefinition.create(CosmicTinkerTools.crowbar); + + +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/TiconUtils.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/TiconUtils.java new file mode 100644 index 000000000..51033c83d --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/TiconUtils.java @@ -0,0 +1,43 @@ +package com.ghostipedia.cosmiccore.common.item.tcon; + +import com.gregtechceu.gtceu.api.item.tool.GTToolType; + +import net.minecraft.world.item.ItemStack; + +import slimeknights.tconstruct.library.modifiers.ModifierEntry; +import slimeknights.tconstruct.library.tools.definition.ToolDefinition; +import slimeknights.tconstruct.library.tools.nbt.ToolStack; + +import java.util.List; + +public class TiconUtils { + + public static ToolStack getTool(ItemStack stack) { + return ToolStack.from(stack); + } + + public static List getModifierList(ToolStack tool) { + return tool.getModifierList(); + } + + public static GTToolType getGTToolType(ToolDefinition def) { + if (def == CosmicToolDefinitions.WRENCHES) { + return GTToolType.WRENCH; + } else if (def == CosmicToolDefinitions.WIRE_CUTTERS) { + return GTToolType.WIRE_CUTTER; + } else if (def == CosmicToolDefinitions.SCREWDRIVERS) { + return GTToolType.SCREWDRIVER; + } else if (def == CosmicToolDefinitions.CROWBARS) { + return GTToolType.CROWBAR; + } else if (def == CosmicToolDefinitions.FILES) { + return GTToolType.FILE; + } else if (def == CosmicToolDefinitions.PLUNGERS) { + return GTToolType.PLUNGER; + } else if (def == CosmicToolDefinitions.SOFT_MALLETS) { + return GTToolType.SOFT_MALLET; + } else if (def == CosmicToolDefinitions.SAWS) { + return GTToolType.SAW; + } + return GTToolType.FILE; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/TinkersMaterials.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/TinkersMaterials.java new file mode 100644 index 000000000..ba392ef5c --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/TinkersMaterials.java @@ -0,0 +1,64 @@ +package com.ghostipedia.cosmiccore.common.item.tcon; + +import com.ghostipedia.cosmiccore.common.data.materials.tinkers.TinkersMaterial; +import com.ghostipedia.cosmiccore.common.item.tcon.modifiers.CosmicCoreModifiers; +import com.gregtechceu.gtceu.api.GTCEuAPI; +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; +import com.gregtechceu.gtceu.api.data.chemical.material.Material; +import com.gregtechceu.gtceu.api.data.chemical.material.properties.PropertyKey; +import com.gregtechceu.gtceu.common.data.GTMaterials; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.Tiers; +import net.minecraft.world.item.crafting.Ingredient; +import slimeknights.tconstruct.library.client.data.spritetransformer.GreyToColorMapping; +import slimeknights.tconstruct.library.materials.MaterialRegistry; +import slimeknights.tconstruct.library.modifiers.ModifierEntry; +import slimeknights.tconstruct.tools.TinkerModifiers; +import slimeknights.tconstruct.tools.stats.StatlessMaterialStats; + +public class TinkersMaterials { + + public static void init() { + + for(Material material : GTCEuAPI.materialManager.getRegisteredMaterials()) { + if (!material.hasProperty(PropertyKey.INGOT)){ + continue; + } + + if(material.hasProperty(PropertyKey.TOOL)){ + + new TinkersMaterial.Builder(material.getName()) + .materialValue(2) + .headMaterialStats(2200, 10.0f, Tiers.IRON, 5.0f) + .gripMaterialStats(3000, 10.0f, 20) + .handleMaterialStats(3000, 10, 4, 10) + .addStatlessType(StatlessMaterialStats.BINDING) + .addStatlessType(StatlessMaterialStats.REPAIR_KIT) + .addStatlessType(StatlessMaterialStats.BOWSTRING) + .defaultTrait(CosmicCoreModifiers.wrenchModeSwitch.getId()) + .trait(() -> new ModifierEntry(CosmicCoreModifiers.wrenchModeSwitch.get(), 3), MaterialRegistry.RANGED) + .trait(() -> new ModifierEntry(TinkerModifiers.decay.get(), 1), MaterialRegistry.MELEE_HARVEST) + .sortOrder(10) + .craftable(true) + .colorMapping( + GreyToColorMapping.builder() + .addARGB(0, 0xFFFF66CC) + .addARGB(85, 0xFFFF99DD) + .addARGB(170, 0xFF99CCFF) + .addARGB(255, 0xFF66CCFF) + .build()) + .fallback("silver") + .fallback("iron") + .color(material.getMaterialARGB()) + .Ingredient(Ingredient.of(ChemicalHelper.getIngot(material, GTValues.M)), 1, 2) + .build(); + + + + } + + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/base/ChargableModifiableItem.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/base/ChargableModifiableItem.java new file mode 100644 index 000000000..9ec7b0283 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/base/ChargableModifiableItem.java @@ -0,0 +1,201 @@ +package com.ghostipedia.cosmiccore.common.item.tcon.base; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.capability.IElectricItem; + +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.CapabilityManager; +import net.minecraftforge.common.capabilities.CapabilityToken; +import net.minecraftforge.common.capabilities.ICapabilityProvider; +import net.minecraftforge.common.util.LazyOptional; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import slimeknights.tconstruct.library.tools.definition.ToolDefinition; +import slimeknights.tconstruct.library.tools.item.ModifiableItem; + +import java.util.List; + +public class ChargableModifiableItem extends ModifiableItem { + + public static final long ENERGY_COST = 8 * GTValues.V[1]; + public static final long CAPACITY = 100_000L; + private static final Capability ELECTRIC_CAP = CapabilityManager + .get(new CapabilityToken() {}); + + public ChargableModifiableItem(Properties properties, ToolDefinition toolDefinition) { + super(properties, toolDefinition); + } + + @Override + public @Nullable ICapabilityProvider initCapabilities(ItemStack stack, @Nullable CompoundTag nbt) { + // Example defaults: 100k max charge, LV tier, chargeable + return new ElectricCapability(stack, 100_000L, GTValues.LV, true); + } + + public static class ElectricCapability implements ICapabilityProvider, IElectricItem { + + private final ItemStack itemStack; + private final long baseMaxCharge; + private final int tier; + private final boolean chargeable; + + private final LazyOptional holder = LazyOptional.of(() -> this); + + public ElectricCapability(ItemStack stack, long maxCharge, int tier, boolean chargeable) { + this.itemStack = stack; + this.baseMaxCharge = maxCharge; + this.tier = tier; + this.chargeable = chargeable; + } + + private CompoundTag getOrCreateTag() { + return itemStack.getOrCreateTag(); + } + + public void setCharge(long charge) { + getOrCreateTag().putLong("charge", Math.max(0, Math.min(charge, getMaxCharge()))); + } + + public void setMaxChargeOverride(long charge) { + getOrCreateTag().putLong("maxCharge", charge); + } + + @Override + public @NotNull LazyOptional getCapability(@NotNull Capability capability, + @Nullable Direction direction) { + if (capability == ELECTRIC_CAP) return holder.cast(); + return LazyOptional.empty(); + } + + @Override + public int getTier() { + return this.tier; + } + + @Override + public boolean canProvideChargeExternally() { + return true; + } + + @Override + public boolean chargeable() { + return chargeable; + } + + @Override + public long charge(long amount, int chargerTier, boolean ignoreTransferLimit, boolean simulate) { + if (!chargeable) return 0; + if (chargerTier < tier) return 0; + + long transferLimit = ignoreTransferLimit ? amount : Math.min(amount, getTransferLimit()); + long current = getCharge(); + long max = getMaxCharge(); + long accepted = Math.min(max - current, transferLimit); + + if (!simulate && accepted > 0) { + setCharge(current + accepted); + } + return accepted; + } + + @Override + public long discharge(long amount, int dischargerTier, boolean ignoreTransferLimit, boolean externally, + boolean simulate) { + if (dischargerTier < tier) return 0; + + long transferLimit = ignoreTransferLimit ? amount : Math.min(amount, getTransferLimit()); + long current = getCharge(); + long extracted = Math.min(current, transferLimit); + + if (!simulate && extracted > 0) { + setCharge(current - extracted); + } + return extracted; + } + + @Override + public long getTransferLimit() { + return GTValues.V[getTier()]; + } + + @Override + public long getMaxCharge() { + var nbt = getOrCreateTag(); + if (nbt.contains("maxCharge", Tag.TAG_LONG)) { + return nbt.getLong("maxCharge"); + } + return baseMaxCharge; + } + + @Override + public long getCharge() { + var nbt = getOrCreateTag(); + if (nbt.getBoolean("infinite")) { + return getMaxCharge(); + } + if (nbt.contains("charge", Tag.TAG_LONG)) { + return nbt.getLong("charge"); + } + return 0; // default empty + } + } + + @Override + public boolean isBarVisible(ItemStack stack) { + return true; + } + + public long getCharge(ItemStack stack) { + return stack.getCapability(ELECTRIC_CAP) + .map(IElectricItem::getCharge) + .orElse(0L); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltip, TooltipFlag flag) { + super.appendHoverText(stack, level, tooltip, flag); + + stack.getCapability(ELECTRIC_CAP).ifPresent(cap -> { + long current = cap.getCharge(); + long max = cap.getMaxCharge(); + + // Format numbers with commas for readability + String currentFormatted = String.format("%,d", current); + String maxFormatted = String.format("%,d", max); + + tooltip.add(Component.literal("Charge: " + currentFormatted + " / " + maxFormatted + " EU")); + }); + } + + public long discharge(ItemStack stack, long amount, boolean simulate) { + // get the capability + return stack.getCapability(ELECTRIC_CAP) + .map(cap -> cap.discharge(amount, GTValues.LV, false, true, simulate)) + .orElse(0L); // if no capability, nothing extracted + } + + public long getCharge(ItemStack stack, long amount, boolean simulate) { + // get the capability + return stack.getCapability(ELECTRIC_CAP) + .map(IElectricItem::getCharge) + .orElse(0L); // if no capability, nothing extracted + } + + @Override + public int getBarWidth(ItemStack stack) { + return (int) Math.round(13.0 * getCharge(stack) / (double) CAPACITY); + } + + @Override + public int getBarColor(ItemStack stack) { + return 0x55D8FF; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/modifiers/CosmicCoreModifiers.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/modifiers/CosmicCoreModifiers.java new file mode 100644 index 000000000..1a551af75 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/modifiers/CosmicCoreModifiers.java @@ -0,0 +1,20 @@ +package com.ghostipedia.cosmiccore.common.item.tcon.modifiers; + +import com.ghostipedia.cosmiccore.CosmicCore; + +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; + +import slimeknights.tconstruct.library.modifiers.util.ModifierDeferredRegister; +import slimeknights.tconstruct.library.modifiers.util.StaticModifier; + +public class CosmicCoreModifiers { + + private static final ModifierDeferredRegister MODIFIERS = ModifierDeferredRegister.create(CosmicCore.MOD_ID); + + public static final StaticModifier wrenchModeSwitch = MODIFIERS.register("wrench_switch", + WrenchModeSwitchModifier::new); + + public static void init() { + MODIFIERS.register(FMLJavaModLoadingContext.get().getModEventBus()); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/modifiers/CosmicModifierIds.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/modifiers/CosmicModifierIds.java new file mode 100644 index 000000000..fa9152fd2 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/modifiers/CosmicModifierIds.java @@ -0,0 +1,10 @@ +package com.ghostipedia.cosmiccore.common.item.tcon.modifiers; + +import com.ghostipedia.cosmiccore.CosmicCore; + +import slimeknights.tconstruct.library.modifiers.ModifierId; + +public class CosmicModifierIds { + + public static final ModifierId wrenchModeBehavior = new ModifierId(CosmicCore.MOD_ID, "wrenchModeBehavior"); +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/modifiers/CosmicModifierProvider.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/modifiers/CosmicModifierProvider.java new file mode 100644 index 000000000..897b624ce --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/modifiers/CosmicModifierProvider.java @@ -0,0 +1,24 @@ +package com.ghostipedia.cosmiccore.common.item.tcon.modifiers; + +import net.minecraft.data.PackOutput; + +import slimeknights.tconstruct.library.data.tinkering.AbstractModifierProvider; +import slimeknights.tconstruct.library.modifiers.util.ModifierLevelDisplay; + +public class CosmicModifierProvider extends AbstractModifierProvider { + + public CosmicModifierProvider(PackOutput packOutput) { + super(packOutput); + } + + @Override + protected void addModifiers() { + buildModifier(CosmicModifierIds.wrenchModeBehavior) + .levelDisplay(ModifierLevelDisplay.NO_LEVELS); + } + + @Override + public String getName() { + return "cosmic modifiers"; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/modifiers/EUContainerModifier.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/modifiers/EUContainerModifier.java new file mode 100644 index 000000000..c100a8413 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/modifiers/EUContainerModifier.java @@ -0,0 +1,24 @@ +package com.ghostipedia.cosmiccore.common.item.tcon.modifiers; + +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; + +import org.jetbrains.annotations.Nullable; +import slimeknights.tconstruct.library.modifiers.ModifierEntry; +import slimeknights.tconstruct.library.modifiers.hook.behavior.ToolDamageModifierHook; +import slimeknights.tconstruct.library.modifiers.hook.interaction.InventoryTickModifierHook; +import slimeknights.tconstruct.library.modifiers.impl.NoLevelsModifier; +import slimeknights.tconstruct.library.tools.nbt.IToolStackView; + +public class EUContainerModifier extends NoLevelsModifier implements ToolDamageModifierHook, InventoryTickModifierHook { + + @Override + public int onDamageTool(IToolStackView tool, ModifierEntry modifier, int amount, @Nullable LivingEntity holder) { + return 0; + } + + @Override + public void onInventoryTick(IToolStackView tool, ModifierEntry modifier, Level world, LivingEntity holder, + int itemSlot, boolean isSelected, boolean isCorrectSlot, ItemStack stack) {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/modifiers/WrenchModeSwitchModifier.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/modifiers/WrenchModeSwitchModifier.java new file mode 100644 index 000000000..6383d2e88 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/modifiers/WrenchModeSwitchModifier.java @@ -0,0 +1,72 @@ +package com.ghostipedia.cosmiccore.common.item.tcon.modifiers; + +import com.gregtechceu.gtceu.common.item.tool.behavior.ToolModeSwitchBehavior; + +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.TooltipFlag; +import net.minecraftforge.common.ToolAction; + +import lombok.RequiredArgsConstructor; +import org.jetbrains.annotations.Nullable; +import slimeknights.mantle.client.TooltipKey; +import slimeknights.tconstruct.library.modifiers.Modifier; +import slimeknights.tconstruct.library.modifiers.ModifierEntry; +import slimeknights.tconstruct.library.modifiers.ModifierHooks; +import slimeknights.tconstruct.library.modifiers.hook.behavior.ToolActionModifierHook; +import slimeknights.tconstruct.library.modifiers.hook.display.TooltipModifierHook; +import slimeknights.tconstruct.library.modifiers.hook.interaction.GeneralInteractionModifierHook; +import slimeknights.tconstruct.library.modifiers.hook.interaction.InteractionSource; +import slimeknights.tconstruct.library.module.ModuleHookMap; +import slimeknights.tconstruct.library.tools.nbt.IToolStackView; + +import java.util.List; + +@RequiredArgsConstructor +public class WrenchModeSwitchModifier extends Modifier implements GeneralInteractionModifierHook, + ToolActionModifierHook, TooltipModifierHook { + + @Override + protected void registerHooks(ModuleHookMap.Builder hookBuilder) { + super.registerHooks(hookBuilder); + hookBuilder.addHook(this, ModifierHooks.GENERAL_INTERACT, ModifierHooks.TOOL_ACTION, ModifierHooks.TOOLTIP); + } + + private static ResourceLocation MODE_SWITCH = new ResourceLocation("ccore", "mode"); + + @Override + public InteractionResult onToolUse(IToolStackView tool, ModifierEntry modifier, Player player, InteractionHand hand, + InteractionSource source) { + var nbt = tool.getPersistentData(); + boolean shift = player.isShiftKeyDown(); + if (shift && source == InteractionSource.RIGHT_CLICK && !tool.isBroken()) { + nbt.putInt(MODE_SWITCH, + (nbt.getInt(MODE_SWITCH) + 1) % ToolModeSwitchBehavior.WrenchModeType.values().length); + player.displayClientMessage(Component.translatable("metaitem.machine_configuration.mode", + ToolModeSwitchBehavior.WrenchModeType.values()[nbt.getInt(MODE_SWITCH)].getName()), true); + } + return InteractionResult.PASS; + } + + @Override + public void addTooltip(IToolStackView tool, ModifierEntry modifier, @Nullable Player player, + List tooltip, TooltipKey tooltipKey, TooltipFlag tooltipFlag) { + var nbt = tool.getPersistentData(); + tooltip.add(Component.translatable("metaitem.machine_configuration.mode", + ToolModeSwitchBehavior.WrenchModeType.values()[nbt.getInt(MODE_SWITCH)].getName())); + } + + public ToolModeSwitchBehavior.WrenchModeType getType(IToolStackView tool) { + var nbt = tool.getPersistentData(); + return ToolModeSwitchBehavior.WrenchModeType.values()[nbt.getInt(MODE_SWITCH)]; + } + + @Override + public boolean canPerformAction(IToolStackView tool, ModifierEntry modifier, ToolAction toolAction) { + // todo check if we are on wrenches + return true; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/IndustrialApiaryMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/IndustrialApiaryMachine.java new file mode 100644 index 000000000..fdf5d5c66 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/IndustrialApiaryMachine.java @@ -0,0 +1,283 @@ +package com.ghostipedia.cosmiccore.common.machine; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.capability.IWorkable; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.gui.UITemplate; +import com.gregtechceu.gtceu.api.gui.fancy.TabsWidget; +import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.WorkableTieredMachine; +import com.gregtechceu.gtceu.api.machine.fancyconfigurator.CombinedDirectionalFancyConfigurator; +import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; +import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.chance.logic.ChanceLogic; +import com.gregtechceu.gtceu.data.recipe.builder.GTRecipeBuilder; + +import com.lowdragmc.lowdraglib.gui.modular.ModularUI; +import com.lowdragmc.lowdraglib.gui.widget.*; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; + +import net.minecraft.core.Direction; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; + +import forestry.api.ForestryCapabilities; +import forestry.api.apiculture.genetics.IBee; +import forestry.api.apiculture.genetics.IBeeSpecies; +import forestry.api.genetics.alleles.BeeChromosomes; +import forestry.api.genetics.alleles.ForestryAlleles; +import lombok.Getter; +import lombok.Setter; +import org.jetbrains.annotations.NotNull; + +import java.util.Collections; +import java.util.Iterator; +import java.util.List; + +// TOOD: IAutoOutputItem +// Just wanna make it work first ngl +public class IndustrialApiaryMachine extends WorkableTieredMachine implements IFancyUIMachine, IMachineLife, IWorkable { + + @Getter + private int beeTier; + + @Getter + @Setter + protected int beeProduct; + + // TODO; Might need more vars for the math behind the logic, but these i put in for the TL keys + + @Getter + private int machineTier; + + @Getter + private int duration; + + @Persisted + @Getter + protected final NotifiableFluidTank tank; + + @Persisted + @Getter + protected final NotifiableItemStackHandler itemCacheIn; + + @Getter + int productionAmplifier; + protected boolean allowInputFromOutputSideItems; + + public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( + IndustrialApiaryMachine.class, WorkableTieredMachine.MANAGED_FIELD_HOLDER); + + public IndustrialApiaryMachine(IMachineBlockEntity holder, int beeTier) { + super(holder, beeTier, (ignored) -> 0); + this.beeTier = beeTier; + this.tank = createTank(); + this.itemCacheIn = createStorageCache(); + } + + @Override + public @NotNull ManagedFieldHolder getFieldHolder() { + return MANAGED_FIELD_HOLDER; + } + + protected NotifiableFluidTank createTank(Object... args) { + return new NotifiableFluidTank(this, 1, 16000, IO.BOTH); + } + + // For Input i tems + protected NotifiableItemStackHandler createStorageCache(Object... args) { + return new NotifiableItemStackHandler(this, 1, IO.IN, IO.IN); + } + + // Attempting to set the non-override from 9 to 12 (with override) + @Override + protected @NotNull NotifiableItemStackHandler createExportItemHandler(Object... args) { + return new NotifiableItemStackHandler(this, 12, IO.OUT, IO.OUT); + } + + @Override + public ModularUI createUI(Player entityPlayer) { + // spotless:off + + var text = new WidgetGroup(0, 0, 176, 164); + text.addWidget(new LabelWidget(9, 5, "gui.cosmiccore.iapiary")); //Note: canTakeItems would probably be what we want to lock? idk can we do that dynamically??? + int groupOutX = 113; + int groupOutY = 7; + var group = new WidgetGroup(0, 0, 176, 164); + //TODO: canTakeItems would probably be what we want to lock when running? idk can we do that dynamically??? We want to lock the queen to this Ind.Apiary to avoid people cycling them across several manually or otherwise! + group.addWidget(new SlotWidget(getItemCacheIn().storage, 0, 8, groupOutY+15, true, true).setBackground(GuiTextures.SLOT)); + //TODO : PROGRESS WIDGET, I'm assuming we'll have a way to track progress in recipeLogic and then make the bar show// between the input slot and the outputs group.addWidget(new ProgressWidget()); + group.addWidget(new SlotWidget(this.exportItems, 0, groupOutX, groupOutY, true, false).setBackground(GuiTextures.SLOT)); + group.addWidget(new SlotWidget(this.exportItems, 1, groupOutX + 18, groupOutY, true, false).setBackground(GuiTextures.SLOT)); + group.addWidget(new SlotWidget(this.exportItems, 2, groupOutX + 36, groupOutY, true, false).setBackground(GuiTextures.SLOT)); + group.addWidget(new SlotWidget(this.exportItems, 3, groupOutX, groupOutY + 18, true, false).setBackground(GuiTextures.SLOT)); + group.addWidget(new SlotWidget(this.exportItems, 4, groupOutX + 18, groupOutY + 18, true, false).setBackground(GuiTextures.SLOT)); + group.addWidget(new SlotWidget(this.exportItems, 5, groupOutX + 36, groupOutY + 18, true, false).setBackground(GuiTextures.SLOT)); + group.addWidget(new SlotWidget(this.exportItems, 6, groupOutX, groupOutY + 36, true, false).setBackground(GuiTextures.SLOT)); + group.addWidget(new SlotWidget(this.exportItems, 7, groupOutX + 18, groupOutY + 36, true, false).setBackground(GuiTextures.SLOT)); + group.addWidget(new SlotWidget(this.exportItems, 8, groupOutX + 36, groupOutY + 36, true, false).setBackground(GuiTextures.SLOT)); + group.addWidget(new SlotWidget(this.exportItems,9,groupOutX,groupOutY + 54,true,false).setBackground(GuiTextures.SLOT)); + group.addWidget(new SlotWidget(this.exportItems,10,groupOutX + 18,groupOutY + 54,true,false).setBackground(GuiTextures.SLOT)); + group.addWidget(new SlotWidget(this.exportItems,11,groupOutX + 36,groupOutY + 54,true,false).setBackground(GuiTextures.SLOT)); + group.addWidget(new DraggableScrollableWidgetGroup(6, 46, 104, 34).setBackground(GuiTextures.BACKGROUND_INVERSE)); + + + return new ModularUI(176, 164, this, entityPlayer) + .background(GuiTextures.BACKGROUND) + .widget(group) + .widget(text) + .widget(UITemplate.bindPlayerInventory(entityPlayer.getInventory(), GuiTextures.SLOT, 7, 84, true)); + // spotless:on + } + + @Override + public void attachSideTabs(TabsWidget sideTabs) { + var directionalConfigurator = CombinedDirectionalFancyConfigurator.of(self(), self()); + if (directionalConfigurator != null) + sideTabs.attachSubTab(directionalConfigurator); + } + + // TODO: HELP IM SCARED + @Override + protected @NotNull RecipeLogic createRecipeLogic(Object @NotNull... args) { + return new IndustrialApiaryMachine.BeeRecipeLogic(this); + } + + @Override + public boolean shouldWeatherOrTerrainExplosion() { + return false; + } + + public static class BeeRecipeLogic extends RecipeLogic { + + int beeTier; + public int beeProduct; + + public BeeRecipeLogic(IndustrialApiaryMachine machine) { + super(machine); + this.beeTier = machine.getTier(); + } + + // Just doing production Mult now + private final List productionMultipliers = List.of(0.25f, 0.5f, 0.75f, 1f, 1.25f, 2.5f, 4f); + + @Override + public @NotNull Iterator searchRecipe() { + var itemHandlers = machine.getCapabilitiesFlat(IO.IN, ItemRecipeCapability.CAP); + for (var handler : itemHandlers) { + if (!(handler instanceof NotifiableItemStackHandler itemHandler)) continue; + for (var content : itemHandler.getContents()) { + if (!(content instanceof ItemStack stack)) continue; + + // Check if it's a Forestry Handler Item + var optionalCap = stack.getCapability(ForestryCapabilities.INDIVIDUAL_HANDLER_ITEM, + (Direction) null); + if (!optionalCap.isPresent()) continue; + var cap = optionalCap.resolve().get(); + + // Check if it's a bee + var individual = cap.getIndividual(); + if (!(individual instanceof IBee bee)) continue; + var genome = bee.getGenome(); + + // Generate recipe from bee + // TODO: Implement the rest of the logic + // TODO: Do we also want to do stuff with secondary species? reject if not equal? output a mix of + // both? + IBeeSpecies primary = genome.getActiveValue(BeeChromosomes.SPECIES); + IBeeSpecies secondary = genome.getInactiveValue(BeeChromosomes.SPECIES); + + // Forestry Genome Values: + + var lifespan = genome.getActiveAllele(BeeChromosomes.LIFESPAN); + // List.of(LIFESPAN_SHORTEST, LIFESPAN_SHORTER, LIFESPAN_SHORT, LIFESPAN_SHORTENED, LIFESPAN_NORMAL, + // LIFESPAN_ELONGATED, LIFESPAN_LONG, LIFESPAN_LONGER, LIFESPAN_LONGEST, LIFESPAN_IMMORTAL); + + var production = genome.getActiveAllele(BeeChromosomes.SPEED); + // List.of(SPEED_SLOWEST, SPEED_SLOWER, SPEED_SLOW, SPEED_NORMAL, SPEED_FAST, SPEED_FASTER, + // SPEED_FASTEST); + var productionIndex = ForestryAlleles.DEFAULT_SPEEDS.indexOf(production); + var productionMultiplier = productionMultipliers.get(productionIndex); + + // For other forestry genome values, see ForestryAlleles.java + + // Define the builder, add the outputs dynamically + var builder = GTRecipeBuilder + .of(CosmicCore.id("bee_recipe"), CosmicRecipeTypes.BEES) + .EUt(GTValues.VA[GTValues.LV]) + .duration((int) (20 * 480)); + + for (var product : primary.getProducts()) { + builder.chancedOutput( + new ItemStack( + product.item(), + (int) (16 + (productionMultiplier * 8) + (beeTier * 16))), + (int) (product.chance() * ChanceLogic.getMaxChancedValue()), + 0); + } + return Collections.singleton(builder.buildRawRecipe()).iterator(); + } + } + return Collections.emptyIterator(); + } + } + + // TODO: + // Grab Species, Lifespan, Production Speed, Flower(?) + + // By default, all I-Apiary runs are 60 seconds (Regardless of tier, tier will be used elsewhere) + + // Lifespan modifies this duration + /* + * Longest - 3x + * Longer - 2.5 + * Long - 1.5 + * Normal - 1 + * Short - 0.75 + * Shorter - 0.5 + * Shortest - 0.25 + */ + + // Production Speed Modifies the total Comb output (more on that below) + /* + * Fastest - 2x + * Faster - 1.5x + * Fast - 1.25x + * Normal - 1 + * Slow - 0.75 + * Slower - 0.5 + * Slowest - 0.25 + */ + + // To Determine how many combs are rewarded + + // Base Speed (60 seconds) always yields 20 combs + // Lifespan adds a linear multi, 3x Duration = 6x Yield (20 -> 120 combs) + // Production Speed adds a multiplier to the base value (20 * 2.5) + // Machine Tier adds a Flat Bonus to the default ( Extra +10 per tier ) + + // This is a math fiasco Idk how to solve so leaving my best examples on how the logic should work + + // The End result is basically, you stick a queen in an input slot, the queen gets locked to that slot, and the + // machine runs, ideally i don't want to have to make the player 'cycle' the queen once it's in because that just + // feels obnoxious! + + // TODO: Current Issues + // Fix UI text to not crash UI loading - can't reproduce! + // Tweak values (see above todo) - values tweaked + // Decide about second species - Don't do anything with them + // Re-implement IAutoOutputItem - will need help + // No configurable output for the output + // The UI doesn't have that top bar piece of the EIO selector thingy and idk where it is :cri: +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/LinkedMultiblockHelper.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/LinkedMultiblockHelper.java new file mode 100644 index 000000000..b242279f3 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/LinkedMultiblockHelper.java @@ -0,0 +1,387 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.capability.ILinkedMultiblock; +import com.ghostipedia.cosmiccore.api.capability.ILinkedMultiblock.LinkRole; +import com.ghostipedia.cosmiccore.api.data.savedData.LinkedMultiblockSavedData; + +import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.capability.recipe.IRecipeHandler; +import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.GlobalPos; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.ChunkPos; +import net.minecraftforge.common.world.ForgeChunkManager; + +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +public class LinkedMultiblockHelper { + + public static final int MAX_FORCED_CHUNKS_PER_MACHINE = 4; + private static final Map> activeTickets = new HashMap<>(); + + public record RolePair(LinkRole aRole, LinkRole bRole) {} + + @Nullable + public static RolePair negotiateRoles(LinkRole aDeclared, LinkRole bDeclared) { + if (aDeclared == LinkRole.PEER && bDeclared == LinkRole.PEER) { + return new RolePair(LinkRole.PEER, LinkRole.PEER); + } + if (aDeclared == LinkRole.PEER && bDeclared == LinkRole.CONTROLLER) { + return new RolePair(LinkRole.REMOTE, LinkRole.CONTROLLER); + } + if (aDeclared == LinkRole.PEER && bDeclared == LinkRole.REMOTE) { + return new RolePair(LinkRole.CONTROLLER, LinkRole.REMOTE); + } + if (aDeclared == LinkRole.CONTROLLER && bDeclared == LinkRole.PEER) { + return new RolePair(LinkRole.CONTROLLER, LinkRole.REMOTE); + } + if (aDeclared == LinkRole.REMOTE && bDeclared == LinkRole.PEER) { + return new RolePair(LinkRole.REMOTE, LinkRole.CONTROLLER); + } + if (aDeclared == LinkRole.CONTROLLER && bDeclared == LinkRole.REMOTE) { + return new RolePair(LinkRole.CONTROLLER, LinkRole.REMOTE); + } + if (aDeclared == LinkRole.REMOTE && bDeclared == LinkRole.CONTROLLER) { + return new RolePair(LinkRole.REMOTE, LinkRole.CONTROLLER); + } + return null; + } + + @Nullable + public static MetaMachine getMachine(MinecraftServer server, GlobalPos pos) { + ServerLevel level = server.getLevel(pos.dimension()); + if (level == null) return null; + + if (!level.isLoaded(pos.pos())) { + return null; + } + + return MetaMachine.getMachine(level, pos.pos()); + } + + @Nullable + public static ILinkedMultiblock getLinkedMachine(MinecraftServer server, GlobalPos pos) { + MetaMachine machine = getMachine(server, pos); + return machine instanceof ILinkedMultiblock linked ? linked : null; + } + + public static boolean isPartnerOnline(MinecraftServer server, GlobalPos pos) { + return getMachine(server, pos) != null; + } + + public static boolean forceLoadPartnerChunk(MinecraftServer server, GlobalPos requester, GlobalPos target) { + Map existing = activeTickets.getOrDefault(requester, Collections.emptyMap()); + if (existing.containsKey(target)) { + return true; + } + if (existing.size() >= MAX_FORCED_CHUNKS_PER_MACHINE) { + CosmicCore.LOGGER.warn("Machine at {} has reached force-load limit of {}", + requester, MAX_FORCED_CHUNKS_PER_MACHINE); + return false; + } + + ServerLevel level = server.getLevel(target.dimension()); + if (level == null) { + CosmicCore.LOGGER.warn("Cannot force-load chunk: dimension {} does not exist", + target.dimension().location()); + return false; + } + + ChunkPos chunkPos = new ChunkPos(target.pos()); + BlockPos ownerPos = requester.pos(); + boolean success = ForgeChunkManager.forceChunk( + level, + CosmicCore.MOD_ID, + ownerPos, + chunkPos.x, + chunkPos.z, + true, + true); + + if (success) { + activeTickets.computeIfAbsent(requester, k -> new HashMap<>()) + .put(target, ownerPos); + CosmicCore.LOGGER.debug("Force-loaded chunk {} in {} for machine at {} (owner: {})", + chunkPos, target.dimension().location(), requester, ownerPos); + } else { + CosmicCore.LOGGER.warn("Failed to force-load chunk {} in {}", + chunkPos, target.dimension().location()); + } + + return success; + } + + public static void releasePartnerChunk(MinecraftServer server, GlobalPos requester, GlobalPos target) { + Map tickets = activeTickets.get(requester); + if (tickets == null) return; + + BlockPos ownerPos = tickets.remove(target); + if (ownerPos == null) return; + + ServerLevel level = server.getLevel(target.dimension()); + if (level == null) return; + + ChunkPos chunkPos = new ChunkPos(target.pos()); + ForgeChunkManager.forceChunk( + level, + CosmicCore.MOD_ID, + ownerPos, + chunkPos.x, + chunkPos.z, + false, + true); + + CosmicCore.LOGGER.debug("Released chunk {} in {} for machine at {} (owner: {})", + chunkPos, target.dimension().location(), requester, ownerPos); + + if (tickets.isEmpty()) { + activeTickets.remove(requester); + } + } + + public static void releaseAllTickets(MinecraftServer server, GlobalPos requester) { + Map tickets = activeTickets.remove(requester); + if (tickets == null) return; + + int released = 0; + for (Map.Entry entry : tickets.entrySet()) { + GlobalPos target = entry.getKey(); + BlockPos ownerPos = entry.getValue(); + + ServerLevel level = server.getLevel(target.dimension()); + if (level != null) { + ChunkPos chunkPos = new ChunkPos(target.pos()); + ForgeChunkManager.forceChunk( + level, + CosmicCore.MOD_ID, + ownerPos, + chunkPos.x, + chunkPos.z, + false, + true); + released++; + } + } + + CosmicCore.LOGGER.debug("Released {} force-load tickets for machine at {}", + released, requester); + } + + public static int getActiveTicketCount(GlobalPos requester) { + return activeTickets.getOrDefault(requester, Collections.emptyMap()).size(); + } + + public static boolean validateLink(MinecraftServer server, UUID owner, GlobalPos a, GlobalPos b) { + LinkedMultiblockSavedData savedData = LinkedMultiblockSavedData.getOrCreate(server); + if (!savedData.isLinked(owner, a, b)) { + return false; + } + + MetaMachine machineA = getMachine(server, a); + MetaMachine machineB = getMachine(server, b); + + ServerLevel levelA = server.getLevel(a.dimension()); + if (levelA != null && levelA.isLoaded(a.pos()) && machineA == null) { + return false; + } + + ServerLevel levelB = server.getLevel(b.dimension()); + if (levelB != null && levelB.isLoaded(b.pos()) && machineB == null) { + return false; + } + + return true; + } + + public static boolean canQuery(MinecraftServer server, UUID owner, GlobalPos requester, GlobalPos target) { + return LinkedMultiblockSavedData.getOrCreate(server).canQuery(owner, requester, target); + } + + @FunctionalInterface + public interface PartnerQuery { + + T query(WorkableElectricMultiblockMachine partner); + } + + @Nullable + public static T queryPartner( + MinecraftServer server, + UUID owner, + GlobalPos requester, + GlobalPos target, + PartnerQuery query) { + if (!canQuery(server, owner, requester, target)) { + CosmicCore.LOGGER.debug("Query denied: {} cannot query {}", requester, target); + return null; + } + + boolean needsUnload = false; + if (!isPartnerOnline(server, target)) { + if (!forceLoadPartnerChunk(server, requester, target)) { + return null; + } + needsUnload = true; + } + + try { + MetaMachine machine = getMachine(server, target); + if (machine instanceof WorkableElectricMultiblockMachine workable) { + return query.query(workable); + } + return null; + } finally { + if (needsUnload) { + releasePartnerChunk(server, requester, target); + } + } + } + + public static List> getPartnerItemHandlers( + MinecraftServer server, + UUID owner, + GlobalPos requester, + GlobalPos target, + IO io) { + List> result = queryPartner(server, owner, requester, target, + partner -> partner.getCapabilitiesFlat(io, ItemRecipeCapability.CAP)); + return result != null ? result : Collections.emptyList(); + } + + public static List> getPartnerFluidHandlers( + MinecraftServer server, + UUID owner, + GlobalPos requester, + GlobalPos target, + IO io) { + List> result = queryPartner(server, owner, requester, target, + partner -> partner.getCapabilitiesFlat(io, FluidRecipeCapability.CAP)); + return result != null ? result : Collections.emptyList(); + } + + public static List> getPartnerEnergyHandlers( + MinecraftServer server, + UUID owner, + GlobalPos requester, + GlobalPos target, + IO io) { + List> result = queryPartner(server, owner, requester, target, + partner -> partner.getCapabilitiesFlat(io, EURecipeCapability.CAP)); + return result != null ? result : Collections.emptyList(); + } + + public static boolean partnerHasItem( + MinecraftServer server, + UUID owner, + GlobalPos requester, + GlobalPos target, + java.util.function.Predicate itemPredicate) { + Boolean result = queryPartner(server, owner, requester, target, partner -> { + var handlers = partner.getCapabilitiesFlat(IO.IN, ItemRecipeCapability.CAP); + if (handlers == null) return false; + + for (Object handler : handlers) { + if (handler instanceof net.minecraftforge.items.IItemHandler itemHandler) { + for (int i = 0; i < itemHandler.getSlots(); i++) { + if (itemPredicate.test(itemHandler.getStackInSlot(i))) { + return true; + } + } + } + } + return false; + }); + return result != null && result; + } + + public static boolean partnerHasFluid( + MinecraftServer server, + UUID owner, + GlobalPos requester, + GlobalPos target, + java.util.function.Predicate fluidPredicate) { + Boolean result = queryPartner(server, owner, requester, target, partner -> { + var handlers = partner.getCapabilitiesFlat(IO.IN, FluidRecipeCapability.CAP); + if (handlers == null) return false; + + for (Object handler : handlers) { + if (handler instanceof net.minecraftforge.fluids.capability.IFluidHandler fluidHandler) { + for (int i = 0; i < fluidHandler.getTanks(); i++) { + if (fluidPredicate.test(fluidHandler.getFluidInTank(i))) { + return true; + } + } + } + } + return false; + }); + return result != null && result; + } + + public static long getPartnerEnergyStored( + MinecraftServer server, + UUID owner, + GlobalPos requester, + GlobalPos target) { + Long result = queryPartner(server, owner, requester, target, partner -> { + var handlers = partner.getCapabilitiesFlat(IO.IN, EURecipeCapability.CAP); + if (handlers == null) return 0L; + + long total = 0; + for (Object handler : handlers) { + if (handler instanceof com.gregtechceu.gtceu.api.capability.IEnergyContainer energyContainer) { + total += energyContainer.getEnergyStored(); + } + } + return total; + }); + return result != null ? result : 0L; + } + + public static boolean isPartnerFormed( + MinecraftServer server, + UUID owner, + GlobalPos requester, + GlobalPos target) { + Boolean result = queryPartner(server, owner, requester, target, + WorkableElectricMultiblockMachine::isFormed); + return result != null && result; + } + + public static boolean isPartnerWorking( + MinecraftServer server, + UUID owner, + GlobalPos requester, + GlobalPos target) { + Boolean result = queryPartner(server, owner, requester, target, partner -> { + RecipeLogic logic = partner.getRecipeLogic(); + return logic != null && logic.isWorking(); + }); + return result != null && result; + } + + private static final Map DIMENSION_NAMES = Map.of( + "minecraft:overworld", "Overworld", + "minecraft:the_nether", "The Nether", + "minecraft:the_end", "The End", + "ad_astra:earth_orbit", "Earth Orbit", + "ad_astra:moon", "Moon", + "ad_astra:mars", "Mars", + "ad_astra:venus", "Venus", + "ad_astra:mercury", "Mercury", + "ad_astra:glacio", "Glacio"); + + public static String getDimensionName(net.minecraft.resources.ResourceLocation dim) { + return DIMENSION_NAMES.getOrDefault(dim.toString(), dim.getPath().replace("_", " ")); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/ArcaneCrucible.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/ArcaneCrucible.java new file mode 100644 index 000000000..2deec7259 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/ArcaneCrucible.java @@ -0,0 +1,55 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; + +import static com.ghostipedia.cosmiccore.api.machine.part.CosmicPartAbility.IMPORT_EMBER; +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.SOUL_STAINED_STEEL_ALU_CASING; +import static com.gregtechceu.gtceu.api.machine.multiblock.PartAbility.EXPORT_FLUIDS; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GTRecipeModifiers.BATCH_MODE; +import static com.gregtechceu.gtceu.common.data.GTRecipeModifiers.ELECTRIC_OVERCLOCK; + +public class ArcaneCrucible { + + public final static MultiblockMachineDefinition ARCANE_CRUCIBLE = REGISTRATE + .multiblock("arcane_crucible", WorkableElectricMultiblockMachine::new) + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.ARCANE_CRUCIBLE) + .appearanceBlock(SOUL_STAINED_STEEL_ALU_CASING) + .partAppearance((controller, part, side) -> SOUL_STAINED_STEEL_ALU_CASING.getDefaultState()) + .recipeModifiers(ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK), BATCH_MODE) + .pattern(definition -> FactoryBlockPattern.start() + .aisle(" AAA ", " ABA ", " BBB ", " BBB ", " ABA ", " AAA ") + .aisle("AAAAA", "A A", "B B", "B B", "A A", "AAAAA") + .aisle("AAAAA", "B B", "B B", "B B", "B B", "AAAAA") + .aisle("AAAAA", "A A", "B B", "B B", "A A", "AAAAA") + .aisle(" AQA ", " ABA ", " BBB ", " BBB ", " ABA ", " AAA ") + .where(' ', any()) + .where("Q", controller(blocks(definition.getBlock()))) + .where('A', blocks(SOUL_STAINED_STEEL_ALU_CASING.get()) + .or(abilities(PartAbility.IMPORT_ITEMS).setPreviewCount(1)) + .or(abilities(PartAbility.EXPORT_ITEMS).setPreviewCount(1)) + .or(abilities(PartAbility.IMPORT_FLUIDS).setPreviewCount(1)) + .or(abilities(EXPORT_FLUIDS).setPreviewCount(1)) + .or(abilities(IMPORT_EMBER).setPreviewCount(1)) + .or(Predicates.abilities(PartAbility.INPUT_ENERGY).setExactLimit(1))) + .where('B', blocks(CosmicBlocks.STEEL_ROSE_LIGHT.block().get())) + // + .build()) + .workableCasingModel(CosmicCore.id("block/casings/solid/soul_stained_steel_aluminium_plated_casing"), + CosmicCore.id("block/multiblock/dawnforge")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/AtomicReconstructor.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/AtomicReconstructor.java new file mode 100644 index 000000000..1bf8e897d --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/AtomicReconstructor.java @@ -0,0 +1,68 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.client.renderer.machine.CosmicDynamicRenderHelpers; +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTBlocks; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.ETHERSTEEL_PLATED_ASH_TILES; +import static com.ghostipedia.cosmiccore.common.data.datagen.CosmicMachineModels.createSeparateControllerCasingMachineModel; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; + +public class AtomicReconstructor { + + public final static MultiblockMachineDefinition ATOMIC_RECONSTRUCTOR = REGISTRATE + .multiblock("atomic_reconstructor", + WorkableElectricMultiblockMachine::new) + .langValue("§6Radbolt Atomic Reconstructor") + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.RADBOLT_RECONSTRUCTOR) + .appearanceBlock(ETHERSTEEL_PLATED_ASH_TILES) + .partAppearance((controller, part, side) -> ETHERSTEEL_PLATED_ASH_TILES.getDefaultState()) + .recipeModifiers( + GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK_SUBTICK), + GTRecipeModifiers.BATCH_MODE) + // spotless:off + .pattern(definition -> FactoryBlockPattern.start() + .aisle(" AAAAAAA ", " DAAAAAD ", " DA AD ", " DA AD ", " D D ", " D D ", " D D ", " D D ", " D D ", " DA AD ", " DA AD ", " DAAAAAD ", " AAAAAAA ", " ") + .aisle("AAAAA ADAAADA DDD ", "A A ADDDDDA GGG ", "A A A A DDD ", "A A A A GGG ", "A A DDD ", "A A A ", "A A A ", "A A A ", "A A ", "A A A A ", "AAAAA A A ", " ADDDDDA ", " ADAAADA ", " AAAAA ") + .aisle("AAAAA AAAAAAA DDDDD", " BBB ADDDDDA GFFFG", " BBB C DFFFD", " BBB C GFFFG", " BBB C DD DD", " BBBCCCCC A DAD ", " BBBCCCCC DAAAAAD ", " BBBCCCCC A ", " BBB C ", " BBB C ", "AAAAA C ", " ADDDDDA ", " AAAAAAA ", " AAAAA ") + .aisle("AAAAA AAAAAAA DDDDD", " B B ADDDDDA GF FG", " B B C DF FD", " B B C GF FG", " B B C D D", " B BCCCCC DDDD D ", " B BCCCCC FFFFF D ", " B BCCCCC DDDDDDD ", " B B C ", " B B C ", "AAAAA C ", " ADDDDDA ", " AAAAAAA ", " AAAAA ") + .aisle("AAAAA AAAAAAA DDDDD", " BBB ADDDDDA GFFFG", " BBB C DFFFD", " BBB C GFFFG", " BBB C DD DD", " BBBCCCCC A DAD ", " BBBCCCCC DAAAAAD ", " BBBCCCCC A ", " BBB C ", " BBB C ", "AAAAA C ", " ADDDDDA ", " AAAAAAA ", " AAAAA ") + .aisle("AAAAA ADAAADA DDD ", "A A ADDDDDA GGG ", "A A A A DDD ", "A A A A GGG ", "A A DDD ", "A A A ", "A A A ", "A A A ", "A A ", "A A A A ", "AAAAA A A ", " ADDDDDA ", " ADAAADA ", " AAAAA ") + .aisle(" AAAAAAA ", " DAAQAAD ", " DA AD ", " DA AD ", " D D ", " D D ", " D D ", " D D ", " D D ", " DA AD ", " DA AD ", " DAAAAAD ", " AAAAAAA ", " ") + + .where(' ', any()) + .where('Q', controller(blocks(definition.getBlock()))) + .where('A', blocks(CosmicBlocks.SOUL_STAINED_STEEL_ALU_CASING.get())) + .where('B', blocks(ETHERSTEEL_PLATED_ASH_TILES.get()) + .or(autoAbilities(CosmicRecipeTypes.VOID_SALT_FISSION)) + .or(abilities(PartAbility.INPUT_ENERGY).setMaxGlobalLimited(2,2)) + .or(abilities(PartAbility.MAINTENANCE).setExactLimit(1))) + .where('C', blocks(GTBlocks.CASING_STAINLESS_CLEAN.get())) + .where('D', blocks(ETHERSTEEL_PLATED_ASH_TILES.get())) + .where('F', blocks(GTBlocks.COIL_CUPRONICKEL.get())) + .where('G', blocks(GTBlocks.CASING_LAMINATED_GLASS.get())) + .build()) + // spotless:on + .model(createSeparateControllerCasingMachineModel( + CosmicCore.id("block/casings/solid/soul_stained_steel_aluminium_plated_casing"), + CosmicCore.id("block/casings/solid/ethersteel_plated_ash_tiles"), + GTCEu.id("block/multiblock/network_switch")) + .andThen(model -> model + .addDynamicRenderer(CosmicDynamicRenderHelpers::createHellfireFoundryPartRender))) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/CHITIN.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/CHITIN.java new file mode 100644 index 000000000..781efaa2f --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/CHITIN.java @@ -0,0 +1,58 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTBlocks; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GTBlocks.CASING_HSSE_STURDY; + +public class CHITIN { + + public final static MultiblockMachineDefinition CHITIN = REGISTRATE + .multiblock("contained_habitat_for_insectoid_tectonic_integration_and_neutralization", + WorkableElectricMultiblockMachine::new) + .langValue("§bKryosyn Cracking Chamber") + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.LARGE_ROASTER) + .appearanceBlock(CASING_HSSE_STURDY) + .partAppearance((controller, part, side) -> CASING_HSSE_STURDY.getDefaultState()) + .recipeModifiers( + GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK_SUBTICK), + GTRecipeModifiers.BATCH_MODE) + // spotless:off + .pattern(definition -> FactoryBlockPattern.start() + .aisle(" AAAAA ", " ABBBA ", " AAAAA ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " ") + .aisle("ACCCCCA", "ACCCCCA", "ACCCCCA", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ") + .aisle("ACCCCCA", "BCCCCCB", "ACCCCCA", "ACCCCCA", "ACCCCCA", "ACCCCCA", "ACCCCCA", "ACCCCCA", "ACCCCCA", " CCCCC ") + .aisle("ACCCCCA", "BCCCCCB", "ACCCCCA", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ") + .aisle("ACCCCCA", "BCCCCCB", "ACCCCCA", "ACCCCCA", "ACCCCCA", "ACCCCCA", "ACCCCCA", "ACCCCCA", "ACCCCCA", " CCCCC ") + .aisle("ACCCCCA", "ACCCCCA", "ACCCCCA", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ") + .aisle(" AAAAA ", " ABQBA ", " AAAAA ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " ") + .where(' ', any()) + .where('Q', controller(blocks(definition.getBlock()))) + .where('A', blocks(CosmicBlocks.SOUL_STAINED_STEEL_ALU_CASING.get())) + .where('B', blocks(CASING_HSSE_STURDY.get()) + .or(autoAbilities(CosmicRecipeTypes.MANA_DIGITIZER,CosmicRecipeTypes.MANA_FLUIDIZER)) + .or(abilities(PartAbility.INPUT_ENERGY).setExactLimit(1)) + .or(abilities(PartAbility.PARALLEL_HATCH).setExactLimit(1)) + .or(abilities(PartAbility.MAINTENANCE).setExactLimit(1))) + .where('A', blocks(GTBlocks.CASING_ALUMINIUM_FROSTPROOF.get())) + .build()) + // spotless:on + .workableCasingModel(GTCEu.id("block/casings/solid/machine_casing_sturdy_hsse"), + GTCEu.id("block/overlay/machine/calx_reactor")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/ChromaticFlotationPlant.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/ChromaticFlotationPlant.java index aa57ec74b..a2f6a0107 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/ChromaticFlotationPlant.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/ChromaticFlotationPlant.java @@ -32,7 +32,6 @@ public class ChromaticFlotationPlant { .recipeModifiers(ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK), GTRecipeModifiers.PARALLEL_HATCH, GTRecipeModifiers.BATCH_MODE) .appearanceBlock(GCYMBlocks.CASING_WATERTIGHT) - .generator(true) .pattern(definition -> FactoryBlockPattern.start() .aisle("AAAAAAA", "AAAAAAA", "AAAAAAA", "AAAAAAA", "AAAAAAA") .aisle("AAAAAAA", "ABCBCBA", "ABBBBBA", "ABBBBBA", "ABBBBBA") diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/CinderHearth.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/CinderHearth.java new file mode 100644 index 000000000..44a90f4a5 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/CinderHearth.java @@ -0,0 +1,57 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.RegressionPersistentWorkableElectricMachine; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; + +import com.rekindled.embers.RegistryManager; + +import static com.ghostipedia.cosmiccore.api.machine.part.CosmicPartAbility.EXPORT_EMBER; +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; + +public class CinderHearth { + + public final static MultiblockMachineDefinition CINDER_HEARTH = REGISTRATE + .multiblock("cinder_hearth", RegressionPersistentWorkableElectricMachine::new) + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.CINDER_HEARTH) + .appearanceBlock(RegistryManager.CAMINITE_TILES) + .partAppearance((controller, part, side) -> RegistryManager.CAMINITE_TILES.get().defaultBlockState()) + .pattern(definition -> FactoryBlockPattern.start() + .aisle("AAAAAAAAAA", "A A A", "A A A", "A A A", "AAAAAAAAAA", " ", + " ") + .aisle("ADDDAAAAAA", " D DCCCCC ", " D DCCCCC ", " D DCCCCC ", "AD DA A", " D D ", + " DDD ") + .aisle("ADDDAAAAAA", " F CCCCC ", " F CCCC ", " F CCCCC ", "A F A A", " F ", + " DDD ") + .aisle("ADDDAAAAAA", " D DCBBBB ", " D DCCCCC ", " D DCBBBB ", "AD DA A", " D D ", + " DDD ") + .aisle("AAQAA A", "A A A", "A A A", "A A A", "AAAAA A", " ", + " ") + .where(' ', any()) + .where("Q", controller(blocks(definition.getBlock()))) + .where('A', blocks(RegistryManager.ARCHAIC_LARGE_BRICKS.get()) + .or(abilities(PartAbility.IMPORT_ITEMS).setPreviewCount(1)) + .or(abilities(PartAbility.IMPORT_FLUIDS).setPreviewCount(1)) + .or(Predicates.abilities(PartAbility.INPUT_ENERGY).setExactLimit(1))) + .where('B', + abilities(EXPORT_EMBER).setPreviewCount(8).or(blocks(RegistryManager.CAMINITE_TILES.get()))) + .where('C', blocks(RegistryManager.CAMINITE_TILES.get())) + .where('D', blocks(CosmicBlocks.REINFORCED_DAWNSTONE_CASING.get())) + .where('F', blocks(RegistryManager.ARCHAIC_LIGHT.get())) + // + .build()) + .workableCasingModel(CosmicCore.id("block/embers/archaic_large_bricks"), + CosmicCore.id("block/multiblock/dawnforge")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/ComponentAssemblyLine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/ComponentAssemblyLine.java index 8686d5f2d..52a3322b7 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/ComponentAssemblyLine.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/ComponentAssemblyLine.java @@ -30,7 +30,8 @@ public class ComponentAssemblyLine { .appearanceBlock(BICHROMAL_NEVRAMITE_CASING) .partAppearance((controller, part, side) -> BICHROMAL_NEVRAMITE_CASING.getDefaultState()) .recipeModifiers(GTRecipeModifiers.PARALLEL_HATCH, - GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK_SUBTICK)) + GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK_SUBTICK), + GTRecipeModifiers.BATCH_MODE) // spotless:off .pattern(definition -> FactoryBlockPattern.start(RelativeDirection.LEFT,RelativeDirection.UP,RelativeDirection.FRONT) .aisle(" AAAAA IIIIIII AAAAA ", " AAAAA IIIIIII AAAAA ", " AAAAA IIIIIII AAAAA ", " AAAAA IIIIIII AAAAA ", " AAAAA IIIIIII AAAAA ", " A A IIIII A A ", " A A A A ", " A A A A ", " A A A A ", " A AA AA A ", " A AA AA A ", " AAAAAAAA AAAAAAAA ", " AAAAAAAAAAA AAAAAAAAAAA ", " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", " AAAAA AAAAA ", " ", " ", " ") diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/DawnForge.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/DawnForge.java new file mode 100644 index 000000000..a8d2a447a --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/DawnForge.java @@ -0,0 +1,60 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.common.machine.multiblock.steam.WeakSteamParallelMultiBlockMachine; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; + +import static com.ghostipedia.cosmiccore.api.machine.part.CosmicPartAbility.IMPORT_EMBER; +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.LIGHT_DAWNSTONE_CASING; +import static com.gregtechceu.gtceu.api.machine.multiblock.PartAbility.EXPORT_FLUIDS; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.api.pattern.util.RelativeDirection.*; +import static com.gregtechceu.gtceu.common.data.GTRecipeModifiers.ELECTRIC_OVERCLOCK; +import static com.rekindled.embers.RegistryManager.DAWNSTONE_ANVIL; + +public class DawnForge { + + public final static MultiblockMachineDefinition DAWN_FORGE = REGISTRATE + .multiblock("dawn_forge", WeakSteamParallelMultiBlockMachine::new) + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.DAWN_FORGE) + .appearanceBlock(LIGHT_DAWNSTONE_CASING) + .partAppearance((controller, part, side) -> LIGHT_DAWNSTONE_CASING.getDefaultState()) + .recipeModifier(WeakSteamParallelMultiBlockMachine.recipeModifierCanRunAtMost(GTValues.MV)) + .pattern(definition -> FactoryBlockPattern.start() + .aisle("ABBBA", "A A", "AA AA", " BBB ", " ") + .aisle("BAAAB", " ", "A A", "BABAB", " B ") + .aisle("BAAAB", " D ", " ", "BBABB", " BBB ") + .aisle("BAAAB", " ", "A A", "BABAB", " B ") + .aisle("ABQBA", "A A", "AA AA", " BBB ", " ") + .where(' ', any()) + .where("Q", controller(blocks(definition.getBlock()))) + .where('A', blocks(CosmicBlocks.REINFORCED_DAWNSTONE_CASING.get())) + .where('B', blocks(CosmicBlocks.LIGHT_DAWNSTONE_CASING.get()) + .or(abilities(PartAbility.IMPORT_ITEMS)) + .or(abilities(PartAbility.STEAM_IMPORT_ITEMS).setPreviewCount(1)) + .or(abilities(PartAbility.EXPORT_ITEMS)) + .or(abilities(PartAbility.STEAM_EXPORT_ITEMS).setPreviewCount(1)) + .or(abilities(PartAbility.IMPORT_FLUIDS).setPreviewCount(1)) + .or(abilities(EXPORT_FLUIDS).setPreviewCount(1)) + .or(abilities(IMPORT_EMBER).setPreviewCount(1)) + .or(Predicates.abilities(PartAbility.STEAM).setExactLimit(1))) + .where('D', blocks(DAWNSTONE_ANVIL.get())) + // + .build()) + .workableCasingModel(CosmicCore.id("block/casings/solid/light_dawnstone_casing"), + CosmicCore.id("block/multiblock/dawnforge")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/DivingBell.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/DivingBell.java new file mode 100644 index 000000000..00a6988e3 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/DivingBell.java @@ -0,0 +1,46 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.DivingBellMachine; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.common.data.GTRecipeTypes; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.*; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; + +public class DivingBell { + + public final static MultiblockMachineDefinition DIVING_BELL = REGISTRATE + .multiblock("diving_bell", DivingBellMachine::new) + .langValue("Diving Bell") + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(GTRecipeTypes.DUMMY_RECIPES) + .appearanceBlock(REINFORCED_NAQUADRIA_CASING) + // spotless:off + .pattern(definition -> FactoryBlockPattern.start() + // Front row (all vertical layers bottom to top) + .aisle("CCC", "GGG", "GGG", "CCC", "CCC") + // Middle row (all vertical layers bottom to top) + .aisle("CQC", "G G", "G G", "C C", "C C") + // Back row (all vertical layers bottom to top) + .aisle("CCC", "GGG", "GGG", "CCC", "CCC") + .where(' ', any()) + .where('Q', controller(blocks(definition.getBlock()))) + .where('G', blocks(ZBLAN_REINFORCED_GLASS.get())) + .where('C', blocks(REINFORCED_NAQUADRIA_CASING.get()) + .or(abilities(PartAbility.INPUT_ENERGY).setMinGlobalLimited(1).setMaxGlobalLimited(2)) + .or(abilities(PartAbility.MAINTENANCE).setExactLimit(1))) + .build()) + // spotless:on + .workableCasingModel(CosmicCore.id("block/casings/solid/highly_flexible_reinforced_trinavine_casing"), + GTCEu.id("block/multiblock/generator/large_gas_turbine")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/DreamersBasin.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/DreamersBasin.java new file mode 100644 index 000000000..3386cbbfa --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/DreamersBasin.java @@ -0,0 +1,105 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.DreamersBasinMachine; +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; + +import net.minecraft.network.chat.Component; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GTBlocks.CASING_STEEL_SOLID; + +/** + * The Dreamer's Basin - A multithreaded processing machine. + *

+ * This machine can run multiple unique recipes simultaneously using color-coded input buses. + * Each thread requires a uniquely colored input bus/hatch pair. + * Maximum threads is determined by energy hatch amperage (4A = 4 threads, 16A = 16 threads). + * All threads share output buses/hatches. + *

+ * Energy is split evenly among threads - each thread gets 1A worth of the input voltage. + * Recipes can overclock within each thread's energy budget. + */ +public class DreamersBasin { + + // ===== Machine Definition ===== + + public static final MultiblockMachineDefinition DREAMERS_BASIN = REGISTRATE + .multiblock("dreamers_basin", DreamersBasinMachine::new) + .langValue("Dreamer's Basin") + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.MULTITHREADED_PROCESSOR) + // CRITICAL: Disable default overclock modifier - we handle overclocking per-thread + .noRecipeModifier() + .appearanceBlock(CASING_STEEL_SOLID) + .tooltips( + Component.translatable("cosmiccore.machine.dreamers_basin.tooltip.0"), + Component.translatable("cosmiccore.machine.dreamers_basin.tooltip.1"), + Component.translatable("cosmiccore.machine.dreamers_basin.tooltip.2"), + Component.translatable("cosmiccore.machine.dreamers_basin.tooltip.3")) + .pattern(definition -> FactoryBlockPattern.start() + .aisle(" AAA AAA ", " A A ", " A A ", " B ", " B ", + " BBB ", " BBBBBBB ", " BBBBB ", " BBB ", " ", + " ") + .aisle(" ACCA ACCA ", " ", " A B A ", " AB BA ", " B B ", + " BBBBBBB ", " BCCBBBCCB ", " CC CC ", " CC CC ", " C C ", + " ") + .aisle("ACCA ACCA", " C B C ", " C B B C ", " A B A ", " A B A ", + " B A C A B ", " BCBBCCCBBCB ", " CC CC ", " C C ", " C C ", + " C C ") + .aisle("ACA B ACA", " B B ", " B ", " C C ", " C CCC C ", + " B CCC CCC B ", "BCBC CBCB", " CC CC ", " C C ", " C C ", + " ") + .aisle("AA B AA", "A B B A", "AA B AA", " AA AA ", " A A ", + " BAC CAB ", "BCB BCB", "BC CB", " C C ", " ", + " ") + .aisle(" BBB ", " BBBBBBB ", " B C B ", " B B ", " B C C B ", + "BB C C BB", "BBC CBB", "B B", "B B", " ", + " ") + .aisle(" BBBBBBB ", " B BBB B ", " B BBCCCBB B ", "B B B B", "B BC CB B", + "BBC CBB", "BBC CBB", "B B", "B B", " ", + " ") + .aisle(" BBB ", " BBBBBBB ", " B C B ", " B B ", " B C C B ", + "BB C C BB", "BBC CBB", "B B", "B B", " ", + " ") + .aisle("AA B AA", "A B B A", "AA B AA", " AA AA ", " A A ", + " BAC CAB ", "BCB BCB", "BC CB", " C C ", " ", + " ") + .aisle("ACA B ACA", " B B ", " B ", " C C ", " C CCC C ", + " B CCC CCC B ", "BCBC CBCB", " CC CC ", " C C ", " C C ", + " ") + .aisle("ACCA ACCA", " C B C ", " C B B C ", " A B A ", " A B A ", + " B A C A B ", " BCBBCCCBBCB ", " CC CC ", " C C ", " C C ", + " C C ") + .aisle(" ACCA ACCA ", " ", " A B A ", " AB BA ", " B B ", + " BBBBBBB ", " BCCBBBCCB ", " CC CC ", " CC CC ", " C C ", + " ") + .aisle(" AAA AAA ", " A A ", " A A ", " B ", " B ", + " BBB ", " BBBBBBB ", " BBDBB ", " BBB ", " ", + " ") + + .where('D', controller(blocks(definition.getBlock()))) + .where(' ', any()) + .where('A', blocks(CosmicBlocks.SOUL_MUTED_CASING.get())) + .where('B', blocks(CosmicBlocks.SUPERHEAVY_STEEL_CASING.get()).setMinGlobalLimited(200) + .or(autoAbilities(CosmicRecipeTypes.MULTITHREADED_PROCESSOR)) + .or(Predicates.abilities(PartAbility.INPUT_ENERGY).setMinGlobalLimited(1) + .setMaxGlobalLimited(2)) + .or(Predicates.abilities(PartAbility.MAINTENANCE).setExactLimit(1))) + .where('C', blocks(CosmicBlocks.SOMARUST_CASING.get())) + .build()) + .workableCasingModel( + GTCEu.id("block/casings/solid/machine_casing_solid_steel"), + GTCEu.id("block/multiblock/implosion_compressor")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/EclipsedDawnForge.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/EclipsedDawnForge.java new file mode 100644 index 000000000..1646fa348 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/EclipsedDawnForge.java @@ -0,0 +1,71 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.recipe.CosmicRecipeModifiers; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTBlocks; + +import com.rekindled.embers.RegistryManager; + +import static com.ghostipedia.cosmiccore.api.machine.part.CosmicPartAbility.IMPORT_EMBER; +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.ETHERSTEEL_PLATED_ASH_TILES; +import static com.gregtechceu.gtceu.api.machine.multiblock.PartAbility.EXPORT_FLUIDS; +import static com.gregtechceu.gtceu.api.machine.multiblock.PartAbility.IMPORT_FLUIDS; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GTRecipeModifiers.BATCH_MODE; +import static com.gregtechceu.gtceu.common.data.GTRecipeModifiers.ELECTRIC_OVERCLOCK; +import static com.rekindled.embers.RegistryManager.DAWNSTONE_ANVIL; + +public class EclipsedDawnForge { + + public final static MultiblockMachineDefinition ECLIPSED_DAWNFORGE = REGISTRATE + .multiblock("dawnforge_eclipsed", WorkableElectricMultiblockMachine::new) + .langValue("Dawnforge [Eclipsed]") + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.DAWNFORGE_ECLIPSED) + .appearanceBlock(ETHERSTEEL_PLATED_ASH_TILES) + .partAppearance((controller, part, side) -> ETHERSTEEL_PLATED_ASH_TILES.getDefaultState()) + .recipeModifiers(CosmicRecipeModifiers::innateParallel4x, + ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK), BATCH_MODE) + .pattern(definition -> FactoryBlockPattern.start() + // spotless:off + .aisle(" AAAAA ", " AAA ", " ", " ", " ", " ", " AAA ", " ") + .aisle(" AAAAAAA ", " AACCCAA ", " AA AA ", " A A ", " ", " ", " AAAAAAA ", " AAA ") + .aisle("AAAAAAAAA", " ACCCCCA ", " AD DA ", " D D ", " D D ", " D D ", " ADA ADA ", " AAAAA ") + .aisle("AAAAAAAAA", "ACCCCCCCA", " CCC ", " ", " ", " ", "AAA AAA", " AAAEAAA ") + .aisle("AAAAAAAAA", "ACCCCCCCA", " CCC ", " F ", " ", " ", "AA AA", " AAEEEAA ") + .aisle("AAAAAAAAA", "ACCCCCCCA", " CCC ", " ", " ", " ", "AAA AAA", " AAAEAAA ") + .aisle("AAAAAAAAA", " ACCCCCA ", " AD DA ", " D D ", " D D ", " D D ", " ADA ADA ", " AAAAA ") + .aisle(" AAAAAAA ", " AACCCAA ", " AA AA ", " A A ", " ", " ", " AAAAAAA ", " AAA ") + .aisle(" AAAAA ", " AQA ", " ", " ", " ", " ", " AAA ", " ") + // spotless:on + .where(' ', any()) + .where("Q", controller(blocks(definition.getBlock()))) + .where('A', blocks(ETHERSTEEL_PLATED_ASH_TILES.get()) + .or(abilities(PartAbility.IMPORT_ITEMS).setPreviewCount(1)) + .or(abilities(PartAbility.EXPORT_ITEMS).setPreviewCount(1)) + .or(abilities(PartAbility.IMPORT_FLUIDS).setPreviewCount(1)) + .or(abilities(EXPORT_FLUIDS).setPreviewCount(1)) + .or(abilities(IMPORT_EMBER).setPreviewCount(1)) + .or(Predicates.abilities(PartAbility.INPUT_ENERGY).setExactLimit(1))) + .where('C', blocks(RegistryManager.CAMINITE_TILES.get())) + .where('D', blocks(GTBlocks.CASING_PTFE_INERT.get())) + .where('E', blocks(GTBlocks.CASING_LAMINATED_GLASS.get())) + .where('F', blocks(DAWNSTONE_ANVIL.get())) + + .build()) + .workableCasingModel(CosmicCore.id("block/casings/solid/ethersteel_plated_ash_tiles"), + CosmicCore.id("block/multiblock/dawnforge")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/IndustChemVat.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/IndustChemVat.java index 12b073e82..bc1ebd738 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/IndustChemVat.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/IndustChemVat.java @@ -17,6 +17,7 @@ import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; import com.gregtechceu.gtceu.common.data.GTBlocks; import com.gregtechceu.gtceu.common.data.GTMaterials; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; import com.gregtechceu.gtceu.common.data.GTRecipeTypes; import net.minecraft.network.chat.Component; @@ -32,9 +33,9 @@ public class IndustChemVat { .multiblock("industrial_chemical_vat", WorkableElectricMultiblockMachine::new) .rotationState(RotationState.ALL) .recipeTypes(CosmicRecipeTypes.INDUSTRIAL_CHEMVAT, GTRecipeTypes.CRACKING_RECIPES) - .recipeModifiers(CosmicRecipeModifiers::chemicalVatLogic, PARALLEL_HATCH, - ELECTRIC_OVERCLOCK.apply(OverclockingLogic.PERFECT_OVERCLOCK_SUBTICK), - BATCH_MODE) + .recipeModifiers(CosmicRecipeModifiers::chemicalVatLogic, GTRecipeModifiers.PARALLEL_HATCH, + GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK_SUBTICK), + GTRecipeModifiers.BATCH_MODE) .appearanceBlock(CYCLOZINE_CHEMICALLY_REPELLING_CASING) // spotless:off .pattern(definition -> FactoryBlockPattern.start() diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/IndustrialSteamTurbine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/IndustrialSteamTurbine.java new file mode 100644 index 000000000..c0b6b7988 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/IndustrialSteamTurbine.java @@ -0,0 +1,56 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.common.data.recipe.CosmicRecipeModifiers; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; + +import static com.ghostipedia.cosmiccore.api.machine.part.CosmicPartAbility.IMPORT_EMBER; +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.SOUL_STAINED_STEEL_ALU_CASING; +import static com.gregtechceu.gtceu.api.machine.multiblock.PartAbility.EXPORT_FLUIDS; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GTRecipeModifiers.ELECTRIC_OVERCLOCK; + +public class IndustrialSteamTurbine { + + public final static MultiblockMachineDefinition LARGE_EMBER_COMPRESSOR = REGISTRATE + .multiblock("large_ember_boiler", WorkableElectricMultiblockMachine::new) + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.ARCANE_CRUCIBLE) + .appearanceBlock(SOUL_STAINED_STEEL_ALU_CASING) + .partAppearance((controller, part, side) -> SOUL_STAINED_STEEL_ALU_CASING.getDefaultState()) + .recipeModifiers(CosmicRecipeModifiers::innateParallel4x, + ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK)) + .pattern(definition -> FactoryBlockPattern.start() + .aisle(" AAA ", " ABA ", " BBB ", " BBB ", " ABA ", " AAA ") + .aisle("AAAAA", "A A", "B B", "B B", "A A", "AAAAA") + .aisle("AAAAA", "B B", "B B", "B B", "B B", "AAAAA") + .aisle("AAAAA", "A A", "B B", "B B", "A A", "AAAAA") + .aisle(" AQA ", " ABA ", " BBB ", " BBB ", " ABA ", " AAA ") + .where(' ', any()) + .where("Q", controller(blocks(definition.getBlock()))) + .where('A', blocks(SOUL_STAINED_STEEL_ALU_CASING.get()) + .or(abilities(PartAbility.IMPORT_ITEMS).setPreviewCount(1)) + .or(abilities(PartAbility.EXPORT_ITEMS).setPreviewCount(1)) + .or(abilities(PartAbility.IMPORT_FLUIDS).setPreviewCount(1)) + .or(abilities(EXPORT_FLUIDS).setPreviewCount(1)) + .or(abilities(IMPORT_EMBER).setPreviewCount(1)) + .or(Predicates.abilities(PartAbility.INPUT_ENERGY).setExactLimit(1))) + .where('B', blocks(CosmicBlocks.STEEL_ROSE_LIGHT.block().get())) + // + .build()) + .workableCasingModel(CosmicCore.id("block/casings/solid/soul_stained_steel_aluminium_plated_casing"), + CosmicCore.id("block/multiblock/dawnforge")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/KryosynCrackingChamber.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/KryosynCrackingChamber.java new file mode 100644 index 000000000..b1584d1c4 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/KryosynCrackingChamber.java @@ -0,0 +1,58 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTBlocks; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GTBlocks.CASING_HSSE_STURDY; + +public class KryosynCrackingChamber { + + public final static MultiblockMachineDefinition KRYOSYN_CRACKING_CHAMBER = REGISTRATE + .multiblock("kryosyn_cracking_chamber", + WorkableElectricMultiblockMachine::new) + .langValue("§bKryosyn Cracking Chamber") + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.LARGE_ROASTER) + .appearanceBlock(CASING_HSSE_STURDY) + .partAppearance((controller, part, side) -> CASING_HSSE_STURDY.getDefaultState()) + .recipeModifiers( + GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK_SUBTICK), + GTRecipeModifiers.BATCH_MODE) + // spotless:off + .pattern(definition -> FactoryBlockPattern.start() + .aisle(" AAAAA ", " ABBBA ", " AAAAA ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " ") + .aisle("ACCCCCA", "ACCCCCA", "ACCCCCA", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ") + .aisle("ACCCCCA", "BCCCCCB", "ACCCCCA", "ACCCCCA", "ACCCCCA", "ACCCCCA", "ACCCCCA", "ACCCCCA", "ACCCCCA", " CCCCC ") + .aisle("ACCCCCA", "BCCCCCB", "ACCCCCA", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ") + .aisle("ACCCCCA", "BCCCCCB", "ACCCCCA", "ACCCCCA", "ACCCCCA", "ACCCCCA", "ACCCCCA", "ACCCCCA", "ACCCCCA", " CCCCC ") + .aisle("ACCCCCA", "ACCCCCA", "ACCCCCA", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ") + .aisle(" AAAAA ", " ABQBA ", " AAAAA ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " ") + .where(' ', any()) + .where('Q', controller(blocks(definition.getBlock()))) + .where('A', blocks(CosmicBlocks.SOUL_STAINED_STEEL_ALU_CASING.get())) + .where('B', blocks(CASING_HSSE_STURDY.get()) + .or(autoAbilities(CosmicRecipeTypes.MANA_DIGITIZER,CosmicRecipeTypes.MANA_FLUIDIZER)) + .or(abilities(PartAbility.INPUT_ENERGY).setExactLimit(1)) + .or(abilities(PartAbility.PARALLEL_HATCH).setExactLimit(1)) + .or(abilities(PartAbility.MAINTENANCE).setExactLimit(1))) + .where('A', blocks(GTBlocks.CASING_ALUMINIUM_FROSTPROOF.get())) + .build()) + // spotless:on + .workableCasingModel(GTCEu.id("block/casings/solid/machine_casing_sturdy_hsse"), + GTCEu.id("block/overlay/machine/calx_reactor")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/LARVA.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/LARVA.java new file mode 100644 index 000000000..2522f0589 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/LARVA.java @@ -0,0 +1,302 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.LarvaMachine; + +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; +import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; +import com.gregtechceu.gtceu.common.data.*; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.HIGHLY_FLEXIBLE_REINFORCED_TRINAVINE_CASING; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.TRITANIUM_LINED_HEAVY_NEUTRONIUM_CASING; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GTMachines.ITEM_IMPORT_BUS; + +public class LARVA { + + public final static MultiblockMachineDefinition LARVA = REGISTRATE + .multiblock("larva", LarvaMachine::new) + .langValue("Logistic Asteroid Reclamation and Valuing Assembly [LARVA]") + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(GTRecipeTypes.DUMMY_RECIPES) + .recipeModifier(RecipeModifier.NO_MODIFIER) + .appearanceBlock(TRITANIUM_LINED_HEAVY_NEUTRONIUM_CASING) + .partAppearance((controller, part, side) -> TRITANIUM_LINED_HEAVY_NEUTRONIUM_CASING.getDefaultState()) + .pattern(definition -> FactoryBlockPattern.start() + // spotless: off + .aisle(" ", + " ", + " AAAAA AAAAA AAAAA ", + " BBBBB BBBBB BBBBB ", + " AAAAA AAAAA AAAAA ", + " ", + " ") + .aisle(" ", + " ", + " CA AC CA AC CA AC ", + " BB D BB BB D BB BB D BB ", + " CA AC CA AC CA AC ", + " ", + " ") + .aisle(" ", + " ", + " CC CC CC CC CC CC ", + " BB D BB BB D BB BB D BB ", + " CC CC CC CC CC CC ", + " ", + " ") + .aisle(" ", + " AAA AAA AAA ", + " AA BBB AA AA BBB AA AA BBB AA ", + " BB CCC BB BB CCC BB BB CCC BB ", + " AA BBB AA AA BBB AA AA BBB AA ", + " AAA AAA AAA ", + " ") + .aisle(" ", + " AAAAA AAAAA AAAAA ", + " A B B A A B B A A B B A ", + " B C C B B C C B B C C B ", + " A B B A A B B A A B B A ", + " AAEAA AAEAA AAEAA ", + " ") + .aisle(" ", + " AAAAA AAAAA AAAAA ", + " A B B A A B B A A B B A ", + " BDDC CDDB BDDC CDDB BDDC CDDB ", + " A B B A A B B A A B B A ", + " AEFEA AEFEA AEFEA ", + " ") + .aisle(" ", + " AAAAA AAAAA AAAAA ", + " A B B A A B B A A B B A ", + " B C C B B C C B B C C B ", + " A B B A A B B A A B B A ", + " AAEAA AAEAA AAEAA ", + " ") + .aisle(" ", + " AAA AAA AAA ", + " AA BBB AA AA BBB AA AA BBB AA ", + " AAAA BB CCC BB BB CCC BB BB CCC BB AAAA ", + " AA BBB AA AA BBB AA AA BBB AA ", + " AAA AAA AAA ", + " ") + .aisle(" ", + " ", + " CCC CC CC CC CC CC CC CCC ", + " AAAAAAAA BB D BB BB D BB BB D BB AAAAAAAA ", + " CCCC CC CC CC CC CC CC CCCC ", + " ", + " ") + .aisle(" ", + " ", + " CC CCCC CA AC CA AC CA AC CCCC CC ", + " AAA AAAAAA BB D BB BB D BB BB D BB AAAAAA AAA ", + " CC CCCC CA AC CA AC CA AC CCCC CC ", + " ", + " ") + .aisle(" ", + " ", + " C CCC AAAAA AAAAA AAAAA CCC C ", + " AA AAAA BBBBB BBBBB BBBBB AAAA AA ", + " C CCC AAAAA AAAAA AAAAA CCC C ", + " ", + " ") + .aisle(" ", + " ", + " C CC ABA CCCCCCABACCCCCC ABA CC C ", + "AA AAA BAB CCCCCCBABCCCCCC BAB AAA AA", + " C CC ABA CCCCCCABACCCCCC ABA CC C ", + " ", + " ") + .aisle(" ", + " ", + " C CC BDB CCCCCCCBDBCCCCCCC BDB CC C ", + "AA AAA D D CCCCCCCD DCCCCCCC D D AAA AA", + " C CC BDB CCCCCCCBDBCCCCCCC BDB CC C ", + " ", + " ") + .aisle(" ", + " ", + "C CC BDB CCCCCCCCBDBCCCCCCCC BDB CC C", + "A AA D D CCCCCCCCD DCCCCCCCC D D AA A", + " CC BDB CCCFFFCCBDBCCFFFCCC BDB CC ", + " ", + " ") + .aisle(" ", + " ", + " C BDB CCCCCCCCCBDBCCCCCCCCC BDB C ", + " A D D CCCCCCCCCD DCCCCCCCCC D D A ", + " C BDB CCFFFCCCCBDBCCCCFFFCC BDB C ", + " FFFFF ", + " ") + .aisle(" CCCCC CCCCC CCCCC ", + " CDAAADC CDAAADC CDAAADC ", + " CDAA AADCCCCCCCDAA AADCCCCCCCDAA AADC ", + " CAA AACCCCCCCAA AACCCCCCCAA AAC ", + " CDAA AADCCCCCCCDAA AADCCCCCCCDAA AADC ", + " CDAAADC CDAAADC CDAAADC ", + " CCCCC CFFFC CCCCC ") + .aisle(" ADADA ADADA ADADA ", + " A A A A A A ", + " A AAAAAAAA AAAAAAAA A ", + " DA AAAAAAAA AAAAAAAA AD ", + " A AAAAAAAA AAAAAAAA A ", + " A A A A A A ", + " ADFDA ADFDA ADFDA ") + .aisle(" ADADA ADADA ADADA ", + " A A A A A A ", + " A AAAAAAAA AAAAAAAA A ", + " DA AAAAAAAA AAAAAAAA AD ", + " A AFFFFFAA AAFFFFFA A ", + " A A A A A A ", + " ADFDA ADQDA ADFDA ") + .aisle(" ADADA ADADA ADADA ", + " A A A A A A ", + " A AAAAAAAA AAAAAAAA A ", + " DA AAAAAAAA AAAAAAAA AD ", + " A AAAAAAAA AAAAAAAA A ", + " A A A A A A ", + " ADFDA ADFDA ADFDA ") + .aisle(" CCCCC CCCCC CCCCC ", + " CDAAADC CDAAADC CDAAADC ", + " CDABABADCCCCCCCDABABADCCCCCCCDABABADC ", + " CAAAAAAACCCCCCCAAAAAAACCCCCCCAAAAAAAC ", + " CDABABADCCCCCCCDABABADCCCCCCCDABABADC ", + " CDAAADC CDAAADC CDAAADC ", + " CCCCC CFFFC CCCCC ") + .aisle(" ", + " ", + " C BDB CCCCCCCCCBDBCCCCCCCCC BDB C ", + " AAADCD CCCCCCCCCDCDCCCCCCCCC DCDAAA ", + " C BDB CCFFFCCCCBDBCCCCFFFCC BDB C ", + " FFFFF ", + " ") + .aisle(" ", + " ", + "C CC BDB CCCCCCCCBDBCCCCCCCC BDB CC C", + "A AAA DCD CCCCCCCCDCDCCCCCCCC DCD AAA A", + " CC BDB CCCFFFCCBDBCCFFFCCC BDB CC ", + " ", + " ") + .aisle(" ", + " ", + " C CC BDB CCCCCCCBDBCCCCCCC BDB CC C ", + "AA AAA DCD CCCCCCCDCDCCCCCCC DCD AAA AA", + " C CC BDB CCCCCCCBDBCCCCCCC BDB CC C ", + " ", + " ") + .aisle(" ", + " ", + " C CC ABA CCCCCCABACCCCCC ABA CC C ", + "AA AAA BCB CCCCCCBCBCCCCCC BCB AAA AA", + " C CC ABA CCCCCCABACCCCCC ABA CC C ", + " ", + " ") + .aisle(" ", + " ", + " C CCC AAAAA AAAAA AAAAA CCC C ", + " AA AAAA BBCBB BBCBB BBCBB AAAA AA ", + " C CCC AAAAA AAAAA AAAAA CCC C ", + " ", + " ") + .aisle(" ", + " ", + " CC CCCC CA AC CA AC CA AC CCCC CC ", + " AAA AAAAAA BB D BB BB D BB BB D BB AAAAAA AAA ", + " CC CCCC CA AC CA AC CA AC CCCC CC ", + " ", + " ") + .aisle(" ", + " ", + " CCC CC CC CC CC CC CC CCC ", + " AAAAAAAA BB D BB BB D BB BB D BB AAAAAAAA ", + " CCCC CC CC CC CC CC CC CCCC ", + " ", + " ") + .aisle(" ", + " AAA AAA AAA ", + " AA BBB AA AA BBB AA AA BBB AA ", + " AAAA BB CCC BB BB CCC BB BB CCC BB AAAA ", + " AA BBB AA AA BBB AA AA BBB AA ", + " AAA AAA AAA ", + " ") + .aisle(" ", + " AAAAA AAAAA AAAAA ", + " A B B A A B B A A B B A ", + " B C C B B C C B B C C B ", + " A B B A A B B A A B B A ", + " AAEAA AAEAA AAEAA ", + " ") + .aisle(" ", + " AAAAA AAAAA AAAAA ", + " A B B A A B B A A B B A ", + " BDDC CDDB BDDC CDDB BDDC CDDB ", + " A B B A A B B A A B B A ", + " AEFEA AEFEA AEFEA ", + " ") + .aisle(" ", + " AAAAA AAAAA AAAAA ", + " A B B A A B B A A B B A ", + " B C C B B C C B B C C B ", + " A B B A A B B A A B B A ", + " AAEAA AAEAA AAEAA ", + " ") + .aisle(" ", + " AAA AAA AAA ", + " AA BBB AA AA BBB AA AA BBB AA ", + " BB CCC BB BB CCC BB BB CCC BB ", + " AA BBB AA AA BBB AA AA BBB AA ", + " AAA AAA AAA ", + " ") + .aisle(" ", + " ", + " CC CC CC CC CC CC ", + " BB D BB BB D BB BB D BB ", + " CC CC CC CC CC CC ", + " ", + " ") + .aisle(" ", + " ", + " CA AC CA AC CA AC ", + " BB D BB BB D BB BB D BB ", + " CA AC CA AC CA AC ", + " ", + " ") + .aisle(" ", + " ", + " AAAAA AAAAA AAAAA ", + " BBBBB BBBBB BBBBB ", + " AAAAA AAAAA AAAAA ", + " ", + " ") + // spotless: on + .where(' ', any()) + .where("Q", controller(blocks(definition.getBlock()))) + .where('C', blocks(CosmicBlocks.HIGH_TOLERANCE_RHENIUM_CASING.get())) + .where('A', blocks(CosmicBlocks.HIGHLY_FLEXIBLE_REINFORCED_TRINAVINE_CASING.get())) + .where('F', blocks(TRITANIUM_LINED_HEAVY_NEUTRONIUM_CASING.get()) + .or(Predicates.abilities(PartAbility.IMPORT_ITEMS).setMaxGlobalLimited(4)) + .or(Predicates.abilities(PartAbility.EXPORT_ITEMS).setMaxGlobalLimited(1)) + .or(Predicates.abilities(PartAbility.INPUT_ENERGY).setMinGlobalLimited(1) + .setMaxGlobalLimited(2)) + .or(Predicates.abilities(PartAbility.IMPORT_FLUIDS).setMinGlobalLimited(1, 1) + .setMaxGlobalLimited(3, 3))) + .where('E', + blocks(TRITANIUM_LINED_HEAVY_NEUTRONIUM_CASING.get()) + .or(blocks(ITEM_IMPORT_BUS[1].getBlock()))) + .where('D', blocks(GCYMBlocks.CASING_HIGH_TEMPERATURE_SMELTING.get())) + .where('B', blocks(CosmicBlocks.NAQUADAH_PRESSURE_RESISTANT_CASING.get())) + .build()) + .workableCasingModel(CosmicCore.id("block/casings/solid/highly_flexible_reinforced_trinavine_casing"), + CosmicCore.id("block/multiblock/mantle_bore")) + .hasBER(true) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/Laminator.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/Laminator.java index d1ce1a822..87b506ff5 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/Laminator.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/Laminator.java @@ -32,7 +32,8 @@ public class Laminator { .appearanceBlock(CYCLOZINE_CHEMICALLY_REPELLING_CASING) .partAppearance((controller, part, side) -> CYCLOZINE_CHEMICALLY_REPELLING_CASING.getDefaultState()) .recipeModifiers(GTRecipeModifiers.PARALLEL_HATCH, - GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK_SUBTICK)) + GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK_SUBTICK), + GTRecipeModifiers.BATCH_MODE) // spotless:off .pattern(definition -> FactoryBlockPattern.start(RelativeDirection.LEFT,RelativeDirection.UP,RelativeDirection.FRONT) .aisle(" AA AA ", " ", " ", " ", " ", " ", " ", " ", " AA AA ") diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/LargeSpoolingMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/LargeSpoolingMachine.java index 54a39a24b..1ebd6bb9d 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/LargeSpoolingMachine.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/LargeSpoolingMachine.java @@ -31,7 +31,7 @@ public class LargeSpoolingMachine { .rotationState(RotationState.NON_Y_AXIS) .recipeType(CosmicRecipeTypes.SPOOLING_MACHINE) .recipeModifiers(GTRecipeModifiers.PARALLEL_HATCH, - ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK)) + ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK), GTRecipeModifiers.BATCH_MODE) .appearanceBlock(WEAR_RESISTANT_RURIDIT_CASING) .pattern(definition -> FactoryBlockPattern.start() .aisle(" AAAA", " F", " DDDF", " F", " F", " F", " F", " AAAA", " ") diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/LinkTestStation.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/LinkTestStation.java new file mode 100644 index 000000000..5b94e1908 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/LinkTestStation.java @@ -0,0 +1,54 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.LinkTestStationMachine; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.common.data.GTBlocks; + +import net.minecraft.network.chat.Component; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.models.GTMachineModels.createWorkableCasingMachineModel; + +/** + * Simple test multiblock for verifying cross-dimensional linking. + * Minimal 3x3x3 structure using steel casings. + */ +public class LinkTestStation { + + public final static MultiblockMachineDefinition LINK_TEST_STATION = REGISTRATE + .multiblock("link_test_station", LinkTestStationMachine::new) + .langValue("Link Test Station") + .tooltips( + Component.literal("Test multiblock for cross-dimensional linking"), + Component.literal("Use datastick: Shift+click to copy, click to link"), + Component.literal("Some recipes require linked partners")) + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.LINK_TEST_RECIPES) + .appearanceBlock(GTBlocks.CASING_STEEL_SOLID) + .pattern(definition -> FactoryBlockPattern.start() + .aisle("CCC", "CCC", "CCC") + .aisle("CCC", "C C", "CCC") + .aisle("CCC", "CQC", "CCC") + .where(' ', any()) + .where('Q', controller(blocks(definition.getBlock()))) + .where('C', blocks(GTBlocks.CASING_STEEL_SOLID.get()) + .or(abilities(PartAbility.INPUT_ENERGY).setMinGlobalLimited(1).setMaxGlobalLimited(1)) + .or(abilities(PartAbility.MAINTENANCE).setExactLimit(1)) + .or(abilities(PartAbility.IMPORT_ITEMS).setMaxGlobalLimited(1)) + .or(abilities(PartAbility.EXPORT_ITEMS).setMaxGlobalLimited(1))) + .build()) + .model( + createWorkableCasingMachineModel( + GTCEu.id("block/casings/solid/machine_casing_solid_steel"), + GTCEu.id("block/multiblock/implosion_compressor"))) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/ManaEtchingFactory.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/ManaEtchingFactory.java new file mode 100644 index 000000000..b6c547208 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/ManaEtchingFactory.java @@ -0,0 +1,57 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTBlocks; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; + +import static com.ghostipedia.cosmiccore.api.machine.part.CosmicPartAbility.IMPORT_EMBER; +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.LIVING_ROCK_TILES; +import static com.gregtechceu.gtceu.api.machine.multiblock.PartAbility.EXPORT_FLUIDS; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GTRecipeModifiers.ELECTRIC_OVERCLOCK; + +public class ManaEtchingFactory { + + public final static MultiblockMachineDefinition MANA_ETCHING_FACTORY = REGISTRATE + .multiblock("mana_etching_factory", WorkableElectricMultiblockMachine::new) + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.MANA_ETCHING_FACTORY) + .appearanceBlock(LIVING_ROCK_TILES) + .partAppearance((controller, part, side) -> LIVING_ROCK_TILES.getDefaultState()) + .recipeModifiers(GTRecipeModifiers.PARALLEL_HATCH, + ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK), GTRecipeModifiers.BATCH_MODE) + .pattern(definition -> FactoryBlockPattern.start() + .aisle(" AAAAA ", " CCCCC ", " CCCCC ", " DDDDD ") + .aisle("AADDDAA", "D D", "D D", "DDDDDDD") + .aisle("AADDDAA", "A A", "A A", "AADADAA") + .aisle("AADDDAA", "D D", "D D", "DDDDDDD") + .aisle(" AAQAA ", " CCCCC ", " CCCCC ", " DDDDD ") + .where(' ', any()) + .where("Q", controller(blocks(definition.getBlock()))) + .where('A', blocks(LIVING_ROCK_TILES.get()) + .or(abilities(PartAbility.IMPORT_ITEMS).setPreviewCount(1)) + .or(abilities(PartAbility.EXPORT_ITEMS).setPreviewCount(1)) + .or(abilities(PartAbility.IMPORT_FLUIDS).setPreviewCount(1)) + .or(abilities(EXPORT_FLUIDS).setPreviewCount(1)) + .or(abilities(IMPORT_EMBER).setPreviewCount(1)) + .or(Predicates.abilities(PartAbility.INPUT_ENERGY).setExactLimit(1))) + .where('C', blocks(GTBlocks.CASING_TEMPERED_GLASS.get())) + .where('D', blocks(CosmicBlocks.SOUL_STAINED_STEEL_ALU_CASING.get())) + .build()) + .workableCasingModel(CosmicCore.id("block/casings/solid/livingrock_tiles"), + CosmicCore.id("block/multiblock/dawnforge")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/MantleBore.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/MantleBore.java index 03ad1c591..66e8ebdbc 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/MantleBore.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/MantleBore.java @@ -3,32 +3,30 @@ import com.ghostipedia.cosmiccore.CosmicCore; import com.ghostipedia.cosmiccore.client.renderer.machine.CosmicDynamicRenderHelpers; import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; -import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.LarvaMachine; -import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.data.RotationState; import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; -import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; import com.gregtechceu.gtceu.api.pattern.Predicates; -import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; import com.gregtechceu.gtceu.common.data.GTBlocks; +import com.gregtechceu.gtceu.common.data.GTRecipeTypes; import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; import static com.gregtechceu.gtceu.api.pattern.Predicates.*; import static com.gregtechceu.gtceu.api.pattern.util.RelativeDirection.*; import static com.gregtechceu.gtceu.common.data.GTBlocks.*; -import static com.gregtechceu.gtceu.common.data.GTRecipeModifiers.ELECTRIC_OVERCLOCK; import static com.gregtechceu.gtceu.common.data.models.GTMachineModels.createWorkableCasingMachineModel; public class MantleBore { public final static MultiblockMachineDefinition MANTLE_BORE = REGISTRATE - .multiblock("mantle_bore", WorkableElectricMultiblockMachine::new) + .multiblock("mantle_bore", LarvaMachine::new) .rotationState(RotationState.NON_Y_AXIS) - .recipeType(CosmicRecipeTypes.CHROMATIC_DISTILLATION_PLANT) - .recipeModifier(ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK)) + .recipeType(GTRecipeTypes.ELECTROLYZER_RECIPES) + .recipeModifier(RecipeModifier.NO_MODIFIER) .appearanceBlock(GTBlocks.STEEL_HULL) .pattern(definition -> FactoryBlockPattern.start(RIGHT, BACK, UP) .aisle(" A A ", "A A", " ", " D ", " ", "A A", " A A ") @@ -40,14 +38,16 @@ public class MantleBore { .where('A', blocks(STEEL_HULL.get())) .where('D', blocks(STEEL_HULL.get())) .where('B', blocks(CASING_STEEL_SOLID.get()) + .or(Predicates.abilities(PartAbility.IMPORT_ITEMS).setMaxGlobalLimited(4)) .or(Predicates.abilities(PartAbility.EXPORT_ITEMS).setMaxGlobalLimited(1)) .or(Predicates.abilities(PartAbility.INPUT_ENERGY).setMinGlobalLimited(1) .setMaxGlobalLimited(2)) - .or(Predicates.abilities(PartAbility.IMPORT_FLUIDS).setExactLimit(1))) + .or(Predicates.abilities(PartAbility.IMPORT_FLUIDS).setExactLimit(1)) + .or(Predicates.abilities(PartAbility.EXPORT_FLUIDS).setExactLimit(1))) .build()) .model(createWorkableCasingMachineModel( CosmicCore.id("block/casings/solid/vomahine_certified_chemically_resistant_casing"), - GTCEu.id("block/multiblock/fusion_reactor")) + CosmicCore.id("block/multiblock/mantle_bore")) .andThen(model -> model.addDynamicRenderer(CosmicDynamicRenderHelpers::getRenderTesterHelper))) .hasBER(true) .register(); diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/MegaProductionAlveary.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/MegaProductionAlveary.java new file mode 100644 index 000000000..be4e506cd --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/MegaProductionAlveary.java @@ -0,0 +1,69 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.MegaAlvearyMultiblockMachine; +import com.ghostipedia.cosmiccore.api.machine.part.CosmicPartAbility; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; +import com.gregtechceu.gtceu.common.data.GTMaterials; +import com.gregtechceu.gtceu.common.data.GTRecipeTypes; + +import net.minecraft.world.level.block.Blocks; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.*; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GTBlocks.*; + +public class MegaProductionAlveary { + + public final static MultiblockMachineDefinition MEGA_PRODUCTION_ALVEARY = REGISTRATE + .multiblock("honey_alveary", + MegaAlvearyMultiblockMachine::new) + .langValue("§eHyper Optimized Nectar Extraction Yard [HONEY]") + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(GTRecipeTypes.DUMMY_RECIPES) // IDK HOW WE GET RID OF THIS? I THOUGHT WE COULD! + .appearanceBlock(CASING_STEEL_SOLID) + .partAppearance((controller, part, side) -> CASING_STEEL_SOLID.getDefaultState()) + .recipeModifiers() // No modifiers, forcefully remove default list + // spotless:off + .pattern(definition -> FactoryBlockPattern.start(RelativeDirection.LEFT,RelativeDirection.UP,RelativeDirection.FRONT) + .aisle(" AAAAA ", " AAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAAAAAAAA ", " AAAAAAAAA ", " AAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAAAAAAAAAA ", " AAAAAAAAAAA ", " AAAAAAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle("AAAAAAA AAAAAAAAAAA ", "AAAAAAA AAAAAAAAAAA ", " B B AAAAAAAAA ", " B B ", " B B ", " B B ", " B B ", "BBBBBBB ", " B B ", " B B ", " B B ", " B B ", " B B ", "BBBBBBB ", " B B ", " B B ", " ", " ", " ") + .aisle("ACCCCCAAAAAAAAAAAAAA", "ACCCCCAAAAAAAAAAAAAA", " CCCCC AAAAAAAAAAA ", " CCCCC ", " CCCCC DDDDDDD ", " CCCCC DEEEEED ", " CCCCC DDDDDDD ", "BCCCCCB B B ", " CCCCC DDDDDDD ", " CCCCC DEEEEED ", " CCCCC DDDDDDD ", " CCCCC B B ", " CCCCC DDDDDDD ", "BCCCCCB DEEEEED ", " CCCCC DDDDDDD ", " CCCCC B B ", " DDDDDDD ", " DEEEEED ", " DDDDDDD ") + .aisle("ACCCCCAAAAAAAAAAAAAA", "ACCCCCAAAAAAAAAAAAAA", " CCCCC AAAAAAAAAAA ", " CCCCC B B ", " CCCCC BDDDDDDDB ", " CCCCC BEFFFFFEB ", " CCCCC BDDDDDDDB ", "BCCCCCBBBBBBBBBBBB ", " CCCCC BDDDDDDDB ", " CCCCC BEFFFFFEB ", " CCCCC BDDDDDDDB ", " CCCCC BBBBBBBBB ", " CCCCC BDDDDDDDB ", "BCCCCCBBBBEFFFFFEB ", " CCCCC BDDDDDDDB ", " CCCCC BBBBBBBBB ", " BDDDDDDDB ", " BEFFFFFEB ", " BDDDDDDDB ") + .aisle("ACCCCCAAAAAAAAAAAAAA", "ACCCCCAAAAAAAAAAAAAA", " CCCCC AAAAAAAAAAA ", " CCCCC ", " CCCCC DDDDDDD ", " CCCCC EFFFFFE ", " CCCCC DDDDDDD ", "BCCCCCB B B ", " CCCCC DDDDDDD ", " CCCCC EFFFFFE ", " CCCCC DDDDDDD ", " CCCCC B B ", " CCCCC DDDDDDD ", "BCCCCCB EFFFFFE ", " CCCCC DDDDDDD ", " CCCCC B B ", " DDDDDDD ", " EFFFFFE ", " DDDDDDD ") + .aisle("ACCCCCAAAAAAAAAAAAAA", "ACCCCCAAAAAAAAAAAAAA", " CCCCC AAAAAAAAAAA ", " CCCCC B B ", " CCCCC BDDDDDDDB ", " CCCCC BEFFFFFEB ", " CCCCC BDDDDDDDB ", "BCCCCCBBBBBBBBBBBB ", " CCCCC BDDDDDDDB ", " CCCCC BEFFFFFEB ", " CCCCC BDDDDDDDB ", " CCCCC BBBBBBBBB ", " CCCCC BDDDDDDDB ", "BCCCCCBBBBEFFFFFEB ", " CCCCC BDDDDDDDB ", " CCCCC BBBBBBBBB ", " BDDDDDDDB ", " BEFFFFFEB ", " BDDDDDDDB ") + .aisle("ACCCCCAAAAAAAAAAAAAA", "ACCCCCAAAAAAAAAAAAAA", " CCCCC AAAAAAAAAAA ", " CCCCC ", " CCCCC DDDDDDD ", " CCCCC DGGEGGD ", " CCCCC DDDDDDD ", "BCCCCCB B B ", " CCCCC DDDDDDD ", " CCCCC DGGEGGD ", " CCCCC DDDDDDD ", " CCCCC B B ", " CCCCC DDDDDDD ", "BCCCCCB DGGEGGD ", " CCCCC DDDDDDD ", " CCCCC B B ", " DDDDDDD ", " DGGEGGD ", " DDDDDDD ") + .aisle("AAAAAAAAAAAAAAAAAAA ", "AAAAAAAAAAAAAAAAAAA ", " B B AAAAAAAAA ", " B B ", " B B ", " B B ", " B B ", "BBBBBBB ", " B B ", " B B ", " B B ", " B B ", " B B ", "BBBBBBB ", " B B ", " B B ", " ", " ", " ") + .aisle(" AAAAAAAAAAA ", " AAAAAAAAAAA ", " AAAAAAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAAAAAAAA ", " AAAAAAAAA ", " AAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAAAA ", " AAQAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .where(' ', any()) + .where('Q', controller(blocks(definition.getBlock()))) + .where('A', blocks(CASING_STEEL_SOLID.get()) + .or(abilities(PartAbility.INPUT_ENERGY,PartAbility.INPUT_LASER).setExactLimit(1)) // Can take laser for when expandable vertically (NYI until V8) + .or(abilities(PartAbility.IMPORT_FLUIDS).setMinGlobalLimited(1,1).setMaxGlobalLimited(3)) // For Nutrient Boosters + .or(abilities(PartAbility.EXPORT_ITEMS).setMinGlobalLimited(1,1).setMaxGlobalLimited(3)) // For Exporting the Products + .or(abilities(PartAbility.EXPORT_FLUIDS).setMinGlobalLimited(1,1).setMaxGlobalLimited(3)) //If we want to do some output waste? idk + .or(abilities(PartAbility.MAINTENANCE).setExactLimit(1))) + .where('B', frames(GTMaterials.Neutronium)) + .where('C', blocks(TRITANIUM_LINED_HEAVY_NEUTRONIUM_CASING.get())) + .where('D', blocks(REINFORCED_DAWNSTONE_CASING.get())) // Frame of the hives + .where('E', blocks(CASING_GRATE.get())) // GRATES + .where('F', blocks(Blocks.HONEYCOMB_BLOCK)) // THE COMBS YAYYYY + .where('G', ability(CosmicPartAbility.BEE_HOLDER)) // The Bee Holders + .build()) + // spotless:on + .workableCasingModel(GTCEu.id("block/casings/solid/machine_casing_solid_steel"), + GTCEu.id("block/multiblock/power_substation")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/MothCargoDropOff.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/MothCargoDropOff.java new file mode 100644 index 000000000..d2240c77d --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/MothCargoDropOff.java @@ -0,0 +1,55 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.MothCargoDropOffMachine; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.common.data.GTRecipeTypes; + +import net.minecraft.network.chat.Component; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GTBlocks.CASING_STEEL_SOLID; + +/** + * Moth Cargo Drop Off - Receiver multiblock for the Cargo Moths system. + * Receives items and fluids from linked Moth Cargo Stations. + * Small, compact design for easy placement at outposts. + */ +public class MothCargoDropOff { + + public static final MultiblockMachineDefinition MOTH_CARGO_DROP_OFF = REGISTRATE + .multiblock("moth_cargo_drop_off", MothCargoDropOffMachine::new) + .langValue("Moth Cargo Drop Off") + .tooltips( + Component.literal("Receives shipments from Moth Cargo Stations"), + Component.literal("Link to stations with a datastick"), + Component.literal("Small footprint for easy outpost placement")) + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(GTRecipeTypes.DUMMY_RECIPES) + .appearanceBlock(CASING_STEEL_SOLID) + // spotless:off + .pattern(definition -> FactoryBlockPattern.start() + // Compact 3x3x3 structure + .aisle("CCC", "CCC", "C C") + .aisle("CCC", "C C", " ") + .aisle("CCC", "CQC", "C C") + .where(' ', any()) + .where('Q', controller(blocks(definition.getBlock()))) + .where('C', blocks(CASING_STEEL_SOLID.get()) + .or(abilities(PartAbility.MAINTENANCE).setExactLimit(1)) + .or(abilities(PartAbility.EXPORT_ITEMS).setMaxGlobalLimited(4)) + .or(abilities(PartAbility.EXPORT_FLUIDS).setMaxGlobalLimited(4))) + .build()) + // spotless:on + .workableCasingModel( + GTCEu.id("block/casings/solid/machine_casing_solid_steel"), + GTCEu.id("block/multiblock/implosion_compressor")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/MothCargoStation.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/MothCargoStation.java new file mode 100644 index 000000000..e02ac4067 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/MothCargoStation.java @@ -0,0 +1,83 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.api.pattern.CosmicPredicates; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.MothCargoStationMachine; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.common.data.GTRecipeTypes; + +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GTBlocks.CASING_STEEL_SOLID; + +/** + * Moth Cargo Station - Sender multiblock for the Cargo Moths system. + * Ships items and fluids to linked Moth Cargo Drop Off stations. + */ +public class MothCargoStation { + + // Forestry beehive blocks used as moth homes + public static final ResourceLocation BEEHIVE_FOREST = new ResourceLocation("forestry", "beehive_forest"); + public static final ResourceLocation BEEHIVE_LUSH = new ResourceLocation("forestry", "beehive_lush"); + public static final ResourceLocation BEEHIVE_DESERT = new ResourceLocation("forestry", "beehive_desert"); + public static final ResourceLocation BEEHIVE_END = new ResourceLocation("forestry", "beehive_end"); + + /** + * Check if a block is a valid moth home (any tier of Forestry beehive). + */ + public static boolean isMothHome(BlockState state) { + Block block = state.getBlock(); + ResourceLocation blockId = BuiltInRegistries.BLOCK.getKey(block); + return blockId.equals(BEEHIVE_FOREST) || + blockId.equals(BEEHIVE_LUSH) || + blockId.equals(BEEHIVE_DESERT) || + blockId.equals(BEEHIVE_END); + } + + public static final MultiblockMachineDefinition MOTH_CARGO_STATION = REGISTRATE + .multiblock("moth_cargo_station", MothCargoStationMachine::new) + .langValue("Moth Cargo Station") + .tooltips( + Component.literal("Ships items and fluids using cargo moths"), + Component.literal("Link to Moth Cargo Drop Offs with a datastick"), + Component.literal("Add Moth Homes to increase capacity and speed"), + Component.literal("Feed moths honey or pale oil for bonuses!")) + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(GTRecipeTypes.DUMMY_RECIPES) + .appearanceBlock(CASING_STEEL_SOLID) + // spotless:off + .pattern(definition -> FactoryBlockPattern.start() + // Tower structure: 3x3 footprint, 6 blocks tall + // Moth homes (beehives) in center column - up to 4 can be placed + // Open walls (air in center) so beehives are visible from all sides + .aisle("CCC", "C C", "C C", "C C", "C C", "CCC") + .aisle("CCC", " M ", " M ", " M ", " M ", "CCC") + .aisle("CQC", "C C", "C C", "C C", "C C", "CCC") + .where(' ', any()) + .where('Q', controller(blocks(definition.getBlock()))) + .where('C', blocks(CASING_STEEL_SOLID.get()) + .or(abilities(PartAbility.MAINTENANCE).setExactLimit(1)) + .or(abilities(PartAbility.IMPORT_ITEMS).setMaxGlobalLimited(4)) + .or(abilities(PartAbility.EXPORT_ITEMS).setMaxGlobalLimited(4)) + .or(abilities(PartAbility.IMPORT_FLUIDS).setMaxGlobalLimited(4)) + .or(abilities(PartAbility.EXPORT_FLUIDS).setMaxGlobalLimited(4))) + .where('M', CosmicPredicates.mothHomes()) + .build()) + // spotless:on + .workableCasingModel( + GTCEu.id("block/casings/solid/machine_casing_solid_steel"), + GTCEu.id("block/multiblock/implosion_compressor")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/PCBFoundry.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/PCBFoundry.java index ddb8375f8..fb120c0b0 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/PCBFoundry.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/PCBFoundry.java @@ -30,7 +30,7 @@ public class PCBFoundry { .recipeType(CosmicRecipeTypes.PCB_FABRICATOR) .appearanceBlock(BICHROMAL_NEVRAMITE_CASING) .partAppearance((controller, part, side) -> BICHROMAL_NEVRAMITE_CASING.getDefaultState()) - .recipeModifiers(CosmicRecipeModifiers::innateParallel, + .recipeModifiers(CosmicRecipeModifiers::innateParallel4x, GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK_SUBTICK), GTRecipeModifiers.BATCH_MODE) // spotless:off diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/PlasmiteDistillery.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/PlasmiteDistillery.java index b66c2fff9..548f25c68 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/PlasmiteDistillery.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/PlasmiteDistillery.java @@ -33,7 +33,8 @@ public class PlasmiteDistillery { .appearanceBlock(HIGHLY_FLEXIBLE_REINFORCED_TRINAVINE_CASING) .partAppearance((controller, part, side) -> HIGHLY_FLEXIBLE_REINFORCED_TRINAVINE_CASING.getDefaultState()) .recipeModifiers(GTRecipeModifiers.PARALLEL_HATCH, - GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK_SUBTICK)) + GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK_SUBTICK), + GTRecipeModifiers.BATCH_MODE) // spotless:off .pattern(definition -> FactoryBlockPattern.start() .aisle(" AAAEEEEEEEEEEE", " AAAEFFFFFFFFFE", " AAAEFFFFFFFFFE", " AAAEFFFFFFFFFE", " AAAEEEEEEEEEEE", " AAA ", " AAA ", " AAA ", " AAA ", " AAA ", " AAA ", " ") diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/PyrothermicRefinery.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/PyrothermicRefinery.java new file mode 100644 index 000000000..25010ba7b --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/PyrothermicRefinery.java @@ -0,0 +1,70 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.common.data.recipe.CosmicRecipeModifiers; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.RegressionPersistentWorkableElectricMachine; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; + +import com.rekindled.embers.RegistryManager; + +import static com.ghostipedia.cosmiccore.api.machine.part.CosmicPartAbility.IMPORT_EMBER; +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.LIGHT_DAWNSTONE_CASING; +import static com.gregtechceu.gtceu.api.machine.multiblock.PartAbility.EXPORT_FLUIDS; +import static com.gregtechceu.gtceu.api.machine.multiblock.PartAbility.IMPORT_FLUIDS; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GTRecipeModifiers.ELECTRIC_OVERCLOCK; + +public class PyrothermicRefinery { + + public final static MultiblockMachineDefinition PYROTHERMIC_REFINDERY = REGISTRATE + .multiblock("pyrothermic_refinery", RegressionPersistentWorkableElectricMachine::new) + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.PYROTHERMIC_REFINERY) + .appearanceBlock(LIGHT_DAWNSTONE_CASING) + .partAppearance((controller, part, side) -> LIGHT_DAWNSTONE_CASING.getDefaultState()) + .recipeModifiers(CosmicRecipeModifiers::innateParallel4x, + ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK)) + .pattern(definition -> FactoryBlockPattern.start() + // spotless:off + .aisle(" AAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBAA ", " DDD ", " DDD ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBA ", " D D ", " D D ", " DDDDD ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle("ABBBBBBBBBBBBBA", " AD DA ", " AD DA ", " A DEEED A ", " AAA E AAA ", " A E A ", " A E A ", " A E A ", " A E A ", " A E A ", " A E A ", " A E A ", " AAAAA ") + .aisle("ABBBBBBBBBBBBBA", " C D D C ", " C D D C ", " C DEEED C ", " C FEF C ", " C FEF C ", " C FEFCCCCC ", " C FEF ", " C FEF ", " C FEF ", " CCCCCFEF ", " FEF ", " A A ") + .aisle("ABBBBBBBBBBBBBA", " AD DA ", " AD DA ", " A DEEED A ", " AAA E AAA ", " A E A ", " A E A ", " A E A ", " A E A ", " A E A ", " A E A ", " A E A ", " AAAAA ") + .aisle(" ABBBBBBBBBBBA ", " D D ", " D D ", " DDDDD ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBAA ", " DQD ", " DDD ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + // spotless:on + .where(' ', any()) + .where("Q", controller(blocks(definition.getBlock()))) + .where('A', blocks(RegistryManager.ARCHAIC_LARGE_BRICKS.get())) + .where('B', blocks(RegistryManager.CAMINITE_TILES.get())) + .where('C', blocks(CosmicBlocks.STEEL_PLATED_BRONZE.get())) + .where('D', blocks(CosmicBlocks.LIGHT_DAWNSTONE_CASING.get()) + .or(abilities(PartAbility.IMPORT_ITEMS).setPreviewCount(1)) + .or(abilities(PartAbility.EXPORT_ITEMS).setPreviewCount(1)) + .or(abilities(EXPORT_FLUIDS).setPreviewCount(1)) + .or(abilities(IMPORT_EMBER).setPreviewCount(1)) + .or(Predicates.abilities(PartAbility.INPUT_ENERGY).setExactLimit(1))) + .where('E', blocks(CosmicBlocks.LIGHT_DAWNSTONE_CASING.get())) + .where('F', abilities(IMPORT_FLUIDS)) + + .build()) + .workableCasingModel(CosmicCore.id("block/casings/solid/light_dawnstone_casing"), + CosmicCore.id("block/multiblock/dawnforge")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/Roaster.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/Roaster.java new file mode 100644 index 000000000..f15035be8 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/Roaster.java @@ -0,0 +1,53 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.api.machine.part.CosmicPartAbility; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTMaterials; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GTBlocks.CASING_INVAR_HEATPROOF; + +public class Roaster { + + public final static MultiblockMachineDefinition LARGE_ROASTER = REGISTRATE + .multiblock("large_roaster", + WorkableElectricMultiblockMachine::new) + .langValue("§cLarge Roaster") + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.LARGE_ROASTER) + .appearanceBlock(CASING_INVAR_HEATPROOF) + .partAppearance((controller, part, side) -> CASING_INVAR_HEATPROOF.getDefaultState()) + .recipeModifiers( + GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK_SUBTICK), + GTRecipeModifiers.BATCH_MODE) + // spotless:off + .pattern(definition -> FactoryBlockPattern.start() + .aisle("A A", "ABA", "BBB", "BBB", " B ") + .aisle(" B ", "BBB", "B B", "B B", "B B") + .aisle("A A", "ABA", "BQB", "BBB", " B ") + .where(' ', any()) + .where('Q', controller(blocks(definition.getBlock()))) + .where('A', frames(GTMaterials.BlackSteel)) + .where('B', blocks(CASING_INVAR_HEATPROOF.get()) + .or(autoAbilities(CosmicRecipeTypes.LARGE_ROASTER)) + .or(abilities(PartAbility.INPUT_ENERGY).setMaxGlobalLimited(2,2)) + .or(abilities(CosmicPartAbility.IMPORT_EMBER).setMaxGlobalLimited(1,1)) + .or(abilities(PartAbility.MAINTENANCE).setExactLimit(1))) + .build()) + // spotless:on + .workableCasingModel(GTCEu.id("block/casings/solid/machine_casing_heatproof"), + GTCEu.id("block/overlay/machine/roaster")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/SpiritCrucible.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/SpiritCrucible.java index 58bfa76fc..14ef3ad3c 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/SpiritCrucible.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/SpiritCrucible.java @@ -18,6 +18,7 @@ import static com.gregtechceu.gtceu.api.pattern.Predicates.*; import static com.gregtechceu.gtceu.common.data.GCYMBlocks.CASING_ATOMIC; import static com.gregtechceu.gtceu.common.data.GTMaterials.TungstenCarbide; +import static com.gregtechceu.gtceu.common.data.GTRecipeModifiers.BATCH_MODE; import static com.gregtechceu.gtceu.common.data.GTRecipeModifiers.ELECTRIC_OVERCLOCK; import static com.gregtechceu.gtceu.common.data.models.GTMachineModels.createWorkableCasingMachineModel; @@ -27,7 +28,7 @@ public class SpiritCrucible { .multiblock("spirit_crucible", WorkableElectricMultiblockMachine::new) .rotationState(RotationState.NON_Y_AXIS) .recipeTypes(CosmicRecipeTypes.SPIRIT_CRUCIBLE, SOUL_FOUNDRY) - .recipeModifier(ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK)) + .recipeModifiers(ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK), BATCH_MODE) .appearanceBlock(CASING_ATOMIC) .partAppearance((controller, part, side) -> CASING_ATOMIC.getDefaultState()) // spotless:off diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/StarLadder.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/StarLadder.java new file mode 100644 index 000000000..11964b2e3 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/StarLadder.java @@ -0,0 +1,190 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.client.renderer.machine.CosmicDynamicRenderHelpers; +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.StarLadderMachine; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTBlocks; +import com.gregtechceu.gtceu.common.data.GTMaterials; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; + +import net.minecraft.network.chat.Component; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.*; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.models.GTMachineModels.createWorkableCasingMachineModel; + +public class StarLadder { + + public final static MultiblockMachineDefinition STAR_LADDER = REGISTRATE + .multiblock("star_ladder", StarLadderMachine::new) + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.STAR_LADDER_RESEARCH) + .recipeModifier(GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK_SUBTICK)) + .appearanceBlock(CosmicBlocks.CYCLOZINE_CHEMICALLY_REPELLING_CASING) + .pattern(definition -> FactoryBlockPattern.start() + // spotless:off + .aisle(" A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABA ", " A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABA ", " A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABAA ", " A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBA ", " BBB ", " A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBA ", " BBB ", " A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBAA ", " BBB ", " A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBA ", " BB BB ", " B ", " A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBAA ", " BB BB ", " B ", " A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBA ", " BB B BB ", " BBB ", " AAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBA ", " BB B BB ", " BBB ", " ABA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBAA ", " B BBB B ", " BBBBB ", " AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBA ", " BB BBB BB ", " BBBBB ", " ABBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBA ", " B BBBBB B ", " BBBBBBB ", " AABBBAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBA ", " B BBBBB B ", " BBBBBBB ", " ABBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBA ", " B BBBBB B ", " BBBBBBB ", " ABBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBAA ", " B BBBBB B ", " BBBBBBB ", " ABBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBA ", " BBBBBBBBBBB ", " BBBBBBBBB ", " AABBBBBAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBA ", " B BBBBBBB B ", " BBBBBBBBB ", " ABBBBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBA ", " B BBBBBBB B ", " BBBBBBBBB ", " ABBBBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBA ", " B BBBBBBB B ", " BBBBBBBBB ", " ABBBBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBAA ", " B BBBBBBB B ", " BBBBBBBBB ", " ABBBBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBBBA ", " BBBBBBBBBBBBB ", " BBBBBBBBBBB ", " AABBBBBBBAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBBBA ", " B BBBBBBBBB B ", " BBBBBBBBBBB ", " ABBBBBBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBBBA ", " B BBBBBBBBB B ", " BBBBBBBBBBB ", " ABBBBBBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBAA ", " B BBBBBBBBB B ", " BBBBBBBBBBB ", " ABBBBBBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBBBBBA ", " BBBBBBBBBBBBBBB ", " BBBBBBBBBBBBB ", " AABBBBBBBBBAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBAA ", " B BBBBBBBBBBB B ", " BBBBBBBBBBBBB ", " ABBBBBABBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBBBBBBBA ", " BB BBBBBBBBBBB BB ", " BBBBBBBBBBBBB ", " ABBBBBABBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBAA ", " BB BBBBBBBBBBB BB ", " BBBBBBBBBBBBB ", " ABBBBAAABBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBBBAA ", " BB BBBBBBBBBBBBB BB ", " BBBBBBBBBBBBBBB ", " AABBBBACABBBBAA ", " C ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAABBBBBBBBBBBBBBBBBBBBBAAA ", " BBB BBBBBBBBBBBBB BBB ", " BBBBBBBBBBBBBBB ", " ABBBBBACABBBBBA ", " C ", " C ", " C ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAAABBBBBBBBBBBBBBBBBBBBBBBBBAAAA ", " BBBBB BBBBBBBBBBBBB BBBBB ", " BBBBBBBBBBBBBBB ", " ABBBBAACAABBBBA ", " C ", " C ", " C ", " C ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " BBBBBBB BBBBBBBBBBBBBBB BBBBBBB ", " BBBBBBBBBBBBBBBBB ", " AABBBBACCCABBBBAA ", " CCC ", " CCC ", " C ", " C ", " C ", " C ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " BBBBBBBB BBBBBBBBBBBBBBB BBBBBBBB ", " BBBBBBBBBBBBBBBBB ", " ABBBBBACCCABBBBBA ", " CCC ", " CCC ", " CCC ", " CCC ", " CCC ", " C ", " C ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAA ", " BBBB B BBBBBBBBBBBBBBB B BBBB ", " BBBB BBBBBBBBBBBBBBBBB BBBB ", " AAAA ABBBBAACCCAABBBBA AAAA ", " CCC ", " CCC ", " CCC ", " CCC ", " CCC ", " CCC ", " CCC ", " C ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAAA ", " ABB BBBB BBBBBBBBBBBBBBBBB BBBB BBA ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAAAAABBBBACCCCCABBBBAAAAAAAA ", " AAA A CCCCC A AAA ", " A CCCCC A ", " A CCCCC A ", " A CCCCC A ", " A CCCCC A ", " A CCC A ", " A CCC A ", " A CCC A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " AAA BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB AAA ", " ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBA ", " AAAAAAAAABBBBBACCCCCABBBBBAAAAAAAAA ", " ADAA DDD CCCCC DDD AADA ", " D D CCCCC D D ", " D D CCCCC D D ", " D D CCCCC D D ", " D D CCCCC D D ", " D D CCCCC D D ", " D D CCCCC D D ", " D D CCCCC D D ", " D D CCC D D ", " D D C D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " DDD DDD ", " A A ", " A A ", " A A ", " A A ", " A A ", " AA AA ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " A ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBA A ", " AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " AAAAAAABBBBBBBAACCCCCAABBBBBBBAAAAAAA ", " AAAA ADDD CCCCC DDDA AAAA ", " AD A CCCCC A DA ", " A CCCCC A ", " A CCCCC A ", " A CCCCC A ", " A CCCCC A ", " A CCCCC A ", " A CCCCC A ", " A CCC A ", " A CCC A ", " A C A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " ADDD DDDA ", " AADDD DDDAA ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAA ", " AAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAA ", " AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " AAAAAAABBCCCBBBACCCCCCCABBBCCCBBAAAAAAA ", " AAAA DDD CCCCCCC DDD AAAA ", " AA D D CCCCCCC D D AA ", " AD D D CCCCCCC D D DA ", " D D CCCCCCC D D ", " D D CCCCCCC D D ", " D D CCCCCCC D D ", " D D CCCCCCC D D ", " D D CCCCCCC D D ", " D D CCCCC D D ", " D D CCCCC D D ", " D D CCCCC D D ", " D D CCC D D ", " D D CCC D D ", " D D C D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " AADDD DDDAA ", " A ED DE A ", " A ED DE A ", " A ED DE A ", " A ED DE A ", " A ED DE A ", " ED DE ", " ED DE ", " E E ", " E E ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " BB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAAAABBCCCBBBBACCCCCCCABBBBCCCBBAAAAAAA ", " AAAA CCCCCCC AAAA ", " AA CCCCCCC AA ", " AA CCCCCCC AA ", " AD CCCCCCC DA ", " AD CCCCCCC DA ", " D CCCCCCC D ", " D CCCCCCC D ", " D CCCCCCC D ", " CCCCCCC ", " CCCCCCC ", " CCCCCCC ", " CCCCC ", " CCCCC ", " CCCCC ", " EEE CCC EEEEE ", " AAAAA CCC AAAAA ", " EEE C EEEEE ", " C ", " ", " ", " ", " DD DD ", " DD DD ", " DD DD ", " DD DD ", " DD DDE ", " DD DD ", " DD DDE ", " DD DD ", " DD DD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " EDD DDE ", " EDD DDE ", " EDD DDE ", " EDD DDE ", " EDD DDE ", " EDD DDE ", " EDD DDE ", " EDD DDE ", " EDD DDE ", " EDD DDE ", " DD DD ", " DD DD ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " BBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAACCCCCCCBBBBAACCCCCCCAABBBBCCCCCCCAAAA ", " AAAAA CCCCCCC AAAAA ", " AA CCCCCCC AA ", " AA CCCCCCC AA ", " A CCCCCCC A ", " A CCCCCCC A ", " A CCCCCCC A ", " A CCCCCCC A ", " D CCCCCCC D ", " D CCCCCCC D ", " D CCCCCCC D ", " CCCCCCC ", " CCCCCCC ", " CCCCCCC ", " CCCCCCC ", " EEE CCCCC EE EEE ", " AAA AA CCC AA AAA ", " EEE CCC EE EEE ", " CCC ", " CCC ", " ", " ", " ", " ", " ", " ", " EE EE ", " AA AA ", " EE EE ", " ", " ", " ", " ", " ", " DD DD ", " DD DD ", " DD DD ", " DD DD ", " DD DD ", " DD DD ", " DDD DDD ", " DDD DDD ", " DD DD ", " DD DD ", " DD DD ", " DD DD ", " DD DD ", " D D ", " D D ", " D D ", " D D ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBA ", " BBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAACCCCCBBBBBAACCCCCCCCCAABBBBBCCCCCAAAAA ", " AAAAADD CCCCCCCC DDAAAAA ", " AAA DD CCCCCCCC DD AAA ", " AA CCCCCCCC AA ", " A CCCCCCCC A ", " A CCCCCCCC A ", " CCCCCCCC ", " CCCCCCCC ", " CCCCCCCC ", " CCCCCCCC ", " D CCCCCCCC D ", " D CCCCCCCC D ", " D CCCCCCC D ", " CCCCCCC ", " CCCCCCC ", " EEE CCCCCCCEE EEE ", " AAA AAACCCCCAAA AAA ", " EEE CCCCCEEE EEE ", " CCC ", " CCC ", " C ", " C ", " C ", " C ", " C ", " C ", " EEE EEE ", " AAA AAA ", " EEE EEE ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBA ", " BBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAACCCCBBBBAAACCCCCCCCCCCAAABBBBCCCCAAAAA ", " DAA DCCC CCCCCCC CCCD AAD ", " DA DCCC CCCCCCC CCCD AD ", " D CCC CCCCCCC CCC D ", " D CCC CCCCCCC CCC D ", " D CCC CCCCCCC CCC D ", " D CCC CCCCCCC CCC D ", " D CCC CCCCCCC CCC D ", " DD CCC CCCCCCC CCC DD ", " D CCC CCCCCCC CCC D ", " DDCCC CCCCCCC CCCDD ", " DCCC CCCCCCC CCCD ", " DCCC CCCCCCC CCCD ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " ECCCE CCCCCCC ECCCE ", " ACCCA CCCCC ACCCA ", " ECCCE CCCCC ECCCE ", " AA CCCCC AA ", " AA CCC AA ", " AA CCC AA ", " AA CCC AA ", " A CCC A ", " A C A ", " A C A ", " A C A ", " EEE C EEE ", " AAA AAA ", " EEE EEE ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " BB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAABCCCCCBAAACCCCCCCCCCCCCCCAAABCCCCCBAAAAA ", " AA CCC CCCCCCC CCC AA ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " ECCCE CCCCCCC ECCCE ", " ACCCA CCCCC ACCCA ", " ECCCE CCCCC ECCCE ", " ACCC CCCCC CCCA ", " ACCC CCCCC CCCA ", " ACCC CCCCC CCCA ", " ACCC CCC CCCA ", " ACCC CCC CCCA ", " ACCC CCC CCCA ", " ACCC CCC CCCA ", " ACCC C CCCA ", " ECCCE C ECCCE ", " ACCCA C ACCCA ", " ECCCE C ECCCE ", " AA AA ", " AA AA ", " AAA AAA ", " AA AA ", " AA AA ", " AA AA ", " AA AA ", " A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBA ", " BBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAABBCCBCCAACCCCCCAAAAAAACCCCCCAACCBCCBBAAAA ", " AA CC EDCCCDE CC AA ", " CC EDCCCDE CC ", " CC EDCCCDE CC ", " CC EDCCCDE CC ", " CC EDCCCDE CC ", " CC EDCCCDE CC ", " CC EDCCCDE CC ", " CC EDCCCDE CC ", " CC EDCCCDE CC ", " CC EDCCCDE CC ", " CC EDCCCDE CC ", " CC EDCCCDE CC ", " CCC EDCCCDE CCC ", " CCC EDDCDDE CCC ", " EECCCE E DCD E ECCCEE ", " AACCCA E DCD E ACCCAA ", " EECCCE E DCD E ECCCEE ", " CCC E DCD E CCC ", " CCC E DDD E CCC ", " CCC E D E CCC ", " CCC E D E CCC ", " CCC E D E CCC ", " CCC E D E CCC ", " CCC E E CCC ", " CCC E E CCC ", " ECCCE E E ECCCE ", " ACCCA E E ACCCA ", " ECCCE E E ECCCE ", " ACCC E E CCCA ", " ACCC E E CCCA ", " ACCC E E CCCA ", " ACCC E E CCCA ", " ACCC E E CCCA ", " ACCC CCCA ", " ACCC CCCA ", " CCC CCC ", " CCC CCC ", " A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " BBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAABBCCBBBACCCCCCAAAAAAAAAAACCCCCCABBBCCBBAAA ", " A FFFFF A ", " FFQFF ", " FFFFF ", " FFF ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E EEE EEE E ", " A AAA AAA A ", " E EEE EEE E ", " CC CC ", " CC CC ", " CC CC ", " CC CC ", " CC CC ", " CC CC ", " CCC CCC ", " CCC CCC ", " EECCCE ECCCEE ", " AACCCA ACCCAA ", " EECCCE ECCCEE ", " CCC CCC ", " CCC CCC ", " ACCC CCCA ", " ACCC CCCA ", " ACCC E E CCCA ", " ACCC E E CCCA ", " ACCC E E CCCA ", " ACCC E E CCCA ", " ACCC E E CCCA ", " ACC CCA ", " ACC CCA ", " AC CA ", " AC CA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " BBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAABCCCBBAACCCCAAAAAAAAAAAAAAACCCCAABBCCCBAAA ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " EE EE ", " AA AA ", " EE EE ", " ", " ", " ", " ", " ", " ", " ", " ", " E EEE EEE E ", " A AAA AAA A ", " E EEE EEE E ", " CC CC ", " CC CC ", " CC CC ", " CC CC ", " CC CC ", " CC CC ", " CCC CCC ", " CCC CCC ", " CCC CCC ", " CCC CCC ", " CCC CCC ", " CCC CCC ", " CCC CCC ", " CC CC ", " CC CC ", " C C ", " C C ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAA ", " BBBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AABCCBBBACCCCAAAAAAAAAAAAAAAAACCCCABBBCCBAA ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A E E A ", " A A A A ", " A E E A ", " A A ", " A A ", " A A ", " A A ", " A A ", " ", " ", " ", " EE EE ", " AA AA ", " EE EE ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " CC CC ", " CC CC ", " CC CC ", " CC CC ", " CCC CCC ", " CCC CCC ", " CCC CCC ", " CCC CCC ", " CC CC ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAA ", " BBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAABBCBBBAACCCAAAAAAAAAAAAAAAAAAACCCAABBBCBBAAAA ", " DDD DDD ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D DE ED D ", " D DA AD D ", " D DE ED D ", " D D D D ", " D D D D ", " D D D D ", " DDD DDD ", " A A ", " A A ", " A A ", " A A ", " A EE E A ", " AA A A AA ", " AEE E A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " CC CC ", " CC CC ", " CC CC ", " CC CC ", " CC CC ", " C C ", " C C ", " C C ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAAAA ", " BBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAABBBBBBBBBACCCAAAAAAAAAAAAAAAAAAAAACCCABBBBBBBBBAAAA ", " ADDD DDDA ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A E E A ", " A A A A ", " A E E A ", " A A ", " A A ", " A A ", " ADDD DDDA ", " AADDD DDDAA ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAAAAA ", " BBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAABBBBBBBBBBBAACCCAAAAAAAAAAAAAAAAAAAAACCCAABBBBBBBBBBBAAAAA ", " DDD E E DDD ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D DEE E E EED D ", " D DAA E E AAD D ", " D DEE E E EED D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " DDD E E DDD ", " DDD E E DDD ", " DDD E E DDD ", " DDD E E DDD ", " DDD E E DDD ", " DDD E E DDD ", " ADDD E E DDDA ", " ADDD E E DDDA ", " ADDD E E DDDA ", " ADDD E E DDDA ", " ADDD E E DDDA ", " ADDD E E DDDA ", " ADDD E E DDDA ", " AADDD E E DDDAA ", " A ED E E DE A ", " A ED E E DE A ", " A ED E E DE A ", " A ED E E DE A ", " A ED E E DE A ", " ED E E DE ", " ED E E DE ", " E E E E ", " E E E E ", " E E E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ") + .aisle(" AAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAAAAA ", " BBBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAABBBBBBBBBBBBBBAACCCAAAAAAAAAAAAAAAAAAAAAAACCCAABBBBBBBBBBBBBBAAAAA ", " CCCCC ", " ", " ", " ", " CCCCC ", " ", " ", " ", " CCCCC ", " ", " ", " ", " CCCCC ", " ", " EE EE ", " AA AA ", " EE CCCCC EE ", " ", " ", " ", " CCCCC ", " DD DD ", " DD DD ", " DD DD ", " DD CCCCC DD ", " DD DD ", " DD DD ", " DD DD ", " DD CCCCC DD ", " DD DD ", " DDD DDD ", " DDD DDD ", " DDD CCCCC DDD ", " DDD DDD ", " EDD DDE ", " EDD DDE ", " EDD CCCCC DDE ", " EDD DDE ", " EDD DDE ", " EDD DDE ", " EDD CCCCC DDE ", " EDD DDE ", " EDD DDE ", " EDD DDE ", " DD CCCCC DD ", " DD DD ", " ", " ", " CCCCC ", " ", " ", " ", " CCCCC ", " ", " ", " ", " CCCCC ", " ", " ", " ", " CCCCC ", " ", " ", " ") + .aisle(" AAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAAA ", " BBBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAAABBBBBBBBBBBBBBBAAAACCCCAAAAAAAAAAAAAAAAAAAAAAACCCCAAAABBBBBBBBBBBBBBBAAAAAA ", " C CCA ACC ", " C A A ", " C AAA ", " C A A ", " C CCA ACC ", " C A A ", " C AAA ", " C A A ", " C CCA ACC ", " C A A ", " C AAA ", " A A ", " CCA ACC ", " A A ", " E AAA E ", " A A A A ", " E CCA ACC E ", " A A ", " AAA ", " A A ", " CCA ACC ", " A A ", " AAA ", " A A ", " CCA ACC ", " A A ", " AAA ", " A A ", " CCA ACC ", " A A ", " AAA ", " A A ", " CCA ACC ", " DD A A DD ", " DD AAA DD ", " DD A A DD ", " DD CCA ACC DD ", " DD A A DD ", " DD AAA DD ", " DDD A A DDD ", " DDD CCA ACC DDD ", " DD A A DD ", " DD AAA DD ", " DD A A DD ", " DD CCA ACC DD ", " DD A A DD ", " D AAA D ", " D A A D ", " D CCA ACC D ", " D A A D ", " AAA ", " A A ", " CCA ACC ", " A A ", " AAA ", " A A ", " CCA ACC ", " A A ", " AAA ", " A A ", " CCA ACC ", " A A ", " AAA ", " A A ") + .aisle(" AAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAA ", " BBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAABBBBBBBBBBBBBBBBBAAAACCCCCCAAAAAAAAAAAAAAAAAAAAAAAAACCCCCCAAAABBBBBBBBBBBBBBBBBAAAAA ", " CCCCCCE CE EC ECCCCCC ", " CCCCCCE E E ECCCCCC ", " CCCCCCE E E ECCCCCC ", " CCCCCCE E E ECCCCCC ", " CCCCCCE CE EC ECCCCCC ", " CCCCCCE E E ECCCCCC ", " CCCCCCE E E ECCCCCC ", " CCCCCCE E E ECCCCCC ", " CCCCCE CE EC ECCCCC ", " CCCCCE E E ECCCCC ", " CCCCCE E E ECCCCC ", " CCCCE E E ECCCC ", " CCCCE CE EC ECCCC ", " CCCCE E E ECCCC ", " CCCE E E ECCC ", " A E E E E A ", " E E CE EC E E ", " E E E E ", " E E E E ", " E E E E ", " E CE EC E ", " E E E E ", " E E E E ", " E E E E ", " E CE EC E ", " E E E E ", " E E E E ", " E E E E ", " E CE EC E ", " E E E E ", " E E E E ", " E E E E ", " EE CE EC EE ", " E E E E ", " E E E E ", " E E E E ", " E CE EC E ", " E E ", " E E ", " E E ", " CE EC ", " E E ", " E E ", " E E ", " CE EC ", " E E ", " E E ", " E E ", " CE EC ", " E E ", " E E ", " E E ", " CE EC ", " E E ", " E E ", " E E ", " CE EC ", " E E ", " E E ", " E E ", " CE EC ", " E E ", " E E ", " E E ") + .aisle(" AAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAAA ", " BBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAABBBBBBBBBBBBBBBBBBAAAACCCCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAACCCCCCCCCAAAABBBBBBBBBBBBBBBBBBAAA ", " CCCCCCCCCDF CC CC FDCCCCCCCCC ", " CCCCCCCCCDF FDCCCCCCCCC ", " CCCCCCCCCDF FDCCCCCCCCC ", " CCCCCCCCCD DCCCCCCCCC ", " CCCCCCCCCD CC CC DCCCCCCCCC ", " CCCCCCCCD DCCCCCCCC ", " CCCCCCCCD DCCCCCCCC ", " CCCCCCCCD DCCCCCCCC ", " CCCCCCD CC CC DCCCCCC ", " CCCCCCD DCCCCCC ", " CCCCCCD DCCCCCC ", " CCCCCD DCCCCC ", " CCCCCD CC CC DCCCCC ", " CCCCCD DCCCCC ", " CCCC CCCC ", " CCC CCC ", " CCC CC CC CCC ", " CC CC ", " C C ", " C C ", " CC CC ", " ", " ", " ", " CC CC ", " ", " ", " ", " CC CC ", " ", " ", " ", " CC CC ", " ", " ", " ", " CC CC ", " ", " ", " ", " CC CC ", " ", " ", " ", " CC CC ", " ", " ", " ", " CC CC ", " ", " ", " ", " CC CC ", " ", " ", " ", " CC CC ", " ", " ", " ", " CC CC ", " ", " ", " ") + .aisle(" AAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAAA ", " BBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAABBBBBBBBBBBBBBBBBAAAACCCCCCCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAACCCCCCCCCCCCAAAABBBBBBBBBBBBBBBBBAAA ", " CCCCCCCCCCCCCF ECA ACE FCCCCCCCCCCCCC ", " CCCCCCCCCCCCCF E A A E FCCCCCCCCCCCCC ", " CCCCCCCCCCCCF E A A E FCCCCCCCCCCCC ", " CCCCCCCCCCCCF E A A E FCCCCCCCCCCCC ", " CCCCCCCCCCCC ECA ACE CCCCCCCCCCCC ", " CCCCCCCCCCC E A A E CCCCCCCCCCC ", " CCCCCCCCCCC E A A E CCCCCCCCCCC ", " CCCCCCCCCC E A A E CCCCCCCCCC ", " CCCCCCCCC ECA ACE CCCCCCCCC ", " CCCCCCCC E A A E CCCCCCCC ", " CCCCCCC E A A E CCCCCCC ", " CCCCCCC E A A E CCCCCCC ", " CCCCCCC ECA ACE CCCCCCC ", " CCCCCD E A A E DCCCCC ", " CCCCCD E A A E DCCCCC ", " CCCCCD E A A E DCCCCC ", " CCCCD ECA ACE DCCCC ", " CCCCD E A A E DCCCC ", " CCCCD E A A E DCCCC ", " CC E A A E CC ", " CC ECA ACE CC ", " CC E A A E CC ", " C E A A E C ", " C E A A E C ", " ECA ACE ", " E A A E ", " E A A E ", " E A A E ", " ECA ACE ", " E A A E ", " E A A E ", " E A A E ", " ECA ACE ", " E A A E ", " E A A E ", " E A A E ", " ECA ACE ", " E A A E ", " E A A E ", " E A A E ", " ECA ACE ", " E A A E ", " E A A E ", " E A A E ", " ECA ACE ", " E A A E ", " E A A E ", " E A A E ", " ECA ACE ", " E A A E ", " E A A E ", " E A A E ", " ECA ACE ", " E A A E ", " E A A E ", " E A A E ", " ECA ACE ", " E A A E ", " E A A E ", " E A A E ", " ECA ACE ", " E A A E ", " E A A E ", " E A A E ") + .aisle("AAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAAAA", " AAABBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBAAA ", " AAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAA ", " AAABBBBBBBBBBBBBBBBBAAACCCCCCCCCCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAACCCCCCCCCCCCCCCAAABBBBBBBBBBBBBBBBBAAA ", " CCCCCCCCCCCCCCCCF C C FCCCCCCCCCCCCCCCC ", " CCCCCCCCCCCCCCCF FCCCCCCCCCCCCCCC ", " CCCCCCCCCCCCCCCF A A FCCCCCCCCCCCCCCC ", " CCCCCCCCCCCCCCF FCCCCCCCCCCCCCC ", " CCCCCCCCCCCCC C C CCCCCCCCCCCCC ", " CCCCCCCCCCCCC CCCCCCCCCCCCC ", " CCCCCCCCCCCC A A CCCCCCCCCCCC ", " CCCCCCCCCCC CCCCCCCCCCC ", " CCCCCCCCC C C CCCCCCCCC ", " CCCCCCCCC CCCCCCCCC ", " CCCCCCCC A A CCCCCCCC ", " CCCCCCC CCCCCCC ", " CCCCCCC C C CCCCCCC ", " CCCCCCC CCCCCCC ", " CCCCCC A A CCCCCC ", " CCCCCC CCCCCC ", " CCCCCC C C CCCCCC ", " CCCCCC CCCCCC ", " CCCCD A A DCCCC ", " CCCD DCCC ", " CCCD C C DCCC ", " CCCD DCCC ", " CCCD A A DCCC ", " CCC CCC ", " CCC C C CCC ", " CC CC ", " C A A C ", " C C ", " C C ", " ", " A A ", " ", " C C ", " ", " A A ", " ", " C C ", " ", " A A ", " ", " C C ", " ", " A A ", " ", " C C ", " ", " A A ", " ", " C C ", " ", " A A ", " ", " C C ", " ", " A A ", " ", " C C ", " ", " A A ", " ", " C C ", " ", " A A ", " ") + .aisle(" AAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAAA ", " BBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAABBBBBBBBBBBBBBBBBAAAACCCCCCCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAACCCCCCCCCCCCAAAABBBBBBBBBBBBBBBBBAAA ", " CCCCCCCCCCCCCF ECA ACE FCCCCCCCCCCCCC ", " CCCCCCCCCCCCCF E A A E FCCCCCCCCCCCCC ", " CCCCCCCCCCCCF E A A E FCCCCCCCCCCCC ", " CCCCCCCCCCCCF E A A E FCCCCCCCCCCCC ", " CCCCCCCCCCCC ECA ACE CCCCCCCCCCCC ", " CCCCCCCCCCC E A A E CCCCCCCCCCC ", " CCCCCCCCCCC E A A E CCCCCCCCCCC ", " CCCCCCCCCC E A A E CCCCCCCCCC ", " CCCCCCCCC ECA ACE CCCCCCCCC ", " CCCCCCCC E A A E CCCCCCCC ", " CCCCCCC E A A E CCCCCCC ", " CCCCCCC E A A E CCCCCCC ", " CCCCCCC ECA ACE CCCCCCC ", " CCCCCD E A A E DCCCCC ", " CCCCCD E A A E DCCCCC ", " CCCCCD E A A E DCCCCC ", " CCCCD ECA ACE DCCCC ", " CCCCD E A A E DCCCC ", " CCCCD E A A E DCCCC ", " CC E A A E CC ", " CC ECA ACE CC ", " CC E A A E CC ", " C E A A E C ", " C E A A E C ", " ECA ACE ", " E A A E ", " E A A E ", " E A A E ", " ECA ACE ", " E A A E ", " E A A E ", " E A A E ", " ECA ACE ", " E A A E ", " E A A E ", " E A A E ", " ECA ACE ", " E A A E ", " E A A E ", " E A A E ", " ECA ACE ", " E A A E ", " E A A E ", " E A A E ", " ECA ACE ", " E A A E ", " E A A E ", " E A A E ", " ECA ACE ", " E A A E ", " E A A E ", " E A A E ", " ECA ACE ", " E A A E ", " E A A E ", " E A A E ", " ECA ACE ", " E A A E ", " E A A E ", " E A A E ", " ECA ACE ", " E A A E ", " E A A E ", " E A A E ") + .aisle(" AAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAAA ", " BBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAABBBBBBBBBBBBBBBBBBAAAACCCCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAACCCCCCCCCAAAABBBBBBBBBBBBBBBBBBAAA ", " CCCCCCCCCDF CC CC FDCCCCCCCCC ", " CCCCCCCCCDF FDCCCCCCCCC ", " CCCCCCCCCDF FDCCCCCCCCC ", " CCCCCCCCCD DCCCCCCCCC ", " CCCCCCCCCD CC CC DCCCCCCCCC ", " CCCCCCCCD DCCCCCCCC ", " CCCCCCCCD DCCCCCCCC ", " CCCCCCCCD DCCCCCCCC ", " CCCCCCD CC CC DCCCCCC ", " CCCCCCD DCCCCCC ", " CCCCCCD DCCCCCC ", " CCCCCD DCCCCC ", " CCCCCD CC CC DCCCCC ", " CCCCCD DCCCCC ", " CCCC CCCC ", " CCC CCC ", " CCC CC CC CCC ", " CC CC ", " C C ", " C C ", " CC CC ", " ", " ", " ", " CC CC ", " ", " ", " ", " CC CC ", " ", " ", " ", " CC CC ", " ", " ", " ", " CC CC ", " ", " ", " ", " CC CC ", " ", " ", " ", " CC CC ", " ", " ", " ", " CC CC ", " ", " ", " ", " CC CC ", " ", " ", " ", " CC CC ", " ", " ", " ", " CC CC ", " ", " ", " ") + .aisle(" AAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAA ", " BBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAABBBBBBBBBBBBBBBBBAAAACCCCCCAAAAAAAAAAAAAAAAAAAAAAAAACCCCCCAAAABBBBBBBBBBBBBBBBBAAAAA ", " CCCCCCE CE EC ECCCCCC ", " CCCCCCE E E ECCCCCC ", " CCCCCCE E E ECCCCCC ", " CCCCCCE E E ECCCCCC ", " CCCCCCE CE EC ECCCCCC ", " CCCCCCE E E ECCCCCC ", " CCCCCCE E E ECCCCCC ", " CCCCCCE E E ECCCCCC ", " CCCCCE CE EC ECCCCC ", " CCCCCE E E ECCCCC ", " CCCCCE E E ECCCCC ", " CCCCE E E ECCCC ", " CCCCE CE EC ECCCC ", " CCCCE E E ECCCC ", " CCCE E E ECCC ", " A E E E E A ", " E CE EC E E ", " E E E E ", " E E E E ", " E E E E ", " E CE EC E ", " E E E E ", " E E E E ", " E E E E ", " E CE EC E ", " E E E E ", " E E E E ", " E E E E ", " E CE EC E ", " E E E E ", " E E E E ", " E E E E ", " EE CE EC EE ", " E E E E ", " E E E E ", " E E E E ", " E CE EC E ", " E E ", " E E ", " E E ", " CE EC ", " E E ", " E E ", " E E ", " CE EC ", " E E ", " E E ", " E E ", " CE EC ", " E E ", " E E ", " E E ", " CE EC ", " E E ", " E E ", " E E ", " CE EC ", " E E ", " E E ", " E E ", " CE EC ", " E E ", " E E ", " E E ") + .aisle(" AAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAAA ", " BBBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAAABBBBBBBBBBBBBBBAAAACCCCAAAAAAAAAAAAAAAAAAAAAAACCCCAAAABBBBBBBBBBBBBBBAAAAAA ", " CCA ACC C ", " A A C ", " AAA C ", " A A C ", " CCA ACC C ", " A A C ", " AAA C ", " A A C ", " CCA ACC C ", " A A C ", " AAA C ", " A A ", " CCA ACC ", " A A ", " AAA E ", " A A A A ", " CCA ACC E ", " A A ", " AAA ", " A A ", " CCA ACC ", " A A ", " AAA ", " A A ", " CCA ACC ", " A A ", " AAA ", " A A ", " CCA ACC ", " A A ", " AAA ", " A A ", " CCA ACC ", " DD A A DD ", " DD AAA DD ", " DD A A DD ", " DD CCA ACC DD ", " DD A A DD ", " DD AAA DD ", " DDD A A DDD ", " DDD CCA ACC DDD ", " DD A A DD ", " DD AAA DD ", " DD A A DD ", " DD CCA ACC DD ", " DD A A DD ", " D AAA D ", " D A A D ", " D CCA ACC D ", " D A A D ", " AAA ", " A A ", " CCA ACC ", " A A ", " AAA ", " A A ", " CCA ACC ", " A A ", " AAA ", " A A ", " CCA ACC ", " A A ", " AAA ", " A A ") + .aisle(" AAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAAAAA ", " BBBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAABBBBBBBBBBBBBBAACCCAAAAAAAAAAAAAAAAAAAAAAACCCAABBBBBBBBBBBBBBAAAAA ", " CCCCC ", " ", " ", " ", " CCCCC ", " ", " ", " ", " CCCCC ", " ", " ", " ", " CCCCC ", " ", " EE ", " AA AA ", " CCCCC EE ", " ", " ", " ", " CCCCC ", " DD DD ", " DD DD ", " DD DD ", " DD CCCCC DD ", " DD DD ", " DD DD ", " DD DD ", " DD CCCCC DD ", " DD DD ", " DDD DDD ", " DDD DDD ", " DDD CCCCC DDD ", " DDD DDD ", " EDD DDE ", " EDD DDE ", " EDD CCCCC DDE ", " EDD DDE ", " EDD DDE ", " EDD DDE ", " EDD CCCCC DDE ", " EDD DDE ", " EDD DDE ", " EDD DDE ", " DD CCCCC DD ", " DD DD ", " ", " ", " CCCCC ", " ", " ", " ", " CCCCC ", " ", " ", " ", " CCCCC ", " ", " ", " ", " CCCCC ", " ", " ", " ") + .aisle(" AAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAAAAA ", " BBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAABBBBBBBBBBBAACCCAAAAAAAAAAAAAAAAAAAAACCCAABBBBBBBBBBBAAAAA ", " DDD E E DDD ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D D E E EED D ", " D DAA E E AAD D ", " D D E E EED D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " DDD E E DDD ", " DDD E E DDD ", " DDD E E DDD ", " DDD E E DDD ", " DDD E E DDD ", " DDD E E DDD ", " ADDD E E DDDA ", " ADDD E E DDDA ", " ADDD E E DDDA ", " ADDD E E DDDA ", " ADDD E E DDDA ", " ADDD E E DDDA ", " ADDD E E DDDA ", " AADDD E E DDDAA ", " A ED E E DE A ", " A ED E E DE A ", " A ED E E DE A ", " A ED E E DE A ", " A ED E E DE A ", " ED E E DE ", " ED E E DE ", " E E E E ", " E E E E ", " E E E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ") + .aisle(" AAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAAAA ", " BBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAABBBBBBBBBACCCAAAAAAAAAAAAAAAAAAAAACCCABBBBBBBBBAAAA ", " ADDD DDDA ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A E A ", " A A A A ", " A E A ", " A A ", " A A ", " A A ", " ADDD DDDA ", " AADDD DDDAA ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAA ", " BBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAABBCBBBAACCCAAAAAAAAAAAAAAAAAAACCCAABBBCBBAAAA ", " DDD DDD ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D DE ED D ", " D DA AD D ", " D DE ED D ", " D D D D ", " D D D D ", " D D D D ", " DDD DDD ", " A A ", " A A ", " A A ", " A A ", " A E EE A ", " AA A A AA ", " A E EEA ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " CC CC ", " CC CC ", " CC CC ", " CC CC ", " CC CC ", " C C ", " C C ", " C C ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAA ", " BBBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AABCCBBBACCCCAAAAAAAAAAAAAAAAACCCCABBBCCBAA ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A E E A ", " A A A A ", " A E E A ", " A A ", " A A ", " A A ", " A A ", " A A ", " ", " ", " ", " EE EE ", " AA AA ", " EE EE ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " CC CC ", " CC CC ", " CC CC ", " CC CC ", " CCC CCC ", " CCC CCC ", " CCC CCC ", " CCC CCC ", " CC CC ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " BBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAABCCCBBAACCCCAAAAAAAAAAAAAAACCCCAABBCCCBAAA ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " EE EE ", " AA AA ", " EE EE ", " ", " ", " ", " ", " ", " ", " ", " ", " E EEE EEE E ", " A AAA AAA A ", " E EEE EEE E ", " CC CC ", " CC CC ", " CC CC ", " CC CC ", " CC CC ", " CC CC ", " CCC CCC ", " CCC CCC ", " CCC CCC ", " CCC CCC ", " CCC CCC ", " CCC CCC ", " CCC CCC ", " CC CC ", " CC CC ", " C C ", " C C ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " BBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAABBCCBBBACCCCCCAAAAAAAAAAACCCCCCABBBCCBBAAA ", " A FFFFF A ", " FFFFF ", " FFFFF ", " FFF ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E EEE EEE E ", " A AAA AAA A ", " E EEE EEE E ", " CC CC ", " CC CC ", " CC CC ", " CC CC ", " CC CC ", " CC CC ", " CCC CCC ", " CCC CCC ", " EECCCE ECCCEE ", " AACCCA ACCCAA ", " EECCCE ECCCEE ", " CCC CCC ", " CCC CCC ", " ACCC CCCA ", " ACCC CCCA ", " ACCC E E CCCA ", " ACCC E E CCCA ", " ACCC E E CCCA ", " ACCC E E CCCA ", " ACCC E E CCCA ", " ACC CCA ", " ACC CCA ", " AC CA ", " AC CA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBA ", " BBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAABBCCBCCAACCCCCCAAAAAAACCCCCCAACCBCCBBAAAA ", " AA CC EDCCCDE CC AA ", " CC EDCCCDE CC ", " CC EDCCCDE CC ", " CC EDCCCDE CC ", " CC EDCCCDE CC ", " CC EDCCCDE CC ", " CC EDCCCDE CC ", " CC EDCCCDE CC ", " CC EDCCCDE CC ", " CC EDCCCDE CC ", " CC EDCCCDE CC ", " CC EDCCCDE CC ", " CCC EDCCCDE CCC ", " CCC EDDCDDE CCC ", " EECCCE E DCD E ECCCEE ", " AACCCA E DCD E ACCCAA ", " EECCCE E DCD E ECCCEE ", " CCC E DCD E CCC ", " CCC E DDD E CCC ", " CCC E D E CCC ", " CCC E D E CCC ", " CCC E D E CCC ", " CCC E D E CCC ", " CCC E E CCC ", " CCC E E CCC ", " ECCCE E E ECCCE ", " ACCCA E E ACCCA ", " ECCCE E E ECCCE ", " ACCC E E CCCA ", " ACCC E E CCCA ", " ACCC E E CCCA ", " ACCC E E CCCA ", " ACCC E E CCCA ", " ACCC CCCA ", " ACCC CCCA ", " CCC CCC ", " CCC CCC ", " A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " BB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAABCCCCCBAAACCCCCCCCCCCCCCCAAABCCCCCBAAAAA ", " AA CCC CCCCCCC CCC AA ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " ECCCE CCCCCCC ECCCE ", " ACCCA CCCCC ACCCA ", " ECCCE CCCCC ECCCE ", " ACCC CCCCC CCCA ", " ACCC CCCCC CCCA ", " ACCC CCCCC CCCA ", " ACCC CCC CCCA ", " ACCC CCC CCCA ", " ACCC CCC CCCA ", " ACCC CCC CCCA ", " ACCC C CCCA ", " ECCCE C ECCCE ", " ACCCA C ACCCA ", " ECCCE C ECCCE ", " AA AA ", " AA AA ", " AAA AAA ", " AA AA ", " AA AA ", " AA AA ", " AA AA ", " A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBA ", " BBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAACCCCBBBBAAACCCCCCCCCCCAAABBBBCCCCAAAAA ", " DAA DCCC CCCCCCC CCCD AAD ", " DA DCCC CCCCCCC CCCD AD ", " D CCC CCCCCCC CCC D ", " D CCC CCCCCCC CCC D ", " D CCC CCCCCCC CCC D ", " D CCC CCCCCCC CCC D ", " D CCC CCCCCCC CCC D ", " DD CCC CCCCCCC CCC DD ", " D CCC CCCCCCC CCC D ", " DDCCC CCCCCCC CCCDD ", " DCCC CCCCCCC CCCD ", " DCCC CCCCCCC CCCD ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " ECCCE CCCCCCC ECCCE ", " ACCCA CCCCC ACCCA ", " ECCCE CCCCC ECCCE ", " AA CCCCC AA ", " AA CCC AA ", " AA CCC AA ", " AA CCC AA ", " A CCC A ", " A C A ", " A C A ", " A C A ", " EEE C EEE ", " AAA AAA ", " EEE EEE ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBA ", " BBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAACCCCCBBBBBAACCCCCCCCCAABBBBBCCCCCAAAAA ", " AAAAADD CCCCCCCC DDAAAAA ", " AAA DD CCCCCCCC DD AAA ", " AA CCCCCCCC AA ", " A CCCCCCCC A ", " A CCCCCCCC A ", " CCCCCCCC ", " CCCCCCCC ", " CCCCCCCC ", " CCCCCCCC ", " D CCCCCCCC D ", " D CCCCCCCC D ", " D CCCCCCC D ", " CCCCCCC ", " CCCCCCC ", " EEE EECCCCCCC EEE ", " AAA AAACCCCCAAA AAA ", " EEE EEECCCCC EEE ", " CCC ", " CCC ", " C ", " C ", " C ", " C ", " C ", " C ", " EEE EEE ", " AAA AAA ", " EEE EEE ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " BBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAACCCCCCCBBBBAACCCCCCCAABBBBCCCCCCCAAAA ", " AAAAA CCCCCCC AAAAA ", " AA CCCCCCC AA ", " AA CCCCCCC AA ", " A CCCCCCC A ", " A CCCCCCC A ", " A CCCCCCC A ", " A CCCCCCC A ", " D CCCCCCC D ", " D CCCCCCC D ", " D CCCCCCC D ", " CCCCCCC ", " CCCCCCC ", " CCCCCCC ", " CCCCCCC ", " EEE EE CCCCC EEE ", " AAA AA CCC AA AAA ", " EEE EE CCC EEE ", " CCC ", " CCC ", " ", " ", " ", " ", " ", " ", " EE EE ", " AA AA ", " EE EE ", " ", " ", " ", " ", " ", " DD DD ", " DD DD ", " DD DD ", " DD DD ", " DD DD ", " DD DD ", " DDD DDD ", " DDD DDD ", " DD DD ", " DD DD ", " DD DD ", " DD DD ", " DD DD ", " D D ", " D D ", " D D ", " D D ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " BB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAAAABBCCCBBBBACCCCCCCABBBBCCCBBAAAAAAA ", " AAAA CCCCCCC AAAA ", " AA CCCCCCC AA ", " AA CCCCCCC AA ", " AD CCCCCCC DA ", " AD CCCCCCC DA ", " D CCCCCCC D ", " D CCCCCCC D ", " D CCCCCCC D ", " CCCCCCC ", " CCCCCCC ", " CCCCCCC ", " CCCCC ", " CCCCC ", " CCCCC ", " EEEEE CCC EEE ", " AAAAA CCC AAAAA ", " EEEEE C EEE ", " C ", " ", " ", " ", " DD DD ", " DD DD ", " DD DD ", " DD DD ", " EDD DD ", " DD DD ", " EDD DD ", " DD DD ", " DD DD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " EDD DDE ", " EDD DDE ", " EDD DDE ", " EDD DDE ", " EDD DDE ", " EDD DDE ", " EDD DDE ", " EDD DDE ", " EDD DDE ", " EDD DDE ", " DD DD ", " DD DD ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAA ", " AAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAA ", " AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " AAAAAAABBCCCBBBACCCCCCCABBBCCCBBAAAAAAA ", " AAAA DDD CCCCCCC DDD AAAA ", " AA D D CCCCCCC D D AA ", " AD D D CCCCCCC D D DA ", " D D CCCCCCC D D ", " D D CCCCCCC D D ", " D D CCCCCCC D D ", " D D CCCCCCC D D ", " D D CCCCCCC D D ", " D D CCCCC D D ", " D D CCCCC D D ", " D D CCCCC D D ", " D D CCC D D ", " D D CCC D D ", " D D C D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " AADDD DDDAA ", " A ED DE A ", " A ED DE A ", " A ED DE A ", " A ED DE A ", " A ED DE A ", " ED DE ", " ED DE ", " E E ", " E E ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " A ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBA A ", " AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " AAAAAAABBBBBBBAACCCCCAABBBBBBBAAAAAAA ", " AAAA ADDD CCCCC DDDA AAAA ", " AD A CCCCC A DA ", " A CCCCC A ", " A CCCCC A ", " A CCCCC A ", " A CCCCC A ", " A CCCCC A ", " A CCCCC A ", " A CCC A ", " A CCC A ", " A C A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " ADDD DDDA ", " AADDD DDDAA ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " AAA BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB AAA ", " ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBA ", " AAAAAAAAABBBBBACCCCCABBBBBAAAAAAAAA ", " ADAA DDD CCCCC DDD AADA ", " D D CCCCC D D ", " D D CCCCC D D ", " D D CCCCC D D ", " D D CCCCC D D ", " D D CCCCC D D ", " D D CCCCC D D ", " D D CCCCC D D ", " D D CCC D D ", " D D C D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " DDD DDD ", " A A ", " A A ", " A A ", " A A ", " A A ", " AA AA ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAAA ", " ABB BBBB BBBBBBBBBBBBBBBBB BBBB BBA ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAAAAABBBBACCCCCABBBBAAAAAAAA ", " AAA A CCCCC A AAA ", " A CCCCC A ", " A CCCCC A ", " A CCCCC A ", " A CCCCC A ", " A CCC A ", " A CCC A ", " A CCC A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAA ", " BBBB B BBBBBBBBBBBBBBB B BBBB ", " BBBB BBBBBBBBBBBBBBBBB BBBB ", " AAAA ABBBBAACCCAABBBBA AAAA ", " CCC ", " CCC ", " CCC ", " CCC ", " CCC ", " CCC ", " CCC ", " C ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " BBBBBBBB BBBBBBBBBBBBBBB BBBBBBBB ", " BBBBBBBBBBBBBBBBB ", " ABBBBBACCCABBBBBA ", " CCC ", " CCC ", " CCC ", " CCC ", " CCC ", " C ", " C ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " BBBBBBB BBBBBBBBBBBBBBB BBBBBBB ", " BBBBBBBBBBBBBBBBB ", " AABBBBACCCABBBBAA ", " CCC ", " CCC ", " C ", " C ", " C ", " C ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAAABBBBBBBBBBBBBBBBBBBBBBBBBAAAA ", " BBBBB BBBBBBBBBBBBB BBBBB ", " BBBBBBBBBBBBBBB ", " ABBBBAACAABBBBA ", " C ", " C ", " C ", " C ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAABBBBBBBBBBBBBBBBBBBBBAAA ", " BBB BBBBBBBBBBBBB BBB ", " BBBBBBBBBBBBBBB ", " ABBBBBACABBBBBA ", " C ", " C ", " C ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBBBAA ", " BB BBBBBBBBBBBBB BB ", " BBBBBBBBBBBBBBB ", " AABBBBACABBBBAA ", " C ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBAA ", " BB BBBBBBBBBBB BB ", " BBBBBBBBBBBBB ", " ABBBBAAABBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBBBBBBBA ", " BB BBBBBBBBBBB BB ", " BBBBBBBBBBBBB ", " ABBBBBABBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBAA ", " B BBBBBBBBBBB B ", " BBBBBBBBBBBBB ", " ABBBBBABBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBBBBBA ", " BBBBBBBBBBBBBBB ", " BBBBBBBBBBBBB ", " AABBBBBBBBBAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBAA ", " B BBBBBBBBB B ", " BBBBBBBBBBB ", " ABBBBBBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBBBA ", " B BBBBBBBBB B ", " BBBBBBBBBBB ", " ABBBBBBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBBBA ", " B BBBBBBBBB B ", " BBBBBBBBBBB ", " ABBBBBBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBBBA ", " BBBBBBBBBBBBB ", " BBBBBBBBBBB ", " AABBBBBBBAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBAA ", " B BBBBBBB B ", " BBBBBBBBB ", " ABBBBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBA ", " B BBBBBBB B ", " BBBBBBBBB ", " ABBBBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBA ", " B BBBBBBB B ", " BBBBBBBBB ", " ABBBBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBA ", " B BBBBBBB B ", " BBBBBBBBB ", " ABBBBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBA ", " BBBBBBBBBBB ", " BBBBBBBBB ", " AABBBBBAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBAA ", " B BBBBB B ", " BBBBBBB ", " ABBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBA ", " B BBBBB B ", " BBBBBBB ", " ABBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBA ", " B BBBBB B ", " BBBBBBB ", " ABBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBA ", " B BBBBB B ", " BBBBBBB ", " AABBBAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBA ", " BB BBB BB ", " BBBBB ", " ABBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBAA ", " B BBB B ", " BBBBB ", " AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBA ", " BB B BB ", " BBB ", " ABA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBA ", " BB B BB ", " BBB ", " AAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBAA ", " BB BB ", " B ", " A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBA ", " BB BB ", " B ", " A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBAA ", " BBB ", " A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBA ", " BBB ", " A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBA ", " BBB ", " A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABAA ", " A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABA ", " A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABA ", " A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + // spotless:on + .where(' ', any()) + .where("Q", controller(blocks(definition.getBlock()))) + .where('F', blocks(RIGID_HIGH_SPEED_STEEL_CASING.get()) + .or(Predicates.abilities(PartAbility.EXPORT_ITEMS).setMaxGlobalLimited(16)) + .or(Predicates.abilities(PartAbility.EXPORT_FLUIDS).setMaxGlobalLimited(16)) + .or(Predicates.abilities(PartAbility.INPUT_ENERGY).setMaxGlobalLimited(2)) + .or(Predicates.abilities(PartAbility.INPUT_LASER).setMaxGlobalLimited(1)) + .or(Predicates.abilities(PartAbility.OUTPUT_LASER).setMaxGlobalLimited(1)) + .or(Predicates.abilities(PartAbility.IMPORT_FLUIDS).setMaxGlobalLimited(16)) + .or(Predicates.abilities(PartAbility.IMPORT_ITEMS).setMaxGlobalLimited(16))) + .where('C', blocks(RIGID_HIGH_SPEED_STEEL_CASING.get())) + .where('D', blocks(BOLTED_HEAVY_FRAME_CASING.get())) + .where('B', blocks(GTBlocks.DARK_CONCRETE.get())) + .where('E', frames(GTMaterials.TungstenSteel)) + .where('A', blocks(SUPERHEAVY_STEEL_CASING.get())) + .build()) + .model(createWorkableCasingMachineModel( + CosmicCore.id("block/casings/solid/rigid_high_speed_steel_casing"), + GTCEu.id("block/multiblock/generator/large_gas_turbine")) + .andThen(model -> model.addDynamicRenderer(CosmicDynamicRenderHelpers::getStarLadderRender))) + + .hasBER(true) + .tooltips(Component.translatable("cosmiccore.multiblock.star_ladder.tooltip.0"), + Component.translatable("cosmiccore.multiblock.star_ladder.tooltip.1"), + Component.translatable("cosmiccore.multiblock.star_ladder.tooltip.2"), + Component.translatable("cosmiccore.multiblock.star_ladder.tooltip.3")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/StarLadderResearchHub.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/StarLadderResearchHub.java new file mode 100644 index 000000000..400deec2c --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/StarLadderResearchHub.java @@ -0,0 +1,1091 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.StarLadderResearchHubMachine; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.BlockPattern; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.MultiblockShapeInfo; +import com.gregtechceu.gtceu.api.pattern.TraceabilityPredicate; +import com.gregtechceu.gtceu.common.data.GTMachines; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.Direction; +import net.minecraft.network.chat.Component; +import net.minecraft.world.level.block.Blocks; + +import java.util.ArrayList; +import java.util.List; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.models.GTMachineModels.createWorkableCasingMachineModel; + +/** + * Star Ladder Research Hub multiblock definition. + * + * LEGEND: + * ' ' (space) = Air/ANY + * '@' = Controller area (hatches/buses allowed) + * '#' = Controller position + * A = cosmiccore:superheavy_steel_casing + * B = cosmiccore:bolted_heavy_frame_casing + * C = cosmiccore:somarust_casing + * D = cosmiccore:soul_muted_casing + * E = cosmiccore:bichromal_nevramite_casing (T1+) + * F = cosmiccore:oscillating_gilded_pthanterum_casings (T2+) + * G = cosmiccore:highly_flexible_reinforced_trinavine_casing (T2+) + * H = cosmiccore:royal_ichorium_casing (T3+) + * I = cosmiccore:multi_purpose_interstellar_grade_casing (T3+) + * J = cosmiccore:ultra_powered_casing (T3+) + */ +public class StarLadderResearchHub { + + public final static MultiblockMachineDefinition STAR_LADDER_RESEARCH_HUB = REGISTRATE + .multiblock("star_ladder_research_hub", StarLadderResearchHubMachine::new) + .langValue("Star Ladder Research Hub") + .tooltips( + Component.literal("Remote research station for the Star Ladder"), + Component.literal("Link to a Star Ladder using a datastick"), + Component.literal("Build larger structures to increase tier (T0-T3)"), + Component.literal("Do NOT use the terminal to automatically build"), + Component.literal( + "Use the Inbuilt multiblock build system (Screwdriver) otherwise you'll experience wrong block placement"), + Component.literal("TODO: ACTUAL LANG KEYS LMAO") + .withStyle(ChatFormatting.RED)) + .rotationState(RotationState.NON_Y_AXIS) + .allowExtendedFacing(false) + .recipeType(CosmicRecipeTypes.STAR_LADDER_RESEARCH) + .appearanceBlock(CosmicBlocks.SUPERHEAVY_STEEL_CASING) + .pattern(definition -> tier0Pattern() + .where(' ', any()) + .where('@', hatchSlot()) + .where('#', controller(blocks(definition.getBlock()))) + .where('A', blocks(CosmicBlocks.SUPERHEAVY_STEEL_CASING.get())) + .where('B', blocks(CosmicBlocks.BOLTED_HEAVY_FRAME_CASING.get())) + .where('C', blocks(CosmicBlocks.SOMARUST_CASING.get())) + .where('D', blocks(CosmicBlocks.SOUL_MUTED_CASING.get())) + .build()) + .shapeInfos(definition -> { + List shapeInfos = new ArrayList<>(); + shapeInfos.add(tier0ShapeInfo(definition) + .where(' ', Blocks.AIR.defaultBlockState()) + .where('@', GTMachines.ENERGY_INPUT_HATCH[3], Direction.NORTH) + .where('#', definition, Direction.NORTH) + .where('A', CosmicBlocks.SUPERHEAVY_STEEL_CASING.getDefaultState()) + .where('B', CosmicBlocks.BOLTED_HEAVY_FRAME_CASING.getDefaultState()) + .where('C', CosmicBlocks.SOMARUST_CASING.getDefaultState()) + .where('D', CosmicBlocks.SOUL_MUTED_CASING.getDefaultState()) + .build()); + + // T1 preview + shapeInfos.add(tier1ShapeInfo(definition) + .where(' ', Blocks.AIR.defaultBlockState()) + .where('@', GTMachines.ENERGY_INPUT_HATCH[4], Direction.NORTH) + .where('#', definition, Direction.NORTH) + .where('A', CosmicBlocks.SUPERHEAVY_STEEL_CASING.getDefaultState()) + .where('B', CosmicBlocks.BOLTED_HEAVY_FRAME_CASING.getDefaultState()) + .where('C', CosmicBlocks.SOMARUST_CASING.getDefaultState()) + .where('D', CosmicBlocks.SOUL_MUTED_CASING.getDefaultState()) + .where('E', CosmicBlocks.BICHROMAL_NEVRAMITE_CASING.getDefaultState()) + .build()); + + // T2 preview + shapeInfos.add(tier2ShapeInfo(definition) + .where(' ', Blocks.AIR.defaultBlockState()) + .where('@', GTMachines.ENERGY_INPUT_HATCH[5], Direction.NORTH) + .where('#', definition, Direction.NORTH) + .where('A', CosmicBlocks.SUPERHEAVY_STEEL_CASING.getDefaultState()) + .where('B', CosmicBlocks.BOLTED_HEAVY_FRAME_CASING.getDefaultState()) + .where('C', CosmicBlocks.SOMARUST_CASING.getDefaultState()) + .where('D', CosmicBlocks.SOUL_MUTED_CASING.getDefaultState()) + .where('E', CosmicBlocks.BICHROMAL_NEVRAMITE_CASING.getDefaultState()) + .where('F', CosmicBlocks.OSCILLATING_GILDED_PTHANTERUM_CASING.getDefaultState()) + .where('G', CosmicBlocks.HIGHLY_FLEXIBLE_REINFORCED_TRINAVINE_CASING.getDefaultState()) + .build()); + + // T3 preview + shapeInfos.add(tier3ShapeInfo(definition) + .where(' ', Blocks.AIR.defaultBlockState()) + .where('@', GTMachines.ENERGY_INPUT_HATCH[6], Direction.NORTH) + .where('#', definition, Direction.NORTH) + .where('A', CosmicBlocks.SUPERHEAVY_STEEL_CASING.getDefaultState()) + .where('B', CosmicBlocks.BOLTED_HEAVY_FRAME_CASING.getDefaultState()) + .where('C', CosmicBlocks.SOMARUST_CASING.getDefaultState()) + .where('D', CosmicBlocks.SOUL_MUTED_CASING.getDefaultState()) + .where('E', CosmicBlocks.BICHROMAL_NEVRAMITE_CASING.getDefaultState()) + .where('F', CosmicBlocks.OSCILLATING_GILDED_PTHANTERUM_CASING.getDefaultState()) + .where('G', CosmicBlocks.HIGHLY_FLEXIBLE_REINFORCED_TRINAVINE_CASING.getDefaultState()) + .where('H', CosmicBlocks.ROYAL_ICHORIUM_CASING.getDefaultState()) + .where('I', CosmicBlocks.MULTIPURPOSE_INTERSTELLAR_GRADE_CASING.getDefaultState()) + .where('J', CosmicBlocks.ULTRA_POWERED_CASING.getDefaultState()) + .build()); + + return shapeInfos; + }) + .model( + createWorkableCasingMachineModel( + CosmicCore.id("block/casings/solid/superheavy_steel_casing"), + CosmicCore.id("block/multiblock/mantle_bore"))) + .register(); + + public static void init() {} + + private static TraceabilityPredicate controllerSlot() { + return blocks(STAR_LADDER_RESEARCH_HUB.getBlock()); + } + + private static TraceabilityPredicate hatchSlot() { + return blocks(CosmicBlocks.SUPERHEAVY_STEEL_CASING.get()) + .or(abilities(PartAbility.INPUT_ENERGY).setMinGlobalLimited(1).setMaxGlobalLimited(2)) + .or(abilities(PartAbility.MAINTENANCE).setExactLimit(1)) + .or(abilities(PartAbility.IMPORT_ITEMS).setMaxGlobalLimited(4)) + .or(abilities(PartAbility.EXPORT_ITEMS).setMaxGlobalLimited(4)) + .or(abilities(PartAbility.IMPORT_FLUIDS).setMaxGlobalLimited(4)) + .or(abilities(PartAbility.EXPORT_FLUIDS).setMaxGlobalLimited(4)); + } + + public static BlockPattern buildT0Pattern() { + return tier0Pattern() + .where(' ', any()) + .where('@', hatchSlot()) + .where('#', controller(controllerSlot())) + .where('A', blocks(CosmicBlocks.SUPERHEAVY_STEEL_CASING.get())) + .where('B', blocks(CosmicBlocks.BOLTED_HEAVY_FRAME_CASING.get())) + .where('C', blocks(CosmicBlocks.SOMARUST_CASING.get())) + .where('D', blocks(CosmicBlocks.SOUL_MUTED_CASING.get())) + .build(); + } + + public static BlockPattern buildT1Pattern() { + return tier1Pattern() + .where(' ', any()) + .where('@', hatchSlot()) + .where('#', controller(controllerSlot())) + .where('A', blocks(CosmicBlocks.SUPERHEAVY_STEEL_CASING.get())) + .where('B', blocks(CosmicBlocks.BOLTED_HEAVY_FRAME_CASING.get())) + .where('C', blocks(CosmicBlocks.SOMARUST_CASING.get())) + .where('D', blocks(CosmicBlocks.SOUL_MUTED_CASING.get())) + .where('E', blocks(CosmicBlocks.BICHROMAL_NEVRAMITE_CASING.get())) + .build(); + } + + public static BlockPattern buildT2Pattern() { + return tier2Pattern() + .where(' ', any()) + .where('@', hatchSlot()) + .where('#', controller(controllerSlot())) + .where('A', blocks(CosmicBlocks.SUPERHEAVY_STEEL_CASING.get())) + .where('B', blocks(CosmicBlocks.BOLTED_HEAVY_FRAME_CASING.get())) + .where('C', blocks(CosmicBlocks.SOMARUST_CASING.get())) + .where('D', blocks(CosmicBlocks.SOUL_MUTED_CASING.get())) + .where('E', blocks(CosmicBlocks.BICHROMAL_NEVRAMITE_CASING.get())) + .where('F', blocks(CosmicBlocks.OSCILLATING_GILDED_PTHANTERUM_CASING.get())) + .where('G', blocks(CosmicBlocks.HIGHLY_FLEXIBLE_REINFORCED_TRINAVINE_CASING.get())) + .build(); + } + + public static BlockPattern buildT3Pattern() { + return tier3Pattern() + .where(' ', any()) + .where('@', hatchSlot()) + .where('#', controller(controllerSlot())) + .where('A', blocks(CosmicBlocks.SUPERHEAVY_STEEL_CASING.get())) + .where('B', blocks(CosmicBlocks.BOLTED_HEAVY_FRAME_CASING.get())) + .where('C', blocks(CosmicBlocks.SOMARUST_CASING.get())) + .where('D', blocks(CosmicBlocks.SOUL_MUTED_CASING.get())) + .where('E', blocks(CosmicBlocks.BICHROMAL_NEVRAMITE_CASING.get())) + .where('F', blocks(CosmicBlocks.OSCILLATING_GILDED_PTHANTERUM_CASING.get())) + .where('G', blocks(CosmicBlocks.HIGHLY_FLEXIBLE_REINFORCED_TRINAVINE_CASING.get())) + .where('H', blocks(CosmicBlocks.ROYAL_ICHORIUM_CASING.get())) + .where('I', blocks(CosmicBlocks.MULTIPURPOSE_INTERSTELLAR_GRADE_CASING.get())) + .where('J', blocks(CosmicBlocks.ULTRA_POWERED_CASING.get())) + .build(); + } + + // spotless:off + + private static FactoryBlockPattern tier0Pattern() { + return FactoryBlockPattern.start() + .aisle(" ", " ", " A ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " A ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " AAA AAA ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " AA AA AAAA AAAA AA AA ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " AA AAAA ACCCA AAAA AA ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " AABA ACCCA ABAA ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " AABABA ACCCA ABABAA ", " ", " ", " ", " ", " ") + .aisle(" DD DD ", " D D ", " D BAB D ", " AA ABABAD ACCCA DABABA AA ", " D D ", " D D ", " DD DD ", " ", " ") + .aisle(" DD DD ", " ", " BAB ", " A ABABA ACCCA ABABA A ", " ", " ", " DD DD ", " ", " ") + .aisle(" DD DD ", " AAAAA ", " BAB ", " AA ABABA ACCCA ABABA AA ", " ", " AAAAA ", " DD DD ", " ", " ") + .aisle(" D D ", " D AAAAAAAAA D ", " D BBBBB D ", " AA DABABA BBBBB ABABAD AA ", " D BBBBB D ", " D AAAAAAAAA D ", " D D D D ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAA ", " BBBBBBBBB ", " A ABABBBBBBBBBBBBBABA A ", " BBBBBBBBB ", " AAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBB ", " A ABABBBBBBBBBBBABA A ", " BBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBBBB ", " AA BBBBBBBBBBBBBBB AA ", " BBBBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " CDCDC ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " A BBBBBBBBBBBBBBB A ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DCDCDCD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " A BBBBBBBBBBBBBBB A ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DDCDCDCDD ", " D D ", " D D ") + .aisle(" ", " AAAAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBBBB ", " AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCC@@@CCCC ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " CCCCCCBBBBBBBBBBBBBBBBBCCCCCC ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDD@@@@@DDDDDD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAAAA ", "AAAAAAAAAAAABBBBBBBBBBBBBBBBBAAAAAAAAAAA", " CCCCCCBBBBBBBBBBBBBBBBBCCCCCC ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCCC@@#@@CCCCC ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " CCCCCCBBBBBBBBBBBBBBBBBCCCCCC ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDD@@@@@DDDDDD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBBBB ", " AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCC@@@CCCC ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " A BBBBBBBBBBBBBBB A ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DDCDCDCDD ", " D D ", " D D ") + .aisle(" ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " A BBBBBBBBBBBBBBB A ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DCDCDCD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBBBB ", " AA BBBBBBBBBBBBBBB AA ", " BBBBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " CDCDC ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBB ", " A ABABBBBBBBBBBBABA A ", " BBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAA ", " BBBBBBBBB ", " A ABABBBBBBBBBBBBBABA A ", " BBBBBBBBB ", " AAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" D D ", " D AAAAAAAAA D ", " D BBBBB D ", " AA DABABA BBBBB ABABAD AA ", " D BBBBB D ", " D AAAAAAAAA D ", " D D D D ", " ", " ") + .aisle(" DD DD ", " AAAAA ", " BAB ", " AA ABABA ACCCA ABABA AA ", " ", " AAAAA ", " DD DD ", " ", " ") + .aisle(" DD DD ", " ", " BAB ", " A ABABA ACCCA ABABA A ", " ", " ", " DD DD ", " ", " ") + .aisle(" DD DD ", " D D ", " D BAB D ", " AA ABABAD ACCCA DABABA AA ", " D D ", " D D ", " DD DD ", " ", " ") + .aisle(" ", " ", " BAB ", " AABABA ACCCA ABABAA ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " AABA ACCCA ABAA ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " AA AAAA ACCCA AAAA AA ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " AA AA AAAA AAAA AA AA ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " AAA AAA ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " A ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " A ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " A ", " ", " ", " ", " ", " ", " ") + ; + } + + private static MultiblockShapeInfo.ShapeInfoBuilder tier0ShapeInfo(MultiblockMachineDefinition definition) { + return MultiblockShapeInfo.builder() + .aisle(" ", " ", " A ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " A ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " AAA AAA ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " AA AA AAAA AAAA AA AA ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " AA AAAA ACCCA AAAA AA ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " AABA ACCCA ABAA ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " AABABA ACCCA ABABAA ", " ", " ", " ", " ", " ") + .aisle(" DD DD ", " D D ", " D BAB D ", " AA ABABAD ACCCA DABABA AA ", " D D ", " D D ", " DD DD ", " ", " ") + .aisle(" DD DD ", " ", " BAB ", " A ABABA ACCCA ABABA A ", " ", " ", " DD DD ", " ", " ") + .aisle(" DD DD ", " AAAAA ", " BAB ", " AA ABABA ACCCA ABABA AA ", " ", " AAAAA ", " DD DD ", " ", " ") + .aisle(" D D ", " D AAAAAAAAA D ", " D BBBBB D ", " AA DABABA BBBBB ABABAD AA ", " D BBBBB D ", " D AAAAAAAAA D ", " D D D D ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAA ", " BBBBBBBBB ", " A ABABBBBBBBBBBBBBABA A ", " BBBBBBBBB ", " AAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBB ", " A ABABBBBBBBBBBBABA A ", " BBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBBBB ", " AA BBBBBBBBBBBBBBB AA ", " BBBBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " CDCDC ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " A BBBBBBBBBBBBBBB A ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DCDCDCD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " A BBBBBBBBBBBBBBB A ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DDCDCDCDD ", " D D ", " D D ") + .aisle(" ", " AAAAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBBBB ", " AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCC@@@CCCC ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " CCCCCCBBBBBBBBBBBBBBBBBCCCCCC ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDD@@@@@DDDDDD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAAAA ", "AAAAAAAAAAAABBBBBBBBBBBBBBBBBAAAAAAAAAAA", " CCCCCCBBBBBBBBBBBBBBBBBCCCCCC ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCCC@@#@@CCCCC ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " CCCCCCBBBBBBBBBBBBBBBBBCCCCCC ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDD@@@@@DDDDDD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBBBB ", " AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCC@@@CCCC ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " A BBBBBBBBBBBBBBB A ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DDCDCDCDD ", " D D ", " D D ") + .aisle(" ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " A BBBBBBBBBBBBBBB A ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DCDCDCD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBBBB ", " AA BBBBBBBBBBBBBBB AA ", " BBBBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " CDCDC ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBB ", " A ABABBBBBBBBBBBABA A ", " BBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAA ", " BBBBBBBBB ", " A ABABBBBBBBBBBBBBABA A ", " BBBBBBBBB ", " AAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" D D ", " D AAAAAAAAA D ", " D BBBBB D ", " AA DABABA BBBBB ABABAD AA ", " D BBBBB D ", " D AAAAAAAAA D ", " D D D D ", " ", " ") + .aisle(" DD DD ", " AAAAA ", " BAB ", " AA ABABA ACCCA ABABA AA ", " ", " AAAAA ", " DD DD ", " ", " ") + .aisle(" DD DD ", " ", " BAB ", " A ABABA ACCCA ABABA A ", " ", " ", " DD DD ", " ", " ") + .aisle(" DD DD ", " D D ", " D BAB D ", " AA ABABAD ACCCA DABABA AA ", " D D ", " D D ", " DD DD ", " ", " ") + .aisle(" ", " ", " BAB ", " AABABA ACCCA ABABAA ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " AABA ACCCA ABAA ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " AA AAAA ACCCA AAAA AA ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " AA AA AAAA AAAA AA AA ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " AAA AAA ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " A ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " A ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " A ", " ", " ", " ", " ", " ", " ") + ; + } + private static FactoryBlockPattern tier1Pattern() { + return FactoryBlockPattern.start() + .aisle(" ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDADD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DBABD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDBABDD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDCBABCDD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCCBABCCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCCBABCCD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCCBABCCD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCCBABCCD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDCCBABCCDD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDCACBABCACDD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " A A ", " A A ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " A A ", " A A ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " AAA EEE AAA ", " ", " ", " A A ", " ", " ") + .aisle(" ", " ", " D BAB D ", " AA AA AAAAEEEAAAA AA AA ", " ", " ", " A A ", " ", " ") + .aisle(" ", " ", " D BAB D ", " AA AAAA ACCCA AAAA AA ", " ", " ", " A A ", " ", " ") + .aisle(" ", " ", " BAB ", " AABA ACCCA ABAA ", " ", " ", " A A ", " ", " ") + .aisle(" ", " ", " BAB ", " AABABA ACCCA ABABAA ", " ", " ", " A A ", " ", " ") + .aisle(" DD DD ", " D D ", " D BAB D ", " AA ABABAD ACCCA DABABA AA ", " D D ", " D D ", " DD A A DD ", " ", " ") + .aisle(" DD DD ", " ", " BAB ", " A ABABA ACCCA ABABA A ", " ", " ", " DD A A DD ", " ", " ") + .aisle(" DD DD ", " AAAAA ", " BAB ", " AA ABABA ACCCA ABABA AA ", " ", " AAAAA ", " DD A A DD ", " ", " ") + .aisle(" D D ", " D AAAAAAAAA D ", " D BBBBB D ", " AA DABABA BBBBB ABABAD AA ", " D BBBBB D ", " D AAAAAAAAA D ", " D D D D ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAA ", " BBBBBBBBB ", " A ABABBBBBBBBBBBBBABA A ", " BBBBBBBBB ", " AAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAA ", " DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD ", " A ABABBBBBBBBBBBABA A ", " BBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAA ", " DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD ", " AA BBBBBBBBBBBBBBB AA ", " BBBBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " CDCDC ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD ", " A BBBBBBBBBBBBBBB A ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DCDCDCD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAA ", " DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD ", " A BBBBBBBBBBBBBBB A ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DDCDCDCDD ", " D D ", " D D ") + .aisle(" ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD ", " EEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEE ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCC@@@CCCC ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD ", " EEEEEEE EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE EEEEEEE ", " A BBBBBBBBBBBBBBBBB A ", " AA AAAAAAAAAAAAAAAAAAA AA ", " AAAAAAAAADDDDDD@@@@@DDDDDDAAAAAAAAA ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAAAA ", "DDDDDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDDDD", " EEEEEEEEEEEE EEEEEEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEEEEEE EEEEEEEEEEEE ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCCC@@#@@CCCCC ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD ", " EEEEEEE EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE EEEEEEE ", " A BBBBBBBBBBBBBBBBB A ", " AA AAAAAAAAAAAAAAAAAAA AA ", " AAAAAAAAADDDDDD@@@@@DDDDDDAAAAAAAAA ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD ", " EEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEE ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCC@@@CCCC ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAA ", " DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD ", " A BBBBBBBBBBBBBBB A ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DDCDCDCDD ", " D D ", " D D ") + .aisle(" ", " AAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD ", " A BBBBBBBBBBBBBBB A ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DCDCDCD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAA ", " DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD ", " AA BBBBBBBBBBBBBBB AA ", " BBBBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " CDCDC ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAA ", " DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD ", " A ABABBBBBBBBBBBABA A ", " BBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAA ", " BBBBBBBBB ", " A ABABBBBBBBBBBBBBABA A ", " BBBBBBBBB ", " AAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" D D ", " D AAAAAAAAA D ", " D BBBBB D ", " AA DABABA BBBBB ABABAD AA ", " D BBBBB D ", " D AAAAAAAAA D ", " D D D D ", " ", " ") + .aisle(" DD DD ", " AAAAA ", " BAB ", " AA ABABA ACCCA ABABA AA ", " ", " AAAAA ", " DD A A DD ", " ", " ") + .aisle(" DD DD ", " ", " BAB ", " A ABABA ACCCA ABABA A ", " ", " ", " DD A A DD ", " ", " ") + .aisle(" DD DD ", " D D ", " D BAB D ", " AA ABABAD ACCCA DABABA AA ", " D D ", " D D ", " DD A A DD ", " ", " ") + .aisle(" ", " ", " BAB ", " AABABA ACCCA ABABAA ", " ", " ", " A A ", " ", " ") + .aisle(" ", " ", " BAB ", " AABA ACCCA ABAA ", " ", " ", " A A ", " ", " ") + .aisle(" ", " ", " D BAB D ", " AA AAAA ACCCA AAAA AA ", " ", " ", " A A ", " ", " ") + .aisle(" ", " ", " D BAB D ", " AA AA AAAAEEEAAAA AA AA ", " ", " ", " A A ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " AAA EEE AAA ", " ", " ", " A A ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " A A ", " A A ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " A A ", " A A ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDCACBABCACDD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDCCBABCCDD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCCBABCCD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCCBABCCD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCCBABCCD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCCBABCCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDCBABCDD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDBABDD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DBABD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDADD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " D ", " ", " ", " ", " ", " ", " ") + ; + } + + private static MultiblockShapeInfo.ShapeInfoBuilder tier1ShapeInfo(MultiblockMachineDefinition definition) { + return MultiblockShapeInfo.builder() + .aisle(" ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDADD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DBABD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDBABDD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDCBABCDD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCCBABCCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCCBABCCD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCCBABCCD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCCBABCCD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDCCBABCCDD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDCACBABCACDD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " A A ", " A A ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " A A ", " A A ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " AAA EEE AAA ", " ", " ", " A A ", " ", " ") + .aisle(" ", " ", " D BAB D ", " AA AA AAAAEEEAAAA AA AA ", " ", " ", " A A ", " ", " ") + .aisle(" ", " ", " D BAB D ", " AA AAAA ACCCA AAAA AA ", " ", " ", " A A ", " ", " ") + .aisle(" ", " ", " BAB ", " AABA ACCCA ABAA ", " ", " ", " A A ", " ", " ") + .aisle(" ", " ", " BAB ", " AABABA ACCCA ABABAA ", " ", " ", " A A ", " ", " ") + .aisle(" DD DD ", " D D ", " D BAB D ", " AA ABABAD ACCCA DABABA AA ", " D D ", " D D ", " DD A A DD ", " ", " ") + .aisle(" DD DD ", " ", " BAB ", " A ABABA ACCCA ABABA A ", " ", " ", " DD A A DD ", " ", " ") + .aisle(" DD DD ", " AAAAA ", " BAB ", " AA ABABA ACCCA ABABA AA ", " ", " AAAAA ", " DD A A DD ", " ", " ") + .aisle(" D D ", " D AAAAAAAAA D ", " D BBBBB D ", " AA DABABA BBBBB ABABAD AA ", " D BBBBB D ", " D AAAAAAAAA D ", " D D D D ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAA ", " BBBBBBBBB ", " A ABABBBBBBBBBBBBBABA A ", " BBBBBBBBB ", " AAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAA ", " DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD ", " A ABABBBBBBBBBBBABA A ", " BBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAA ", " DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD ", " AA BBBBBBBBBBBBBBB AA ", " BBBBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " CDCDC ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD ", " A BBBBBBBBBBBBBBB A ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DCDCDCD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAA ", " DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD ", " A BBBBBBBBBBBBBBB A ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DDCDCDCDD ", " D D ", " D D ") + .aisle(" ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD ", " EEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEE ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCC@@@CCCC ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD ", " EEEEEEE EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE EEEEEEE ", " A BBBBBBBBBBBBBBBBB A ", " AA AAAAAAAAAAAAAAAAAAA AA ", " AAAAAAAAADDDDDD@@@@@DDDDDDAAAAAAAAA ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAAAA ", "DDDDDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDDDD", " EEEEEEEEEEEE EEEEEEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEEEEEE EEEEEEEEEEEE ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCCC@@#@@CCCCC ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD ", " EEEEEEE EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE EEEEEEE ", " A BBBBBBBBBBBBBBBBB A ", " AA AAAAAAAAAAAAAAAAAAA AA ", " AAAAAAAAADDDDDD@@@@@DDDDDDAAAAAAAAA ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD ", " EEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEE ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCC@@@CCCC ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAA ", " DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD ", " A BBBBBBBBBBBBBBB A ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DDCDCDCDD ", " D D ", " D D ") + .aisle(" ", " AAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD ", " A BBBBBBBBBBBBBBB A ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DCDCDCD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAA ", " DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD ", " AA BBBBBBBBBBBBBBB AA ", " BBBBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " CDCDC ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAA ", " DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD ", " A ABABBBBBBBBBBBABA A ", " BBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAA ", " BBBBBBBBB ", " A ABABBBBBBBBBBBBBABA A ", " BBBBBBBBB ", " AAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" D D ", " D AAAAAAAAA D ", " D BBBBB D ", " AA DABABA BBBBB ABABAD AA ", " D BBBBB D ", " D AAAAAAAAA D ", " D D D D ", " ", " ") + .aisle(" DD DD ", " AAAAA ", " BAB ", " AA ABABA ACCCA ABABA AA ", " ", " AAAAA ", " DD A A DD ", " ", " ") + .aisle(" DD DD ", " ", " BAB ", " A ABABA ACCCA ABABA A ", " ", " ", " DD A A DD ", " ", " ") + .aisle(" DD DD ", " D D ", " D BAB D ", " AA ABABAD ACCCA DABABA AA ", " D D ", " D D ", " DD A A DD ", " ", " ") + .aisle(" ", " ", " BAB ", " AABABA ACCCA ABABAA ", " ", " ", " A A ", " ", " ") + .aisle(" ", " ", " BAB ", " AABA ACCCA ABAA ", " ", " ", " A A ", " ", " ") + .aisle(" ", " ", " D BAB D ", " AA AAAA ACCCA AAAA AA ", " ", " ", " A A ", " ", " ") + .aisle(" ", " ", " D BAB D ", " AA AA AAAAEEEAAAA AA AA ", " ", " ", " A A ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " AAA EEE AAA ", " ", " ", " A A ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " A A ", " A A ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " A A ", " A A ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDCACBABCACDD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDCCBABCCDD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCCBABCCD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCCBABCCD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCCBABCCD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCCBABCCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDCBABCDD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDBABDD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DBABD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDADD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " D ", " ", " ", " ", " ", " ", " ") + ; + } + + private static FactoryBlockPattern tier2Pattern() { + return FactoryBlockPattern.start() + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DDD ", " ", " ", " ", " DDD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DDADD ", " ", " ", " ", " DDADD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DBABD ", " ", " ", " ", " DBABD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " ", " ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " ", " ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " ", " ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DDBABDD ", " ", " ", " ", " DDBABDD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " ", " ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " ", " ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " ", " ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " ", " ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " ", " ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DDCBABCDD ", " ", " ", " ", " DDCBABCDD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCCBABCCD ", " ", " ", " ", " DCCBABCCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DCCBABCCD ", " ", " ", " ", " DCCBABCCD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFFFFFF ", " DCCBABCCD ", " ", " ", " ", " DCCBABCCD ", " FFFFFFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFF FFFFF ", " DCCBABCCD ", " ", " ", " ", " DCCBABCCD ", " FFFFF FFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FF FF ", " DDCCBABCCDD ", " ", " ", " ", " DDCCBABCCDD ", " FF FF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFF FFF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FFF FFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FF FFFFFEFFFFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFFFFEFFFFF FF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FF FFFFF E FFFFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFFFF E FFFFF FF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FF FFFF E FFFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFFF E FFFF FF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FF FFF E FFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFF E FFF FF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFF EEE FFFFF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FFFFF EEE FFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GG GG ", " FFFF EEE FFFF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FFFF EEE FFFF ", " GG GG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GGGA AGGG ", " FFF EEE FFF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FFF EEE FFF ", " GGGA AGGG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GGGAA AAGGG ", " FF FFFEEEFFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFFEEEFFF FF ", " GGGAA AAGGG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGGGA AGGGGA ", " FF FFFFFFEEEFFFFFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFFFFFEEEFFFFFF FF ", " AGGGGA AGGGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGAGGA AGGAGA ", " FF FFFFFFFFEEEFFFFFFFF FF ", " DDCACBABCACDD ", " ", " ", " ", " DDCACBABCACDD ", " FF FFFFFFFFEEEFFFFFFFF FF ", " AGAGGA AGGAGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFFFFFFEEEFFFFFFFFFF FF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FF FFFFFFFFFFEEEFFFFFFFFFF FF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFFFFF EEEEE FFFFFFFFF FF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FF FFFFFFFFF EEEEE FFFFFFFFF FF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFF EEEEE FFFFFF FF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FF FFFFFF EEEEE FFFFFF FF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFF FFFF EEEEE FFFF FFF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FFF FFFF EEEEE FFFF FFF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFF FFF EEEEE FFF FFF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FFF FFF EEEEE FFF FFF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFFF FF EEEEE FF FFFF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FFFF FF EEEEE FF FFFF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " A A ", " AGGAGGA A A AGGAGGA ", " F F FF EEEEE FF F F ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " F F FF EEEEE FF F F ", " AGGAGGA A A AGGAGGA ", " A A ", " ", " ", " ") + .aisle(" ", " ", " A A ", " A A ", " AGGAGGA AGGAGGA ", " F F FF EEEEE FF F F ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " F F FF EEEEE FF F F ", " AGGAGGA AGGAGGA ", " A A ", " A A ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAGGA AGGAGGA ", " F F FF AAA EEE AAA FF F F ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " F F FF AAA EEE AAA FF F F ", " AGGAGGA AGGAGGA ", " ", " A A ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAGGA AGGAGGA ", " F F FF AA AA AAAAEEEAAAA AA AA FF F F ", " D BAB D ", " ", " ", " ", " D BAB D ", " F F FF AA AA AAAAEEEAAAA AA AA FF F F ", " AGGAGGA AGGAGGA ", " ", " A A ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAG GAGGA ", " FF FF FFF AA AAAA ACCCA AAAA AA FFF FF FF ", " D BAB D ", " ", " ", " ", " D BAB D ", " FF FF FFF AA AAAA ACCCA AAAA AA FFF FF FF ", " AGGAG GAGGA ", " ", " A A ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGA AGGA ", " F F FFF AABA ACCCA ABAA FFF F F ", " BAB ", " ", " ", " ", " BAB ", " F F FFF AABA ACCCA ABAA FFF F F ", " AGGA AGGA ", " ", " A A ", " ", " ") + .aisle(" ", " ", " A A ", " ", " A A ", " F F FFF AABABA ACCCA ABABAA FFF F F ", " BAB ", " ", " ", " ", " BAB ", " F F FFF AABABA ACCCA ABABAA FFF F F ", " A A ", " ", " A A ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " D D ", " D D ", " F F FFF AA ABABAD ACCCA DABABA AA FFF F F ", " D BAB D ", " D D ", " DD DD ", " D D ", " D BAB D ", " F F FFF AA ABABAD ACCCA DABABA AA FFF F F ", " D D ", " D D ", " DD A A DD ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " ", " ", " F F FFF A ABABA ACCCA ABABA A FFF F F ", " BAB ", " ", " DD DD ", " ", " BAB ", " F F FFF A ABABA ACCCA ABABA A FFF F F ", " ", " ", " DD A A DD ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " AAAAA ", " ", " F F FFFF AA ABABA ACCCA ABABA AA FFFF F F ", " BAB ", " AAAAA ", " DD DD ", " AAAAA ", " BAB ", " F F FFFF AA ABABA ACCCA ABABA AA FFFF F F ", " ", " AAAAA ", " DD A A DD ", " ", " ") + .aisle(" ", " ", " D D D D ", " D AAAAAAAAA D ", " D BBBBB D ", " F F FFF AA DABABA BBBBB ABABAD AA FFF F F ", " D BBBBB D ", " D AAAAAAAAA D ", " D GGGGG D ", " D AAAAAAAAA D ", " D BBBBB D ", " F F FFF AA DABABA BBBBB ABABAD AA FFF F F ", " D BBBBB D ", " D AAAAAAAAA D ", " D D D D ", " ", " ") + .aisle(" ", " ", " DCD ", " AAAAAAAAAAAAA ", " BBBBBBBBB ", " F F FFFF A ABABBBBBBBBBBBBBABA A FFFF F F ", " BBBBBBBBB ", " AAAAAAAAAAAAA ", " GGGGGGGGG ", " AAAAAAAAAAAAA ", " BBBBBBBBB ", " F F FFFF A ABABBBBBBBBBBBBBABA A FFFF F F ", " BBBBBBBBB ", " AAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " ", " DCD ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBB ", " F F FFFF A ABABBBBBBBBBBBABA A FFFF F F ", " DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD ", " AAAAAAAAAAAAAAA ", " GGGGGGGGGGG ", " AAAAAAAAAAAAAAA ", " DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD ", " F F FFFF A ABABBBBBBBBBBBABA A FFFF F F ", " BBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " ", " CDCDC ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBBBB ", " F F FFFF AA BBBBBBBBBBBBBBB AA FFFF F F ", " DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD ", " AAAAAAAAAAAAAAA ", " GGGGGGGGGGGGG ", " AAAAAAAAAAAAAAA ", " DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD ", " F F FFFF AA BBBBBBBBBBBBBBB AA FFFF F F ", " BBBBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " CDCDC ", " ", " ") + .aisle(" ", " ", " DCDCDCD ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " F F FFFF A BBBBBBBBBBBBBBB A FFFF F F ", " DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD ", " AAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD ", " F F FFFF A BBBBBBBBBBBBBBB A FFFF F F ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DCDCDCD ", " ", " ") + .aisle(" D D ", " D D ", " DDCDCDCDD ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " F F FFFF A BBBBBBBBBBBBBBB A FFFF F F ", " DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD ", " AAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAA ", " DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD ", " F F FFFF A BBBBBBBBBBBBBBB A FFFF F F ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DDCDCDCDD ", " D D ", " D D ") + .aisle(" ", " ", " CCCC CCCC ", " AAAAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBBBB ", " F F FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF F F ", " DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD ", " AAAAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD ", " F F FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF F F ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCC@@@CCCC ", " ", " ") + .aisle(" ", " ", " AAAAAAAAADDDDDD DDDDDDAAAAAAAAA ", " AA AAAAAAAAAAAAAAAAAAA AA ", " A BBBBBBBBBBBBBBBBB A ", " EEEEEEE F F EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE F F EEEEEEE ", " DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD ", " AAAAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD ", " EEEEEEE F F EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE F F EEEEEEE ", " A BBBBBBBBBBBBBBBBB A ", " AA AAAAAAAAAAAAAAAAAAA AA ", " AAAAAAAAADDDDDD@@@@@DDDDDDAAAAAAAAA ", " ", " ") + .aisle(" ", " ", " CCCCC CCCCC ", " AAAAAAAAA AAAAAAAAA ", " BBBBBBBB BBBBBBBB ", " EEEEEEEEEEEEF EEEEEEEEEEEEEEEEEEEECCCCCCBBBBBBBB BBBBBBBBCCCCCCEEEEEEEEEEEEEEEEEEEE FEEEEEEEEEEEE ", "DDDDDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDDDD", " AAAAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAAAA ", "DDDDDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDDDD", " EEEEEEEEEEEEF EEEEEEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEEEEEE FEEEEEEEEEEEE ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCCC@@#@@CCCCC ", " ", " ") + .aisle(" ", " ", " AAAAAAAAADDDDDD DDDDDDAAAAAAAAA ", " AA AAAAAAAAAAAAAAAAAAA AA ", " A BBBBBBBBBBBBBBBBB A ", " EEEEEEE F F EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE F F EEEEEEE ", " DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD ", " AAAAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD ", " EEEEEEE F F EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE F F EEEEEEE ", " A BBBBBBBBBBBBBBBBB A ", " AA AAAAAAAAAAAAAAAAAAA AA ", " AAAAAAAAADDDDDD@@@@@DDDDDDAAAAAAAAA ", " ", " ") + .aisle(" ", " ", " CCCC CCCC ", " AAAAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBBBB ", " F F FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF F F ", " DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD ", " AAAAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD ", " F F FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF F F ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCC@@@CCCC ", " ", " ") + .aisle(" D D ", " D D ", " DDCDCDCDD ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " F F FFFF A BBBBBBBBBBBBBBB A FFFF F F ", " DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD ", " AAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAA ", " DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD ", " F F FFFF A BBBBBBBBBBBBBBB A FFFF F F ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DDCDCDCDD ", " D D ", " D D ") + .aisle(" ", " ", " DCDCDCD ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " F F FFFF A BBBBBBBBBBBBBBB A FFFF F F ", " DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD ", " AAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD ", " F F FFFF A BBBBBBBBBBBBBBB A FFFF F F ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DCDCDCD ", " ", " ") + .aisle(" ", " ", " CDCDC ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBBBB ", " F F FFFF AA BBBBBBBBBBBBBBB AA FFFF F F ", " DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD ", " AAAAAAAAAAAAAAA ", " GGGGGGGGGGGGG ", " AAAAAAAAAAAAAAA ", " DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD ", " F F FFFF AA BBBBBBBBBBBBBBB AA FFFF F F ", " BBBBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " CDCDC ", " ", " ") + .aisle(" ", " ", " DCD ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBB ", " F F FFFF A ABABBBBBBBBBBBABA A FFFF F F ", " DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD ", " AAAAAAAAAAAAAAA ", " GGGGGGGGGGG ", " AAAAAAAAAAAAAAA ", " DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD ", " F F FFFF A ABABBBBBBBBBBBABA A FFFF F F ", " BBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " ", " DCD ", " AAAAAAAAAAAAA ", " BBBBBBBBB ", " F F FFFF A ABABBBBBBBBBBBBBABA A FFFF F F ", " BBBBBBBBB ", " AAAAAAAAAAAAA ", " GGGGGGGGG ", " AAAAAAAAAAAAA ", " BBBBBBBBB ", " F F FFFF A ABABBBBBBBBBBBBBABA A FFFF F F ", " BBBBBBBBB ", " AAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " ", " D D D D ", " D AAAAAAAAA D ", " D BBBBB D ", " F F FFF AA DABABA BBBBB ABABAD AA FFF F F ", " D BBBBB D ", " D AAAAAAAAA D ", " D GGGGG D ", " D AAAAAAAAA D ", " D BBBBB D ", " F F FFF AA DABABA BBBBB ABABAD AA FFF F F ", " D BBBBB D ", " D AAAAAAAAA D ", " D D D D ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " AAAAA ", " ", " F F FFFF AA ABABA ACCCA ABABA AA FFFF F F ", " BAB ", " AAAAA ", " DD DD ", " AAAAA ", " BAB ", " F F FFFF AA ABABA ACCCA ABABA AA FFFF F F ", " ", " AAAAA ", " DD A A DD ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " ", " ", " F F FFF A ABABA ACCCA ABABA A FFF F F ", " BAB ", " ", " DD DD ", " ", " BAB ", " F F FFF A ABABA ACCCA ABABA A FFF F F ", " ", " ", " DD A A DD ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " D D ", " D D ", " F F FFF AA ABABAD ACCCA DABABA AA FFF F F ", " D BAB D ", " D D ", " DD DD ", " D D ", " D BAB D ", " F F FFF AA ABABAD ACCCA DABABA AA FFF F F ", " D D ", " D D ", " DD A A DD ", " ", " ") + .aisle(" ", " ", " A A ", " ", " A A ", " F F FFF AABABA ACCCA ABABAA FFF F F ", " BAB ", " ", " ", " ", " BAB ", " F F FFF AABABA ACCCA ABABAA FFF F F ", " A A ", " ", " A A ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGA AGGA ", " F F FFF AABA ACCCA ABAA FFF F F ", " BAB ", " ", " ", " ", " BAB ", " F F FFF AABA ACCCA ABAA FFF F F ", " AGGA AGGA ", " ", " A A ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAG GAGGA ", " FF FF FFF AA AAAA ACCCA AAAA AA FFF FF FF ", " D BAB D ", " ", " ", " ", " D BAB D ", " FF FF FFF AA AAAA ACCCA AAAA AA FFF FF FF ", " AGGAG GAGGA ", " ", " A A ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAGGA AGGAGGA ", " F F FF AA AA AAAAEEEAAAA AA AA FF F F ", " D BAB D ", " ", " ", " ", " D BAB D ", " F F FF AA AA AAAAEEEAAAA AA AA FF F F ", " AGGAGGA AGGAGGA ", " ", " A A ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAGGA AGGAGGA ", " F F FF AAA EEE AAA FF F F ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " F F FF AAA EEE AAA FF F F ", " AGGAGGA AGGAGGA ", " ", " A A ", " ", " ") + .aisle(" ", " ", " A A ", " A A ", " AGGAGGA AGGAGGA ", " F F FF EEEEE FF F F ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " F F FF EEEEE FF F F ", " AGGAGGA AGGAGGA ", " A A ", " A A ", " ", " ") + .aisle(" ", " ", " ", " A A ", " AGGAGGA A A AGGAGGA ", " F F FF EEEEE FF F F ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " F F FF EEEEE FF F F ", " AGGAGGA A A AGGAGGA ", " A A ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFFF FF EEEEE FF FFFF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FFFF FF EEEEE FF FFFF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFF FFF EEEEE FFF FFF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FFF FFF EEEEE FFF FFF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFF FFFF EEEEE FFFF FFF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FFF FFFF EEEEE FFFF FFF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFF EEEEE FFFFFF FF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FF FFFFFF EEEEE FFFFFF FF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFFFFF EEEEE FFFFFFFFF FF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FF FFFFFFFFF EEEEE FFFFFFFFF FF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFFFFFFEEEFFFFFFFFFF FF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FF FFFFFFFFFFEEEFFFFFFFFFF FF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGAGGA AGGAGA ", " FF FFFFFFFFEEEFFFFFFFF FF ", " DDCACBABCACDD ", " ", " ", " ", " DDCACBABCACDD ", " FF FFFFFFFFEEEFFFFFFFF FF ", " AGAGGA AGGAGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGGGA AGGGGA ", " FF FFFFFFEEEFFFFFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFFFFFEEEFFFFFF FF ", " AGGGGA AGGGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GGGAA AAGGG ", " FF FFFEEEFFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFFEEEFFF FF ", " GGGAA AAGGG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GGGA AGGG ", " FFF EEE FFF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FFF EEE FFF ", " GGGA AGGG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GG GG ", " FFFF EEE FFFF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FFFF EEE FFFF ", " GG GG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFF EEE FFFFF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FFFFF EEE FFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FF FFF E FFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFF E FFF FF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FF FFFF E FFFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFFF E FFFF FF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FF FFFFF E FFFFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFFFF E FFFFF FF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FF FFFFFEFFFFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFFFFEFFFFF FF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFF FFF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FFF FFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FF FF ", " DDCCBABCCDD ", " ", " ", " ", " DDCCBABCCDD ", " FF FF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFF FFFFF ", " DCCBABCCD ", " ", " ", " ", " DCCBABCCD ", " FFFFF FFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFFFFFF ", " DCCBABCCD ", " ", " ", " ", " DCCBABCCD ", " FFFFFFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DCCBABCCD ", " ", " ", " ", " DCCBABCCD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCCBABCCD ", " ", " ", " ", " DCCBABCCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DDCBABCDD ", " ", " ", " ", " DDCBABCDD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " ", " ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " ", " ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " ", " ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " ", " ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " ", " ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DDBABDD ", " ", " ", " ", " DDBABDD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " ", " ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " ", " ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " ", " ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DBABD ", " ", " ", " ", " DBABD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DDADD ", " ", " ", " ", " DDADD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DDD ", " ", " ", " ", " DDD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " ", " ", " D ", " ", " ", " ", " ", " ", " ") + ; + } + + private static MultiblockShapeInfo.ShapeInfoBuilder tier2ShapeInfo(MultiblockMachineDefinition definition) { + return MultiblockShapeInfo.builder() + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DDD ", " ", " ", " ", " DDD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DDADD ", " ", " ", " ", " DDADD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DBABD ", " ", " ", " ", " DBABD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " ", " ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " ", " ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " ", " ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DDBABDD ", " ", " ", " ", " DDBABDD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " ", " ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " ", " ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " ", " ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " ", " ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " ", " ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DDCBABCDD ", " ", " ", " ", " DDCBABCDD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCCBABCCD ", " ", " ", " ", " DCCBABCCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DCCBABCCD ", " ", " ", " ", " DCCBABCCD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFFFFFF ", " DCCBABCCD ", " ", " ", " ", " DCCBABCCD ", " FFFFFFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFF FFFFF ", " DCCBABCCD ", " ", " ", " ", " DCCBABCCD ", " FFFFF FFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FF FF ", " DDCCBABCCDD ", " ", " ", " ", " DDCCBABCCDD ", " FF FF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFF FFF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FFF FFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FF FFFFFEFFFFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFFFFEFFFFF FF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FF FFFFF E FFFFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFFFF E FFFFF FF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FF FFFF E FFFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFFF E FFFF FF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FF FFF E FFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFF E FFF FF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFF EEE FFFFF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FFFFF EEE FFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GG GG ", " FFFF EEE FFFF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FFFF EEE FFFF ", " GG GG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GGGA AGGG ", " FFF EEE FFF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FFF EEE FFF ", " GGGA AGGG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GGGAA AAGGG ", " FF FFFEEEFFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFFEEEFFF FF ", " GGGAA AAGGG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGGGA AGGGGA ", " FF FFFFFFEEEFFFFFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFFFFFEEEFFFFFF FF ", " AGGGGA AGGGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGAGGA AGGAGA ", " FF FFFFFFFFEEEFFFFFFFF FF ", " DDCACBABCACDD ", " ", " ", " ", " DDCACBABCACDD ", " FF FFFFFFFFEEEFFFFFFFF FF ", " AGAGGA AGGAGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFFFFFFEEEFFFFFFFFFF FF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FF FFFFFFFFFFEEEFFFFFFFFFF FF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFFFFF EEEEE FFFFFFFFF FF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FF FFFFFFFFF EEEEE FFFFFFFFF FF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFF EEEEE FFFFFF FF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FF FFFFFF EEEEE FFFFFF FF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFF FFFF EEEEE FFFF FFF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FFF FFFF EEEEE FFFF FFF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFF FFF EEEEE FFF FFF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FFF FFF EEEEE FFF FFF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFFF FF EEEEE FF FFFF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FFFF FF EEEEE FF FFFF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " A A ", " AGGAGGA A A AGGAGGA ", " F F FF EEEEE FF F F ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " F F FF EEEEE FF F F ", " AGGAGGA A A AGGAGGA ", " A A ", " ", " ", " ") + .aisle(" ", " ", " A A ", " A A ", " AGGAGGA AGGAGGA ", " F F FF EEEEE FF F F ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " F F FF EEEEE FF F F ", " AGGAGGA AGGAGGA ", " A A ", " A A ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAGGA AGGAGGA ", " F F FF AAA EEE AAA FF F F ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " F F FF AAA EEE AAA FF F F ", " AGGAGGA AGGAGGA ", " ", " A A ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAGGA AGGAGGA ", " F F FF AA AA AAAAEEEAAAA AA AA FF F F ", " D BAB D ", " ", " ", " ", " D BAB D ", " F F FF AA AA AAAAEEEAAAA AA AA FF F F ", " AGGAGGA AGGAGGA ", " ", " A A ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAG GAGGA ", " FF FF FFF AA AAAA ACCCA AAAA AA FFF FF FF ", " D BAB D ", " ", " ", " ", " D BAB D ", " FF FF FFF AA AAAA ACCCA AAAA AA FFF FF FF ", " AGGAG GAGGA ", " ", " A A ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGA AGGA ", " F F FFF AABA ACCCA ABAA FFF F F ", " BAB ", " ", " ", " ", " BAB ", " F F FFF AABA ACCCA ABAA FFF F F ", " AGGA AGGA ", " ", " A A ", " ", " ") + .aisle(" ", " ", " A A ", " ", " A A ", " F F FFF AABABA ACCCA ABABAA FFF F F ", " BAB ", " ", " ", " ", " BAB ", " F F FFF AABABA ACCCA ABABAA FFF F F ", " A A ", " ", " A A ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " D D ", " D D ", " F F FFF AA ABABAD ACCCA DABABA AA FFF F F ", " D BAB D ", " D D ", " DD DD ", " D D ", " D BAB D ", " F F FFF AA ABABAD ACCCA DABABA AA FFF F F ", " D D ", " D D ", " DD A A DD ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " ", " ", " F F FFF A ABABA ACCCA ABABA A FFF F F ", " BAB ", " ", " DD DD ", " ", " BAB ", " F F FFF A ABABA ACCCA ABABA A FFF F F ", " ", " ", " DD A A DD ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " AAAAA ", " ", " F F FFFF AA ABABA ACCCA ABABA AA FFFF F F ", " BAB ", " AAAAA ", " DD DD ", " AAAAA ", " BAB ", " F F FFFF AA ABABA ACCCA ABABA AA FFFF F F ", " ", " AAAAA ", " DD A A DD ", " ", " ") + .aisle(" ", " ", " D D D D ", " D AAAAAAAAA D ", " D BBBBB D ", " F F FFF AA DABABA BBBBB ABABAD AA FFF F F ", " D BBBBB D ", " D AAAAAAAAA D ", " D GGGGG D ", " D AAAAAAAAA D ", " D BBBBB D ", " F F FFF AA DABABA BBBBB ABABAD AA FFF F F ", " D BBBBB D ", " D AAAAAAAAA D ", " D D D D ", " ", " ") + .aisle(" ", " ", " DCD ", " AAAAAAAAAAAAA ", " BBBBBBBBB ", " F F FFFF A ABABBBBBBBBBBBBBABA A FFFF F F ", " BBBBBBBBB ", " AAAAAAAAAAAAA ", " GGGGGGGGG ", " AAAAAAAAAAAAA ", " BBBBBBBBB ", " F F FFFF A ABABBBBBBBBBBBBBABA A FFFF F F ", " BBBBBBBBB ", " AAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " ", " DCD ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBB ", " F F FFFF A ABABBBBBBBBBBBABA A FFFF F F ", " DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD ", " AAAAAAAAAAAAAAA ", " GGGGGGGGGGG ", " AAAAAAAAAAAAAAA ", " DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD ", " F F FFFF A ABABBBBBBBBBBBABA A FFFF F F ", " BBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " ", " CDCDC ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBBBB ", " F F FFFF AA BBBBBBBBBBBBBBB AA FFFF F F ", " DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD ", " AAAAAAAAAAAAAAA ", " GGGGGGGGGGGGG ", " AAAAAAAAAAAAAAA ", " DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD ", " F F FFFF AA BBBBBBBBBBBBBBB AA FFFF F F ", " BBBBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " CDCDC ", " ", " ") + .aisle(" ", " ", " DCDCDCD ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " F F FFFF A BBBBBBBBBBBBBBB A FFFF F F ", " DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD ", " AAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD ", " F F FFFF A BBBBBBBBBBBBBBB A FFFF F F ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DCDCDCD ", " ", " ") + .aisle(" D D ", " D D ", " DDCDCDCDD ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " F F FFFF A BBBBBBBBBBBBBBB A FFFF F F ", " DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD ", " AAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAA ", " DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD ", " F F FFFF A BBBBBBBBBBBBBBB A FFFF F F ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DDCDCDCDD ", " D D ", " D D ") + .aisle(" ", " ", " CCCC CCCC ", " AAAAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBBBB ", " F F FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF F F ", " DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD ", " AAAAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD ", " F F FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF F F ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCC@@@CCCC ", " ", " ") + .aisle(" ", " ", " AAAAAAAAADDDDDD DDDDDDAAAAAAAAA ", " AA AAAAAAAAAAAAAAAAAAA AA ", " A BBBBBBBBBBBBBBBBB A ", " EEEEEEE F F EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE F F EEEEEEE ", " DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD ", " AAAAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD ", " EEEEEEE F F EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE F F EEEEEEE ", " A BBBBBBBBBBBBBBBBB A ", " AA AAAAAAAAAAAAAAAAAAA AA ", " AAAAAAAAADDDDDD@@@@@DDDDDDAAAAAAAAA ", " ", " ") + .aisle(" ", " ", " CCCCC CCCCC ", " AAAAAAAAA AAAAAAAAA ", " BBBBBBBB BBBBBBBB ", " EEEEEEEEEEEEF EEEEEEEEEEEEEEEEEEEECCCCCCBBBBBBBB BBBBBBBBCCCCCCEEEEEEEEEEEEEEEEEEEE FEEEEEEEEEEEE ", "DDDDDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDDDD", " AAAAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAAAA ", "DDDDDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDDDD", " EEEEEEEEEEEEF EEEEEEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEEEEEE FEEEEEEEEEEEE ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCCC@@#@@CCCCC ", " ", " ") + .aisle(" ", " ", " AAAAAAAAADDDDDD DDDDDDAAAAAAAAA ", " AA AAAAAAAAAAAAAAAAAAA AA ", " A BBBBBBBBBBBBBBBBB A ", " EEEEEEE F F EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE F F EEEEEEE ", " DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD ", " AAAAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD ", " EEEEEEE F F EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE F F EEEEEEE ", " A BBBBBBBBBBBBBBBBB A ", " AA AAAAAAAAAAAAAAAAAAA AA ", " AAAAAAAAADDDDDD@@@@@DDDDDDAAAAAAAAA ", " ", " ") + .aisle(" ", " ", " CCCC CCCC ", " AAAAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBBBB ", " F F FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF F F ", " DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD ", " AAAAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD ", " F F FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF F F ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCC@@@CCCC ", " ", " ") + .aisle(" D D ", " D D ", " DDCDCDCDD ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " F F FFFF A BBBBBBBBBBBBBBB A FFFF F F ", " DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD ", " AAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAA ", " DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD ", " F F FFFF A BBBBBBBBBBBBBBB A FFFF F F ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DDCDCDCDD ", " D D ", " D D ") + .aisle(" ", " ", " DCDCDCD ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " F F FFFF A BBBBBBBBBBBBBBB A FFFF F F ", " DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD ", " AAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD ", " F F FFFF A BBBBBBBBBBBBBBB A FFFF F F ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DCDCDCD ", " ", " ") + .aisle(" ", " ", " CDCDC ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBBBB ", " F F FFFF AA BBBBBBBBBBBBBBB AA FFFF F F ", " DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD ", " AAAAAAAAAAAAAAA ", " GGGGGGGGGGGGG ", " AAAAAAAAAAAAAAA ", " DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD ", " F F FFFF AA BBBBBBBBBBBBBBB AA FFFF F F ", " BBBBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " CDCDC ", " ", " ") + .aisle(" ", " ", " DCD ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBB ", " F F FFFF A ABABBBBBBBBBBBABA A FFFF F F ", " DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD ", " AAAAAAAAAAAAAAA ", " GGGGGGGGGGG ", " AAAAAAAAAAAAAAA ", " DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD ", " F F FFFF A ABABBBBBBBBBBBABA A FFFF F F ", " BBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " ", " DCD ", " AAAAAAAAAAAAA ", " BBBBBBBBB ", " F F FFFF A ABABBBBBBBBBBBBBABA A FFFF F F ", " BBBBBBBBB ", " AAAAAAAAAAAAA ", " GGGGGGGGG ", " AAAAAAAAAAAAA ", " BBBBBBBBB ", " F F FFFF A ABABBBBBBBBBBBBBABA A FFFF F F ", " BBBBBBBBB ", " AAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " ", " D D D D ", " D AAAAAAAAA D ", " D BBBBB D ", " F F FFF AA DABABA BBBBB ABABAD AA FFF F F ", " D BBBBB D ", " D AAAAAAAAA D ", " D GGGGG D ", " D AAAAAAAAA D ", " D BBBBB D ", " F F FFF AA DABABA BBBBB ABABAD AA FFF F F ", " D BBBBB D ", " D AAAAAAAAA D ", " D D D D ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " AAAAA ", " ", " F F FFFF AA ABABA ACCCA ABABA AA FFFF F F ", " BAB ", " AAAAA ", " DD DD ", " AAAAA ", " BAB ", " F F FFFF AA ABABA ACCCA ABABA AA FFFF F F ", " ", " AAAAA ", " DD A A DD ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " ", " ", " F F FFF A ABABA ACCCA ABABA A FFF F F ", " BAB ", " ", " DD DD ", " ", " BAB ", " F F FFF A ABABA ACCCA ABABA A FFF F F ", " ", " ", " DD A A DD ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " D D ", " D D ", " F F FFF AA ABABAD ACCCA DABABA AA FFF F F ", " D BAB D ", " D D ", " DD DD ", " D D ", " D BAB D ", " F F FFF AA ABABAD ACCCA DABABA AA FFF F F ", " D D ", " D D ", " DD A A DD ", " ", " ") + .aisle(" ", " ", " A A ", " ", " A A ", " F F FFF AABABA ACCCA ABABAA FFF F F ", " BAB ", " ", " ", " ", " BAB ", " F F FFF AABABA ACCCA ABABAA FFF F F ", " A A ", " ", " A A ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGA AGGA ", " F F FFF AABA ACCCA ABAA FFF F F ", " BAB ", " ", " ", " ", " BAB ", " F F FFF AABA ACCCA ABAA FFF F F ", " AGGA AGGA ", " ", " A A ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAG GAGGA ", " FF FF FFF AA AAAA ACCCA AAAA AA FFF FF FF ", " D BAB D ", " ", " ", " ", " D BAB D ", " FF FF FFF AA AAAA ACCCA AAAA AA FFF FF FF ", " AGGAG GAGGA ", " ", " A A ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAGGA AGGAGGA ", " F F FF AA AA AAAAEEEAAAA AA AA FF F F ", " D BAB D ", " ", " ", " ", " D BAB D ", " F F FF AA AA AAAAEEEAAAA AA AA FF F F ", " AGGAGGA AGGAGGA ", " ", " A A ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAGGA AGGAGGA ", " F F FF AAA EEE AAA FF F F ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " F F FF AAA EEE AAA FF F F ", " AGGAGGA AGGAGGA ", " ", " A A ", " ", " ") + .aisle(" ", " ", " A A ", " A A ", " AGGAGGA AGGAGGA ", " F F FF EEEEE FF F F ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " F F FF EEEEE FF F F ", " AGGAGGA AGGAGGA ", " A A ", " A A ", " ", " ") + .aisle(" ", " ", " ", " A A ", " AGGAGGA A A AGGAGGA ", " F F FF EEEEE FF F F ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " F F FF EEEEE FF F F ", " AGGAGGA A A AGGAGGA ", " A A ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFFF FF EEEEE FF FFFF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FFFF FF EEEEE FF FFFF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFF FFF EEEEE FFF FFF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FFF FFF EEEEE FFF FFF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFF FFFF EEEEE FFFF FFF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FFF FFFF EEEEE FFFF FFF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFF EEEEE FFFFFF FF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FF FFFFFF EEEEE FFFFFF FF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFFFFF EEEEE FFFFFFFFF FF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FF FFFFFFFFF EEEEE FFFFFFFFF FF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFFFFFFEEEFFFFFFFFFF FF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FF FFFFFFFFFFEEEFFFFFFFFFF FF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGAGGA AGGAGA ", " FF FFFFFFFFEEEFFFFFFFF FF ", " DDCACBABCACDD ", " ", " ", " ", " DDCACBABCACDD ", " FF FFFFFFFFEEEFFFFFFFF FF ", " AGAGGA AGGAGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGGGA AGGGGA ", " FF FFFFFFEEEFFFFFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFFFFFEEEFFFFFF FF ", " AGGGGA AGGGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GGGAA AAGGG ", " FF FFFEEEFFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFFEEEFFF FF ", " GGGAA AAGGG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GGGA AGGG ", " FFF EEE FFF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FFF EEE FFF ", " GGGA AGGG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GG GG ", " FFFF EEE FFFF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FFFF EEE FFFF ", " GG GG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFF EEE FFFFF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FFFFF EEE FFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FF FFF E FFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFF E FFF FF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FF FFFF E FFFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFFF E FFFF FF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FF FFFFF E FFFFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFFFF E FFFFF FF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FF FFFFFEFFFFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFFFFEFFFFF FF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFF FFF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FFF FFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FF FF ", " DDCCBABCCDD ", " ", " ", " ", " DDCCBABCCDD ", " FF FF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFF FFFFF ", " DCCBABCCD ", " ", " ", " ", " DCCBABCCD ", " FFFFF FFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFFFFFF ", " DCCBABCCD ", " ", " ", " ", " DCCBABCCD ", " FFFFFFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DCCBABCCD ", " ", " ", " ", " DCCBABCCD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCCBABCCD ", " ", " ", " ", " DCCBABCCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DDCBABCDD ", " ", " ", " ", " DDCBABCDD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " ", " ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " ", " ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " ", " ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " ", " ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " ", " ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DDBABDD ", " ", " ", " ", " DDBABDD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " ", " ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " ", " ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " ", " ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DBABD ", " ", " ", " ", " DBABD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DDADD ", " ", " ", " ", " DDADD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DDD ", " ", " ", " ", " DDD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " ", " ", " D ", " ", " ", " ", " ", " ", " ") + ; + } + + private static FactoryBlockPattern tier3Pattern() { + return FactoryBlockPattern.start() + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " H ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " H ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " H ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " H ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DDD ", " ", " H ", " ", " DDD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " H ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " H ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " H ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DDADD ", " ", " H ", " ", " DDADD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DBABD ", " I I ", " IHI ", " I I ", " DBABD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " I I ", " IHI ", " I I ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " I I ", " IHI ", " I I ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " I I ", " IHI ", " I I ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DDBABDD ", " I I ", " IHI ", " I I ", " DDBABDD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " I I ", " IHI ", " I I ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " I I ", " IHI ", " I I ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " I I ", " IHI ", " I I ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " I I ", " IHI ", " I I ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " I I ", " IHI ", " I I ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DDCBABCDD ", " I I ", " IHI ", " I I ", " DDCBABCDD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCCBABCCD ", " I I ", " IHI ", " I I ", " DCCBABCCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DCCBABCCD ", " I I ", " IHI ", " I I ", " DCCBABCCD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFFFFFF ", " DCCBABCCD ", " I I ", " IHI ", " I I ", " DCCBABCCD ", " FFFFFFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFFIIIIIIIIIFFFFF ", " DCCBABCCD ", " I I ", " IHI ", " I I ", " DCCBABCCD ", " FFFFFIIIIIIIIIFFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFIIIIIIIIIIIIIIIIIIIFF ", " IIIIDDCCBABCCDDIIII ", " IIII I I IIII ", " IIII IHI IIII ", " IIII I I IIII ", " IIIIDDCCBABCCDDIIII ", " FFIIIIIIIIIIIIIIIIIIIFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFIIIIIIIIIIIIIIIIIIIIIIIFFF ", " IIIIIIDCACBABCACDIIIIII ", " IIIIII I I IIIIII ", " IIIIII IHI IIIIII ", " IIIIII I I IIIIII ", " IIIIIIDCACBABCACDIIIIII ", " FFFIIIIIIIIIIIIIIIIIIIIIIIFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFIIIIIIIIFFFFFEFFFFFIIIIIIIIFF ", " IIIIIIIIDCACBABCACDIIIIIIII ", " IIIIIIII I I IIIIIIII ", " IIIIIIII IHI IIIIIIII ", " IIIIIIII I I IIIIIIII ", " IIIIIIIIDCACBABCACDIIIIIIII ", " FFIIIIIIIIFFFFFEFFFFFIIIIIIIIFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFIIIIIFFFFF E FFFFFIIIIIFF ", " IIIII DCACBABCACD IIIII ", " IIIII I I IIIII ", " IIIII IHI IIIII ", " IIIII I I IIIII ", " IIIII DCACBABCACD IIIII ", " FFIIIIIFFFFF E FFFFFIIIIIFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFIIIFFFF E FFFFIIIFF ", " III DCACBABCACD III ", " III I I III ", " III IHI III ", " III I I III ", " III DCACBABCACD III ", " FFIIIFFFF E FFFFIIIFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFIIFFF E FFFIIFF ", " II DCACBABCACD II ", " II I I II ", " II IHI II ", " II I I II ", " II DCACBABCACD II ", " FFIIFFF E FFFIIFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFF EEE FFFFF ", " DCACBABCACD ", " I I ", " IHI ", " I I ", " DCACBABCACD ", " FFFFF EEE FFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GG GG ", " FFFF EEE FFFF ", " DCACBABCACD ", " I I ", " IHI ", " I I ", " DCACBABCACD ", " FFFF EEE FFFF ", " GG J GG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GGGA AGGG ", " FFF EEE FFF ", " DCACBABCACD ", " I I ", " IHI ", " I I ", " DCACBABCACD ", " FFF EEE FFF ", " GGGA J AGGG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GGGAA AAGGG ", " FF FFFEEEFFF FF ", " DCACBABCACD ", " I I ", " IHI ", " I I ", " DCACBABCACD ", " FF FFFEEEFFF FF ", " GGGAA J AAGGG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGGGA AGGGGA ", " FF FFFFFFEEEFFFFFF FF ", " DCACBABCACD ", " I I ", " IHI ", " I I ", " DCACBABCACD ", " FF FFFFFFEEEFFFFFF FF ", " AGGGGA J AGGGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGAGGA AGGAGA ", " FF FFFFFFFFEEEFFFFFFFF FF ", " DDCACBABCACDD ", " I I ", " IHI ", " I I ", " DDCACBABCACDD ", " FF FFFFFFFFEEEFFFFFFFF FF ", " AGAGGA J AGGAGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFFFFFFEEEFFFFFFFFFF FF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FF FFFFFFFFFFEEEFFFFFFFFFF FF ", " AGGAGGA J AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFFFFF EEEEE FFFFFFFFF FF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FF FFFFFFFFF EEEEE FFFFFFFFF FF ", " AGGAGGA AGGAGGA ", " J ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFF EEEEE FFFFFF FF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FF FFFFFF EEEEE FFFFFF FF ", " AGGAGGA AGGAGGA ", " J ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFF FFFF EEEEE FFFF FFF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FFF FFFF EEEEE FFFF FFF ", " AGGAGGA AGGAGGA ", " J ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFF FFF EEEEE FFF FFF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FFF FFF EEEEE FFF FFF ", " AGGAGGA AGGAGGA ", " J ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFFF FF EEEEE FF FFFF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FFFF FF EEEEE FF FFFF ", " AGGAGGA AGGAGGA ", " J ", " ", " ", " ") + .aisle(" ", " ", " ", " A A ", " AGGAGGA A A AGGAGGA ", " FIF FF EEEEE FF FIF ", " I DCAACBABCAACD I ", " I I I I ", " I IHI I ", " I I I I ", " I DCAACBABCAACD I ", " FIF FF EEEEE FF FIF ", " AGGAGGA A A AGGAGGA ", " AJA ", " ", " ", " ") + .aisle(" ", " ", " A A ", " A A ", " AGGAGGA AGGAGGA ", " FIIF FF EEEEE FF FIIF ", " II DCAACBABCAACD II ", " II I I II ", " II IHI II ", " II I I II ", " II DCAACBABCAACD II ", " FIIF FF EEEEE FF FIIF ", " AGGAGGA AGGAGGA ", " A A ", " AJA ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAGGA AGGAGGA ", " FIF FF AAA EEE AAA FF FIF ", " I DCAACBABCAACD I ", " I I I I ", " I IHI I ", " I I I I ", " I DCAACBABCAACD I ", " FIF FF AAA EEE AAA FF FIF ", " AGGAGGA AGGAGGA ", " ", " AJA ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAGGA AGGAGGA ", " FIIF FF AA AA AAAAEEEAAAA AA AA FF FIIF ", " II D BAB D II ", " II I I II ", " II IHI II ", " II I I II ", " II D BAB D II ", " FIIF FF AA AA AAAAEEEAAAA AA AA FF FIIF ", " AGGAGGA AGGAGGA ", " ", " AJA ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAG GAGGA ", " FFIFF FFF AA AAAA ACCCA AAAA AA FFF FFIFF ", " I D BAB D I ", " I I I I ", " I IHI I ", " I I I I ", " I D BAB D I ", " FFIFF FFF AA AAAA ACCCA AAAA AA FFF FFIFF ", " AGGAG GAGGA ", " ", " AJA ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGA AGGA ", " FIIF FFF AABA ACCCA ABAA FFF FIIF ", " II BAB II ", " II I I II ", " II IHI II ", " II I I II ", " II BAB II ", " FIIF FFF AABA ACCCA ABAA FFF FIIF ", " AGGA AGGA ", " ", " AJA ", " ", " ") + .aisle(" ", " ", " A A ", " ", " A A ", " FIIF FFF AABABA ACCCA ABABAA FFF FIIF ", " II BAB II ", " II I I II ", " II IHI II ", " II I I II ", " II BAB II ", " FIIF FFF AABABA ACCCA ABABAA FFF FIIF ", " A A ", " ", " AJA ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " D D ", " D D ", " FIIIF FFF AA ABABAD ACCCA DABABA AA FFF FIIIF ", " III D BAB D III ", " III D I I D III ", " III DD IHI DD III ", " III D I I D III ", " III D BAB D III ", " FIIIF FFF AA ABABAD ACCCA DABABA AA FFF FIIIF ", " D D ", " D D ", " DD AJA DD ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " ", " ", " FIIF FFF A ABABA ACCCA ABABA A FFF FIIF ", " II BAB II ", " II I I II ", " II DD IHI DD II ", " II I I II ", " II BAB II ", " FIIF FFF A ABABA ACCCA ABABA A FFF FIIF ", " ", " ", " DD AJA DD ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " AAAAA ", " ", " FIIIF FFFF AA ABABA ACCCA ABABA AA FFFF FIIIF ", " III BAB III ", " III AAAAA III ", " III DD H DD III ", " III AAAAA III ", " III BAB III ", " FIIIF FFFF AA ABABA ACCCA ABABA AA FFFF FIIIF ", " ", " AAAAA ", " DD AJA DD ", " ", " ") + .aisle(" ", " ", " D D D D ", " D AAAAAAAAA D ", " D BBBBB D ", " FIIIF FFF AA DABABA BBBBB ABABAD AA FFF FIIIF ", " III D BBBBB D III ", " III D AAAAAAAAA D III ", " III D GGGGG D III ", " III D AAAAAAAAA D III ", " III D BBBBB D III ", " FIIIF FFF AA DABABA BBBBB ABABAD AA FFF FIIIF ", " D BBBBB D ", " D AAAAAAAAA D ", " D DJD D ", " ", " ") + .aisle(" ", " ", " DCD ", " AAAAAAAAAAAAA ", " BBBBBBBBB ", " FIIIF FFFF A ABABBBBBBBBBBBBBABA A FFFF FIIIF ", " III BBBBBBBBB III ", " III AAAAAAAAAAAAA III ", " III GGGGGGGGG III ", " III AAAAAAAAAAAAA III ", " III BBBBBBBBB III ", " FIIIF FFFF A ABABBBBBBBBBBBBBABA A FFFF FIIIF ", " BBBBBBBBB ", " AAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " ", " DCD ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBB ", " FIIIF FFFF A ABABBBBBBBBBBBABA A FFFF FIIIF ", " III DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD III ", " III AAAAAAAAAAAAAAA III ", " III GGGGGGGGGGG III ", " III AAAAAAAAAAAAAAA III ", " III DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD III ", " FIIIF FFFF A ABABBBBBBBBBBBABA A FFFF FIIIF ", " BBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " ", " CDCDC ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBBBB ", " FIIF FFFF AA BBBBBBBBBBBBBBB AA FFFF FIIF ", " DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD ", " AAAAAAAAAAAAAAA ", " GGGGGGGGGGGGG ", " AAAAAAAAAAAAAAA ", " DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD ", " FIIF FFFF AA BBBBBBBBBBBBBBB AA FFFF FIIF ", " BBBBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " CDCDC ", " ", " ") + .aisle(" ", " ", " DCDCDCD ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF ", " DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD ", " AAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD ", " FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DCDCDCD ", " ", " ") + .aisle(" D D ", " D D ", " DDCDCDCDD ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF ", " DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD ", " AAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAA ", " DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD ", " FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DDCDCDCDD ", " D D ", " D D ") + .aisle(" ", " ", " CCCCCCCCCCC ", " AAAAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBBBB ", " FIIIF FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF FIIIF ", " DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD ", " AAAAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD ", " FIIIF FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF FIIIF ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCC@@@CCCC ", " ", " ") + .aisle(" ", " ", " AAAAAAAAADDDDDDCCCCCDDDDDDAAAAAAAAA ", " AA AAAAAAAAAAAAAAAAAAA AA ", " A BBBBBBBBBBBBBBBBB A ", " EEEEEEE FIIIF EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE FIIIF EEEEEEE ", " DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD ", " IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIAAAAAAAAAAAAAAAAAAAIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII ", " IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII GGGGGGGGGGGGGGGGG IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII ", " IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIAAAAAAAAAAAAAAAAAAAIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII ", " DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD ", " EEEEEEE FIIIF EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE FIIIF EEEEEEE ", " A BBBBBBBBBBBBBBBBB A ", " AA AAAAAAAAAAAAAAAAAAA AA ", " AAAAAAAAADDDDDD@@@@@DDDDDDAAAAAAAAA ", " ", " ") + .aisle(" ", " ", " CCCCCCCCCCCCCCC ", " AAAAAAAAA AAAAAAAAA ", " BBBBBBBB BBBBBBBB ", " EEEEEEEEEEEEFIIIEEEEEEEEEEEEEEEEEEEECCCCCCBBBBBBBB BBBBBBBBCCCCCCEEEEEEEEEEEEEEEEEEEEIIIFEEEEEEEEEEEE ", " DDDDDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDDDD ", " AAAAAAAAAAAAAAAAAAA ", "HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH", " AAAAAAAAAAAAAAAAAAA ", " DDDDDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDDDD ", " EEEEEEEEEEEEFIIIEEEEEEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEEEEEEIIIFEEEEEEEEEEEE ", " JJJJJJ BBBBBBBBBBBBBBBBB JJJJJJ ", " JJJJJJ AAAAAAAAAAAAAAAAAAA JJJJJJ ", " JJJJJJJJJJCCCCC@@#@@CCCCCJJJJJJJJJJ ", " ", " ") + .aisle(" ", " ", " AAAAAAAAADDDDDDCCCCCDDDDDDAAAAAAAAA ", " AA AAAAAAAAAAAAAAAAAAA AA ", " A BBBBBBBBBBBBBBBBB A ", " EEEEEEE FIIIF EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE FIIIF EEEEEEE ", " DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD ", " IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIAAAAAAAAAAAAAAAAAAAIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII ", " IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII GGGGGGGGGGGGGGGGG IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII ", " IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIAAAAAAAAAAAAAAAAAAAIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII ", " DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD ", " EEEEEEE FIIIF EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE FIIIF EEEEEEE ", " A BBBBBBBBBBBBBBBBB A ", " AA AAAAAAAAAAAAAAAAAAA AA ", " AAAAAAAAADDDDDD@@@@@DDDDDDAAAAAAAAA ", " ", " ") + .aisle(" ", " ", " CCCCCCCCCCC ", " AAAAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBBBB ", " FIIIF FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF FIIIF ", " DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD ", " AAAAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD ", " FIIIF FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF FIIIF ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCC@@@CCCC ", " ", " ") + .aisle(" D D ", " D D ", " DDCDCDCDD ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF ", " DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD ", " AAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAA ", " DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD ", " FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DDCDCDCDD ", " D D ", " D D ") + .aisle(" ", " ", " DCDCDCD ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF ", " DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD ", " AAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD ", " FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DCDCDCD ", " ", " ") + .aisle(" ", " ", " CDCDC ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBBBB ", " FIIF FFFF AA BBBBBBBBBBBBBBB AA FFFF FIIF ", " DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD ", " AAAAAAAAAAAAAAA ", " GGGGGGGGGGGGG ", " AAAAAAAAAAAAAAA ", " DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD ", " FIIF FFFF AA BBBBBBBBBBBBBBB AA FFFF FIIF ", " BBBBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " CDCDC ", " ", " ") + .aisle(" ", " ", " DCD ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBB ", " FIIIF FFFF A ABABBBBBBBBBBBABA A FFFF FIIIF ", " III DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD III ", " III AAAAAAAAAAAAAAA III ", " III GGGGGGGGGGG III ", " III AAAAAAAAAAAAAAA III ", " III DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD III ", " FIIIF FFFF A ABABBBBBBBBBBBABA A FFFF FIIIF ", " BBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " ", " DCD ", " AAAAAAAAAAAAA ", " BBBBBBBBB ", " FIIIF FFFF A ABABBBBBBBBBBBBBABA A FFFF FIIIF ", " III BBBBBBBBB III ", " III AAAAAAAAAAAAA III ", " III GGGGGGGGG III ", " III AAAAAAAAAAAAA III ", " III BBBBBBBBB III ", " FIIIF FFFF A ABABBBBBBBBBBBBBABA A FFFF FIIIF ", " BBBBBBBBB ", " AAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " ", " D D D D ", " D AAAAAAAAA D ", " D BBBBB D ", " FIIIF FFF AA DABABA BBBBB ABABAD AA FFF FIIIF ", " III D BBBBB D III ", " III D AAAAAAAAA D III ", " III D GGGGG D III ", " III D AAAAAAAAA D III ", " III D BBBBB D III ", " FIIIF FFF AA DABABA BBBBB ABABAD AA FFF FIIIF ", " D BBBBB D ", " D AAAAAAAAA D ", " D DJD D ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " AAAAA ", " ", " FIIIF FFFF AA ABABA ACCCA ABABA AA FFFF FIIIF ", " III BAB III ", " III AAAAA III ", " III DD H DD III ", " III AAAAA III ", " III BAB III ", " FIIIF FFFF AA ABABA ACCCA ABABA AA FFFF FIIIF ", " ", " AAAAA ", " DD AJA DD ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " ", " ", " FIIF FFF A ABABA ACCCA ABABA A FFF FIIF ", " II BAB II ", " II I I II ", " II DD IHI DD II ", " II I I II ", " II BAB II ", " FIIF FFF A ABABA ACCCA ABABA A FFF FIIF ", " ", " ", " DD AJA DD ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " D D ", " D D ", " FIIIF FFF AA ABABAD ACCCA DABABA AA FFF FIIIF ", " III D BAB D III ", " III D I I D III ", " III DD IHI DD III ", " III D I I D III ", " III D BAB D III ", " FIIIF FFF AA ABABAD ACCCA DABABA AA FFF FIIIF ", " D D ", " D D ", " DD AJA DD ", " ", " ") + .aisle(" ", " ", " A A ", " ", " A A ", " FIIF FFF AABABA ACCCA ABABAA FFF FIIF ", " II BAB II ", " II I I II ", " II IHI II ", " II I I II ", " II BAB II ", " FIIF FFF AABABA ACCCA ABABAA FFF FIIF ", " A A ", " ", " AJA ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGA AGGA ", " FIIF FFF AABA ACCCA ABAA FFF FIIF ", " II BAB II ", " II I I II ", " II IHI II ", " II I I II ", " II BAB II ", " FIIF FFF AABA ACCCA ABAA FFF FIIF ", " AGGA AGGA ", " ", " AJA ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAG GAGGA ", " FFIFF FFF AA AAAA ACCCA AAAA AA FFF FFIFF ", " I D BAB D I ", " I I I I ", " I IHI I ", " I I I I ", " I D BAB D I ", " FFIFF FFF AA AAAA ACCCA AAAA AA FFF FFIFF ", " AGGAG GAGGA ", " ", " AJA ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAGGA AGGAGGA ", " FIIF FF AA AA AAAAEEEAAAA AA AA FF FIIF ", " II D BAB D II ", " II I I II ", " II IHI II ", " II I I II ", " II D BAB D II ", " FIIF FF AA AA AAAAEEEAAAA AA AA FF FIIF ", " AGGAGGA AGGAGGA ", " ", " AJA ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAGGA AGGAGGA ", " FIF FF AAA EEE AAA FF FIF ", " I DCAACBABCAACD I ", " I I I I ", " I IHI I ", " I I I I ", " I DCAACBABCAACD I ", " FIF FF AAA EEE AAA FF FIF ", " AGGAGGA AGGAGGA ", " ", " AJA ", " ", " ") + .aisle(" ", " ", " A A ", " A A ", " AGGAGGA AGGAGGA ", " FIIF FF EEEEE FF FIIF ", " II DCAACBABCAACD II ", " II I I II ", " II IHI II ", " II I I II ", " II DCAACBABCAACD II ", " FIIF FF EEEEE FF FIIF ", " AGGAGGA AGGAGGA ", " A A ", " AJA ", " ", " ") + .aisle(" ", " ", " ", " A A ", " AGGAGGA A A AGGAGGA ", " FIF FF EEEEE FF FIF ", " I DCAACBABCAACD I ", " I I I I ", " I IHI I ", " I I I I ", " I DCAACBABCAACD I ", " FIF FF EEEEE FF FIF ", " AGGAGGA A A AGGAGGA ", " AJA ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFFF FF EEEEE FF FFFF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FFFF FF EEEEE FF FFFF ", " AGGAGGA AGGAGGA ", " J ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFF FFF EEEEE FFF FFF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FFF FFF EEEEE FFF FFF ", " AGGAGGA AGGAGGA ", " J ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFF FFFF EEEEE FFFF FFF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FFF FFFF EEEEE FFFF FFF ", " AGGAGGA AGGAGGA ", " J ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFF EEEEE FFFFFF FF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FF FFFFFF EEEEE FFFFFF FF ", " AGGAGGA AGGAGGA ", " J ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFFFFF EEEEE FFFFFFFFF FF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FF FFFFFFFFF EEEEE FFFFFFFFF FF ", " AGGAGGA AGGAGGA ", " J ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFFFFFFEEEFFFFFFFFFF FF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FF FFFFFFFFFFEEEFFFFFFFFFF FF ", " AGGAGGA J AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGAGGA AGGAGA ", " FF FFFFFFFFEEEFFFFFFFF FF ", " DDCACBABCACDD ", " I I ", " IHI ", " I I ", " DDCACBABCACDD ", " FF FFFFFFFFEEEFFFFFFFF FF ", " AGAGGA J AGGAGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGGGA AGGGGA ", " FF FFFFFFEEEFFFFFF FF ", " DCACBABCACD ", " I I ", " IHI ", " I I ", " DCACBABCACD ", " FF FFFFFFEEEFFFFFF FF ", " AGGGGA J AGGGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GGGAA AAGGG ", " FF FFFEEEFFF FF ", " DCACBABCACD ", " I I ", " IHI ", " I I ", " DCACBABCACD ", " FF FFFEEEFFF FF ", " GGGAA J AAGGG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GGGA AGGG ", " FFF EEE FFF ", " DCACBABCACD ", " I I ", " IHI ", " I I ", " DCACBABCACD ", " FFF EEE FFF ", " GGGA J AGGG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GG GG ", " FFFF EEE FFFF ", " DCACBABCACD ", " I I ", " IHI ", " I I ", " DCACBABCACD ", " FFFF EEE FFFF ", " GG J GG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFF EEE FFFFF ", " DCACBABCACD ", " I I ", " IHI ", " I I ", " DCACBABCACD ", " FFFFF EEE FFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFIIFFF E FFFIIFF ", " II DCACBABCACD II ", " II I I II ", " II IHI II ", " II I I II ", " II DCACBABCACD II ", " FFIIFFF E FFFIIFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFIIIFFFF E FFFFIIIFF ", " III DCACBABCACD III ", " III I I III ", " III IHI III ", " III I I III ", " III DCACBABCACD III ", " FFIIIFFFF E FFFFIIIFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFIIIIIFFFFF E FFFFFIIIIIFF ", " IIIII DCACBABCACD IIIII ", " IIIII I I IIIII ", " IIIII IHI IIIII ", " IIIII I I IIIII ", " IIIII DCACBABCACD IIIII ", " FFIIIIIFFFFF E FFFFFIIIIIFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFIIIIIIIIFFFFFEFFFFFIIIIIIIIFF ", " IIIIIIIIDCACBABCACDIIIIIIII ", " IIIIIIII I I IIIIIIII ", " IIIIIIII IHI IIIIIIII ", " IIIIIIII I I IIIIIIII ", " IIIIIIIIDCACBABCACDIIIIIIII ", " FFIIIIIIIIFFFFFEFFFFFIIIIIIIIFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFIIIIIIIIIIIIIIIIIIIIIIIFFF ", " IIIIIIDCACBABCACDIIIIII ", " IIIIII I I IIIIII ", " IIIIII IHI IIIIII ", " IIIIII I I IIIIII ", " IIIIIIDCACBABCACDIIIIII ", " FFFIIIIIIIIIIIIIIIIIIIIIIIFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFIIIIIIIIIIIIIIIIIIIFF ", " IIIIDDCCBABCCDDIIII ", " IIII I I IIII ", " IIII IHI IIII ", " IIII I I IIII ", " IIIIDDCCBABCCDDIIII ", " FFIIIIIIIIIIIIIIIIIIIFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFFIIIIIIIIIFFFFF ", " DCCBABCCD ", " I I ", " IHI ", " I I ", " DCCBABCCD ", " FFFFFIIIIIIIIIFFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFFFFFF ", " DCCBABCCD ", " I I ", " IHI ", " I I ", " DCCBABCCD ", " FFFFFFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DCCBABCCD ", " I I ", " IHI ", " I I ", " DCCBABCCD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCCBABCCD ", " I I ", " IHI ", " I I ", " DCCBABCCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DDCBABCDD ", " I I ", " IHI ", " I I ", " DDCBABCDD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " I I ", " IHI ", " I I ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " I I ", " IHI ", " I I ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " I I ", " IHI ", " I I ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " I I ", " IHI ", " I I ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " I I ", " IHI ", " I I ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DDBABDD ", " I I ", " IHI ", " I I ", " DDBABDD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " I I ", " IHI ", " I I ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " I I ", " IHI ", " I I ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " I I ", " IHI ", " I I ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DBABD ", " I I ", " IHI ", " I I ", " DBABD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DDADD ", " ", " H ", " ", " DDADD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " H ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " H ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " H ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DDD ", " ", " H ", " ", " DDD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " H ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " H ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " H ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " H ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + ; + } + + private static MultiblockShapeInfo.ShapeInfoBuilder tier3ShapeInfo(MultiblockMachineDefinition definition) { + return MultiblockShapeInfo.builder() + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " H ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " H ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " H ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " H ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DDD ", " ", " H ", " ", " DDD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " H ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " H ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " H ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DDADD ", " ", " H ", " ", " DDADD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DBABD ", " I I ", " IHI ", " I I ", " DBABD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " I I ", " IHI ", " I I ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " I I ", " IHI ", " I I ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " I I ", " IHI ", " I I ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DDBABDD ", " I I ", " IHI ", " I I ", " DDBABDD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " I I ", " IHI ", " I I ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " I I ", " IHI ", " I I ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " I I ", " IHI ", " I I ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " I I ", " IHI ", " I I ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " I I ", " IHI ", " I I ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DDCBABCDD ", " I I ", " IHI ", " I I ", " DDCBABCDD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCCBABCCD ", " I I ", " IHI ", " I I ", " DCCBABCCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DCCBABCCD ", " I I ", " IHI ", " I I ", " DCCBABCCD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFFFFFF ", " DCCBABCCD ", " I I ", " IHI ", " I I ", " DCCBABCCD ", " FFFFFFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFFIIIIIIIIIFFFFF ", " DCCBABCCD ", " I I ", " IHI ", " I I ", " DCCBABCCD ", " FFFFFIIIIIIIIIFFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFIIIIIIIIIIIIIIIIIIIFF ", " IIIIDDCCBABCCDDIIII ", " IIII I I IIII ", " IIII IHI IIII ", " IIII I I IIII ", " IIIIDDCCBABCCDDIIII ", " FFIIIIIIIIIIIIIIIIIIIFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFIIIIIIIIIIIIIIIIIIIIIIIFFF ", " IIIIIIDCACBABCACDIIIIII ", " IIIIII I I IIIIII ", " IIIIII IHI IIIIII ", " IIIIII I I IIIIII ", " IIIIIIDCACBABCACDIIIIII ", " FFFIIIIIIIIIIIIIIIIIIIIIIIFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFIIIIIIIIFFFFFEFFFFFIIIIIIIIFF ", " IIIIIIIIDCACBABCACDIIIIIIII ", " IIIIIIII I I IIIIIIII ", " IIIIIIII IHI IIIIIIII ", " IIIIIIII I I IIIIIIII ", " IIIIIIIIDCACBABCACDIIIIIIII ", " FFIIIIIIIIFFFFFEFFFFFIIIIIIIIFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFIIIIIFFFFF E FFFFFIIIIIFF ", " IIIII DCACBABCACD IIIII ", " IIIII I I IIIII ", " IIIII IHI IIIII ", " IIIII I I IIIII ", " IIIII DCACBABCACD IIIII ", " FFIIIIIFFFFF E FFFFFIIIIIFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFIIIFFFF E FFFFIIIFF ", " III DCACBABCACD III ", " III I I III ", " III IHI III ", " III I I III ", " III DCACBABCACD III ", " FFIIIFFFF E FFFFIIIFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFIIFFF E FFFIIFF ", " II DCACBABCACD II ", " II I I II ", " II IHI II ", " II I I II ", " II DCACBABCACD II ", " FFIIFFF E FFFIIFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFF EEE FFFFF ", " DCACBABCACD ", " I I ", " IHI ", " I I ", " DCACBABCACD ", " FFFFF EEE FFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GG GG ", " FFFF EEE FFFF ", " DCACBABCACD ", " I I ", " IHI ", " I I ", " DCACBABCACD ", " FFFF EEE FFFF ", " GG J GG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GGGA AGGG ", " FFF EEE FFF ", " DCACBABCACD ", " I I ", " IHI ", " I I ", " DCACBABCACD ", " FFF EEE FFF ", " GGGA J AGGG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GGGAA AAGGG ", " FF FFFEEEFFF FF ", " DCACBABCACD ", " I I ", " IHI ", " I I ", " DCACBABCACD ", " FF FFFEEEFFF FF ", " GGGAA J AAGGG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGGGA AGGGGA ", " FF FFFFFFEEEFFFFFF FF ", " DCACBABCACD ", " I I ", " IHI ", " I I ", " DCACBABCACD ", " FF FFFFFFEEEFFFFFF FF ", " AGGGGA J AGGGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGAGGA AGGAGA ", " FF FFFFFFFFEEEFFFFFFFF FF ", " DDCACBABCACDD ", " I I ", " IHI ", " I I ", " DDCACBABCACDD ", " FF FFFFFFFFEEEFFFFFFFF FF ", " AGAGGA J AGGAGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFFFFFFEEEFFFFFFFFFF FF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FF FFFFFFFFFFEEEFFFFFFFFFF FF ", " AGGAGGA J AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFFFFF EEEEE FFFFFFFFF FF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FF FFFFFFFFF EEEEE FFFFFFFFF FF ", " AGGAGGA AGGAGGA ", " J ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFF EEEEE FFFFFF FF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FF FFFFFF EEEEE FFFFFF FF ", " AGGAGGA AGGAGGA ", " J ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFF FFFF EEEEE FFFF FFF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FFF FFFF EEEEE FFFF FFF ", " AGGAGGA AGGAGGA ", " J ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFF FFF EEEEE FFF FFF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FFF FFF EEEEE FFF FFF ", " AGGAGGA AGGAGGA ", " J ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFFF FF EEEEE FF FFFF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FFFF FF EEEEE FF FFFF ", " AGGAGGA AGGAGGA ", " J ", " ", " ", " ") + .aisle(" ", " ", " ", " A A ", " AGGAGGA A A AGGAGGA ", " FIF FF EEEEE FF FIF ", " I DCAACBABCAACD I ", " I I I I ", " I IHI I ", " I I I I ", " I DCAACBABCAACD I ", " FIF FF EEEEE FF FIF ", " AGGAGGA A A AGGAGGA ", " AJA ", " ", " ", " ") + .aisle(" ", " ", " A A ", " A A ", " AGGAGGA AGGAGGA ", " FIIF FF EEEEE FF FIIF ", " II DCAACBABCAACD II ", " II I I II ", " II IHI II ", " II I I II ", " II DCAACBABCAACD II ", " FIIF FF EEEEE FF FIIF ", " AGGAGGA AGGAGGA ", " A A ", " AJA ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAGGA AGGAGGA ", " FIF FF AAA EEE AAA FF FIF ", " I DCAACBABCAACD I ", " I I I I ", " I IHI I ", " I I I I ", " I DCAACBABCAACD I ", " FIF FF AAA EEE AAA FF FIF ", " AGGAGGA AGGAGGA ", " ", " AJA ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAGGA AGGAGGA ", " FIIF FF AA AA AAAAEEEAAAA AA AA FF FIIF ", " II D BAB D II ", " II I I II ", " II IHI II ", " II I I II ", " II D BAB D II ", " FIIF FF AA AA AAAAEEEAAAA AA AA FF FIIF ", " AGGAGGA AGGAGGA ", " ", " AJA ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAG GAGGA ", " FFIFF FFF AA AAAA ACCCA AAAA AA FFF FFIFF ", " I D BAB D I ", " I I I I ", " I IHI I ", " I I I I ", " I D BAB D I ", " FFIFF FFF AA AAAA ACCCA AAAA AA FFF FFIFF ", " AGGAG GAGGA ", " ", " AJA ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGA AGGA ", " FIIF FFF AABA ACCCA ABAA FFF FIIF ", " II BAB II ", " II I I II ", " II IHI II ", " II I I II ", " II BAB II ", " FIIF FFF AABA ACCCA ABAA FFF FIIF ", " AGGA AGGA ", " ", " AJA ", " ", " ") + .aisle(" ", " ", " A A ", " ", " A A ", " FIIF FFF AABABA ACCCA ABABAA FFF FIIF ", " II BAB II ", " II I I II ", " II IHI II ", " II I I II ", " II BAB II ", " FIIF FFF AABABA ACCCA ABABAA FFF FIIF ", " A A ", " ", " AJA ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " D D ", " D D ", " FIIIF FFF AA ABABAD ACCCA DABABA AA FFF FIIIF ", " III D BAB D III ", " III D I I D III ", " III DD IHI DD III ", " III D I I D III ", " III D BAB D III ", " FIIIF FFF AA ABABAD ACCCA DABABA AA FFF FIIIF ", " D D ", " D D ", " DD AJA DD ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " ", " ", " FIIF FFF A ABABA ACCCA ABABA A FFF FIIF ", " II BAB II ", " II I I II ", " II DD IHI DD II ", " II I I II ", " II BAB II ", " FIIF FFF A ABABA ACCCA ABABA A FFF FIIF ", " ", " ", " DD AJA DD ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " AAAAA ", " ", " FIIIF FFFF AA ABABA ACCCA ABABA AA FFFF FIIIF ", " III BAB III ", " III AAAAA III ", " III DD H DD III ", " III AAAAA III ", " III BAB III ", " FIIIF FFFF AA ABABA ACCCA ABABA AA FFFF FIIIF ", " ", " AAAAA ", " DD AJA DD ", " ", " ") + .aisle(" ", " ", " D D D D ", " D AAAAAAAAA D ", " D BBBBB D ", " FIIIF FFF AA DABABA BBBBB ABABAD AA FFF FIIIF ", " III D BBBBB D III ", " III D AAAAAAAAA D III ", " III D GGGGG D III ", " III D AAAAAAAAA D III ", " III D BBBBB D III ", " FIIIF FFF AA DABABA BBBBB ABABAD AA FFF FIIIF ", " D BBBBB D ", " D AAAAAAAAA D ", " D DJD D ", " ", " ") + .aisle(" ", " ", " DCD ", " AAAAAAAAAAAAA ", " BBBBBBBBB ", " FIIIF FFFF A ABABBBBBBBBBBBBBABA A FFFF FIIIF ", " III BBBBBBBBB III ", " III AAAAAAAAAAAAA III ", " III GGGGGGGGG III ", " III AAAAAAAAAAAAA III ", " III BBBBBBBBB III ", " FIIIF FFFF A ABABBBBBBBBBBBBBABA A FFFF FIIIF ", " BBBBBBBBB ", " AAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " ", " DCD ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBB ", " FIIIF FFFF A ABABBBBBBBBBBBABA A FFFF FIIIF ", " III DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD III ", " III AAAAAAAAAAAAAAA III ", " III GGGGGGGGGGG III ", " III AAAAAAAAAAAAAAA III ", " III DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD III ", " FIIIF FFFF A ABABBBBBBBBBBBABA A FFFF FIIIF ", " BBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " ", " CDCDC ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBBBB ", " FIIF FFFF AA BBBBBBBBBBBBBBB AA FFFF FIIF ", " DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD ", " AAAAAAAAAAAAAAA ", " GGGGGGGGGGGGG ", " AAAAAAAAAAAAAAA ", " DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD ", " FIIF FFFF AA BBBBBBBBBBBBBBB AA FFFF FIIF ", " BBBBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " CDCDC ", " ", " ") + .aisle(" ", " ", " DCDCDCD ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF ", " DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD ", " AAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD ", " FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DCDCDCD ", " ", " ") + .aisle(" D D ", " D D ", " DDCDCDCDD ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF ", " DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD ", " AAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAA ", " DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD ", " FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DDCDCDCDD ", " D D ", " D D ") + .aisle(" ", " ", " CCCCCCCCCCC ", " AAAAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBBBB ", " FIIIF FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF FIIIF ", " DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD ", " AAAAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD ", " FIIIF FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF FIIIF ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCC@@@CCCC ", " ", " ") + .aisle(" ", " ", " AAAAAAAAADDDDDDCCCCCDDDDDDAAAAAAAAA ", " AA AAAAAAAAAAAAAAAAAAA AA ", " A BBBBBBBBBBBBBBBBB A ", " EEEEEEE FIIIF EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE FIIIF EEEEEEE ", " DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD ", " IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIAAAAAAAAAAAAAAAAAAAIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII ", " IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII GGGGGGGGGGGGGGGGG IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII ", " IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIAAAAAAAAAAAAAAAAAAAIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII ", " DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD ", " EEEEEEE FIIIF EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE FIIIF EEEEEEE ", " A BBBBBBBBBBBBBBBBB A ", " AA AAAAAAAAAAAAAAAAAAA AA ", " AAAAAAAAADDDDDD@@@@@DDDDDDAAAAAAAAA ", " ", " ") + .aisle(" ", " ", " CCCCCCCCCCCCCCC ", " AAAAAAAAA AAAAAAAAA ", " BBBBBBBB BBBBBBBB ", " EEEEEEEEEEEEFIIIEEEEEEEEEEEEEEEEEEEECCCCCCBBBBBBBB BBBBBBBBCCCCCCEEEEEEEEEEEEEEEEEEEEIIIFEEEEEEEEEEEE ", " DDDDDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDDDD ", " AAAAAAAAAAAAAAAAAAA ", "HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH", " AAAAAAAAAAAAAAAAAAA ", " DDDDDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDDDD ", " EEEEEEEEEEEEFIIIEEEEEEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEEEEEEIIIFEEEEEEEEEEEE ", " JJJJJJ BBBBBBBBBBBBBBBBB JJJJJJ ", " JJJJJJ AAAAAAAAAAAAAAAAAAA JJJJJJ ", " JJJJJJJJJJCCCCC@@#@@CCCCCJJJJJJJJJJ ", " ", " ") + .aisle(" ", " ", " AAAAAAAAADDDDDDCCCCCDDDDDDAAAAAAAAA ", " AA AAAAAAAAAAAAAAAAAAA AA ", " A BBBBBBBBBBBBBBBBB A ", " EEEEEEE FIIIF EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE FIIIF EEEEEEE ", " DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD ", " IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIAAAAAAAAAAAAAAAAAAAIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII ", " IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII GGGGGGGGGGGGGGGGG IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII ", " IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIAAAAAAAAAAAAAAAAAAAIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII ", " DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD ", " EEEEEEE FIIIF EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE FIIIF EEEEEEE ", " A BBBBBBBBBBBBBBBBB A ", " AA AAAAAAAAAAAAAAAAAAA AA ", " AAAAAAAAADDDDDD@@@@@DDDDDDAAAAAAAAA ", " ", " ") + .aisle(" ", " ", " CCCCCCCCCCC ", " AAAAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBBBB ", " FIIIF FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF FIIIF ", " DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD ", " AAAAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD ", " FIIIF FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF FIIIF ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCC@@@CCCC ", " ", " ") + .aisle(" D D ", " D D ", " DDCDCDCDD ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF ", " DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD ", " AAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAA ", " DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD ", " FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DDCDCDCDD ", " D D ", " D D ") + .aisle(" ", " ", " DCDCDCD ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF ", " DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD ", " AAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD ", " FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DCDCDCD ", " ", " ") + .aisle(" ", " ", " CDCDC ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBBBB ", " FIIF FFFF AA BBBBBBBBBBBBBBB AA FFFF FIIF ", " DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD ", " AAAAAAAAAAAAAAA ", " GGGGGGGGGGGGG ", " AAAAAAAAAAAAAAA ", " DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD ", " FIIF FFFF AA BBBBBBBBBBBBBBB AA FFFF FIIF ", " BBBBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " CDCDC ", " ", " ") + .aisle(" ", " ", " DCD ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBB ", " FIIIF FFFF A ABABBBBBBBBBBBABA A FFFF FIIIF ", " III DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD III ", " III AAAAAAAAAAAAAAA III ", " III GGGGGGGGGGG III ", " III AAAAAAAAAAAAAAA III ", " III DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD III ", " FIIIF FFFF A ABABBBBBBBBBBBABA A FFFF FIIIF ", " BBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " ", " DCD ", " AAAAAAAAAAAAA ", " BBBBBBBBB ", " FIIIF FFFF A ABABBBBBBBBBBBBBABA A FFFF FIIIF ", " III BBBBBBBBB III ", " III AAAAAAAAAAAAA III ", " III GGGGGGGGG III ", " III AAAAAAAAAAAAA III ", " III BBBBBBBBB III ", " FIIIF FFFF A ABABBBBBBBBBBBBBABA A FFFF FIIIF ", " BBBBBBBBB ", " AAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " ", " D D D D ", " D AAAAAAAAA D ", " D BBBBB D ", " FIIIF FFF AA DABABA BBBBB ABABAD AA FFF FIIIF ", " III D BBBBB D III ", " III D AAAAAAAAA D III ", " III D GGGGG D III ", " III D AAAAAAAAA D III ", " III D BBBBB D III ", " FIIIF FFF AA DABABA BBBBB ABABAD AA FFF FIIIF ", " D BBBBB D ", " D AAAAAAAAA D ", " D DJD D ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " AAAAA ", " ", " FIIIF FFFF AA ABABA ACCCA ABABA AA FFFF FIIIF ", " III BAB III ", " III AAAAA III ", " III DD H DD III ", " III AAAAA III ", " III BAB III ", " FIIIF FFFF AA ABABA ACCCA ABABA AA FFFF FIIIF ", " ", " AAAAA ", " DD AJA DD ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " ", " ", " FIIF FFF A ABABA ACCCA ABABA A FFF FIIF ", " II BAB II ", " II I I II ", " II DD IHI DD II ", " II I I II ", " II BAB II ", " FIIF FFF A ABABA ACCCA ABABA A FFF FIIF ", " ", " ", " DD AJA DD ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " D D ", " D D ", " FIIIF FFF AA ABABAD ACCCA DABABA AA FFF FIIIF ", " III D BAB D III ", " III D I I D III ", " III DD IHI DD III ", " III D I I D III ", " III D BAB D III ", " FIIIF FFF AA ABABAD ACCCA DABABA AA FFF FIIIF ", " D D ", " D D ", " DD AJA DD ", " ", " ") + .aisle(" ", " ", " A A ", " ", " A A ", " FIIF FFF AABABA ACCCA ABABAA FFF FIIF ", " II BAB II ", " II I I II ", " II IHI II ", " II I I II ", " II BAB II ", " FIIF FFF AABABA ACCCA ABABAA FFF FIIF ", " A A ", " ", " AJA ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGA AGGA ", " FIIF FFF AABA ACCCA ABAA FFF FIIF ", " II BAB II ", " II I I II ", " II IHI II ", " II I I II ", " II BAB II ", " FIIF FFF AABA ACCCA ABAA FFF FIIF ", " AGGA AGGA ", " ", " AJA ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAG GAGGA ", " FFIFF FFF AA AAAA ACCCA AAAA AA FFF FFIFF ", " I D BAB D I ", " I I I I ", " I IHI I ", " I I I I ", " I D BAB D I ", " FFIFF FFF AA AAAA ACCCA AAAA AA FFF FFIFF ", " AGGAG GAGGA ", " ", " AJA ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAGGA AGGAGGA ", " FIIF FF AA AA AAAAEEEAAAA AA AA FF FIIF ", " II D BAB D II ", " II I I II ", " II IHI II ", " II I I II ", " II D BAB D II ", " FIIF FF AA AA AAAAEEEAAAA AA AA FF FIIF ", " AGGAGGA AGGAGGA ", " ", " AJA ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAGGA AGGAGGA ", " FIF FF AAA EEE AAA FF FIF ", " I DCAACBABCAACD I ", " I I I I ", " I IHI I ", " I I I I ", " I DCAACBABCAACD I ", " FIF FF AAA EEE AAA FF FIF ", " AGGAGGA AGGAGGA ", " ", " AJA ", " ", " ") + .aisle(" ", " ", " A A ", " A A ", " AGGAGGA AGGAGGA ", " FIIF FF EEEEE FF FIIF ", " II DCAACBABCAACD II ", " II I I II ", " II IHI II ", " II I I II ", " II DCAACBABCAACD II ", " FIIF FF EEEEE FF FIIF ", " AGGAGGA AGGAGGA ", " A A ", " AJA ", " ", " ") + .aisle(" ", " ", " ", " A A ", " AGGAGGA A A AGGAGGA ", " FIF FF EEEEE FF FIF ", " I DCAACBABCAACD I ", " I I I I ", " I IHI I ", " I I I I ", " I DCAACBABCAACD I ", " FIF FF EEEEE FF FIF ", " AGGAGGA A A AGGAGGA ", " AJA ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFFF FF EEEEE FF FFFF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FFFF FF EEEEE FF FFFF ", " AGGAGGA AGGAGGA ", " J ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFF FFF EEEEE FFF FFF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FFF FFF EEEEE FFF FFF ", " AGGAGGA AGGAGGA ", " J ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFF FFFF EEEEE FFFF FFF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FFF FFFF EEEEE FFFF FFF ", " AGGAGGA AGGAGGA ", " J ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFF EEEEE FFFFFF FF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FF FFFFFF EEEEE FFFFFF FF ", " AGGAGGA AGGAGGA ", " J ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFFFFF EEEEE FFFFFFFFF FF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FF FFFFFFFFF EEEEE FFFFFFFFF FF ", " AGGAGGA AGGAGGA ", " J ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFFFFFFEEEFFFFFFFFFF FF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FF FFFFFFFFFFEEEFFFFFFFFFF FF ", " AGGAGGA J AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGAGGA AGGAGA ", " FF FFFFFFFFEEEFFFFFFFF FF ", " DDCACBABCACDD ", " I I ", " IHI ", " I I ", " DDCACBABCACDD ", " FF FFFFFFFFEEEFFFFFFFF FF ", " AGAGGA J AGGAGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGGGA AGGGGA ", " FF FFFFFFEEEFFFFFF FF ", " DCACBABCACD ", " I I ", " IHI ", " I I ", " DCACBABCACD ", " FF FFFFFFEEEFFFFFF FF ", " AGGGGA J AGGGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GGGAA AAGGG ", " FF FFFEEEFFF FF ", " DCACBABCACD ", " I I ", " IHI ", " I I ", " DCACBABCACD ", " FF FFFEEEFFF FF ", " GGGAA J AAGGG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GGGA AGGG ", " FFF EEE FFF ", " DCACBABCACD ", " I I ", " IHI ", " I I ", " DCACBABCACD ", " FFF EEE FFF ", " GGGA J AGGG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GG GG ", " FFFF EEE FFFF ", " DCACBABCACD ", " I I ", " IHI ", " I I ", " DCACBABCACD ", " FFFF EEE FFFF ", " GG J GG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFF EEE FFFFF ", " DCACBABCACD ", " I I ", " IHI ", " I I ", " DCACBABCACD ", " FFFFF EEE FFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFIIFFF E FFFIIFF ", " II DCACBABCACD II ", " II I I II ", " II IHI II ", " II I I II ", " II DCACBABCACD II ", " FFIIFFF E FFFIIFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFIIIFFFF E FFFFIIIFF ", " III DCACBABCACD III ", " III I I III ", " III IHI III ", " III I I III ", " III DCACBABCACD III ", " FFIIIFFFF E FFFFIIIFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFIIIIIFFFFF E FFFFFIIIIIFF ", " IIIII DCACBABCACD IIIII ", " IIIII I I IIIII ", " IIIII IHI IIIII ", " IIIII I I IIIII ", " IIIII DCACBABCACD IIIII ", " FFIIIIIFFFFF E FFFFFIIIIIFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFIIIIIIIIFFFFFEFFFFFIIIIIIIIFF ", " IIIIIIIIDCACBABCACDIIIIIIII ", " IIIIIIII I I IIIIIIII ", " IIIIIIII IHI IIIIIIII ", " IIIIIIII I I IIIIIIII ", " IIIIIIIIDCACBABCACDIIIIIIII ", " FFIIIIIIIIFFFFFEFFFFFIIIIIIIIFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFIIIIIIIIIIIIIIIIIIIIIIIFFF ", " IIIIIIDCACBABCACDIIIIII ", " IIIIII I I IIIIII ", " IIIIII IHI IIIIII ", " IIIIII I I IIIIII ", " IIIIIIDCACBABCACDIIIIII ", " FFFIIIIIIIIIIIIIIIIIIIIIIIFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFIIIIIIIIIIIIIIIIIIIFF ", " IIIIDDCCBABCCDDIIII ", " IIII I I IIII ", " IIII IHI IIII ", " IIII I I IIII ", " IIIIDDCCBABCCDDIIII ", " FFIIIIIIIIIIIIIIIIIIIFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFFIIIIIIIIIFFFFF ", " DCCBABCCD ", " I I ", " IHI ", " I I ", " DCCBABCCD ", " FFFFFIIIIIIIIIFFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFFFFFF ", " DCCBABCCD ", " I I ", " IHI ", " I I ", " DCCBABCCD ", " FFFFFFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DCCBABCCD ", " I I ", " IHI ", " I I ", " DCCBABCCD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCCBABCCD ", " I I ", " IHI ", " I I ", " DCCBABCCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DDCBABCDD ", " I I ", " IHI ", " I I ", " DDCBABCDD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " I I ", " IHI ", " I I ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " I I ", " IHI ", " I I ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " I I ", " IHI ", " I I ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " I I ", " IHI ", " I I ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " I I ", " IHI ", " I I ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DDBABDD ", " I I ", " IHI ", " I I ", " DDBABDD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " I I ", " IHI ", " I I ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " I I ", " IHI ", " I I ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " I I ", " IHI ", " I I ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DBABD ", " I I ", " IHI ", " I I ", " DBABD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DDADD ", " ", " H ", " ", " DDADD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " H ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " H ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " H ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DDD ", " ", " H ", " ", " DDD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " H ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " H ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " H ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " H ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + ; + } + + // spotless:on +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/StarLadderResearchHubPatterns.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/StarLadderResearchHubPatterns.java new file mode 100644 index 000000000..ad1a1fe0f --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/StarLadderResearchHubPatterns.java @@ -0,0 +1,463 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +/** + * Star Ladder Research Hub structure patterns for tiers T0-T3. + * Characters have been normalized across all tiers for consistency. + * Each string in the array is one aisle, with layers separated by '|'. + * + * UNIFIED LEGEND (applies to all tiers): + * ' ' (space) = Air/ANY + * '@' = Controller marker (orange_wool from export) + * '#' = Controller position (red_wool from export) + * A = cosmiccore:superheavy_steel_casing + * B = cosmiccore:bolted_heavy_frame_casing + * C = cosmiccore:somarust_casing + * D = cosmiccore:soul_muted_casing + * E = cosmiccore:bichromal_nevramite_casing (T1+) + * F = cosmiccore:oscillating_gilded_pthanterum_casings (T2+) + * G = cosmiccore:highly_flexible_reinforced_trinavine_casing (T2+) + * H = cosmiccore:royal_ichorium_casing (T3+) + * I = cosmiccore:multi_purpose_interstellar_grade_casing (T3+) + * J = cosmiccore:ultra_powered_casing (T3+) + */ +public class StarLadderResearchHubPatterns { + + // spotless:off + + public static final String[] TIER_0 = { + " | | A | | | | | | ", + " | | A | | | | | | ", + " | | A | | | | | | ", + " | | BAB | | | | | | ", + " | | BAB | AAA AAA | | | | | ", + " | | BAB | AA AA AAAA AAAA AA AA | | | | | ", + " | | BAB | AA AAAA ACCCA AAAA AA | | | | | ", + " | | BAB | AABA ACCCA ABAA | | | | | ", + " | | BAB | AABABA ACCCA ABABAA | | | | | ", + " DD DD | D D | D BAB D | AA ABABAD ACCCA DABABA AA | D D | D D | DD DD | | ", + " DD DD | | BAB | A ABABA ACCCA ABABA A | | | DD DD | | ", + " DD DD | AAAAA | BAB | AA ABABA ACCCA ABABA AA | | AAAAA | DD DD | | ", + " D D | D AAAAAAAAA D | D BBBBB D | AA DABABA BBBBB ABABAD AA | D BBBBB D | D AAAAAAAAA D | D D D D | | ", + " | AAAAAAAAAAAAA | BBBBBBBBB | A ABABBBBBBBBBBBBBABA A | BBBBBBBBB | AAAAAAAAAAAAA | DCD | | ", + " | AAAAAAAAAAAAAAA | BBBBBBBBBBB | A ABABBBBBBBBBBBABA A | BBBBBBBBBBB | AAAAAAAAAAAAAAA | DCD | | ", + " | AAAAAAAAAAAAAAA | BBBBBBBBBBBBB | AA BBBBBBBBBBBBBBB AA | BBBBBBBBBBBBB | AAAAAAAAAAAAAAA | CDCDC | | ", + " | AAAAAAAAAAAAAAAAA | BBBBBBBBBBBBBBB | A BBBBBBBBBBBBBBB A | BBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAA | DCDCDCD | | ", + " | AAAAAAAAAAAAAAAAA | BBBBBBBBBBBBBBB | A BBBBBBBBBBBBBBB A | BBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAA | DDCDCDCDD | D D | D D ", + " | AAAAAAAAAAAAAAAAAAA | BBBBBBBBBBBBBBBBB | AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA | BBBBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAAAA | CCCC@@@CCCC | | ", + " | AAAAAAAAAAAAAAAAAAA | BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB | CCCCCCBBBBBBBBBBBBBBBBBCCCCCC | BBBBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAAAA | DDDDDD@@@@@DDDDDD | | ", + " | AAAAAAAAAAAAAAAAAAA |AAAAAAAAAAABBBBBBBBBBBBBBBBBAAAAAAAAAAAA| CCCCCCBBBBBBBBBBBBBBBBBCCCCCC | BBBBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAAAA | CCCCC@@#@@CCCCC | | ", + " | AAAAAAAAAAAAAAAAAAA | BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB | CCCCCCBBBBBBBBBBBBBBBBBCCCCCC | BBBBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAAAA | DDDDDD@@@@@DDDDDD | | ", + " | AAAAAAAAAAAAAAAAAAA | BBBBBBBBBBBBBBBBB | AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA | BBBBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAAAA | CCCC@@@CCCC | | ", + " | AAAAAAAAAAAAAAAAA | BBBBBBBBBBBBBBB | A BBBBBBBBBBBBBBB A | BBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAA | DDCDCDCDD | D D | D D ", + " | AAAAAAAAAAAAAAAAA | BBBBBBBBBBBBBBB | A BBBBBBBBBBBBBBB A | BBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAA | DCDCDCD | | ", + " | AAAAAAAAAAAAAAA | BBBBBBBBBBBBB | AA BBBBBBBBBBBBBBB AA | BBBBBBBBBBBBB | AAAAAAAAAAAAAAA | CDCDC | | ", + " | AAAAAAAAAAAAAAA | BBBBBBBBBBB | A ABABBBBBBBBBBBABA A | BBBBBBBBBBB | AAAAAAAAAAAAAAA | DCD | | ", + " | AAAAAAAAAAAAA | BBBBBBBBB | A ABABBBBBBBBBBBBBABA A | BBBBBBBBB | AAAAAAAAAAAAA | DCD | | ", + " D D | D AAAAAAAAA D | D BBBBB D | AA DABABA BBBBB ABABAD AA | D BBBBB D | D AAAAAAAAA D | D D D D | | ", + " DD DD | AAAAA | BAB | AA ABABA ACCCA ABABA AA | | AAAAA | DD DD | | ", + " DD DD | | BAB | A ABABA ACCCA ABABA A | | | DD DD | | ", + " DD DD | D D | D BAB D | AA ABABAD ACCCA DABABA AA | D D | D D | DD DD | | ", + " | | BAB | AABABA ACCCA ABABAA | | | | | ", + " | | BAB | AABA ACCCA ABAA | | | | | ", + " | | BAB | AA AAAA ACCCA AAAA AA | | | | | ", + " | | BAB | AA AA AAAA AAAA AA AA | | | | | ", + " | | BAB | AAA AAA | | | | | ", + " | | BAB | | | | | | ", + " | | A | | | | | | ", + " | | A | | | | | | " + }; + + public static final String[] TIER_1 = { + " | | D | | | | | | ", + " | | D | | | | | | ", + " | | D | | | | | | ", + " | | D | | | | | | ", + " | | DDD | | | | | | ", + " | | DAD | | | | | | ", + " | | DAD | | | | | | ", + " | | DAD | | | | | | ", + " | | DDADD | | | | | | ", + " | | DBABD | | | | | | ", + " | | DBABD | E | | | | | ", + " | | DBABD | E | | | | | ", + " | | DBABD | E | | | | | ", + " | | DDBABDD | E | | | | | ", + " | | DCBABCD | EEE | | | | | ", + " | | DCBABCD | EEE | | | | | ", + " | | DCBABCD | EEE | | | | | ", + " | | DCBABCD | EEE | | | | | ", + " | | DCBABCD | EEE | | | | | ", + " | | DDCBABCDD | EEE | | | | | ", + " | | DCCBABCCD | EEE | | | | | ", + " | | DCCBABCCD | E | | | | | ", + " | | DCCBABCCD | | | | | | ", + " | | DCCBABCCD | | | | | | ", + " | | DDCCBABCCDD | | | | | | ", + " | | DCACBABCACD | | | | | | ", + " | | DCACBABCACD | E | | | | | ", + " | | DCACBABCACD | E | | | | | ", + " | | DCACBABCACD | E | | | | | ", + " | | DCACBABCACD | E | | | | | ", + " | | DCACBABCACD | EEE | | | | | ", + " | | DCACBABCACD | EEE | | | | | ", + " | | DCACBABCACD | EEE | | | | | ", + " | | DCACBABCACD | EEE | | | | | ", + " | | DCACBABCACD | EEE | | | | | ", + " | | DDCACBABCACDD | EEE | | | | | ", + " | | DCAACBABCAACD | EEE | | | | | ", + " | | DCAACBABCAACD | EEEEE | | | | | ", + " | | DCAACBABCAACD | EEEEE | | | | | ", + " | | DCAACBABCAACD | EEEEE | | | | | ", + " | | DCAACBABCAACD | EEEEE | | | | | ", + " | | DCAACBABCAACD | EEEEE | | | | | ", + " | | DCAACBABCAACD | EEEEE | A A | A A | | | ", + " | | DCAACBABCAACD | EEEEE | | A A | A A | | ", + " | | DCAACBABCAACD | AAA EEE AAA | | | A A | | ", + " | | D BAB D | AA AA AAAAEEEAAAA AA AA | | | A A | | ", + " | | D BAB D | AA AAAA ACCCA AAAA AA | | | A A | | ", + " | | BAB | AABA ACCCA ABAA | | | A A | | ", + " | | BAB | AABABA ACCCA ABABAA | | | A A | | ", + " DD DD | D D | D BAB D | AA ABABAD ACCCA DABABA AA | D D | D D | DD A A DD | | ", + " DD DD | | BAB | A ABABA ACCCA ABABA A | | | DD A A DD | | ", + " DD DD | AAAAA | BAB | AA ABABA ACCCA ABABA AA | | AAAAA | DD A A DD | | ", + " D D | D AAAAAAAAA D | D BBBBB D | AA DABABA BBBBB ABABAD AA | D BBBBB D | D AAAAAAAAA D | D D D D | | ", + " | AAAAAAAAAAAAA | BBBBBBBBB | A ABABBBBBBBBBBBBBABA A | BBBBBBBBB | AAAAAAAAAAAAA | DCD | | ", + " | AAAAAAAAAAAAAAA | DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD | A ABABBBBBBBBBBBABA A | BBBBBBBBBBB | AAAAAAAAAAAAAAA | DCD | | ", + " | AAAAAAAAAAAAAAA | DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD | AA BBBBBBBBBBBBBBB AA | BBBBBBBBBBBBB | AAAAAAAAAAAAAAA | CDCDC | | ", + " | AAAAAAAAAAAAAAAAA | DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD | A BBBBBBBBBBBBBBB A | BBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAA | DCDCDCD | | ", + " | AAAAAAAAAAAAAAAAA | DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD | A BBBBBBBBBBBBBBB A | BBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAA | DDCDCDCDD | D D | D D ", + " | AAAAAAAAAAAAAAAAAAA | DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD | EEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEE | BBBBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAAAA | CCCC@@@CCCC | | ", + " | AAAAAAAAAAAAAAAAAAA | DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD | EEEEEEE EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE EEEEEEE | A BBBBBBBBBBBBBBBBB A | AA AAAAAAAAAAAAAAAAAAA AA | AAAAAAAAADDDDDD@@@@@DDDDDDAAAAAAAAA | | ", + " | AAAAAAAAAAAAAAAAAAA |DDDDDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDDDD| EEEEEEEEEEEE EEEEEEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEEEEEE EEEEEEEEEEEE | BBBBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAAAA | CCCCC@@#@@CCCCC | | ", + " | AAAAAAAAAAAAAAAAAAA | DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD | EEEEEEE EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE EEEEEEE | A BBBBBBBBBBBBBBBBB A | AA AAAAAAAAAAAAAAAAAAA AA | AAAAAAAAADDDDDD@@@@@DDDDDDAAAAAAAAA | | ", + " | AAAAAAAAAAAAAAAAAAA | DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD | EEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEE | BBBBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAAAA | CCCC@@@CCCC | | ", + " | AAAAAAAAAAAAAAAAA | DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD | A BBBBBBBBBBBBBBB A | BBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAA | DDCDCDCDD | D D | D D ", + " | AAAAAAAAAAAAAAAAA | DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD | A BBBBBBBBBBBBBBB A | BBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAA | DCDCDCD | | ", + " | AAAAAAAAAAAAAAA | DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD | AA BBBBBBBBBBBBBBB AA | BBBBBBBBBBBBB | AAAAAAAAAAAAAAA | CDCDC | | ", + " | AAAAAAAAAAAAAAA | DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD | A ABABBBBBBBBBBBABA A | BBBBBBBBBBB | AAAAAAAAAAAAAAA | DCD | | ", + " | AAAAAAAAAAAAA | BBBBBBBBB | A ABABBBBBBBBBBBBBABA A | BBBBBBBBB | AAAAAAAAAAAAA | DCD | | ", + " D D | D AAAAAAAAA D | D BBBBB D | AA DABABA BBBBB ABABAD AA | D BBBBB D | D AAAAAAAAA D | D D D D | | ", + " DD DD | AAAAA | BAB | AA ABABA ACCCA ABABA AA | | AAAAA | DD A A DD | | ", + " DD DD | | BAB | A ABABA ACCCA ABABA A | | | DD A A DD | | ", + " DD DD | D D | D BAB D | AA ABABAD ACCCA DABABA AA | D D | D D | DD A A DD | | ", + " | | BAB | AABABA ACCCA ABABAA | | | A A | | ", + " | | BAB | AABA ACCCA ABAA | | | A A | | ", + " | | D BAB D | AA AAAA ACCCA AAAA AA | | | A A | | ", + " | | D BAB D | AA AA AAAAEEEAAAA AA AA | | | A A | | ", + " | | DCAACBABCAACD | AAA EEE AAA | | | A A | | ", + " | | DCAACBABCAACD | EEEEE | | A A | A A | | ", + " | | DCAACBABCAACD | EEEEE | A A | A A | | | ", + " | | DCAACBABCAACD | EEEEE | | | | | ", + " | | DCAACBABCAACD | EEEEE | | | | | ", + " | | DCAACBABCAACD | EEEEE | | | | | ", + " | | DCAACBABCAACD | EEEEE | | | | | ", + " | | DCAACBABCAACD | EEEEE | | | | | ", + " | | DCAACBABCAACD | EEE | | | | | ", + " | | DDCACBABCACDD | EEE | | | | | ", + " | | DCACBABCACD | EEE | | | | | ", + " | | DCACBABCACD | EEE | | | | | ", + " | | DCACBABCACD | EEE | | | | | ", + " | | DCACBABCACD | EEE | | | | | ", + " | | DCACBABCACD | EEE | | | | | ", + " | | DCACBABCACD | E | | | | | ", + " | | DCACBABCACD | E | | | | | ", + " | | DCACBABCACD | E | | | | | ", + " | | DCACBABCACD | E | | | | | ", + " | | DCACBABCACD | | | | | | ", + " | | DDCCBABCCDD | | | | | | ", + " | | DCCBABCCD | | | | | | ", + " | | DCCBABCCD | | | | | | ", + " | | DCCBABCCD | E | | | | | ", + " | | DCCBABCCD | EEE | | | | | ", + " | | DDCBABCDD | EEE | | | | | ", + " | | DCBABCD | EEE | | | | | ", + " | | DCBABCD | EEE | | | | | ", + " | | DCBABCD | EEE | | | | | ", + " | | DCBABCD | EEE | | | | | ", + " | | DCBABCD | EEE | | | | | ", + " | | DDBABDD | E | | | | | ", + " | | DBABD | E | | | | | ", + " | | DBABD | E | | | | | ", + " | | DBABD | E | | | | | ", + " | | DBABD | | | | | | ", + " | | DDADD | | | | | | ", + " | | DAD | | | | | | ", + " | | DAD | | | | | | ", + " | | DAD | | | | | | ", + " | | DDD | | | | | | ", + " | | D | | | | | | ", + " | | D | | | | | | ", + " | | D | | | | | | ", + " | | D | | | | | | " + }; + + public static final String[] TIER_2 = { + " | | | | | | D | | | | D | | | | | | ", + " | | | | | | D | | | | D | | | | | | ", + " | | | | | | D | | | | D | | | | | | ", + " | | | | | | D | | | | D | | | | | | ", + " | | | | | | DDD | | | | DDD | | | | | | ", + " | | | | | | DAD | | | | DAD | | | | | | ", + " | | | | | | DAD | | | | DAD | | | | | | ", + " | | | | | | DAD | | | | DAD | | | | | | ", + " | | | | | | DDADD | | | | DDADD | | | | | | ", + " | | | | | | DBABD | | | | DBABD | | | | | | ", + " | | | | | E | DBABD | | | | DBABD | E | | | | | ", + " | | | | | E | DBABD | | | | DBABD | E | | | | | ", + " | | | | | E | DBABD | | | | DBABD | E | | | | | ", + " | | | | | E | DDBABDD | | | | DDBABDD | E | | | | | ", + " | | | | | EEE | DCBABCD | | | | DCBABCD | EEE | | | | | ", + " | | | | | EEE | DCBABCD | | | | DCBABCD | EEE | | | | | ", + " | | | | | EEE | DCBABCD | | | | DCBABCD | EEE | | | | | ", + " | | | | | EEE | DCBABCD | | | | DCBABCD | EEE | | | | | ", + " | | | | | EEE | DCBABCD | | | | DCBABCD | EEE | | | | | ", + " | | | | | EEE | DDCBABCDD | | | | DDCBABCDD | EEE | | | | | ", + " | | | | | EEE | DCCBABCCD | | | | DCCBABCCD | EEE | | | | | ", + " | | | | | E | DCCBABCCD | | | | DCCBABCCD | E | | | | | ", + " | | | | | FFFFFFFFF | DCCBABCCD | | | | DCCBABCCD | FFFFFFFFF | | | | | ", + " | | | | | FFFFF FFFFF | DCCBABCCD | | | | DCCBABCCD | FFFFF FFFFF | | | | | ", + " | | | | | FF FF | DDCCBABCCDD | | | | DDCCBABCCDD | FF FF | | | | | ", + " | | | | | FFF FFF | DCACBABCACD | | | | DCACBABCACD | FFF FFF | | | | | ", + " | | | | | FF FFFFFEFFFFF FF | DCACBABCACD | | | | DCACBABCACD | FF FFFFFEFFFFF FF | | | | | ", + " | | | | | FF FFFFF E FFFFF FF | DCACBABCACD | | | | DCACBABCACD | FF FFFFF E FFFFF FF | | | | | ", + " | | | | | FF FFFF E FFFF FF | DCACBABCACD | | | | DCACBABCACD | FF FFFF E FFFF FF | | | | | ", + " | | | | | FF FFF E FFF FF | DCACBABCACD | | | | DCACBABCACD | FF FFF E FFF FF | | | | | ", + " | | | | | FFFFF EEE FFFFF | DCACBABCACD | | | | DCACBABCACD | FFFFF EEE FFFFF | | | | | ", + " | | | | GG GG | FFFF EEE FFFF | DCACBABCACD | | | | DCACBABCACD | FFFF EEE FFFF | GG GG | | | | ", + " | | | | GGGA AGGG | FFF EEE FFF | DCACBABCACD | | | | DCACBABCACD | FFF EEE FFF | GGGA AGGG | | | | ", + " | | | | GGGAA AAGGG | FF FFFEEEFFF FF | DCACBABCACD | | | | DCACBABCACD | FF FFFEEEFFF FF | GGGAA AAGGG | | | | ", + " | | | | AGGGGA AGGGGA | FF FFFFFFEEEFFFFFF FF | DCACBABCACD | | | | DCACBABCACD | FF FFFFFFEEEFFFFFF FF | AGGGGA AGGGGA | | | | ", + " | | | | AGAGGA AGGAGA | FF FFFFFFFFEEEFFFFFFFF FF | DDCACBABCACDD | | | | DDCACBABCACDD | FF FFFFFFFFEEEFFFFFFFF FF | AGAGGA AGGAGA | | | | ", + " | | | | AGGAGGA AGGAGGA | FF FFFFFFFFFFEEEFFFFFFFFFF FF | DCAACBABCAACD | | | | DCAACBABCAACD | FF FFFFFFFFFFEEEFFFFFFFFFF FF | AGGAGGA AGGAGGA | | | | ", + " | | | | AGGAGGA AGGAGGA | FF FFFFFFFFF EEEEE FFFFFFFFF FF | DCAACBABCAACD | | | | DCAACBABCAACD | FF FFFFFFFFF EEEEE FFFFFFFFF FF | AGGAGGA AGGAGGA | | | | ", + " | | | | AGGAGGA AGGAGGA | FF FFFFFF EEEEE FFFFFF FF | DCAACBABCAACD | | | | DCAACBABCAACD | FF FFFFFF EEEEE FFFFFF FF | AGGAGGA AGGAGGA | | | | ", + " | | | | AGGAGGA AGGAGGA | FFF FFFF EEEEE FFFF FFF | DCAACBABCAACD | | | | DCAACBABCAACD | FFF FFFF EEEEE FFFF FFF | AGGAGGA AGGAGGA | | | | ", + " | | | | AGGAGGA AGGAGGA | FFF FFF EEEEE FFF FFF | DCAACBABCAACD | | | | DCAACBABCAACD | FFF FFF EEEEE FFF FFF | AGGAGGA AGGAGGA | | | | ", + " | | | | AGGAGGA AGGAGGA | FFFF FF EEEEE FF FFFF | DCAACBABCAACD | | | | DCAACBABCAACD | FFFF FF EEEEE FF FFFF | AGGAGGA AGGAGGA | | | | ", + " | | | A A | AGGAGGA A A AGGAGGA | F F FF EEEEE FF F F | DCAACBABCAACD | | | | DCAACBABCAACD | F F FF EEEEE FF F F | AGGAGGA A A AGGAGGA | A A | | | ", + " | | A A | A A | AGGAGGA AGGAGGA | F F FF EEEEE FF F F | DCAACBABCAACD | | | | DCAACBABCAACD | F F FF EEEEE FF F F | AGGAGGA AGGAGGA | A A | A A | | ", + " | | A A | | AGGAGGA AGGAGGA | F F FF AAA EEE AAA FF F F | DCAACBABCAACD | | | | DCAACBABCAACD | F F FF AAA EEE AAA FF F F | AGGAGGA AGGAGGA | | A A | | ", + " | | A A | | AGGAGGA AGGAGGA | F F FF AA AA AAAAEEEAAAA AA AA FF F F | D BAB D | | | | D BAB D | F F FF AA AA AAAAEEEAAAA AA AA FF F F | AGGAGGA AGGAGGA | | A A | | ", + " | | A A | | AGGAG GAGGA | FF FF FFF AA AAAA ACCCA AAAA AA FFF FF FF | D BAB D | | | | D BAB D | FF FF FFF AA AAAA ACCCA AAAA AA FFF FF FF | AGGAG GAGGA | | A A | | ", + " | | A A | | AGGA AGGA | F F FFF AABA ACCCA ABAA FFF F F | BAB | | | | BAB | F F FFF AABA ACCCA ABAA FFF F F | AGGA AGGA | | A A | | ", + " | | A A | | A A | F F FFF AABABA ACCCA ABABAA FFF F F | BAB | | | | BAB | F F FFF AABABA ACCCA ABABAA FFF F F | A A | | A A | | ", + " | | DD A A DD | D D | D D | F F FFF AA ABABAD ACCCA DABABA AA FFF F F | D BAB D | D D | DD DD | D D | D BAB D | F F FFF AA ABABAD ACCCA DABABA AA FFF F F | D D | D D | DD A A DD | | ", + " | | DD A A DD | | | F F FFF A ABABA ACCCA ABABA A FFF F F | BAB | | DD DD | | BAB | F F FFF A ABABA ACCCA ABABA A FFF F F | | | DD A A DD | | ", + " | | DD A A DD | AAAAA | | F F FFFF AA ABABA ACCCA ABABA AA FFFF F F | BAB | AAAAA | DD DD | AAAAA | BAB | F F FFFF AA ABABA ACCCA ABABA AA FFFF F F | | AAAAA | DD A A DD | | ", + " | | D D D D | D AAAAAAAAA D | D BBBBB D | F F FFF AA DABABA BBBBB ABABAD AA FFF F F | D BBBBB D | D AAAAAAAAA D | D GGGGG D | D AAAAAAAAA D | D BBBBB D | F F FFF AA DABABA BBBBB ABABAD AA FFF F F | D BBBBB D | D AAAAAAAAA D | D D D D | | ", + " | | DCD | AAAAAAAAAAAAA | BBBBBBBBB | F F FFFF A ABABBBBBBBBBBBBBABA A FFFF F F | BBBBBBBBB | AAAAAAAAAAAAA | GGGGGGGGG | AAAAAAAAAAAAA | BBBBBBBBB | F F FFFF A ABABBBBBBBBBBBBBABA A FFFF F F | BBBBBBBBB | AAAAAAAAAAAAA | DCD | | ", + " | | DCD | AAAAAAAAAAAAAAA | BBBBBBBBBBB | F F FFFF A ABABBBBBBBBBBBABA A FFFF F F | DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD | AAAAAAAAAAAAAAA | GGGGGGGGGGG | AAAAAAAAAAAAAAA | DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD | F F FFFF A ABABBBBBBBBBBBABA A FFFF F F | BBBBBBBBBBB | AAAAAAAAAAAAAAA | DCD | | ", + " | | CDCDC | AAAAAAAAAAAAAAA | BBBBBBBBBBBBB | F F FFFF AA BBBBBBBBBBBBBBB AA FFFF F F | DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD | AAAAAAAAAAAAAAA | GGGGGGGGGGGGG | AAAAAAAAAAAAAAA | DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD | F F FFFF AA BBBBBBBBBBBBBBB AA FFFF F F | BBBBBBBBBBBBB | AAAAAAAAAAAAAAA | CDCDC | | ", + " | | DCDCDCD | AAAAAAAAAAAAAAAAA | BBBBBBBBBBBBBBB | F F FFFF A BBBBBBBBBBBBBBB A FFFF F F | DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD | AAAAAAAAAAAAAAAAA | GGGGGGGGGGGGGGG | AAAAAAAAAAAAAAAAA | DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD | F F FFFF A BBBBBBBBBBBBBBB A FFFF F F | BBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAA | DCDCDCD | | ", + " D D | D D | DDCDCDCDD | AAAAAAAAAAAAAAAAA | BBBBBBBBBBBBBBB | F F FFFF A BBBBBBBBBBBBBBB A FFFF F F | DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD | AAAAAAAAAAAAAAAAA | GGGGGGGGGGGGGGG | AAAAAAAAAAAAAAAAA | DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD | F F FFFF A BBBBBBBBBBBBBBB A FFFF F F | BBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAA | DDCDCDCDD | D D | D D ", + " | | CCCC CCCC | AAAAAAAAAAAAAAAAAAA | BBBBBBBBBBBBBBBBB | F F FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF F F | DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD | AAAAAAAAAAAAAAAAAAA | GGGGGGGGGGGGGGGGG | AAAAAAAAAAAAAAAAAAA | DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD | F F FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF F F | BBBBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAAAA | CCCC@@@CCCC | | ", + " | | AAAAAAAAADDDDDD DDDDDDAAAAAAAAA | AA AAAAAAAAAAAAAAAAAAA AA | A BBBBBBBBBBBBBBBBB A | EEEEEEE F F EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE F F EEEEEEE | DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD | AAAAAAAAAAAAAAAAAAA | GGGGGGGGGGGGGGGGG | AAAAAAAAAAAAAAAAAAA | DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD | EEEEEEE F F EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE F F EEEEEEE | A BBBBBBBBBBBBBBBBB A | AA AAAAAAAAAAAAAAAAAAA AA | AAAAAAAAADDDDDD@@@@@DDDDDDAAAAAAAAA | | ", + " | | CCCCC CCCCC | AAAAAAAAA AAAAAAAAA | BBBBBBBB BBBBBBBB | EEEEEEEEEEEEF EEEEEEEEEEEEEEEEEEEECCCCCCBBBBBBBB BBBBBBBBCCCCCCEEEEEEEEEEEEEEEEEEEE FEEEEEEEEEEEE |DDDDDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDDDD| AAAAAAAAAAAAAAAAAAA | GGGGGGGGGGGGGGGGG | AAAAAAAAAAAAAAAAAAA |DDDDDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDDDD| EEEEEEEEEEEEF EEEEEEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEEEEEE FEEEEEEEEEEEE | BBBBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAAAA | CCCCC@@#@@CCCCC | | ", + " | | AAAAAAAAADDDDDD DDDDDDAAAAAAAAA | AA AAAAAAAAAAAAAAAAAAA AA | A BBBBBBBBBBBBBBBBB A | EEEEEEE F F EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE F F EEEEEEE | DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD | AAAAAAAAAAAAAAAAAAA | GGGGGGGGGGGGGGGGG | AAAAAAAAAAAAAAAAAAA | DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD | EEEEEEE F F EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE F F EEEEEEE | A BBBBBBBBBBBBBBBBB A | AA AAAAAAAAAAAAAAAAAAA AA | AAAAAAAAADDDDDD@@@@@DDDDDDAAAAAAAAA | | ", + " | | CCCC CCCC | AAAAAAAAAAAAAAAAAAA | BBBBBBBBBBBBBBBBB | F F FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF F F | DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD | AAAAAAAAAAAAAAAAAAA | GGGGGGGGGGGGGGGGG | AAAAAAAAAAAAAAAAAAA | DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD | F F FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF F F | BBBBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAAAA | CCCC@@@CCCC | | ", + " D D | D D | DDCDCDCDD | AAAAAAAAAAAAAAAAA | BBBBBBBBBBBBBBB | F F FFFF A BBBBBBBBBBBBBBB A FFFF F F | DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD | AAAAAAAAAAAAAAAAA | GGGGGGGGGGGGGGG | AAAAAAAAAAAAAAAAA | DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD | F F FFFF A BBBBBBBBBBBBBBB A FFFF F F | BBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAA | DDCDCDCDD | D D | D D ", + " | | DCDCDCD | AAAAAAAAAAAAAAAAA | BBBBBBBBBBBBBBB | F F FFFF A BBBBBBBBBBBBBBB A FFFF F F | DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD | AAAAAAAAAAAAAAAAA | GGGGGGGGGGGGGGG | AAAAAAAAAAAAAAAAA | DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD | F F FFFF A BBBBBBBBBBBBBBB A FFFF F F | BBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAA | DCDCDCD | | ", + " | | CDCDC | AAAAAAAAAAAAAAA | BBBBBBBBBBBBB | F F FFFF AA BBBBBBBBBBBBBBB AA FFFF F F | DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD | AAAAAAAAAAAAAAA | GGGGGGGGGGGGG | AAAAAAAAAAAAAAA | DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD | F F FFFF AA BBBBBBBBBBBBBBB AA FFFF F F | BBBBBBBBBBBBB | AAAAAAAAAAAAAAA | CDCDC | | ", + " | | DCD | AAAAAAAAAAAAAAA | BBBBBBBBBBB | F F FFFF A ABABBBBBBBBBBBABA A FFFF F F | DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD | AAAAAAAAAAAAAAA | GGGGGGGGGGG | AAAAAAAAAAAAAAA | DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD | F F FFFF A ABABBBBBBBBBBBABA A FFFF F F | BBBBBBBBBBB | AAAAAAAAAAAAAAA | DCD | | ", + " | | DCD | AAAAAAAAAAAAA | BBBBBBBBB | F F FFFF A ABABBBBBBBBBBBBBABA A FFFF F F | BBBBBBBBB | AAAAAAAAAAAAA | GGGGGGGGG | AAAAAAAAAAAAA | BBBBBBBBB | F F FFFF A ABABBBBBBBBBBBBBABA A FFFF F F | BBBBBBBBB | AAAAAAAAAAAAA | DCD | | ", + " | | D D D D | D AAAAAAAAA D | D BBBBB D | F F FFF AA DABABA BBBBB ABABAD AA FFF F F | D BBBBB D | D AAAAAAAAA D | D GGGGG D | D AAAAAAAAA D | D BBBBB D | F F FFF AA DABABA BBBBB ABABAD AA FFF F F | D BBBBB D | D AAAAAAAAA D | D D D D | | ", + " | | DD A A DD | AAAAA | | F F FFFF AA ABABA ACCCA ABABA AA FFFF F F | BAB | AAAAA | DD DD | AAAAA | BAB | F F FFFF AA ABABA ACCCA ABABA AA FFFF F F | | AAAAA | DD A A DD | | ", + " | | DD A A DD | | | F F FFF A ABABA ACCCA ABABA A FFF F F | BAB | | DD DD | | BAB | F F FFF A ABABA ACCCA ABABA A FFF F F | | | DD A A DD | | ", + " | | DD A A DD | D D | D D | F F FFF AA ABABAD ACCCA DABABA AA FFF F F | D BAB D | D D | DD DD | D D | D BAB D | F F FFF AA ABABAD ACCCA DABABA AA FFF F F | D D | D D | DD A A DD | | ", + " | | A A | | A A | F F FFF AABABA ACCCA ABABAA FFF F F | BAB | | | | BAB | F F FFF AABABA ACCCA ABABAA FFF F F | A A | | A A | | ", + " | | A A | | AGGA AGGA | F F FFF AABA ACCCA ABAA FFF F F | BAB | | | | BAB | F F FFF AABA ACCCA ABAA FFF F F | AGGA AGGA | | A A | | ", + " | | A A | | AGGAG GAGGA | FF FF FFF AA AAAA ACCCA AAAA AA FFF FF FF | D BAB D | | | | D BAB D | FF FF FFF AA AAAA ACCCA AAAA AA FFF FF FF | AGGAG GAGGA | | A A | | ", + " | | A A | | AGGAGGA AGGAGGA | F F FF AA AA AAAAEEEAAAA AA AA FF F F | D BAB D | | | | D BAB D | F F FF AA AA AAAAEEEAAAA AA AA FF F F | AGGAGGA AGGAGGA | | A A | | ", + " | | A A | | AGGAGGA AGGAGGA | F F FF AAA EEE AAA FF F F | DCAACBABCAACD | | | | DCAACBABCAACD | F F FF AAA EEE AAA FF F F | AGGAGGA AGGAGGA | | A A | | ", + " | | A A | A A | AGGAGGA AGGAGGA | F F FF EEEEE FF F F | DCAACBABCAACD | | | | DCAACBABCAACD | F F FF EEEEE FF F F | AGGAGGA AGGAGGA | A A | A A | | ", + " | | | A A | AGGAGGA A A AGGAGGA | F F FF EEEEE FF F F | DCAACBABCAACD | | | | DCAACBABCAACD | F F FF EEEEE FF F F | AGGAGGA A A AGGAGGA | A A | | | ", + " | | | | AGGAGGA AGGAGGA | FFFF FF EEEEE FF FFFF | DCAACBABCAACD | | | | DCAACBABCAACD | FFFF FF EEEEE FF FFFF | AGGAGGA AGGAGGA | | | | ", + " | | | | AGGAGGA AGGAGGA | FFF FFF EEEEE FFF FFF | DCAACBABCAACD | | | | DCAACBABCAACD | FFF FFF EEEEE FFF FFF | AGGAGGA AGGAGGA | | | | ", + " | | | | AGGAGGA AGGAGGA | FFF FFFF EEEEE FFFF FFF | DCAACBABCAACD | | | | DCAACBABCAACD | FFF FFFF EEEEE FFFF FFF | AGGAGGA AGGAGGA | | | | ", + " | | | | AGGAGGA AGGAGGA | FF FFFFFF EEEEE FFFFFF FF | DCAACBABCAACD | | | | DCAACBABCAACD | FF FFFFFF EEEEE FFFFFF FF | AGGAGGA AGGAGGA | | | | ", + " | | | | AGGAGGA AGGAGGA | FF FFFFFFFFF EEEEE FFFFFFFFF FF | DCAACBABCAACD | | | | DCAACBABCAACD | FF FFFFFFFFF EEEEE FFFFFFFFF FF | AGGAGGA AGGAGGA | | | | ", + " | | | | AGGAGGA AGGAGGA | FF FFFFFFFFFFEEEFFFFFFFFFF FF | DCAACBABCAACD | | | | DCAACBABCAACD | FF FFFFFFFFFFEEEFFFFFFFFFF FF | AGGAGGA AGGAGGA | | | | ", + " | | | | AGAGGA AGGAGA | FF FFFFFFFFEEEFFFFFFFF FF | DDCACBABCACDD | | | | DDCACBABCACDD | FF FFFFFFFFEEEFFFFFFFF FF | AGAGGA AGGAGA | | | | ", + " | | | | AGGGGA AGGGGA | FF FFFFFFEEEFFFFFF FF | DCACBABCACD | | | | DCACBABCACD | FF FFFFFFEEEFFFFFF FF | AGGGGA AGGGGA | | | | ", + " | | | | GGGAA AAGGG | FF FFFEEEFFF FF | DCACBABCACD | | | | DCACBABCACD | FF FFFEEEFFF FF | GGGAA AAGGG | | | | ", + " | | | | GGGA AGGG | FFF EEE FFF | DCACBABCACD | | | | DCACBABCACD | FFF EEE FFF | GGGA AGGG | | | | ", + " | | | | GG GG | FFFF EEE FFFF | DCACBABCACD | | | | DCACBABCACD | FFFF EEE FFFF | GG GG | | | | ", + " | | | | | FFFFF EEE FFFFF | DCACBABCACD | | | | DCACBABCACD | FFFFF EEE FFFFF | | | | | ", + " | | | | | FF FFF E FFF FF | DCACBABCACD | | | | DCACBABCACD | FF FFF E FFF FF | | | | | ", + " | | | | | FF FFFF E FFFF FF | DCACBABCACD | | | | DCACBABCACD | FF FFFF E FFFF FF | | | | | ", + " | | | | | FF FFFFF E FFFFF FF | DCACBABCACD | | | | DCACBABCACD | FF FFFFF E FFFFF FF | | | | | ", + " | | | | | FF FFFFFEFFFFF FF | DCACBABCACD | | | | DCACBABCACD | FF FFFFFEFFFFF FF | | | | | ", + " | | | | | FFF FFF | DCACBABCACD | | | | DCACBABCACD | FFF FFF | | | | | ", + " | | | | | FF FF | DDCCBABCCDD | | | | DDCCBABCCDD | FF FF | | | | | ", + " | | | | | FFFFF FFFFF | DCCBABCCD | | | | DCCBABCCD | FFFFF FFFFF | | | | | ", + " | | | | | FFFFFFFFF | DCCBABCCD | | | | DCCBABCCD | FFFFFFFFF | | | | | ", + " | | | | | E | DCCBABCCD | | | | DCCBABCCD | E | | | | | ", + " | | | | | EEE | DCCBABCCD | | | | DCCBABCCD | EEE | | | | | ", + " | | | | | EEE | DDCBABCDD | | | | DDCBABCDD | EEE | | | | | ", + " | | | | | EEE | DCBABCD | | | | DCBABCD | EEE | | | | | ", + " | | | | | EEE | DCBABCD | | | | DCBABCD | EEE | | | | | ", + " | | | | | EEE | DCBABCD | | | | DCBABCD | EEE | | | | | ", + " | | | | | EEE | DCBABCD | | | | DCBABCD | EEE | | | | | ", + " | | | | | EEE | DCBABCD | | | | DCBABCD | EEE | | | | | ", + " | | | | | E | DDBABDD | | | | DDBABDD | E | | | | | ", + " | | | | | E | DBABD | | | | DBABD | E | | | | | ", + " | | | | | E | DBABD | | | | DBABD | E | | | | | ", + " | | | | | E | DBABD | | | | DBABD | E | | | | | ", + " | | | | | | DBABD | | | | DBABD | | | | | | ", + " | | | | | | DDADD | | | | DDADD | | | | | | ", + " | | | | | | DAD | | | | DAD | | | | | | ", + " | | | | | | DAD | | | | DAD | | | | | | ", + " | | | | | | DAD | | | | DAD | | | | | | ", + " | | | | | | DDD | | | | DDD | | | | | | ", + " | | | | | | D | | | | D | | | | | | ", + " | | | | | | D | | | | D | | | | | | ", + " | | | | | | D | | | | D | | | | | | ", + " | | | | | | D | | | | D | | | | | | " + }; + + public static final String[] TIER_3 = { + " | | | | | | | | H | | | | | | | | ", + " | | | | | | | | H | | | | | | | | ", + " | | | | | | | | H | | | | | | | | ", + " | | | | | | | | H | | | | | | | | ", + " | | | | | | | | H | | | | | | | | ", + " | | | | | | | | H | | | | | | | | ", + " | | | | | | | | H | | | | | | | | ", + " | | | | | | | | H | | | | | | | | ", + " | | | | | | D | | H | | D | | | | | | ", + " | | | | | | D | | H | | D | | | | | | ", + " | | | | | | D | | H | | D | | | | | | ", + " | | | | | | D | | H | | D | | | | | | ", + " | | | | | | DDD | | H | | DDD | | | | | | ", + " | | | | | | DAD | | H | | DAD | | | | | | ", + " | | | | | | DAD | | H | | DAD | | | | | | ", + " | | | | | | DAD | | H | | DAD | | | | | | ", + " | | | | | | DDADD | | H | | DDADD | | | | | | ", + " | | | | | | DBABD | I I | IHI | I I | DBABD | | | | | | ", + " | | | | | E | DBABD | I I | IHI | I I | DBABD | E | | | | | ", + " | | | | | E | DBABD | I I | IHI | I I | DBABD | E | | | | | ", + " | | | | | E | DBABD | I I | IHI | I I | DBABD | E | | | | | ", + " | | | | | E | DDBABDD | I I | IHI | I I | DDBABDD | E | | | | | ", + " | | | | | EEE | DCBABCD | I I | IHI | I I | DCBABCD | EEE | | | | | ", + " | | | | | EEE | DCBABCD | I I | IHI | I I | DCBABCD | EEE | | | | | ", + " | | | | | EEE | DCBABCD | I I | IHI | I I | DCBABCD | EEE | | | | | ", + " | | | | | EEE | DCBABCD | I I | IHI | I I | DCBABCD | EEE | | | | | ", + " | | | | | EEE | DCBABCD | I I | IHI | I I | DCBABCD | EEE | | | | | ", + " | | | | | EEE | DDCBABCDD | I I | IHI | I I | DDCBABCDD | EEE | | | | | ", + " | | | | | EEE | DCCBABCCD | I I | IHI | I I | DCCBABCCD | EEE | | | | | ", + " | | | | | E | DCCBABCCD | I I | IHI | I I | DCCBABCCD | E | | | | | ", + " | | | | | FFFFFFFFF | DCCBABCCD | I I | IHI | I I | DCCBABCCD | FFFFFFFFF | | | | | ", + " | | | | | FFFFFIIIIIIIIIFFFFF | DCCBABCCD | I I | IHI | I I | DCCBABCCD | FFFFFIIIIIIIIIFFFFF | | | | | ", + " | | | | | FFIIIIIIIIIIIIIIIIIIIFF | IIIIDDCCBABCCDDIIII | IIII I I IIII | IIII IHI IIII | IIII I I IIII | IIIIDDCCBABCCDDIIII | FFIIIIIIIIIIIIIIIIIIIFF | | | | | ", + " | | | | | FFFIIIIIIIIIIIIIIIIIIIIIIIFFF | IIIIIIDCACBABCACDIIIIII | IIIIII I I IIIIII | IIIIII IHI IIIIII | IIIIII I I IIIIII | IIIIIIDCACBABCACDIIIIII | FFFIIIIIIIIIIIIIIIIIIIIIIIFFF | | | | | ", + " | | | | | FFIIIIIIIIFFFFFEFFFFFIIIIIIIIFF | IIIIIIIIDCACBABCACDIIIIIIII | IIIIIIII I I IIIIIIII | IIIIIIII IHI IIIIIIII | IIIIIIII I I IIIIIIII | IIIIIIIIDCACBABCACDIIIIIIII | FFIIIIIIIIFFFFFEFFFFFIIIIIIIIFF | | | | | ", + " | | | | | FFIIIIIFFFFF E FFFFFIIIIIFF | IIIII DCACBABCACD IIIII | IIIII I I IIIII | IIIII IHI IIIII | IIIII I I IIIII | IIIII DCACBABCACD IIIII | FFIIIIIFFFFF E FFFFFIIIIIFF | | | | | ", + " | | | | | FFIIIFFFF E FFFFIIIFF | III DCACBABCACD III | III I I III | III IHI III | III I I III | III DCACBABCACD III | FFIIIFFFF E FFFFIIIFF | | | | | ", + " | | | | | FFIIFFF E FFFIIFF | II DCACBABCACD II | II I I II | II IHI II | II I I II | II DCACBABCACD II | FFIIFFF E FFFIIFF | | | | | ", + " | | | | | FFFFF EEE FFFFF | DCACBABCACD | I I | IHI | I I | DCACBABCACD | FFFFF EEE FFFFF | | | | | ", + " | | | | GG GG | FFFF EEE FFFF | DCACBABCACD | I I | IHI | I I | DCACBABCACD | FFFF EEE FFFF | GG J GG | | | | ", + " | | | | GGGA AGGG | FFF EEE FFF | DCACBABCACD | I I | IHI | I I | DCACBABCACD | FFF EEE FFF | GGGA J AGGG | | | | ", + " | | | | GGGAA AAGGG | FF FFFEEEFFF FF | DCACBABCACD | I I | IHI | I I | DCACBABCACD | FF FFFEEEFFF FF | GGGAA J AAGGG | | | | ", + " | | | | AGGGGA AGGGGA | FF FFFFFFEEEFFFFFF FF | DCACBABCACD | I I | IHI | I I | DCACBABCACD | FF FFFFFFEEEFFFFFF FF | AGGGGA J AGGGGA | | | | ", + " | | | | AGAGGA AGGAGA | FF FFFFFFFFEEEFFFFFFFF FF | DDCACBABCACDD | I I | IHI | I I | DDCACBABCACDD | FF FFFFFFFFEEEFFFFFFFF FF | AGAGGA J AGGAGA | | | | ", + " | | | | AGGAGGA AGGAGGA | FF FFFFFFFFFFEEEFFFFFFFFFF FF | DCAACBABCAACD | I I | IHI | I I | DCAACBABCAACD | FF FFFFFFFFFFEEEFFFFFFFFFF FF | AGGAGGA J AGGAGGA | | | | ", + " | | | | AGGAGGA AGGAGGA | FF FFFFFFFFF EEEEE FFFFFFFFF FF | DCAACBABCAACD | I I | IHI | I I | DCAACBABCAACD | FF FFFFFFFFF EEEEE FFFFFFFFF FF | AGGAGGA AGGAGGA | J | | | ", + " | | | | AGGAGGA AGGAGGA | FF FFFFFF EEEEE FFFFFF FF | DCAACBABCAACD | I I | IHI | I I | DCAACBABCAACD | FF FFFFFF EEEEE FFFFFF FF | AGGAGGA AGGAGGA | J | | | ", + " | | | | AGGAGGA AGGAGGA | FFF FFFF EEEEE FFFF FFF | DCAACBABCAACD | I I | IHI | I I | DCAACBABCAACD | FFF FFFF EEEEE FFFF FFF | AGGAGGA AGGAGGA | J | | | ", + " | | | | AGGAGGA AGGAGGA | FFF FFF EEEEE FFF FFF | DCAACBABCAACD | I I | IHI | I I | DCAACBABCAACD | FFF FFF EEEEE FFF FFF | AGGAGGA AGGAGGA | J | | | ", + " | | | | AGGAGGA AGGAGGA | FFFF FF EEEEE FF FFFF | DCAACBABCAACD | I I | IHI | I I | DCAACBABCAACD | FFFF FF EEEEE FF FFFF | AGGAGGA AGGAGGA | J | | | ", + " | | | A A | AGGAGGA A A AGGAGGA | FIF FF EEEEE FF FIF | I DCAACBABCAACD I | I I I I | I IHI I | I I I I | I DCAACBABCAACD I | FIF FF EEEEE FF FIF | AGGAGGA A A AGGAGGA | AJA | | | ", + " | | A A | A A | AGGAGGA AGGAGGA | FIIF FF EEEEE FF FIIF | II DCAACBABCAACD II | II I I II | II IHI II | II I I II | II DCAACBABCAACD II | FIIF FF EEEEE FF FIIF | AGGAGGA AGGAGGA | A A | AJA | | ", + " | | A A | | AGGAGGA AGGAGGA | FIF FF AAA EEE AAA FF FIF | I DCAACBABCAACD I | I I I I | I IHI I | I I I I | I DCAACBABCAACD I | FIF FF AAA EEE AAA FF FIF | AGGAGGA AGGAGGA | | AJA | | ", + " | | A A | | AGGAGGA AGGAGGA | FIIF FF AA AA AAAAEEEAAAA AA AA FF FIIF | II D BAB D II | II I I II | II IHI II | II I I II | II D BAB D II | FIIF FF AA AA AAAAEEEAAAA AA AA FF FIIF | AGGAGGA AGGAGGA | | AJA | | ", + " | | A A | | AGGAG GAGGA | FFIFF FFF AA AAAA ACCCA AAAA AA FFF FFIFF | I D BAB D I | I I I I | I IHI I | I I I I | I D BAB D I | FFIFF FFF AA AAAA ACCCA AAAA AA FFF FFIFF | AGGAG GAGGA | | AJA | | ", + " | | A A | | AGGA AGGA | FIIF FFF AABA ACCCA ABAA FFF FIIF | II BAB II | II I I II | II IHI II | II I I II | II BAB II | FIIF FFF AABA ACCCA ABAA FFF FIIF | AGGA AGGA | | AJA | | ", + " | | A A | | A A | FIIF FFF AABABA ACCCA ABABAA FFF FIIF | II BAB II | II I I II | II IHI II | II I I II | II BAB II | FIIF FFF AABABA ACCCA ABABAA FFF FIIF | A A | | AJA | | ", + " | | DD A A DD | D D | D D | FIIIF FFF AA ABABAD ACCCA DABABA AA FFF FIIIF | III D BAB D III | III D I I D III | III DD IHI DD III | III D I I D III | III D BAB D III | FIIIF FFF AA ABABAD ACCCA DABABA AA FFF FIIIF | D D | D D | DD AJA DD | | ", + " | | DD A A DD | | | FIIF FFF A ABABA ACCCA ABABA A FFF FIIF | II BAB II | II I I II | II DD IHI DD II | II I I II | II BAB II | FIIF FFF A ABABA ACCCA ABABA A FFF FIIF | | | DD AJA DD | | ", + " | | DD A A DD | AAAAA | | FIIIF FFFF AA ABABA ACCCA ABABA AA FFFF FIIIF | III BAB III | III AAAAA III | III DD H DD III | III AAAAA III | III BAB III | FIIIF FFFF AA ABABA ACCCA ABABA AA FFFF FIIIF | | AAAAA | DD AJA DD | | ", + " | | D D D D | D AAAAAAAAA D | D BBBBB D | FIIIF FFF AA DABABA BBBBB ABABAD AA FFF FIIIF | III D BBBBB D III | III D AAAAAAAAA D III | III D GGGGG D III | III D AAAAAAAAA D III | III D BBBBB D III | FIIIF FFF AA DABABA BBBBB ABABAD AA FFF FIIIF | D BBBBB D | D AAAAAAAAA D | D DJD D | | ", + " | | DCD | AAAAAAAAAAAAA | BBBBBBBBB | FIIIF FFFF A ABABBBBBBBBBBBBBABA A FFFF FIIIF | III BBBBBBBBB III | III AAAAAAAAAAAAA III | III GGGGGGGGG III | III AAAAAAAAAAAAA III | III BBBBBBBBB III | FIIIF FFFF A ABABBBBBBBBBBBBBABA A FFFF FIIIF | BBBBBBBBB | AAAAAAAAAAAAA | DCD | | ", + " | | DCD | AAAAAAAAAAAAAAA | BBBBBBBBBBB | FIIIF FFFF A ABABBBBBBBBBBBABA A FFFF FIIIF | III DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD III | III AAAAAAAAAAAAAAA III | III GGGGGGGGGGG III | III AAAAAAAAAAAAAAA III | III DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD III | FIIIF FFFF A ABABBBBBBBBBBBABA A FFFF FIIIF | BBBBBBBBBBB | AAAAAAAAAAAAAAA | DCD | | ", + " | | CDCDC | AAAAAAAAAAAAAAA | BBBBBBBBBBBBB | FIIF FFFF AA BBBBBBBBBBBBBBB AA FFFF FIIF | DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD | AAAAAAAAAAAAAAA | GGGGGGGGGGGGG | AAAAAAAAAAAAAAA | DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD | FIIF FFFF AA BBBBBBBBBBBBBBB AA FFFF FIIF | BBBBBBBBBBBBB | AAAAAAAAAAAAAAA | CDCDC | | ", + " | | DCDCDCD | AAAAAAAAAAAAAAAAA | BBBBBBBBBBBBBBB | FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF | DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD | AAAAAAAAAAAAAAAAA | GGGGGGGGGGGGGGG | AAAAAAAAAAAAAAAAA | DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD | FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF | BBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAA | DCDCDCD | | ", + " D D | D D | DDCDCDCDD | AAAAAAAAAAAAAAAAA | BBBBBBBBBBBBBBB | FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF | DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD | AAAAAAAAAAAAAAAAA | GGGGGGGGGGGGGGG | AAAAAAAAAAAAAAAAA | DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD | FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF | BBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAA | DDCDCDCDD | D D | D D ", + " | | CCCCCCCCCCC | AAAAAAAAAAAAAAAAAAA | BBBBBBBBBBBBBBBBB | FIIIF FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF FIIIF | DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD | AAAAAAAAAAAAAAAAAAA | GGGGGGGGGGGGGGGGG | AAAAAAAAAAAAAAAAAAA | DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD | FIIIF FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF FIIIF | BBBBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAAAA | CCCC@@@CCCC | | ", + " | | AAAAAAAAADDDDDDCCCCCDDDDDDAAAAAAAAA | AA AAAAAAAAAAAAAAAAAAA AA | A BBBBBBBBBBBBBBBBB A | EEEEEEE FIIIF EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE FIIIF EEEEEEE | DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD | IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIAAAAAAAAAAAAAAAAAAAIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII | IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII GGGGGGGGGGGGGGGGG IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII | IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIAAAAAAAAAAAAAAAAAAAIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII | DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD | EEEEEEE FIIIF EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE FIIIF EEEEEEE | A BBBBBBBBBBBBBBBBB A | AA AAAAAAAAAAAAAAAAAAA AA | AAAAAAAAADDDDDD@@@@@DDDDDDAAAAAAAAA | | ", + " | | CCCCCCCCCCCCCCC | AAAAAAAAA AAAAAAAAA | BBBBBBBB BBBBBBBB | EEEEEEEEEEEEFIIIEEEEEEEEEEEEEEEEEEEECCCCCCBBBBBBBB BBBBBBBBCCCCCCEEEEEEEEEEEEEEEEEEEEIIIFEEEEEEEEEEEE | DDDDDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDDDD | AAAAAAAAAAAAAAAAAAA |HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH| AAAAAAAAAAAAAAAAAAA | DDDDDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDDDD | EEEEEEEEEEEEFIIIEEEEEEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEEEEEEIIIFEEEEEEEEEEEE | JJJJJJ BBBBBBBBBBBBBBBBB JJJJJJ | JJJJJJ AAAAAAAAAAAAAAAAAAA JJJJJJ | JJJJJJJJJJCCCCC@@#@@CCCCCJJJJJJJJJJ | | ", + " | | AAAAAAAAADDDDDDCCCCCDDDDDDAAAAAAAAA | AA AAAAAAAAAAAAAAAAAAA AA | A BBBBBBBBBBBBBBBBB A | EEEEEEE FIIIF EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE FIIIF EEEEEEE | DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD | IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIAAAAAAAAAAAAAAAAAAAIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII | IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII GGGGGGGGGGGGGGGGG IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII | IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIAAAAAAAAAAAAAAAAAAAIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII | DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD | EEEEEEE FIIIF EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE FIIIF EEEEEEE | A BBBBBBBBBBBBBBBBB A | AA AAAAAAAAAAAAAAAAAAA AA | AAAAAAAAADDDDDD@@@@@DDDDDDAAAAAAAAA | | ", + " | | CCCCCCCCCCC | AAAAAAAAAAAAAAAAAAA | BBBBBBBBBBBBBBBBB | FIIIF FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF FIIIF | DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD | AAAAAAAAAAAAAAAAAAA | GGGGGGGGGGGGGGGGG | AAAAAAAAAAAAAAAAAAA | DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD | FIIIF FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF FIIIF | BBBBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAAAA | CCCC@@@CCCC | | ", + " D D | D D | DDCDCDCDD | AAAAAAAAAAAAAAAAA | BBBBBBBBBBBBBBB | FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF | DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD | AAAAAAAAAAAAAAAAA | GGGGGGGGGGGGGGG | AAAAAAAAAAAAAAAAA | DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD | FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF | BBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAA | DDCDCDCDD | D D | D D ", + " | | DCDCDCD | AAAAAAAAAAAAAAAAA | BBBBBBBBBBBBBBB | FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF | DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD | AAAAAAAAAAAAAAAAA | GGGGGGGGGGGGGGG | AAAAAAAAAAAAAAAAA | DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD | FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF | BBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAA | DCDCDCD | | ", + " | | CDCDC | AAAAAAAAAAAAAAA | BBBBBBBBBBBBB | FIIF FFFF AA BBBBBBBBBBBBBBB AA FFFF FIIF | DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD | AAAAAAAAAAAAAAA | GGGGGGGGGGGGG | AAAAAAAAAAAAAAA | DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD | FIIF FFFF AA BBBBBBBBBBBBBBB AA FFFF FIIF | BBBBBBBBBBBBB | AAAAAAAAAAAAAAA | CDCDC | | ", + " | | DCD | AAAAAAAAAAAAAAA | BBBBBBBBBBB | FIIIF FFFF A ABABBBBBBBBBBBABA A FFFF FIIIF | III DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD III | III AAAAAAAAAAAAAAA III | III GGGGGGGGGGG III | III AAAAAAAAAAAAAAA III | III DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD III | FIIIF FFFF A ABABBBBBBBBBBBABA A FFFF FIIIF | BBBBBBBBBBB | AAAAAAAAAAAAAAA | DCD | | ", + " | | DCD | AAAAAAAAAAAAA | BBBBBBBBB | FIIIF FFFF A ABABBBBBBBBBBBBBABA A FFFF FIIIF | III BBBBBBBBB III | III AAAAAAAAAAAAA III | III GGGGGGGGG III | III AAAAAAAAAAAAA III | III BBBBBBBBB III | FIIIF FFFF A ABABBBBBBBBBBBBBABA A FFFF FIIIF | BBBBBBBBB | AAAAAAAAAAAAA | DCD | | ", + " | | D D D D | D AAAAAAAAA D | D BBBBB D | FIIIF FFF AA DABABA BBBBB ABABAD AA FFF FIIIF | III D BBBBB D III | III D AAAAAAAAA D III | III D GGGGG D III | III D AAAAAAAAA D III | III D BBBBB D III | FIIIF FFF AA DABABA BBBBB ABABAD AA FFF FIIIF | D BBBBB D | D AAAAAAAAA D | D DJD D | | ", + " | | DD A A DD | AAAAA | | FIIIF FFFF AA ABABA ACCCA ABABA AA FFFF FIIIF | III BAB III | III AAAAA III | III DD H DD III | III AAAAA III | III BAB III | FIIIF FFFF AA ABABA ACCCA ABABA AA FFFF FIIIF | | AAAAA | DD AJA DD | | ", + " | | DD A A DD | | | FIIF FFF A ABABA ACCCA ABABA A FFF FIIF | II BAB II | II I I II | II DD IHI DD II | II I I II | II BAB II | FIIF FFF A ABABA ACCCA ABABA A FFF FIIF | | | DD AJA DD | | ", + " | | DD A A DD | D D | D D | FIIIF FFF AA ABABAD ACCCA DABABA AA FFF FIIIF | III D BAB D III | III D I I D III | III DD IHI DD III | III D I I D III | III D BAB D III | FIIIF FFF AA ABABAD ACCCA DABABA AA FFF FIIIF | D D | D D | DD AJA DD | | ", + " | | A A | | A A | FIIF FFF AABABA ACCCA ABABAA FFF FIIF | II BAB II | II I I II | II IHI II | II I I II | II BAB II | FIIF FFF AABABA ACCCA ABABAA FFF FIIF | A A | | AJA | | ", + " | | A A | | AGGA AGGA | FIIF FFF AABA ACCCA ABAA FFF FIIF | II BAB II | II I I II | II IHI II | II I I II | II BAB II | FIIF FFF AABA ACCCA ABAA FFF FIIF | AGGA AGGA | | AJA | | ", + " | | A A | | AGGAG GAGGA | FFIFF FFF AA AAAA ACCCA AAAA AA FFF FFIFF | I D BAB D I | I I I I | I IHI I | I I I I | I D BAB D I | FFIFF FFF AA AAAA ACCCA AAAA AA FFF FFIFF | AGGAG GAGGA | | AJA | | ", + " | | A A | | AGGAGGA AGGAGGA | FIIF FF AA AA AAAAEEEAAAA AA AA FF FIIF | II D BAB D II | II I I II | II IHI II | II I I II | II D BAB D II | FIIF FF AA AA AAAAEEEAAAA AA AA FF FIIF | AGGAGGA AGGAGGA | | AJA | | ", + " | | A A | | AGGAGGA AGGAGGA | FIF FF AAA EEE AAA FF FIF | I DCAACBABCAACD I | I I I I | I IHI I | I I I I | I DCAACBABCAACD I | FIF FF AAA EEE AAA FF FIF | AGGAGGA AGGAGGA | | AJA | | ", + " | | A A | A A | AGGAGGA AGGAGGA | FIIF FF EEEEE FF FIIF | II DCAACBABCAACD II | II I I II | II IHI II | II I I II | II DCAACBABCAACD II | FIIF FF EEEEE FF FIIF | AGGAGGA AGGAGGA | A A | AJA | | ", + " | | | A A | AGGAGGA A A AGGAGGA | FIF FF EEEEE FF FIF | I DCAACBABCAACD I | I I I I | I IHI I | I I I I | I DCAACBABCAACD I | FIF FF EEEEE FF FIF | AGGAGGA A A AGGAGGA | AJA | | | ", + " | | | | AGGAGGA AGGAGGA | FFFF FF EEEEE FF FFFF | DCAACBABCAACD | I I | IHI | I I | DCAACBABCAACD | FFFF FF EEEEE FF FFFF | AGGAGGA AGGAGGA | J | | | ", + " | | | | AGGAGGA AGGAGGA | FFF FFF EEEEE FFF FFF | DCAACBABCAACD | I I | IHI | I I | DCAACBABCAACD | FFF FFF EEEEE FFF FFF | AGGAGGA AGGAGGA | J | | | ", + " | | | | AGGAGGA AGGAGGA | FFF FFFF EEEEE FFFF FFF | DCAACBABCAACD | I I | IHI | I I | DCAACBABCAACD | FFF FFFF EEEEE FFFF FFF | AGGAGGA AGGAGGA | J | | | ", + " | | | | AGGAGGA AGGAGGA | FF FFFFFF EEEEE FFFFFF FF | DCAACBABCAACD | I I | IHI | I I | DCAACBABCAACD | FF FFFFFF EEEEE FFFFFF FF | AGGAGGA AGGAGGA | J | | | ", + " | | | | AGGAGGA AGGAGGA | FF FFFFFFFFF EEEEE FFFFFFFFF FF | DCAACBABCAACD | I I | IHI | I I | DCAACBABCAACD | FF FFFFFFFFF EEEEE FFFFFFFFF FF | AGGAGGA AGGAGGA | J | | | ", + " | | | | AGGAGGA AGGAGGA | FF FFFFFFFFFFEEEFFFFFFFFFF FF | DCAACBABCAACD | I I | IHI | I I | DCAACBABCAACD | FF FFFFFFFFFFEEEFFFFFFFFFF FF | AGGAGGA J AGGAGGA | | | | ", + " | | | | AGAGGA AGGAGA | FF FFFFFFFFEEEFFFFFFFF FF | DDCACBABCACDD | I I | IHI | I I | DDCACBABCACDD | FF FFFFFFFFEEEFFFFFFFF FF | AGAGGA J AGGAGA | | | | ", + " | | | | AGGGGA AGGGGA | FF FFFFFFEEEFFFFFF FF | DCACBABCACD | I I | IHI | I I | DCACBABCACD | FF FFFFFFEEEFFFFFF FF | AGGGGA J AGGGGA | | | | ", + " | | | | GGGAA AAGGG | FF FFFEEEFFF FF | DCACBABCACD | I I | IHI | I I | DCACBABCACD | FF FFFEEEFFF FF | GGGAA J AAGGG | | | | ", + " | | | | GGGA AGGG | FFF EEE FFF | DCACBABCACD | I I | IHI | I I | DCACBABCACD | FFF EEE FFF | GGGA J AGGG | | | | ", + " | | | | GG GG | FFFF EEE FFFF | DCACBABCACD | I I | IHI | I I | DCACBABCACD | FFFF EEE FFFF | GG J GG | | | | ", + " | | | | | FFFFF EEE FFFFF | DCACBABCACD | I I | IHI | I I | DCACBABCACD | FFFFF EEE FFFFF | | | | | ", + " | | | | | FFIIFFF E FFFIIFF | II DCACBABCACD II | II I I II | II IHI II | II I I II | II DCACBABCACD II | FFIIFFF E FFFIIFF | | | | | ", + " | | | | | FFIIIFFFF E FFFFIIIFF | III DCACBABCACD III | III I I III | III IHI III | III I I III | III DCACBABCACD III | FFIIIFFFF E FFFFIIIFF | | | | | ", + " | | | | | FFIIIIIFFFFF E FFFFFIIIIIFF | IIIII DCACBABCACD IIIII | IIIII I I IIIII | IIIII IHI IIIII | IIIII I I IIIII | IIIII DCACBABCACD IIIII | FFIIIIIFFFFF E FFFFFIIIIIFF | | | | | ", + " | | | | | FFIIIIIIIIFFFFFEFFFFFIIIIIIIIFF | IIIIIIIIDCACBABCACDIIIIIIII | IIIIIIII I I IIIIIIII | IIIIIIII IHI IIIIIIII | IIIIIIII I I IIIIIIII | IIIIIIIIDCACBABCACDIIIIIIII | FFIIIIIIIIFFFFFEFFFFFIIIIIIIIFF | | | | | ", + " | | | | | FFFIIIIIIIIIIIIIIIIIIIIIIIFFF | IIIIIIDCACBABCACDIIIIII | IIIIII I I IIIIII | IIIIII IHI IIIIII | IIIIII I I IIIIII | IIIIIIDCACBABCACDIIIIII | FFFIIIIIIIIIIIIIIIIIIIIIIIFFF | | | | | ", + " | | | | | FFIIIIIIIIIIIIIIIIIIIFF | IIIIDDCCBABCCDDIIII | IIII I I IIII | IIII IHI IIII | IIII I I IIII | IIIIDDCCBABCCDDIIII | FFIIIIIIIIIIIIIIIIIIIFF | | | | | ", + " | | | | | FFFFFIIIIIIIIIFFFFF | DCCBABCCD | I I | IHI | I I | DCCBABCCD | FFFFFIIIIIIIIIFFFFF | | | | | ", + " | | | | | FFFFFFFFF | DCCBABCCD | I I | IHI | I I | DCCBABCCD | FFFFFFFFF | | | | | ", + " | | | | | E | DCCBABCCD | I I | IHI | I I | DCCBABCCD | E | | | | | ", + " | | | | | EEE | DCCBABCCD | I I | IHI | I I | DCCBABCCD | EEE | | | | | ", + " | | | | | EEE | DDCBABCDD | I I | IHI | I I | DDCBABCDD | EEE | | | | | ", + " | | | | | EEE | DCBABCD | I I | IHI | I I | DCBABCD | EEE | | | | | ", + " | | | | | EEE | DCBABCD | I I | IHI | I I | DCBABCD | EEE | | | | | ", + " | | | | | EEE | DCBABCD | I I | IHI | I I | DCBABCD | EEE | | | | | ", + " | | | | | EEE | DCBABCD | I I | IHI | I I | DCBABCD | EEE | | | | | ", + " | | | | | EEE | DCBABCD | I I | IHI | I I | DCBABCD | EEE | | | | | ", + " | | | | | E | DDBABDD | I I | IHI | I I | DDBABDD | E | | | | | ", + " | | | | | E | DBABD | I I | IHI | I I | DBABD | E | | | | | ", + " | | | | | E | DBABD | I I | IHI | I I | DBABD | E | | | | | ", + " | | | | | E | DBABD | I I | IHI | I I | DBABD | E | | | | | ", + " | | | | | | DBABD | I I | IHI | I I | DBABD | | | | | | ", + " | | | | | | DDADD | | H | | DDADD | | | | | | ", + " | | | | | | DAD | | H | | DAD | | | | | | ", + " | | | | | | DAD | | H | | DAD | | | | | | ", + " | | | | | | DAD | | H | | DAD | | | | | | ", + " | | | | | | DDD | | H | | DDD | | | | | | ", + " | | | | | | D | | H | | D | | | | | | ", + " | | | | | | D | | H | | D | | | | | | ", + " | | | | | | D | | H | | D | | | | | | ", + " | | | | | | D | | H | | D | | | | | | ", + " | | | | | | | | H | | | | | | | | ", + " | | | | | | | | H | | | | | | | | ", + " | | | | | | | | H | | | | | | | | ", + " | | | | | | | | H | | | | | | | | ", + " | | | | | | | | H | | | | | | | | ", + " | | | | | | | | H | | | | | | | | ", + " | | | | | | | | H | | | | | | | | ", + " | | | | | | | | H | | | | | | | | " + }; + + public static final String[] TIER_4 = { + // T4 not yet available + }; + + // spotless:on +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/SteamAssembler.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/SteamAssembler.java index c9de572b1..8ac99a904 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/SteamAssembler.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/SteamAssembler.java @@ -1,5 +1,6 @@ package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; +import com.ghostipedia.cosmiccore.CosmicCore; import com.ghostipedia.cosmiccore.common.machine.multiblock.steam.WeakSteamParallelMultiBlockMachine; import com.gregtechceu.gtceu.GTCEu; @@ -44,7 +45,7 @@ public class SteamAssembler { .or(Predicates.abilities(PartAbility.STEAM).setExactLimit(1))) .where('D', blocks(CASING_STEEL_GEARBOX.get())) .build()) - .model(createWorkableCasingMachineModel(GTCEu.id("block/casings/solid/machine_casing_bronze_plated_bricks"), + .model(createWorkableCasingMachineModel(CosmicCore.id("block/casings/solid/steel_plated_bronze_casing"), GTCEu.id("block/multiblock/steam_oven")) .andThen(b -> b.addDynamicRenderer( () -> DynamicRenderHelper.makeBoilerPartRender( diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/SteamMixer.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/SteamMixer.java index 17b2e530e..b886744dc 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/SteamMixer.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/SteamMixer.java @@ -1,6 +1,7 @@ package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.machine.part.CosmicPartAbility; import com.ghostipedia.cosmiccore.common.machine.multiblock.steam.WeakSteamParallelMultiBlockMachine; import com.gregtechceu.gtceu.GTCEu; @@ -28,7 +29,7 @@ public class SteamMixer { .addOutputLimit(ItemRecipeCapability.CAP, 1) .pattern(definition -> FactoryBlockPattern.start() .aisle("AAA", "BCB", "BCB", " B ") - .aisle("AAA", "CEC", "CEC", "BBB") + .aisle("AAA", "CEC", "CEC", "BXB") .aisle("ADA", "BCB", "BCB", " B ") .where('D', Predicates.controller(blocks(definition.getBlock()))) .where('#', Predicates.air()) @@ -42,6 +43,9 @@ public class SteamMixer { .where('B', blocks(CASING_BRONZE_BRICKS.get())) .where('C', blocks(BRONZE_HULL.get())) .where('E', blocks(CASING_BRONZE_GEARBOX.get())) + .where('X', + blocks(CASING_BRONZE_BRICKS.get()) + .or(Predicates.abilities(CosmicPartAbility.IMPORT_EMBER).setPreviewCount(1))) .build()) .model(createWorkableCasingMachineModel(GTCEu.id("block/casings/solid/machine_casing_bronze_plated_bricks"), CosmicCore.id("block/multiblock/mixing_vessel"))) diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/StellarIris.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/StellarIris.java index 3b5414f80..eec2e585e 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/StellarIris.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/StellarIris.java @@ -2,6 +2,7 @@ import com.ghostipedia.cosmiccore.CosmicCore; import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine; +import com.ghostipedia.cosmiccore.api.pattern.CosmicPredicates; import com.ghostipedia.cosmiccore.client.renderer.machine.CosmicDynamicRenderHelpers; import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; @@ -9,9 +10,7 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.data.RotationState; import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; -import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; -import com.gregtechceu.gtceu.api.pattern.Predicates; import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; @@ -32,4717 +31,144 @@ public class StellarIris { .recipeModifier(GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK_SUBTICK)) .appearanceBlock(CosmicBlocks.CYCLOZINE_CHEMICALLY_REPELLING_CASING) .pattern(definition -> FactoryBlockPattern.start() - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AAAAAAAAAAAAAAA ", - " ", - " ", - " ", - " ", - " ", - " AAAAAAAAAAAAAAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", - " BBBBBBBBBBBBBBB ", - " BBBBBB BBBBBB ", - " BBBBBB BBBBBB ", - " BBBBBB BBBBBB ", - " BBBBBBBBBBBBBBB ", - " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AAAAAAAAAACCCCCCCCCCCCCCCAAAAAAAAAA ", - " BBBBBBBBBBBBBBBBBBBBBBBBBBB ", - " BBBBBBBBBBBB BBBBBBBBBBBB ", - " BBBBBBBBBBBB BBBBBBBBBBBB ", - " BBBBBBBBBBBB BBBBBBBBBBBB ", - " BBBBBBBBBBBBBBBBBBBBBBBBBBB ", - " AAAAAAAAAACCCCCCCCCCCCCCCAAAAAAAAAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AAAAAAACCCCCCAAAAAAAAAAAAAAACCCCCCAAAAAAA ", - " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", - " BBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBB ", - " BBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBB ", - " BBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBB ", - " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", - " AAAAAAACCCCCCAAAAAAAAAAAAAAACCCCCCAAAAAAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AAAAACCCCAAAAAAAAAAAAAAAAAAAAAAAAAAACCCCAAAAA ", - " BBBBBBBBBBBBB BBBBBBBBBBBBB ", - " BBBBBBBBBBBBB BBBBBBBBBBBBB ", - " BBBBBBBBBBBBB BBBBBBBBBBBBB ", - " BBBBBBBBBBBBB BBBBBBBBBBBBB ", - " BBBBBBBBBBBBB BBBBBBBBBBBBB ", - " AAAAACCCCAAAAAAAAAAAAAAAAAAAAAAAAAAACCCCAAAAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AAAAACCCAAAAAAAAAA AAAAAAAAAACCCAAAAA ", - " BBBBBBBBB BBBBBBBBB ", - " BBBBBBBBB BBBBBBBBB ", - " BBBBBBBBB BBBBBBBBB ", - " BBBBBBBBB BBBBBBBBB ", - " BBBBBBBBB BBBBBBBBB ", - " AAAAACCCAAAAAAAAAA AAAAAAAAAACCCAAAAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AAAAACCAAAAAAA AAAAAAACCAAAAA ", - " BBBBBBBB BBBBBBBB ", - " BBBBBBBB BBBBBBBB ", - " BBBBBBBB BBBBBBBB ", - " BBBBBBBB BBBBBBBB ", - " BBBBBBBB BBBBBBBB ", - " AAAAACCAAAAAAA AAAAAAACCAAAAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AAAACCCAAAAA AAAAACCCAAAA ", - " BBBBBBB BBBBBBB ", - " BBBBBBB BBBBBBB ", - " BBBBBBB BBBBBBB ", - " BBBBBBB BBBBBBB ", - " BBBBBBB BBBBBBB ", - " AAAACCCAAAAA AAAAACCCAAAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AAACCAAAAA AAAAACCAAA ", - " BBBBBBB BBBBBBB ", - " BBBBBBB BBBBBBB ", - " BBBBBBB BBBBBBB ", - " BBBBBBB BBBBBBB ", - " BBBBBBB BBBBBBB ", - " AAACCAAAAA AAAAACCAAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AAACCAAAAA AAAAACCAAA ", - " BBBBB BBBBB ", - " BBBBB BBBBB ", - " BBBBB BBBBB ", - " BBBBB BBBBB ", - " BBBBB BBBBB ", - " AAACCAAAAA AAAAACCAAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AAAACAAAA AAAACAAAA ", - " BBBBB BBBBB ", - " BBBBB BBBBB ", - " BBBBB BBBBB ", - " BBBBB BBBBB ", - " BBBBB BBBBB ", - " AAAACAAAA AAAACAAAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AAACCAAA AAACCAAA ", - " BBBBB BBBBB ", - " BBBBB BBBBB ", - " BBBBB BBBBB ", - " BBBBB BBBBB ", - " BBBBB BBBBB ", - " AAACCAAA AAACCAAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AACCAAA AAACCAA ", - " BBBBB BBBBB ", - " BBBBB BBBBB ", - " BBBBB BBBBB ", - " BBBBB BBBBB ", - " BBBBB BBBBB ", - " AACCAAA AAACCAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AAACAAAA AAAACAAA ", - " BBBB BBBB ", - " BBBB BBBB ", - " BBBB BBBB ", - " BBBB BBBB ", - " BBBB BBBB ", - " AAACAAAA AAAACAAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CAACAAA AAACAAC ", - " BBBB BBBB ", - " BBBB BBBB ", - " BBBB BBBB ", - " BBBB BBBB ", - " BBBB BBBB ", - " CAACAAA AAACAAC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CCCCAA AAAAAAAAAAAAA AACCCC ", - " BBBB BBBB ", - " BBBB BBBB ", - " BBBB BBBB ", - " BBBB BBBB ", - " BBBB BBBB ", - " CCCCAA AAAAAAAAAAAAA AACCCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CCCAAA AAAAAAAAAAAAAAAAAAAAAAA AAACCC ", - " BBBB BBBBBBBBBBBBB BBBB ", - " BBBB BBBBBBBBBBBBB BBBB ", - " BBBB BBBBBBBBBBBBB BBBB ", - " BBBB BBBBBBBBBBBBB BBBB ", - " BBBB BBBBBBBBBBBBB BBBB ", - " CCCAAA AAAAAAAAAAAAAAAAAAAAAAA AAACCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CCCCAA AAAAAAAACCCCCCCCCCCCCAAAAAAAA AACCCC ", - " BBB BBBBBBBBBBBBBBBBBBBBBBB BBB ", - " BBB BBBBBBBBBBBBBBBBBBBBBBB BBB ", - " BBB BBBBBBBBBBBBBBBBBBBBBBB BBB ", - " BBB BBBBBBBBBBBBBBBBBBBBBBB BBB ", - " BBB BBBBBBBBBBBBBBBBBBBBBBB BBB ", - " CCCCAA AAAAAAAACCCCCCCCCCCCCAAAAAAAA AACCCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CCCCC AAAAAACCCCCAAAAAAAAAAAAACCCCCAAAAAA CCCCC ", - " BBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBB ", - " BBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBB ", - " BBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBB ", - " BBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBB ", - " BBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBB ", - " CCCCC AAAAAACCCCCAAAAAAAAAAAAACCCCCAAAAAA CCCCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CCCCC AAAAACCCAAAAAAAAAAAAAAAAAAAAAAACCCAAAAA CCCCC ", - " BBB BBBBBBBBBBB BBBBBBBBBBB BBB ", - " BBB BBBBBBBBBBB BBBBBBBBBBB BBB ", - " BBB BBBBBBBBBBB BBBBBBBBBBB BBB ", - " BBB BBBBBBBBBBB BBBBBBBBBBB BBB ", - " BBB BBBBBBBBBBB BBBBBBBBBBB BBB ", - " CCCCC AAAAACCCAAAAAAAAAAAAAAAAAAAAAAACCCAAAAA CCCCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CCCCC AAAACCCAAAAAAAA AAAAAAAACCCAAAA CCCCC ", - " BBB BBBBBBBB BBBBBBBB BBB ", - " BBB BBBBBBBB BBBBBBBB BBB ", - " BBB BBBBBBBB BBBBBBBB BBB ", - " BBB BBBBBBBB BBBBBBBB BBB ", - " BBB BBBBBBBB BBBBBBBB BBB ", - " CCCCC AAAACCCAAAAAAAA AAAAAAAACCCAAAA CCCCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CCCCC AAAACCAAAAAA AAAAAACCAAAA CCCCC ", - " BBB BBBBBBB BBBBBBB BBB ", - " BBB BBBBBBB BBBBBBB BBB ", - " BBB BBBBBBB BBBBBBB BBB ", - " BBB BBBBBBB BBBBBBB BBB ", - " BBB BBBBBBB BBBBBBB BBB ", - " CCCCC AAAACCAAAAAA AAAAAACCAAAA CCCCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CCCCC AAAACCAAAAA AAAAACCAAAA CCCCC ", - " BBB BBBBBB BBBBBB BBB ", - " BBB BBBBBB BBBBBB BBB ", - " BBB BBBBBB BBBBBB BBB ", - " BBB BBBBBB BBBBBB BBB ", - " BBB BBBBBB BBBBBB BBB ", - " CCCCC AAAACCAAAAA AAAAACCAAAA CCCCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CCCCC DAACCAAAA AAAACCAAD CCCCC ", - " BBB DBBBBBB BBBBBBD BBB ", - " BBB DBBBBBB BBBBBBD BBB ", - " BBB DBBBBBB BBBBBBD BBB ", - " BBB DBBBBBB BBBBBBD BBB ", - " BBB DBBBBBB BBBBBBD BBB ", - " CCCCC DAACCAAAA AAAACCAAD CCCCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CCCCC AADDCAAAA AAAACDDAA CCCCC ", - " BBB BBBBB BBBBB BBB ", - " BBB BBBBB BBBBB BBB ", - " BBB BBBBB BBBBB BBB ", - " BBB BBBBB BBBBB BBB ", - " BBB BBBBB BBBBB BBB ", - " CCCCC AADDCAAAA AAAACDDAA CCCCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " D D ", - " AACAA AADDDDAA AADDDDAA AACAA ", - " BBB BBBBD DBBBB BBB ", - " BBB BBBBD DBBBB BBB ", - " BBB BBBBD DBBBB BBB ", - " BBB BBBBD DBBBB BBB ", - " BBB BBBBD DBBBB BBB ", - " AACAA AADDDDAA AADDDDAA AACAA ", - " D D ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " D D ", - " D D ", - " D D ", - " D D ", - " AACAA AADDDAA AADDDAA AACAA ", - " BBB BBBBE EBBBB BBB ", - " BBB BBBBE EBBBB BBB ", - " BBB BBBBE EBBBB BBB ", - " BBB BBBBE EBBBB BBB ", - " BBB BBBBE EBBBB BBB ", - " AACAA AADDDAA AADDDAA AACAA ", - " D D ", - " D D ", - " D D ", - " D D ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " AACAA AADDDAA AADDDAA AACAA ", - " BBB BBBBE EBBBB BBB ", - " BBB BBBBA ABBBB BBB ", - " BBB BBBBA ABBBB BBB ", - " BBB BBBBA ABBBB BBB ", - " BBB BBBBE EBBBB BBB ", - " AACAA AADDDAA AADDDAA AACAA ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " D D ", - " AACAA ADDDAA AADDDA AACAA ", - " BBB DBBBBE EBBBBD BBB ", - " BBB DBBBBA ABBBBD BBB ", - " BBB DBBBBA ABBBBD BBB ", - " BBB DBBBBA ABBBBD BBB ", - " BBB DBBBBE EBBBBD BBB ", - " AACAA ADDDAA AADDDA AACAA ", - " D D ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " AACAA DDDDDAA AADDDDD AACAA ", - " BBB DBBBBE EBBBBD BBB ", - " BBB DBBBBA ABBBBD BBB ", - " BBB DBBBBA ABBBBD BBB ", - " BBB DBBBBA ABBBBD BBB ", - " BBB DBBBBE EBBBBD BBB ", - " AACAA DDDDDAA AADDDDD AACAA ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " E E ", - " E E ", - " E E ", - " E E ", - " E E ", - " D E E D ", - " D E E D ", - " DDE EDD ", - " DDE EDD ", - " DDD DDD ", - " DDD DDD ", - " AACAA DDDDDAA AADDDDD AACAA ", - " BBB DBBBDE EDBBBD BBB ", - " BBB DBBBDE EDBBBD BBB ", - " BBB DBBBDE EDBBBD BBB ", - " BBB DBBBDE EDBBBD BBB ", - " BBB DBBBDE EDBBBD BBB ", - " AACAA DDDDDAA AADDDDD AACAA ", - " DDD DDD ", - " DDD DDD ", - " DDE EDD ", - " DDE EDD ", - " D E E D ", - " D E E D ", - " E E ", - " E E ", - " E E ", - " E E ", - " E E ", - " ", - " ", - " ", - " ") - .aisle(" A A ", - " A A ", - " A A ", - " A A ", - " A A ", - " A A ", - " A A ", - " A A ", - " A A ", - " D D ", - " D D ", - " DD DD ", - " DDE EDD ", - " DDE EDD ", - " DDE EDD ", - " AACAA DDDDB BDDDD AACAA ", - " BBB DBBBDB BDBBBD BBB ", - " BBB DBBBDB BDBBBD BBB ", - " BBB DBBBDB BDBBBD BBB ", - " BBB DBBBDB BDBBBD BBB ", - " BBB DBBBDB BDBBBD BBB ", - " AACAA DDDDB BDDDD AACAA ", - " DDE EDD ", - " DDE EDD ", - " DDE EDD ", - " DD DD ", - " D D ", - " D D ", - " A A ", - " A A ", - " A A ", - " A A ", - " A A ", - " A A ", - " A A ", - " A A ", - " A A ") - .aisle(" ", - " ", - " ", - " ", - " E E ", - " E E ", - " E E ", - " E E ", - " E E ", - " E E ", - " E E ", - " E E ", - " EE EE ", - " DE ED ", - " DEA AED ", - " AACAA AADDDA ADDDAA AACAA ", - " BBB BBBDA ADBBB BBB ", - " BBB BBBDA ADBBB BBB ", - " BBB BBBDA ADBBB BBB ", - " BBB BBBDA ADBBB BBB ", - " BBB BBBDA ADBBB BBB ", - " AACAA AADDDA ADDDAA AACAA ", - " DEA AED ", - " DE ED ", - " EE EE ", - " E E ", - " E E ", - " E E ", - " E E ", - " E E ", - " E E ", - " E E ", - " E E ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " AACAA AADDDB BDDDAA AACAA ", - " BBB BBBDB BDBBB BBB ", - " BBB BBBDB BDBBB BBB ", - " BBB BBBDB BDBBB BBB ", - " BBB BBBDB BDBBB BBB ", - " BBB BBBDB BDBBB BBB ", - " AACAA AADDDB BDDDAA AACAA ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " D D ", - " AACAA AADDDA ADDDAA AACAA ", - " BBB BBBBE EBBBB BBB ", - " BBB BBBBE EBBBB BBB ", - " BBB BBBBE EBBBB BBB ", - " BBB BBBBE EBBBB BBB ", - " BBB BBBBE EBBBB BBB ", - " AACAA AADDDA ADDDAA AACAA ", - " D D ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " AACAA AADDDAA AADDDAA AACAA ", - " BBB BBBBE EBBBB BBB ", - " BBB BBBBA ABBBB BBB ", - " BBB BBBBA ABBBB BBB ", - " BBB BBBBA ABBBB BBB ", - " BBB BBBBE EBBBB BBB ", - " AACAA AADDDAA AADDDAA AACAA ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " D D ", - " D D ", - " D D ", - " D D ", - " AACAA ADDDAA AADDDA AACAA ", - " BBB BBBE EBBB BBB ", - " BBB BBBA ABBB BBB ", - " BBB BBBA ABBB BBB ", - " BBB BBBA ABBB BBB ", - " BBB BBBE EBBB BBB ", - " AACAA ADDDAA AADDDA AACAA ", - " D D ", - " D D ", - " D D ", - " D D ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " D D ", - " AACAA DDDDAA AADDDD AACAA ", - " BBB DBBBE EBBBD BBB ", - " BBB DBBBA ABBBD BBB ", - " BBB DBBBA ABBBD BBB ", - " BBB DBBBA ABBBD BBB ", - " BBB DBBBE EBBBD BBB ", - " AACAA DDDDAA AADDDD AACAA ", - " D D ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AACAA AADDAA AADDAA AACAA ", - " BBB BBBE EBBB BBB ", - " BBB BBBE EBBB BBB ", - " BBB BBBE EBBB BBB ", - " BBB BBBE EBBB BBB ", - " BBB BBBE EBBB BBB ", - " AACAA AADDAA AADDAA AACAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AACAA AACDA ADCAA AACAA ", - " BBB BBD DBB BBB ", - " BBB BBD DBB BBB ", - " BBB BBD DBB BBB ", - " BBB BBD DBB BBB ", - " BBB BBD DBB BBB ", - " AACAA AACDA ADCAA AACAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AACAA AACAA AACAA AACAA ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " AACAA AACAA AACAA AACAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AACAA AACAA AACAA AACAA ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " AACAA AACAA AACAA AACAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AACAA AACAA AACAA AACAA ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " AACAA AACAA AACAA AACAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AACAA AACAA AACAA AACAA ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " AACAA AACAA AACAA AACAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AACAA AACAA AACAA AACAA ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " AACAA AACAA AACAA AACAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AACAA AACAA AACAA AACAA ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " AACAA AACAA AACAA AACAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AACAA AACAA AACAA AACAA ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " AACAA AACAA AACAA AACAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AACAA AACAA AACAA AACAA ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " AACAA AACAA AACAA AACAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AACAA AACAA AACAA AACAA ", - " BBB BBB BBB BBB ", - " BBB BBB CCCCCCC BBB BBB ", - " BBB BBB FFC CFF BBB BBB ", - " BBB BBB CCCCCCC BBB BBB ", - " BBB BBB BBB BBB ", - " AACAA AACAA AACAA AACAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AACAA AACAA AACAA AACAA ", - " BBB BBB BBB BBB ", - " BBB BBB CCC CCC BBB BBB ", - " BBB BBB FFF FFF BBB BBB ", - " BBB BBB CCC CCC BBB BBB ", - " BBB BBB BBB BBB ", - " AACAA AACAA AACAA AACAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AACAA AACAA AACAA AACAA ", - " BBB BBB BBB BBB ", - " BBB BBB CC CC BBB BBB ", - " BBB BBB FF FF BBB BBB ", - " BBB BBB CC CC BBB BBB ", - " BBB BBB BBB BBB ", - " AACAA AACAA AACAA AACAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AACAA AACAA AACAA AACAA ", - " BBB BBB BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB F F BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB BBB BBB ", - " AACAA AACAA AACAA AACAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AACAA AACAA AACAA AACAA ", - " BBB BBB BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB F F BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB BBB BBB ", - " AACAA AACAA AACAA AACAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AACAA AACAA AACAA AACAA ", - " BBB BBB BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB F F BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB BBB BBB ", - " AACAA AACAA AACAA AACAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AACAA AACAA AACAA AACAA ", - " BBB BBB BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB F F BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB BBB BBB ", - " AACAA AACAA AACAA AACAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AACAA AACAA AACAA AACAA ", - " BBB BBB BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB F F BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB BBB BBB ", - " AACAA AACAA AACAA AACAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - "AACAA AACAA AACAA AACAA", - " BBB BBB BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB F F BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB BBB BBB ", - "AACAA AACAA AACAA AACAA", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - "AACAA AACAA AACAA AACAA", - " BBB BBB BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB F F BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB BBB BBB ", - "AACAA AACAA AACAA AACAA", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - "AACAA AACAA AACAA AACAA", - " BBB BBB BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB F F BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB BBB BBB ", - "AACAA AACAA AACAA AACAA", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - "AACAA AACAA AACAA AACAA", - " BBB BBB BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB F F BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB BBB BBB ", - "AACAA AACAA AACAA AACAA", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - "AACAA AACAA AACAA AACAA", - " BBB BBB BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB F F BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB BBB BBB ", - "AACAA AACAA AACAA AACAA", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - "AACAA AACAA AACAA AACAA", - " BBB BBB BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB F F BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB BBB BBB ", - "AACAA AACAA AACAA AACAA", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - "AACAA AACAA AACAA AACAA", - " BBB BBB BBB BBB ", - " BBB C C BBB ", - " BBB C C BBB ", - " BBB C C BBB ", - " BBB BBB BBB BBB ", - "AACAA AACAA AACAA AACAA", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - "AACAA AACAA AACAA AACAA", - " BBB BBB BBB BBB ", - " BBB C C BBB ", - " BBB A BBB ", - " BBB C C BBB ", - " BBB BBB BBB BBB ", - "AACAA AACAA AACAA AACAA", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - "AACAA AACAA AACAA AACAA", - " BBB BBB BBB BBB ", - " BBB C C BBB ", - " BBB C C BBB ", - " BBB C C BBB ", - " BBB BBB BBB BBB ", - "AACAA AACAA AACAA AACAA", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - "AACAA AACAA AACAA AACAA", - " BBB BBB BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB F F BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB BBB BBB ", - "AACAA AACAA AACAA AACAA", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - "AACAA AACAA AACAA AACAA", - " BBB BBB BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB F F BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB BBB BBB ", - "AACAA AACAA AACAA AACAA", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - "AACAA AACAA AACAA AACAA", - " BBB BBB BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB F F BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB BBB BBB ", - "AACAA AACAA AACAA AACAA", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - "AACAA AACAA AACAA AACAA", - " BBB BBB BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB F F BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB BBB BBB ", - "AACAA AACAA AACAA AACAA", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - "AACAA AACAA AACAA AACAA", - " BBB BBB BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB F F BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB BBB BBB ", - "AACAA AACAA AACAA AACAA", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - "AACAA AACAA AACAA AACAA", - " BBB BBB BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB F F BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB BBB BBB ", - "AACAA AACAA AACAA AACAA", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AACAA AACAA AACAA AACAA ", - " BBB BBB BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB F F BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB BBB BBB ", - " AACAA AACAA AACAA AACAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AACAA AACAA AACAA AACAA ", - " BBB BBB BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB F F BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB BBB BBB ", - " AACAA AACAA AACAA AACAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AACAA AACAA AACAA AACAA ", - " BBB BBB BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB F F BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB BBB BBB ", - " AACAA AACAA AACAA AACAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AACAA AACAA AACAA AACAA ", - " BBB BBB BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB F F BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB BBB BBB ", - " AACAA AACAA AACAA AACAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AACAA AACAA AACAA AACAA ", - " BBB BBB BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB F F BBB BBB ", - " BBB BBB C C BBB BBB ", - " BBB BBB BBB BBB ", - " AACAA AACAA AACAA AACAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AACAA AACAA AACAA AACAA ", - " BBB BBB BBB BBB ", - " BBB BBB CC CC BBB BBB ", - " BBB BBB FF FF BBB BBB ", - " BBB BBB CC CC BBB BBB ", - " BBB BBB BBB BBB ", - " AACAA AACAA AACAA AACAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AACAA AACAA AACAA AACAA ", - " BBB BBB BBB BBB ", - " BBB BBB CCC CCC BBB BBB ", - " BBB BBB FFF FFF BBB BBB ", - " BBB BBB CCC CCC BBB BBB ", - " BBB BBB BBB BBB ", - " AACAA AACAA AACAA AACAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AACAA AACAA AACAA AACAA ", - " BBB BBB BBB BBB ", - " BBB BBB CCCCCCC BBB BBB ", - " BBB BBB FFC CFF BBB BBB ", - " BBB BBB CCCCCCC BBB BBB ", - " BBB BBB BBB BBB ", - " AACAA AACAA AACAA AACAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AACAA AACAA AACAA AACAA ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " AACAA AACAA AACAA AACAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AACAA AACAA AACAA AACAA ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " AACAA AACAA AACAA AACAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AACAA AACAA AACAA AACAA ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " AACAA AACAA AACAA AACAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AACAA AACAA AACAA AACAA ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " AACAA AACAA AACAA AACAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AACAA AACAA AACAA AACAA ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " AACAA AACAA AACAA AACAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AACAA AACAA AACAA AACAA ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " AACAA AACAA AACAA AACAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AACAA AACAA AACAA AACAA ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " AACAA AACAA AACAA AACAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AACAA AACAA AACAA AACAA ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " BBB BBB BBB BBB ", - " AACAA AACAA AACAA AACAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AACAA AACDA ADCAA AACAA ", - " BBB BBD DBB BBB ", - " BBB BBD DBB BBB ", - " BBB BBD DBB BBB ", - " BBB BBD DBB BBB ", - " BBB BBD DBB BBB ", - " AACAA AACDA ADCAA AACAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AACAA AADDAA AADDAA AACAA ", - " BBB BBBE EBBB BBB ", - " BBB BBBE EBBB BBB ", - " BBB BBBE EBBB BBB ", - " BBB BBBE EBBB BBB ", - " BBB BBBE EBBB BBB ", - " AACAA AADDAA AADDAA AACAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " D D ", - " AACAA DDDDAA AADDDD AACAA ", - " BBB DBBBE EBBBD BBB ", - " BBB DBBBA ABBBD BBB ", - " BBB DBBBA ABBBD BBB ", - " BBB DBBBA ABBBD BBB ", - " BBB DBBBE EBBBD BBB ", - " AACAA DDDDAA AADDDD AACAA ", - " D D ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " D D ", - " D D ", - " D D ", - " D D ", - " AACAA ADDDAA AADDDA AACAA ", - " BBB BBBE EBBB BBB ", - " BBB BBBA ABBB BBB ", - " BBB BBBA ABBB BBB ", - " BBB BBBA ABBB BBB ", - " BBB BBBE EBBB BBB ", - " AACAA ADDDAA AADDDA AACAA ", - " D D ", - " D D ", - " D D ", - " D D ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " AACAA AADDDAA AADDDAA AACAA ", - " BBB BBBBE EBBBB BBB ", - " BBB BBBBA ABBBB BBB ", - " BBB BBBBA ABBBB BBB ", - " BBB BBBBA ABBBB BBB ", - " BBB BBBBE EBBBB BBB ", - " AACAA AADDDAA AADDDAA AACAA ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " D D ", - " AACAA AADDDA ADDDAA AACAA ", - " BBB BBBBE EBBBB BBB ", - " BBB BBBBE EBBBB BBB ", - " BBB BBBBE EBBBB BBB ", - " BBB BBBBE EBBBB BBB ", - " BBB BBBBE EBBBB BBB ", - " AACAA AADDDA ADDDAA AACAA ", - " D D ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " AACAA AADDDB BDDDAA AACAA ", - " BBB BBBDB BDBBB BBB ", - " BBB BBBDB BDBBB BBB ", - " BBB BBBDB BDBBB BBB ", - " BBB BBBDB BDBBB BBB ", - " BBB BBBDB BDBBB BBB ", - " AACAA AADDDB BDDDAA AACAA ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " E E ", - " E E ", - " E E ", - " E E ", - " E E ", - " E E ", - " E E ", - " E E ", - " EE EE ", - " DE ED ", - " DEA AED ", - " AACAA AADDDA ADDDAA AACAA ", - " BBB BBBDA ADBBB BBB ", - " BBB BBBDA ADBBB BBB ", - " BBB BBBDA ADBBB BBB ", - " BBB BBBDA ADBBB BBB ", - " BBB BBBDA ADBBB BBB ", - " AACAA AADDDA ADDDAA AACAA ", - " DEA AED ", - " DE ED ", - " EE EE ", - " E E ", - " E E ", - " E E ", - " E E ", - " E E ", - " E E ", - " E E ", - " E E ", - " ", - " ", - " ", - " ") - .aisle(" A A ", - " A A ", - " A A ", - " A A ", - " A A ", - " A A ", - " A A ", - " A A ", - " A A ", - " D D ", - " D D ", - " DD DD ", - " DDE EDD ", - " DDE EDD ", - " DDE EDD ", - " AACAA DDDDB BDDDD AACAA ", - " BBB DBBBDB BDBBBD BBB ", - " BBB DBBBDB BDBBBD BBB ", - " BBB DBBBDB BDBBBD BBB ", - " BBB DBBBDB BDBBBD BBB ", - " BBB DBBBDB BDBBBD BBB ", - " AACAA DDDDB BDDDD AACAA ", - " DDE EDD ", - " DDE EDD ", - " DDE EDD ", - " DD DD ", - " D D ", - " D D ", - " A A ", - " A A ", - " A A ", - " A A ", - " A A ", - " A A ", - " A A ", - " A A ", - " A A ") - .aisle(" ", - " ", - " ", - " ", - " E E ", - " E E ", - " E E ", - " E E ", - " E E ", - " D E E D ", - " D E E D ", - " DDE EDD ", - " DDE EDD ", - " DDD DDD ", - " DDD DDD ", - " AACAA DDDDDAA AADDDDD AACAA ", - " BBB DBBBDE EDBBBD BBB ", - " BBB DBBBDE EDBBBD BBB ", - " BBB DBBBDE EDBBBD BBB ", - " BBB DBBBDE EDBBBD BBB ", - " BBB DBBBDE EDBBBD BBB ", - " AACAA DDDDDAA AADDDDD AACAA ", - " DDD DDD ", - " DDD DDD ", - " DDE EDD ", - " DDE EDD ", - " D E E D ", - " D E E D ", - " E E ", - " E E ", - " E E ", - " E E ", - " E E ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " AACAA DDDDDAA AADDDDD AACAA ", - " BBB DBBBBE EBBBBD BBB ", - " BBB DBBBBA ABBBBD BBB ", - " BBB DBBBBA ABBBBD BBB ", - " BBB DBBBBA ABBBBD BBB ", - " BBB DBBBBE EBBBBD BBB ", - " AACAA DDDDDAA AADDDDD AACAA ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " D D ", - " AACAA ADDDAA AADDDA AACAA ", - " BBB DBBBBE EBBBBD BBB ", - " BBB DBBBBA ABBBBD BBB ", - " BBB DBBBBA ABBBBD BBB ", - " BBB DBBBBA ABBBBD BBB ", - " BBB DBBBBE EBBBBD BBB ", - " AACAA ADDDAA AADDDA AACAA ", - " D D ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " AACAA AADDDAA AADDDAA AACAA ", - " BBB BBBBE EBBBB BBB ", - " BBB BBBBA ABBBB BBB ", - " BBB BBBBA ABBBB BBB ", - " BBB BBBBA ABBBB BBB ", - " BBB BBBBE EBBBB BBB ", - " AACAA AADDDAA AADDDAA AACAA ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " D D ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " D D ", - " D D ", - " D D ", - " D D ", - " AACAA AADDDAA AADDDAA AACAA ", - " BBB BBBBE EBBBB BBB ", - " BBB BBBBE EBBBB BBB ", - " BBB BBBBE EBBBB BBB ", - " BBB BBBBE EBBBB BBB ", - " BBB BBBBE EBBBB BBB ", - " AACAA AADDDAA AADDDAA AACAA ", - " D D ", - " D D ", - " D D ", - " D D ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " D D ", - " AACAA AADDDDAA AADDDDAA AACAA ", - " BBB BBBBD DBBBB BBB ", - " BBB BBBBD DBBBB BBB ", - " BBB BBBBD DBBBB BBB ", - " BBB BBBBD DBBBB BBB ", - " BBB BBBBD DBBBB BBB ", - " AACAA AADDDDAA AADDDDAA AACAA ", - " D D ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CCCCC AADDCAAAA AAAACDDAA CCCCC ", - " BBB BBBBB BBBBB BBB ", - " BBB BBBBB BBBBB BBB ", - " BBB BBBBB BBBBB BBB ", - " BBB BBBBB BBBBB BBB ", - " BBB BBBBB BBBBB BBB ", - " CCCCC AADDCAAAA AAAACDDAA CCCCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CCCCC DAACCAAAA AAAACCAAD CCCCC ", - " BBB DBBBBBB BBBBBBD BBB ", - " BBB DBBBBBB BBBBBBD BBB ", - " BBB DBBBBBB BBBBBBD BBB ", - " BBB DBBBBBB BBBBBBD BBB ", - " BBB DBBBBBB BBBBBBD BBB ", - " CCCCC DAACCAAAA AAAACCAAD CCCCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CCCCC AAAACCAAAAA AAAAACCAAAA CCCCC ", - " BBB BBBBBB BBBBBB BBB ", - " BBB BBBBBB BBBBBB BBB ", - " BBB BBBBBB BBBBBB BBB ", - " BBB BBBBBB BBBBBB BBB ", - " BBB BBBBBB BBBBBB BBB ", - " CCCCC AAAACCAAAAA AAAAACCAAAA CCCCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CCCCC AAAACCAAAAAA AAAAAACCAAAA CCCCC ", - " BBB BBBBBBB BBBBBBB BBB ", - " BBB BBBBBBB BBBBBBB BBB ", - " BBB BBBBBBB BBBBBBB BBB ", - " BBB BBBBBBB BBBBBBB BBB ", - " BBB BBBBBBB BBBBBBB BBB ", - " CCCCC AAAACCAAAAAA AAAAAACCAAAA CCCCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CCCCC AAAACCCAAAAAAAA AAAAAAAACCCAAAA CCCCC ", - " BBB BBBBBBBB BBBBBBBB BBB ", - " BBB BBBBBBBB BBBBBBBB BBB ", - " BBB BBBBBBBB BBBBBBBB BBB ", - " BBB BBBBBBBB BBBBBBBB BBB ", - " BBB BBBBBBBB BBBBBBBB BBB ", - " CCCCC AAAACCCAAAAAAAA AAAAAAAACCCAAAA CCCCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CCCCC AAAAACCCAAAAAAAAAAAAAAAAAAAAAAACCCAAAAA CCCCC ", - " BBB BBBBBBBBBBB BBBBBBBBBBB BBB ", - " BBB BBBBBBBBBBB BBBBBBBBBBB BBB ", - " BBB BBBBBBBBBBB BBBBBBBBBBB BBB ", - " BBB BBBBBBBBBBB BBBBBBBBBBB BBB ", - " BBB BBBBBBBBBBB BBBBBBBBBBB BBB ", - " CCCCC AAAAACCCAAAAAAAAAAAAAAAAAAAAAAACCCAAAAA CCCCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CCCCC AAAAAACCCCCAAAAAAAAAAAAACCCCCAAAAAA CCCCC ", - " BBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBB ", - " BBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBB ", - " BBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBB ", - " BBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBB ", - " BBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBB ", - " CCCCC AAAAAACCCCCAAAAAAAAAAAAACCCCCAAAAAA CCCCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CCCCAA AAAAAAAACCCCCCCCCCCCCAAAAAAAA AACCCC ", - " BBB BBBBBBBBBBBBBBBBBBBBBBB BBB ", - " BBB BBBBBBBBBBBBBBBBBBBBBBB BBB ", - " BBB BBBBBBBBBBBBBBBBBBBBBBB BBB ", - " BBB BBBBBBBBBBBBBBBBBBBBBBB BBB ", - " BBB BBBBBBBBBBBBBBBBBBBBBBB BBB ", - " CCCCAA AAAAAAAACCCCCCGCCCCCCAAAAAAAA AACCCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CCCAAA AAAAAAAAAAAAAAAAAAAAAAA AAACCC ", - " BBBB BBBBBBBBBBBBB BBBB ", - " BBBB BBBBBBBBBBBBB BBBB ", - " BBBB BBBBBBBBBBBBB BBBB ", - " BBBB BBBBBBBBBBBBB BBBB ", - " BBBB BBBBBBBBBBBBB BBBB ", - " CCCAAA AAAAAAAAAAAAAAAAAAAAAAA AAACCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CCCCAA AAAAAAAAAAAAA AACCCC ", - " BBBB BBBB ", - " BBBB BBBB ", - " BBBB BBBB ", - " BBBB BBBB ", - " BBBB BBBB ", - " CCCCAA AAAAAAAAAAAAA AACCCC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " CAACAAA AAACAAC ", - " BBBB BBBB ", - " BBBB BBBB ", - " BBBB BBBB ", - " BBBB BBBB ", - " BBBB BBBB ", - " CAACAAA AAACAAC ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AAACAAAA AAAACAAA ", - " BBBB BBBB ", - " BBBB BBBB ", - " BBBB BBBB ", - " BBBB BBBB ", - " BBBB BBBB ", - " AAACAAAA AAAACAAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AACCAAA AAACCAA ", - " BBBBB BBBBB ", - " BBBBB BBBBB ", - " BBBBB BBBBB ", - " BBBBB BBBBB ", - " BBBBB BBBBB ", - " AACCAAA AAACCAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AAACCAAA AAACCAAA ", - " BBBBB BBBBB ", - " BBBBB BBBBB ", - " BBBBB BBBBB ", - " BBBBB BBBBB ", - " BBBBB BBBBB ", - " AAACCAAA AAACCAAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AAAACAAAA AAAACAAAA ", - " BBBBB BBBBB ", - " BBBBB BBBBB ", - " BBBBB BBBBB ", - " BBBBB BBBBB ", - " BBBBB BBBBB ", - " AAAACAAAA AAAACAAAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AAACCAAAAA AAAAACCAAA ", - " BBBBB BBBBB ", - " BBBBB BBBBB ", - " BBBBB BBBBB ", - " BBBBB BBBBB ", - " BBBBB BBBBB ", - " AAACCAAAAA AAAAACCAAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AAACCAAAAA AAAAACCAAA ", - " BBBBBBB BBBBBBB ", - " BBBBBBB BBBBBBB ", - " BBBBBBB BBBBBBB ", - " BBBBBBB BBBBBBB ", - " BBBBBBB BBBBBBB ", - " AAACCAAAAA AAAAACCAAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AAAACCCAAAAA AAAAACCCAAAA ", - " BBBBBBB BBBBBBB ", - " BBBBBBB BBBBBBB ", - " BBBBBBB BBBBBBB ", - " BBBBBBB BBBBBBB ", - " BBBBBBB BBBBBBB ", - " AAAACCCAAAAA AAAAACCCAAAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AAAAACCAAAAAAA AAAAAAACCAAAAA ", - " BBBBBBBB BBBBBBBB ", - " BBBBBBBB BBBBBBBB ", - " BBBBBBBB BBBBBBBB ", - " BBBBBBBB BBBBBBBB ", - " BBBBBBBB BBBBBBBB ", - " AAAAACCAAAAAAA AAAAAAACCAAAAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AAAAACCCAAAAAAAAAA AAAAAAAAAACCCAAAAA ", - " BBBBBBBBB BBBBBBBBB ", - " BBBBBBBBB BBBBBBBBB ", - " BBBBBBBBB BBBBBBBBB ", - " BBBBBBBBB BBBBBBBBB ", - " BBBBBBBBB BBBBBBBBB ", - " AAAAACCCAAAAAAAAAA AAAAAAAAAACCCAAAAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AAAAACCCCAAAAAAAAAAAAAAAAAAAAAAAAAAACCCCAAAAA ", - " BBBBBBBBBBBBB BBBBBBBBBBBBB ", - " BBBBBBBBBBBBB BBBBBBBBBBBBB ", - " BBBBBBBBBBBBB BBBBBBBBBBBBB ", - " BBBBBBBBBBBBB BBBBBBBBBBBBB ", - " BBBBBBBBBBBBB BBBBBBBBBBBBB ", - " AAAAACCCCAAAAAAAAAAAAAAAAAAAAAAAAAAACCCCAAAAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AAAAAAACCCCCCAAAAAAAAAAAAAAACCCCCCAAAAAAA ", - " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", - " BBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBB ", - " BBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBB ", - " BBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBB ", - " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", - " AAAAAAACCCCCCAAAAAAAAAAAAAAACCCCCCAAAAAAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AAAAAAAAAACCCCCCCCCCCCCCCAAAAAAAAAA ", - " BBBBBBBBBBBBBBBBBBBBBBBBBBB ", - " BBBBBBBBBBBB BBBBBBBBBBBB ", - " BBBBBBBBBBBB BBBBBBBBBBBB ", - " BBBBBBBBBBBB BBBBBBBBBBBB ", - " BBBBBBBBBBBBBBBBBBBBBBBBBBB ", - " AAAAAAAAAACCCCCCCCCCCCCCCAAAAAAAAAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", - " BBBBBBBBBBBBBBB ", - " BBBBBB BBBBBB ", - " BBBBBB BBBBBB ", - " BBBBBB BBBBBB ", - " BBBBBBBBBBBBBBB ", - " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") - .aisle(" ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " AAAAAAAAAAAAAAA ", - " ", - " ", - " ", - " ", - " ", - " AAAAAAAAAAAAAAA ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ") + // spotless:off + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAAAAAAAAAAAAAA ", " ", " ", " ", " ", " ", " AAAAAAAAAAAAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " BBBBBBCCCBBBBBB ", " BBBBBBCCCBBBBBB ", " BBBBBBCCCBBBBBB ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAAAAAAAAABBBBBBBBBBBBBBBAAAAAAAAAA ", " BBBBBBBBBBBBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBCCCBBBBBBBBBBBB ", " BBBBBBBBBBBBCCCBBBBBBBBBBBB ", " BBBBBBBBBBBBCCCBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAAAAAAABBBBBBBBBBBBBBBAAAAAAAAAA ", " D ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAAAAAABBBBBBAAAAAAAAAAAAAAABBBBBBAAAAAAA ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBCCCBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBCCCBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBCCCBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAAAABBBBBBAAAAAAAAAAAAAAABBBBBBAAAAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAAAABBBBAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBAAAAA ", " BBBBBBBBBBBBB BBBBBBBBBBBBB ", " BBBBBBBBBBBBB BBBBBBBBBBBBB ", " BBBBBBBBBBBBB BBBBBBBBBBBBB ", " BBBBBBBBBBBBB BBBBBBBBBBBBB ", " BBBBBBBBBBBBB BBBBBBBBBBBBB ", " AAAAABBBBAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBAAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAAAABBBAAAAAAAAAA AAAAAAAAAABBBAAAAA ", " BBBBBBBBB BBBBBBBBB ", " BBBBBBBBB BBBBBBBBB ", " BBBBBBBBB BBBBBBBBB ", " BBBBBBBBB BBBBBBBBB ", " BBBBBBBBB BBBBBBBBB ", " AAAAABBBAAAAAAAAAA AAAAAAAAAABBBAAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAAAABBAAAAAAA AAAAAAABBAAAAA ", " BBBBBBBB BBBBBBBB ", " BBBBBBBB BBBBBBBB ", " BBBBBBBB BBBBBBBB ", " BBBBBBBB BBBBBBBB ", " BBBBBBBB BBBBBBBB ", " AAAAABBAAAAAAA AAAAAAABBAAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAAABBBAAAAA AAAAABBBAAAA ", " BBBBBBB BBBBBBB ", " BBBBBBB BBBBBBB ", " BBBBBBB BBBBBBB ", " BBBBBBB BBBBBBB ", " BBBBBBB BBBBBBB ", " AAAABBBAAAAA AAAAABBBAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAABBAAAAA AAAAABBAAA ", " BBBBBBB BBBBBBB ", " BBBBBBB BBBBBBB ", " BBBBBBB BBBBBBB ", " BBBBBBB BBBBBBB ", " BBBBBBB BBBBBBB ", " AAABBAAAAA AAAAABBAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAABBAAAAA AAAAABBAAA ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " AAABBAAAAA AAAAABBAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAAABAAAA AAAABAAAA ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " AAAABAAAA AAAABAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAABBAAA AAABBAAA ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " AAABBAAA AAABBAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABBAAA AAABBAA ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " AABBAAA AAABBAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAABAAAA AAAABAAA ", " BBBB BBBB ", " BBBB BBBB ", " BBBB BBBB ", " BBBB BBBB ", " BBBB BBBB ", " AAABAAAA AAAABAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BAABAAA AAABAAB ", " BBBB BBBB ", " BBBB BBBB ", " BBBB BBBB ", " BBBB BBBB ", " BBBB BBBB ", " BAABAAA AAABAAB ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BBBBAA AAAAAAAAAAAAA AABBBB ", " BBBB BBBB ", " BBBB BBBB ", " BBBB BBBB ", " BBBB BBBB ", " BBBB BBBB ", " BBBBAA AAAAAAAAAAAAA AABBBB ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BBBAAA AAAAAAAAAAAAAAAAAAAAAAA AAABBB ", " BBBB BBBBBBBBBBBBB BBBB ", " BBBB BBBBBCCCBBBBB BBBB ", " BBBB BBBBBCCCBBBBB BBBB ", " BBBB BBBBBCCCBBBBB BBBB ", " BBBB BBBBBBBBBBBBB BBBB ", " BBBAAA AAAAAAAAAAAAAAAAAAAAAAA AAABBB ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BBBBAA AAAAAAAABBBBBBBBBBBBBAAAAAAAA AABBBB ", " BBB BBBBBBBBBBBBBBBBBBBBBBB BBB ", " BBB BBBBBBBBBBCCCBBBBBBBBBB BBB ", " BBB BBBBBBBBBBCCCBBBBBBBBBB BBB ", " BBB BBBBBBBBBBCCCBBBBBBBBBB BBB ", " BBB BBBBBBBBBBBBBBBBBBBBBBB BBB ", " BBBBAA AAAAAAAABBBBBBBBBBBBBAAAAAAAA AABBBB ", " D ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BBBBB AAAAAABBBBBAAAAAAAAAAAAABBBBBAAAAAA BBBBB ", " BBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBB ", " BBB BBBBBBBBBBBBBCCCBBBBBBBBBBBBB BBB ", " BBB BBBBBBBBBBBBBCCCBBBBBBBBBBBBB BBB ", " BBB BBBBBBBBBBBBBCCCBBBBBBBBBBBBB BBB ", " BBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBB ", " BBBBB AAAAAABBBBBAAAAAAAAAAAAABBBBBAAAAAA BBBBB ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BBBBB AAAAABBBAAAAAAAAAAAAAAAAAAAAAAABBBAAAAA BBBBB ", " BBB BBBBBBBBBBB BBBBBBBBBBB BBB ", " BBB BBBBBBBBBBB BBBBBBBBBBB BBB ", " BBB BBBBBBBBBBB BBBBBBBBBBB BBB ", " BBB BBBBBBBBBBB BBBBBBBBBBB BBB ", " BBB BBBBBBBBBBB BBBBBBBBBBB BBB ", " BBBBB AAAAABBBAAAAAAAAAAAAAAAAAAAAAAABBBAAAAA BBBBB ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BBBBB AAAABBBAAAAAAAA AAAAAAAABBBAAAA BBBBB ", " BBB BBBBBBBB BBBBBBBB BBB ", " BBB BBBBBBBB BBBBBBBB BBB ", " BBB BBBBBBBB BBBBBBBB BBB ", " BBB BBBBBBBB BBBBBBBB BBB ", " BBB BBBBBBBB BBBBBBBB BBB ", " BBBBB AAAABBBAAAAAAAA AAAAAAAABBBAAAA BBBBB ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BBBBB AAAABBAAAAAA AAAAAABBAAAA BBBBB ", " BBB BBBBBBB BBBBBBB BBB ", " BBB BBBBBBB BBBBBBB BBB ", " BBB BBBBBBB BBBBBBB BBB ", " BBB BBBBBBB BBBBBBB BBB ", " BBB BBBBBBB BBBBBBB BBB ", " BBBBB AAAABBAAAAAA AAAAAABBAAAA BBBBB ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BBBBB AAAABBAAAAA AAAAABBAAAA BBBBB ", " BBB BBBBBB BBBBBB BBB ", " BBB BBBBBB BBBBBB BBB ", " BBB BBBBBB BBBBBB BBB ", " BBB BBBBBB BBBBBB BBB ", " BBB BBBBBB BBBBBB BBB ", " BBBBB AAAABBAAAAA AAAAABBAAAA BBBBB ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BBBBB EAABBAAAA AAAABBAAE BBBBB ", " BBB EBBBBBB BBBBBBE BBB ", " BBB EBBBBBB BBBBBBE BBB ", " BBB EBBBBBB BBBBBBE BBB ", " BBB EBBBBBB BBBBBBE BBB ", " BBB EBBBBBB BBBBBBE BBB ", " BBBBB EAABBAAAA AAAABBAAE BBBBB ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BBBBB AAEEBAAAA AAAABEEAA BBBBB ", " BBB BBBBB BBBBB BBB ", " BBB BBBBB BBBBB BBB ", " BBB BBBBB BBBBB BBB ", " BBB BBBBB BBBBB BBB ", " BBB BBBBB BBBBB BBB ", " BBBBB AAEEBAAAA AAAABEEAA BBBBB ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E E ", " AABAA AAEEEEAA AAEEEEAA AABAA ", " BBB BBBBE EBBBB BBB ", " BBB BBBBE EBBBB BBB ", " BBB BBBBE EBBBB BBB ", " BBB BBBBE EBBBB BBB ", " BBB BBBBE EBBBB BBB ", " AABAA AAEEEEAA AAEEEEAA AABAA ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E E ", " E E ", " E E ", " E E ", " AABAA AAEEEAA AAEEEAA AABAA ", " BBB BBBBF FBBBB BBB ", " BBB BBBBF FBBBB BBB ", " BBB BBBBF FBBBB BBB ", " BBB BBBBF FBBBB BBB ", " BBB BBBBF FBBBB BBB ", " AABAA AAEEEAA AAEEEAA AABAA ", " E E ", " E E ", " E E ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " AABAA AAEEEAA AAEEEAA AABAA ", " BBB BBBBF FBBBB BBB ", " BBB BBBBA ABBBB BBB ", " BBB BBBBA ABBBB BBB ", " BBB BBBBA ABBBB BBB ", " BBB BBBBF FBBBB BBB ", " AABAA AAEEEAA AAEEEAA AABAA ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E E ", " AABAA AEEEAA AAEEEA AABAA ", " BBB EBBBBF FBBBBE BBB ", " BBB EBBBBA ABBBBE BBB ", " BBB EBBBBA ABBBBE BBB ", " BBB EBBBBA ABBBBE BBB ", " BBB EBBBBF FBBBBE BBB ", " AABAA AEEEAA AAEEEA AABAA ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " AABAA EEEEEAA AAEEEEE AABAA ", " BBB EBBBBF FBBBBE BBB ", " BBB EBBBBA ABBBBE BBB ", " BBB EBBBBA ABBBBE BBB ", " BBB EBBBBA ABBBBE BBB ", " BBB EBBBBF FBBBBE BBB ", " AABAA EEEEEAA AAEEEEE AABAA ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " F F ", " F F ", " F F ", " F F ", " F F ", " E F F E ", " E F F E ", " EEF FEE ", " EEF FEE ", " EEE EEE ", " EEE EEE ", " AABAA EEEEEAA AAEEEEE AABAA ", " BBB EBBBEF FEBBBE BBB ", " BBB EBBBEF FEBBBE BBB ", " BBB EBBBEF FEBBBE BBB ", " BBB EBBBEF FEBBBE BBB ", " BBB EBBBEF FEBBBE BBB ", " AABAA EEEEEAA AAEEEEE AABAA ", " EEE EEE ", " EEE EEE ", " EEF FEE ", " EEF FEE ", " E F F E ", " E F F E ", " F F ", " F F ", " F F ", " F F ", " F F ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " E E ", " E E ", " EE EE ", " EEF FEE ", " EEF FEE ", " EEF FEE ", " AABAA EEEEB BEEEE AABAA ", " BBB EBBBEB BEBBBE BBB ", " BBB EBBBEB BEBBBE BBB ", " BBB EBBBEB BEBBBE BBB ", " BBB EBBBEB BEBBBE BBB ", " BBB EBBBEB BEBBBE BBB ", " AABAA EEEEB BEEEE AABAA ", " EEF FEE ", " EEF FEE ", " EEF FEE ", " EE EE ", " E E ", " E E ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " FF FF ", " EF FE ", " EFA AFE ", " AABAA AAEEEA AEEEAA AABAA ", " BBB BBBEA AEBBB BBB ", " BBB BBBEA AEBBB BBB ", " BBB BBBEA AEBBB BBB ", " BBB BBBEA AEBBB BBB ", " BBB BBBEA AEBBB BBB ", " AABAA AAEEEA AEEEAA AABAA ", " EFA AFE ", " EF FE ", " FF FF ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " AABAA AAEEEB BEEEAA AABAA ", " BBB BBBEB BEBBB BBB ", " BBB BBBEB BEBBB BBB ", " BBB BBBEB BEBBB BBB ", " BBB BBBEB BEBBB BBB ", " BBB BBBEB BEBBB BBB ", " AABAA AAEEEB BEEEAA AABAA ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E E ", " AABAA AAEEEA AEEEAA AABAA ", " BBB BBBBF FBBBB BBB ", " BBB BBBBF FBBBB BBB ", " BBB BBBBF FBBBB BBB ", " BBB BBBBF FBBBB BBB ", " BBB BBBBF FBBBB BBB ", " AABAA AAEEEA AEEEAA AABAA ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " AABAA AAEEEAA AAEEEAA AABAA ", " BBB BBBBF FBBBB BBB ", " BBB BBBBA ABBBB BBB ", " BBB BBBBA ABBBB BBB ", " BBB BBBBA ABBBB BBB ", " BBB BBBBF FBBBB BBB ", " AABAA AAEEEAA AAEEEAA AABAA ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E E ", " E E ", " E E ", " E E ", " AABAA AEEEAA AAEEEA AABAA ", " BBB BBBF FBBB BBB ", " BBB BBBA ABBB BBB ", " BBB BBBA ABBB BBB ", " BBB BBBA ABBB BBB ", " BBB BBBF FBBB BBB ", " AABAA AEEEAA AAEEEA AABAA ", " E E ", " E E ", " E E ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E E ", " AABAA EEEEAA AAEEEE AABAA ", " BBB EBBBF FBBBE BBB ", " BBB EBBBA ABBBE BBB ", " BBB EBBBA ABBBE BBB ", " BBB EBBBA ABBBE BBB ", " BBB EBBBF FBBBE BBB ", " AABAA EEEEAA AAEEEE AABAA ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AAEEAA AAEEAA AABAA ", " BBB BBBF FBBB BBB ", " BBB BBBF FBBB BBB ", " BBB BBBF FBBB BBB ", " BBB BBBF FBBB BBB ", " BBB BBBF FBBB BBB ", " AABAA AAEEAA AAEEAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABEA AEBAA AABAA ", " BBB BBE EBB BBB ", " BBB BBE EBB BBB ", " BBB BBE EBB BBB ", " BBB BBE EBB BBB ", " BBB BBE EBB BBB ", " AABAA AABEA AEBAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " GGGGG ", " ", " GGGGG ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " GGGGG ", " ", " GGGGG ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" H H ", " H H ", " H H ", " H H ", " H H ", " HH HH ", " HH HH ", " GGGHH HHGGG ", " HH HH ", " GGGHH HHGGG ", " HH HH ", " H H ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " H H ", " HH HH ", " GGGHH HHGGG ", " HH HH ", " GGGHH HHGGG ", " HH HH ", " HH HH ", " H H ", " H H ", " H H ", " H H ", " H H ") + .aisle(" ", " ", " ", " ", " ", " AACCCCCAA ", " AA HHH AA ", " G AA HHH AA G ", " AA HHH AA ", " G AA HHH AA G ", " AA HHH AA ", " AACHHHCAA ", " HHH ", " HHH ", " HHH ", " H ", " H ", " H ", " H ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " H ", " H ", " H ", " H ", " HHH ", " HHH ", " HHH ", " AACHHHCAA ", " AA HHH AA ", " G AA HHH AA G ", " AA HHH AA ", " G AA HHH AA G ", " AA HHH AA ", " AACCCCCAA ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " G G ", " AACCCCCCCCCAA ", " AA AA ", " GGAA G G AAGG ", " AA AA ", " GGAA AAGG ", " AA AA ", " AACCCCCCCCCAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AACCCCCCCCCAA ", " AA AA ", " GGAA AAGG ", " AA AA ", " GGAA G G AAGG ", " AA AA ", " AACCCCCCCCCAA ", " G G ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " G G ", " ACCCC HHH CCCCA ", " A A ", " GA G G AG ", " A A ", " GA AG ", " A A ", " ACCCC CCCCA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "AABAA AABAA AABAA AABAA", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", "AABAA AABAA AABAA AABAA", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ACCCC CCCCA ", " A A ", " GA AG ", " A A ", " GA G G AG ", " A A ", " ACCCC HHH CCCCA ", " G G ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " G G ", " ACCC HHH CCCA ", " A A ", " GA G G AG ", " A A ", " GA AG ", " A A ", " ACCC CCCA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "AABAA AABAA AABAA AABAA", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", "AABAA AABAA AABAA AABAA", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ACCC CCCA ", " A A ", " GA AG ", " A A ", " GA G G AG ", " A A ", " ACCC HHH CCCA ", " G G ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " G G ", " ACC HHH CCA ", " A A ", " G A G G A G ", " A A ", " G A A G ", " A A ", " ACC CCA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "AABAA AABAA AABAA AABAA", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", "AABAA AABAA AABAA AABAA", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ACC CCA ", " A A ", " G A A G ", " A A ", " G A G G A G ", " A A ", " ACC HHH CCA ", " G G ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " G G ", " ACC HHH CCA ", " A A ", " GA G G AG ", " A A ", " GA AG ", " A A ", " ACC CCA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "AABAA AABAA AABAA AABAA", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", "AABAA AABAA AABAA AABAA", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ACC CCA ", " A A ", " GA AG ", " A A ", " GA G G AG ", " A A ", " ACC HHH CCA ", " G G ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GGGGG ", " ACC HHH CCA ", " A A ", " GA G G AG ", " A A ", " GA AG ", " A A ", " ACC CCA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "AABAA AABAA AABAA AABAA", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", "AABAA AABAA AABAA AABAA", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ACC CCA ", " A A ", " GA AG ", " A A ", " GA G G AG ", " A A ", " ACC HHH CCA ", " GGGGG ", " ", " ", " ", " ") + .aisle(" H H ", " H H ", " H H ", " H H ", " H GGGGGGGCCCGGGGGGG H ", " HCC HHH CCH ", " H H ", " GH G G HG ", " H H ", " GH HG ", " H H ", " CC CC ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "AABAA AABAA AABAA AABAA", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", "AABAA AABAA AABAA AABAA", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " CC CC ", " H H ", " GH HG ", " H H ", " GH G G HG ", " H H ", " HCC HHH CCH ", " H GGGGGGGCCCGGGGGGG H ", " H H ", " H H ", " H H ", " H H ") + .aisle(" ", " ", " ", " ", " GCCCCCG ", " HCCHHHHHHHHHHHHHHHCCH ", " HH HH ", " GHHGGGGGGGGGGGGGGGGGHHG ", " HH HH ", " GHH HHG ", " HH HH ", " HHC CHH ", " H H ", " H H ", " H H ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "AABAA AABAA AABAA AABAA", " BBB BBB BBB BBB ", " CCC CCC CCC CCC ", " CCC CCC CCC CCC ", " CCC CCC CCC CCC ", " BBB BBB BBB BBB ", "AABAA AABAA AABAA AABAA", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " H H ", " H H ", " H H ", " HHC CHH ", " HH HH ", " GHH HHG ", " HH HH ", " GHHGGGGGGGGGGGGGGGGGHHG ", " HH HH ", " HCCHHHHHHHHHHHHHHHCCH ", " GCCCCCG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GCC CCG ", " CCHHHHHHHHHHHHHHHCC ", " H H ", " G H G G H G ", " H H ", " G H H G ", " H H ", " HC CH ", " H H ", " H H ", " H H ", " H H ", " H H ", " H H ", " H H ", " ", " ", " ", " ", " ", " ", "AABAA AABAA AABAA AABAA", " BBB BBB BBB BBB ", " CCC CCC CCC CCC ", " CCC CCC CCC CCC ", " CCC CCC CCC CCC ", " BBB BBB BBB BBB ", "AABAA AABAA AABAA AABAA", " D D D D ", " ", " ", " ", " ", " ", " H H ", " H H ", " H H ", " H H ", " H H ", " H H ", " H H ", " HC CH ", " H H ", " G H H G ", " H H ", " G H G G H G ", " H H ", " CCHHHHHHHHHHHHHHHCC ", " GCCQCCG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GCCCCCG ", " HCCHHHHHHHHHHHHHHHCCH ", " HH HH ", " GHHGGGGGGGGGGGGGGGGGHHG ", " HH HH ", " GHH HHG ", " HH HH ", " HHC CHH ", " H H ", " H H ", " H H ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "AABAA AABAA AABAA AABAA", " BBB BBB BBB BBB ", " CCC CCC CCC CCC ", " CCC CCC CCC CCC ", " CCC CCC CCC CCC ", " BBB BBB BBB BBB ", "AABAA AABAA AABAA AABAA", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " H H ", " H H ", " H H ", " HHC CHH ", " HH HH ", " GHH HHG ", " HH HH ", " GHHGGGGGGGGGGGGGGGGGHHG ", " HH HH ", " HCCHHHHHHHHHHHHHHHCCH ", " GCCCCCG ", " ", " ", " ", " ") + .aisle(" H H ", " H H ", " H H ", " H H ", " H GGGGGGGCCCGGGGGGG H ", " HCC HHH CCH ", " H H ", " GH G G HG ", " H H ", " GH HG ", " H H ", " CC CC ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "AABAA AABAA AABAA AABAA", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", "AABAA AABAA AABAA AABAA", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " CC CC ", " H H ", " GH HG ", " H H ", " GH G G HG ", " H H ", " HCC HHH CCH ", " H GGGGGGGCCCGGGGGGG H ", " H H ", " H H ", " H H ", " H H ") + .aisle(" ", " ", " ", " ", " GGGGG ", " ACC HHH CCA ", " A A ", " GA G G AG ", " A A ", " GA AG ", " A A ", " ACC CCA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "AABAA AABAA AABAA AABAA", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", "AABAA AABAA AABAA AABAA", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ACC CCA ", " A A ", " GA AG ", " A A ", " GA G G AG ", " A A ", " ACC HHH CCA ", " GGGGG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " G G ", " ACC HHH CCA ", " A A ", " GA G G AG ", " A A ", " GA AG ", " A A ", " ACC CCA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "AABAA AABAA AABAA AABAA", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", "AABAA AABAA AABAA AABAA", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ACC CCA ", " A A ", " GA AG ", " A A ", " GA G G AG ", " A A ", " ACC HHH CCA ", " G G ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " G G ", " ACC HHH CCA ", " A A ", " G A G G A G ", " A A ", " G A A G ", " A A ", " ACC CCA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "AABAA AABAA AABAA AABAA", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", "AABAA AABAA AABAA AABAA", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ACC CCA ", " A A ", " G A A G ", " A A ", " G A G G A G ", " A A ", " ACC HHH CCA ", " G G ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " G G ", " ACCC HHH CCCA ", " A A ", " GA G G AG ", " A A ", " GA AG ", " A A ", " ACCC CCCA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "AABAA AABAA AABAA AABAA", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", "AABAA AABAA AABAA AABAA", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ACCC CCCA ", " A A ", " GA AG ", " A A ", " GA G G AG ", " A A ", " ACCC HHH CCCA ", " G G ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " G G ", " ACCCC HHH CCCCA ", " A A ", " GA G G AG ", " A A ", " GA AG ", " A A ", " ACCCC CCCCA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "AABAA AABAA AABAA AABAA", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", "AABAA AABAA AABAA AABAA", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ACCCC CCCCA ", " A A ", " GA AG ", " A A ", " GA G G AG ", " A A ", " ACCCC HHH CCCCA ", " G G ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " G G ", " AACCCCCCCCCAA ", " AA AA ", " GGAA G G AAGG ", " AA AA ", " GGAA AAGG ", " AA AA ", " AACCCCCCCCCAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AACCCCCCCCCAA ", " AA AA ", " GGAA AAGG ", " AA AA ", " GGAA G G AAGG ", " AA AA ", " AACCCCCCCCCAA ", " G G ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " AACCCCCAA ", " AA HHH AA ", " G AA HHH AA G ", " AA HHH AA ", " G AA HHH AA G ", " AA HHH AA ", " AACHHHCAA ", " HHH ", " HHH ", " HHH ", " H ", " H ", " H ", " H ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " H ", " H ", " H ", " H ", " HHH ", " HHH ", " HHH ", " AACHHHCAA ", " AA HHH AA ", " G AA HHH AA G ", " AA HHH AA ", " G AA HHH AA G ", " AA HHH AA ", " AACCCCCAA ", " ", " ", " ", " ", " ") + .aisle(" H H ", " H H ", " H H ", " H H ", " H H ", " HH HH ", " HH HH ", " GGGHH HHGGG ", " HH HH ", " GGGHH HHGGG ", " HH HH ", " H H ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " H H ", " HH HH ", " GGGHH HHGGG ", " HH HH ", " GGGHH HHGGG ", " HH HH ", " HH HH ", " H H ", " H H ", " H H ", " H H ", " H H ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " GGGGG ", " ", " GGGGG ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " GGGGG ", " ", " GGGGG ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABEA AEBAA AABAA ", " BBB BBE EBB BBB ", " BBB BBE EBB BBB ", " BBB BBE EBB BBB ", " BBB BBE EBB BBB ", " BBB BBE EBB BBB ", " AABAA AABEA AEBAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AAEEAA AAEEAA AABAA ", " BBB BBBF FBBB BBB ", " BBB BBBF FBBB BBB ", " BBB BBBF FBBB BBB ", " BBB BBBF FBBB BBB ", " BBB BBBF FBBB BBB ", " AABAA AAEEAA AAEEAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E E ", " AABAA EEEEAA AAEEEE AABAA ", " BBB EBBBF FBBBE BBB ", " BBB EBBBA ABBBE BBB ", " BBB EBBBA ABBBE BBB ", " BBB EBBBA ABBBE BBB ", " BBB EBBBF FBBBE BBB ", " AABAA EEEEAA AAEEEE AABAA ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E E ", " E E ", " E E ", " E E ", " AABAA AEEEAA AAEEEA AABAA ", " BBB BBBF FBBB BBB ", " BBB BBBA ABBB BBB ", " BBB BBBA ABBB BBB ", " BBB BBBA ABBB BBB ", " BBB BBBF FBBB BBB ", " AABAA AEEEAA AAEEEA AABAA ", " E E ", " E E ", " E E ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " AABAA AAEEEAA AAEEEAA AABAA ", " BBB BBBBF FBBBB BBB ", " BBB BBBBA ABBBB BBB ", " BBB BBBBA ABBBB BBB ", " BBB BBBBA ABBBB BBB ", " BBB BBBBF FBBBB BBB ", " AABAA AAEEEAA AAEEEAA AABAA ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E E ", " AABAA AAEEEA AEEEAA AABAA ", " BBB BBBBF FBBBB BBB ", " BBB BBBBF FBBBB BBB ", " BBB BBBBF FBBBB BBB ", " BBB BBBBF FBBBB BBB ", " BBB BBBBF FBBBB BBB ", " AABAA AAEEEA AEEEAA AABAA ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " AABAA AAEEEB BEEEAA AABAA ", " BBB BBBEB BEBBB BBB ", " BBB BBBEB BEBBB BBB ", " BBB BBBEB BEBBB BBB ", " BBB BBBEB BEBBB BBB ", " BBB BBBEB BEBBB BBB ", " AABAA AAEEEB BEEEAA AABAA ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " FF FF ", " EF FE ", " EFA AFE ", " AABAA AAEEEA AEEEAA AABAA ", " BBB BBBEA AEBBB BBB ", " BBB BBBEA AEBBB BBB ", " BBB BBBEA AEBBB BBB ", " BBB BBBEA AEBBB BBB ", " BBB BBBEA AEBBB BBB ", " AABAA AAEEEA AEEEAA AABAA ", " EFA AFE ", " EF FE ", " FF FF ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " E E ", " E E ", " EE EE ", " EEF FEE ", " EEF FEE ", " EEF FEE ", " AABAA EEEEB BEEEE AABAA ", " BBB EBBBEB BEBBBE BBB ", " BBB EBBBEB BEBBBE BBB ", " BBB EBBBEB BEBBBE BBB ", " BBB EBBBEB BEBBBE BBB ", " BBB EBBBEB BEBBBE BBB ", " AABAA EEEEB BEEEE AABAA ", " EEF FEE ", " EEF FEE ", " EEF FEE ", " EE EE ", " E E ", " E E ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " F F ", " F F ", " F F ", " F F ", " F F ", " E F F E ", " E F F E ", " EEF FEE ", " EEF FEE ", " EEE EEE ", " EEE EEE ", " AABAA EEEEEAA AAEEEEE AABAA ", " BBB EBBBEF FEBBBE BBB ", " BBB EBBBEF FEBBBE BBB ", " BBB EBBBEF FEBBBE BBB ", " BBB EBBBEF FEBBBE BBB ", " BBB EBBBEF FEBBBE BBB ", " AABAA EEEEEAA AAEEEEE AABAA ", " EEE EEE ", " EEE EEE ", " EEF FEE ", " EEF FEE ", " E F F E ", " E F F E ", " F F ", " F F ", " F F ", " F F ", " F F ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " AABAA EEEEEAA AAEEEEE AABAA ", " BBB EBBBBF FBBBBE BBB ", " BBB EBBBBA ABBBBE BBB ", " BBB EBBBBA ABBBBE BBB ", " BBB EBBBBA ABBBBE BBB ", " BBB EBBBBF FBBBBE BBB ", " AABAA EEEEEAA AAEEEEE AABAA ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E E ", " AABAA AEEEAA AAEEEA AABAA ", " BBB EBBBBF FBBBBE BBB ", " BBB EBBBBA ABBBBE BBB ", " BBB EBBBBA ABBBBE BBB ", " BBB EBBBBA ABBBBE BBB ", " BBB EBBBBF FBBBBE BBB ", " AABAA AEEEAA AAEEEA AABAA ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " AABAA AAEEEAA AAEEEAA AABAA ", " BBB BBBBF FBBBB BBB ", " BBB BBBBA ABBBB BBB ", " BBB BBBBA ABBBB BBB ", " BBB BBBBA ABBBB BBB ", " BBB BBBBF FBBBB BBB ", " AABAA AAEEEAA AAEEEAA AABAA ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E E ", " E E ", " E E ", " E E ", " AABAA AAEEEAA AAEEEAA AABAA ", " BBB BBBBF FBBBB BBB ", " BBB BBBBF FBBBB BBB ", " BBB BBBBF FBBBB BBB ", " BBB BBBBF FBBBB BBB ", " BBB BBBBF FBBBB BBB ", " AABAA AAEEEAA AAEEEAA AABAA ", " E E ", " E E ", " E E ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E E ", " AABAA AAEEEEAA AAEEEEAA AABAA ", " BBB BBBBE EBBBB BBB ", " BBB BBBBE EBBBB BBB ", " BBB BBBBE EBBBB BBB ", " BBB BBBBE EBBBB BBB ", " BBB BBBBE EBBBB BBB ", " AABAA AAEEEEAA AAEEEEAA AABAA ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BBBBB AAEEBAAAA AAAABEEAA BBBBB ", " BBB BBBBB BBBBB BBB ", " BBB BBBBB BBBBB BBB ", " BBB BBBBB BBBBB BBB ", " BBB BBBBB BBBBB BBB ", " BBB BBBBB BBBBB BBB ", " BBBBB AAEEBAAAA AAAABEEAA BBBBB ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BBBBB EAABBAAAA AAAABBAAE BBBBB ", " BBB EBBBBBB BBBBBBE BBB ", " BBB EBBBBBB BBBBBBE BBB ", " BBB EBBBBBB BBBBBBE BBB ", " BBB EBBBBBB BBBBBBE BBB ", " BBB EBBBBBB BBBBBBE BBB ", " BBBBB EAABBAAAA AAAABBAAE BBBBB ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BBBBB AAAABBAAAAA AAAAABBAAAA BBBBB ", " BBB BBBBBB BBBBBB BBB ", " BBB BBBBBB BBBBBB BBB ", " BBB BBBBBB BBBBBB BBB ", " BBB BBBBBB BBBBBB BBB ", " BBB BBBBBB BBBBBB BBB ", " BBBBB AAAABBAAAAA AAAAABBAAAA BBBBB ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BBBBB AAAABBAAAAAA AAAAAABBAAAA BBBBB ", " BBB BBBBBBB BBBBBBB BBB ", " BBB BBBBBBB BBBBBBB BBB ", " BBB BBBBBBB BBBBBBB BBB ", " BBB BBBBBBB BBBBBBB BBB ", " BBB BBBBBBB BBBBBBB BBB ", " BBBBB AAAABBAAAAAA AAAAAABBAAAA BBBBB ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BBBBB AAAABBBAAAAAAAA AAAAAAAABBBAAAA BBBBB ", " BBB BBBBBBBB BBBBBBBB BBB ", " BBB BBBBBBBB BBBBBBBB BBB ", " BBB BBBBBBBB BBBBBBBB BBB ", " BBB BBBBBBBB BBBBBBBB BBB ", " BBB BBBBBBBB BBBBBBBB BBB ", " BBBBB AAAABBBAAAAAAAA AAAAAAAABBBAAAA BBBBB ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BBBBB AAAAABBBAAAAAAAAAAAAAAAAAAAAAAABBBAAAAA BBBBB ", " BBB BBBBBBBBBBB BBBBBBBBBBB BBB ", " BBB BBBBBBBBBBB BBBBBBBBBBB BBB ", " BBB BBBBBBBBBBB BBBBBBBBBBB BBB ", " BBB BBBBBBBBBBB BBBBBBBBBBB BBB ", " BBB BBBBBBBBBBB BBBBBBBBBBB BBB ", " BBBBB AAAAABBBAAAAAAAAAAAAAAAAAAAAAAABBBAAAAA BBBBB ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BBBBB AAAAAABBBBBAAAAAAAAAAAAABBBBBAAAAAA BBBBB ", " BBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBB ", " BBB BBBBBBBBBBBBBCCCBBBBBBBBBBBBB BBB ", " BBB BBBBBBBBBBBBBCCCBBBBBBBBBBBBB BBB ", " BBB BBBBBBBBBBBBBCCCBBBBBBBBBBBBB BBB ", " BBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBB ", " BBBBB AAAAAABBBBBAAAAAAAAAAAAABBBBBAAAAAA BBBBB ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BBBBAA AAAAAAAABBBBBBBBBBBBBAAAAAAAA AABBBB ", " BBB BBBBBBBBBBBBBBBBBBBBBBB BBB ", " BBB BBBBBBBBBBCCCBBBBBBBBBB BBB ", " BBB BBBBBBBBBBCCCBBBBBBBBBB BBB ", " BBB BBBBBBBBBBCCCBBBBBBBBBB BBB ", " BBB BBBBBBBBBBBBBBBBBBBBBBB BBB ", " BBBBAA AAAAAAAABBBBBBBBBBBBBAAAAAAAA AABBBB ", " D ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BBBAAA AAAAAAAAAAAAAAAAAAAAAAA AAABBB ", " BBBB BBBBBBBBBBBBB BBBB ", " BBBB BBBBBCCCBBBBB BBBB ", " BBBB BBBBBCCCBBBBB BBBB ", " BBBB BBBBBCCCBBBBB BBBB ", " BBBB BBBBBBBBBBBBB BBBB ", " BBBAAA AAAAAAAAAAAAAAAAAAAAAAA AAABBB ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BBBBAA AAAAAAAAAAAAA AABBBB ", " BBBB BBBB ", " BBBB BBBB ", " BBBB BBBB ", " BBBB BBBB ", " BBBB BBBB ", " BBBBAA AAAAAAAAAAAAA AABBBB ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BAABAAA AAABAAB ", " BBBB BBBB ", " BBBB BBBB ", " BBBB BBBB ", " BBBB BBBB ", " BBBB BBBB ", " BAABAAA AAABAAB ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAABAAAA AAAABAAA ", " BBBB BBBB ", " BBBB BBBB ", " BBBB BBBB ", " BBBB BBBB ", " BBBB BBBB ", " AAABAAAA AAAABAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABBAAA AAABBAA ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " AABBAAA AAABBAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAABBAAA AAABBAAA ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " AAABBAAA AAABBAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAAABAAAA AAAABAAAA ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " AAAABAAAA AAAABAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAABBAAAAA AAAAABBAAA ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " AAABBAAAAA AAAAABBAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAABBAAAAA AAAAABBAAA ", " BBBBBBB BBBBBBB ", " BBBBBBB BBBBBBB ", " BBBBBBB BBBBBBB ", " BBBBBBB BBBBBBB ", " BBBBBBB BBBBBBB ", " AAABBAAAAA AAAAABBAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAAABBBAAAAA AAAAABBBAAAA ", " BBBBBBB BBBBBBB ", " BBBBBBB BBBBBBB ", " BBBBBBB BBBBBBB ", " BBBBBBB BBBBBBB ", " BBBBBBB BBBBBBB ", " AAAABBBAAAAA AAAAABBBAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAAAABBAAAAAAA AAAAAAABBAAAAA ", " BBBBBBBB BBBBBBBB ", " BBBBBBBB BBBBBBBB ", " BBBBBBBB BBBBBBBB ", " BBBBBBBB BBBBBBBB ", " BBBBBBBB BBBBBBBB ", " AAAAABBAAAAAAA AAAAAAABBAAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAAAABBBAAAAAAAAAA AAAAAAAAAABBBAAAAA ", " BBBBBBBBB BBBBBBBBB ", " BBBBBBBBB BBBBBBBBB ", " BBBBBBBBB BBBBBBBBB ", " BBBBBBBBB BBBBBBBBB ", " BBBBBBBBB BBBBBBBBB ", " AAAAABBBAAAAAAAAAA AAAAAAAAAABBBAAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAAAABBBBAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBAAAAA ", " BBBBBBBBBBBBB BBBBBBBBBBBBB ", " BBBBBBBBBBBBB BBBBBBBBBBBBB ", " BBBBBBBBBBBBB BBBBBBBBBBBBB ", " BBBBBBBBBBBBB BBBBBBBBBBBBB ", " BBBBBBBBBBBBB BBBBBBBBBBBBB ", " AAAAABBBBAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBAAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAAAAAABBBBBBAAAAAAAAAAAAAAABBBBBBAAAAAAA ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBCCCBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBCCCBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBCCCBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAAAABBBBBBAAAAAAAAAAAAAAABBBBBBAAAAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAAAAAAAAABBBBBBBBBBBBBBBAAAAAAAAAA ", " BBBBBBBBBBBBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBCCCBBBBBBBBBBBB ", " BBBBBBBBBBBBCCCBBBBBBBBBBBB ", " BBBBBBBBBBBBCCCBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAAAAAAABBBBBBBBBBBBBBBAAAAAAAAAA ", " D ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " BBBBBBCCCBBBBBB ", " BBBBBBCCCBBBBBB ", " BBBBBBCCCBBBBBB ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAAAAAAAAAAAAAA ", " ", " ", " ", " ", " ", " AAAAAAAAAAAAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + // spotless:on + .where(' ', any()) - .where("G", controller(blocks(definition.getBlock()))) - .where('F', blocks(CYCLOZINE_CHEMICALLY_REPELLING_CASING.get()) - .or(Predicates.abilities(PartAbility.EXPORT_ITEMS).setMaxGlobalLimited(16)) - .or(Predicates.abilities(PartAbility.EXPORT_FLUIDS).setMaxGlobalLimited(16)) - .or(Predicates.abilities(PartAbility.INPUT_ENERGY).setMaxGlobalLimited(2)) - .or(Predicates.abilities(PartAbility.INPUT_LASER).setMaxGlobalLimited(1)) - .or(Predicates.abilities(PartAbility.OUTPUT_LASER).setMaxGlobalLimited(1)) - .or(Predicates.abilities(PartAbility.IMPORT_FLUIDS).setMaxGlobalLimited(16)) - .or(Predicates.abilities(PartAbility.IMPORT_ITEMS).setMaxGlobalLimited(16))) - .where('C', blocks(MULTIPURPOSE_INTERSTELLAR_GRADE_CASING.get())) - .where('D', blocks(CASING_ATOMIC.get())) + .where("Q", controller(blocks(definition.getBlock()))) + .where('H', blocks(CYCLOZINE_CHEMICALLY_REPELLING_CASING.get())) + .where('G', blocks(CYCLOZINE_CHEMICALLY_REPELLING_CASING.get())) + .where('F', blocks(CYCLOZINE_CHEMICALLY_REPELLING_CASING.get())) + .where('C', blocks(ROYAL_ICHORIUM_CASING.get())) + .where('D', CosmicPredicates.stellarModuleSlot()) // Module controller anchor points - accepts air + // or formed stellar modules .where('B', blocks(MULTIPURPOSE_INTERSTELLAR_GRADE_CASING.get())) .where('E', blocks(ULTRA_POWERED_CASING.get())) .where('A', blocks(CASING_HIGH_TEMPERATURE_SMELTING.get())) diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/StellarSmeltingModule.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/StellarSmeltingModule.java new file mode 100644 index 000000000..cfa504933 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/StellarSmeltingModule.java @@ -0,0 +1,63 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.StellarBaseModule; +import com.ghostipedia.cosmiccore.common.data.recipe.CosmicRecipeModifiers; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.*; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.api.pattern.util.RelativeDirection.*; +import static com.gregtechceu.gtceu.common.data.GCYMBlocks.*; + +public class StellarSmeltingModule { + + public static final MultiblockMachineDefinition STELLAR_SMELTING_MODULE = REGISTRATE + .multiblock("stellar_smelting_module", StellarBaseModule::new) + .langValue("Ignition Complex : GRAND FORGE") + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.STELLAR_SMELTING) + .appearanceBlock(CASING_HIGH_TEMPERATURE_SMELTING) + .recipeModifiers(CosmicRecipeModifiers.STELLAR_MODULE_OVERCLOCK) + // spotless:off + .pattern(definition -> FactoryBlockPattern.start(RIGHT, BACK, UP) + .aisle(" AAAAA ", " ACCCCCA ", "AFCFFFCFA", "AFCFFFCFA", "AFCFFFCFA", " ACCCCCA ", " AAAAA ") + .aisle(" B B ", "DDDDDDDDD", "DDDDDDDDD", "GGGGGGGGG", "DDDDDDDDD", "DDDDDDDDD", " B B ") + .aisle(" B B ", "BCCCCCCCB", "GGGGGGGGG", "GGGGGGGGG", "GGGGGGGGG", "BCC CCB", " B B ") + .aisle(" B B ", "BCC CCB", "GGGBBBGGG", "GGGBBBGGG", "GGGBBBGGG", "BCC CCB", " B B ") + .aisle(" BBBBBBB ", "BCC B CCB", "GGGBBBGGG", "GGGBBBGGG", "GGGBBBGGG", "BCC B CCB", " BBBBBBB ") + .aisle(" B B ", "BCC CCB", "GGGBBBGGG", "GGGBBBGGG", "GGGBBBGGG", "BCC CCB", " B B ") + .aisle(" B B ", "BCCCCCCCB", "GGGGGGGGG", "GGGGGGGGG", "GGGGGGGGG", "BCC CCB", " B B ") + .aisle(" B B ", "DDDDDDDDD", "DDDDDDDDD", "GGGGGGGGG", "DDDDDDDDD", "DDDDDDDDD", " B B ") + .aisle(" AAAAA ", " AEEEEEA ", "AFEFFFEFA", "AFEFQFEFA", "AFEFFFEFA", " AEEEEEA ", " AAAAA ") + + .where(' ', any()) + .where('Q', controller(blocks(definition.getBlock()))) + .where('B', blocks(ROYAL_ICHORIUM_CASING.get())) // Shared ring blocks + .where('C', blocks(CYCLOZINE_CHEMICALLY_REPELLING_CASING.get()))// Shared ring blocks + .where('D', blocks(CASING_HIGH_TEMPERATURE_SMELTING.get())) // Shared ring blocks + .where('E', blocks(BOLTED_HEAVY_FRAME_CASING.get()) + .or(Predicates.abilities(PartAbility.EXPORT_ITEMS)) + .or(Predicates.abilities(PartAbility.EXPORT_FLUIDS)) + .or(Predicates.abilities(PartAbility.IMPORT_FLUIDS)) + .or(Predicates.abilities(PartAbility.IMPORT_ITEMS))) + .where('F', blocks(ULTRA_POWERED_CASING.get())) + .where('G', blocks(MULTIPURPOSE_INTERSTELLAR_GRADE_CASING.get()) + + ) + .where('A', blocks(SOMARUST_CASING.get())) + .build()) + // spotless:on + .workableCasingModel(GTCEu.id("block/casings/gcym/high_temperature_smelting_casing"), + GTCEu.id("block/overlay/machine/alloy_blast_smelter")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/VileFissionReactor.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/VileFissionReactor.java new file mode 100644 index 000000000..54b359b4e --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/VileFissionReactor.java @@ -0,0 +1,63 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.machine.part.CosmicPartAbility; +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTBlocks; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; + +import com.sammy.malum.registry.common.block.BlockRegistry; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.HIGH_TEMP_FISSION_CASING; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; + +public class VileFissionReactor { + + public final static MultiblockMachineDefinition VILE_FISSION_REACTOR = REGISTRATE + .multiblock("vile_fission", + WorkableElectricMultiblockMachine::new) + .langValue("§cFestering Fission Reactor") + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.VILE_FISSION) + .appearanceBlock(HIGH_TEMP_FISSION_CASING) + .partAppearance((controller, part, side) -> HIGH_TEMP_FISSION_CASING.getDefaultState()) + .recipeModifiers( + GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK_SUBTICK), + GTRecipeModifiers.BATCH_MODE) + // spotless:off + .pattern(definition -> FactoryBlockPattern.start() + .aisle("AAAAAAA", " AA AA ", " A A ", " ", " ", " A ", " A ", " ABA ", " A ", " A ", " ", " ", " A A ", " AA AA ", "AAAAAAA") + .aisle("AAAAAAA", "AABBBAA", "AABCBAA", " ABCBA ", " BCB ", " BBB ", " AAA ", " AA AA ", " AAA ", " BBB ", " BCB ", " ABCBA ", "AABCBAA", "AABBBAA", "AAAAAAA") + .aisle("AAAAAAA", "ABDDDBA", " BDDDB ", " BDDDB ", " BDDDB ", " BDDDB ", " AADAA ", "AAADAAA", " AADAA ", " BDDDB ", " BDDDB ", " BDDDB ", " BDDDB ", "ABDDDBA", "AAAAAAA") + .aisle("AAAAAAA", " BD DB ", " CD DC ", " CD DC ", " CD DC ", "ABD DBA", "AAD DAA", "B D D B", "AAD DAA", "ABD DBA", " CD DC ", " CD DC ", " CD DC ", " BD DB ", "AAAAAAA") + .aisle("AAAAAAA", "ABDDDBA", " BDDDB ", " BDDDB ", " BDDDB ", " BDDDB ", " AADAA ", "AAADAAA", " AADAA ", " BDDDB ", " BDDDB ", " BDDDB ", " BDDDB ", "ABDDDBA", "AAAAAAA") + .aisle("AAAAAAA", "AABBBAA", "AABCBAA", " ABCBA ", " BCB ", " BBB ", " AAA ", " AA AA ", " AAA ", " BBB ", " BCB ", " ABCBA ", "AABCBAA", "AABBBAA", "AAAAAAA") + .aisle("AAAQAAA", " AA AA ", " A A ", " ", " ", " A ", " A ", " ABA ", " A ", " A ", " ", " ", " A A ", " AA AA ", "AAAAAAA") + + .where(' ', any()) + .where('Q', controller(blocks(definition.getBlock()))) + .where('A', blocks(HIGH_TEMP_FISSION_CASING.get()) + .or(autoAbilities(CosmicRecipeTypes.VILE_FISSION)) + .or(abilities(PartAbility.INPUT_ENERGY).setMaxGlobalLimited(2,2)) + .or(abilities(CosmicPartAbility.IMPORT_EMBER).setMaxGlobalLimited(1,1)) + .or(abilities(PartAbility.MAINTENANCE).setExactLimit(1))) + .where('B', blocks(CosmicBlocks.HIGHLY_CONDUCTIVE_FISSION_CASING.get())) + .where('C', blocks(GTBlocks.CASING_LAMINATED_GLASS.get())) + .where('D', blocks(BlockRegistry.BLOCK_OF_LIVING_FLESH.get())) + .build()) + // spotless:on + .workableCasingModel(CosmicCore.id("block/casings/solid/high_temperature_fission_casing"), + CosmicCore.id("block/overlay/machine/roaster")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/VoidSaltReactor.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/VoidSaltReactor.java new file mode 100644 index 000000000..36c26b77e --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/VoidSaltReactor.java @@ -0,0 +1,60 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTBlocks; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; + +import com.sammy.malum.registry.common.block.BlockRegistry; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.HIGH_TEMP_FISSION_CASING; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; + +public class VoidSaltReactor { + + public final static MultiblockMachineDefinition VILE_FISSION_REACTOR = REGISTRATE + .multiblock("void_salt_fissiom", + WorkableElectricMultiblockMachine::new) + .langValue("§5Voidtouched Salt Fission Reactor") + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.VOID_SALT_FISSION) + .appearanceBlock(HIGH_TEMP_FISSION_CASING) + .partAppearance((controller, part, side) -> HIGH_TEMP_FISSION_CASING.getDefaultState()) + .recipeModifiers( + GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK_SUBTICK), + GTRecipeModifiers.BATCH_MODE) + // spotless:off + .pattern(definition -> FactoryBlockPattern.start() + .aisle("AA AA", "BA AB", "B B", "B B", "B B", "BA AB", "AA AA") + .aisle("AAAAA", "ACCCA", " CDC ", " CDC ", " CDC ", "ACCCA", "AAAAA") + .aisle(" AAA ", " CCC ", " DED ", " DED ", " DED ", " CCC ", " AAA ") + .aisle("AAAAA", "ACQCA", " CDC ", " CDC ", " CDC ", "ACCCA", "AAAAA") + .aisle("AA AA", "BA AB", "B B", "B B", "B B", "BA AB", "AA AA") + + .where(' ', any()) + .where('Q', controller(blocks(definition.getBlock()))) + .where('A', blocks(HIGH_TEMP_FISSION_CASING.get()) + .or(autoAbilities(CosmicRecipeTypes.VOID_SALT_FISSION)) + .or(abilities(PartAbility.INPUT_ENERGY).setMaxGlobalLimited(2,2)) + .or(abilities(PartAbility.MAINTENANCE).setExactLimit(1))) + .where('B', blocks(BlockRegistry.BLOCK_OF_SOULSTONE.get())) + .where('C', blocks(CosmicBlocks.HIGHLY_CONDUCTIVE_FISSION_CASING.get())) + .where('D', blocks(GTBlocks.CASING_LAMINATED_GLASS.get())) + .where('E', blocks(BlockRegistry.BLOCK_OF_VOID_SALTS.get())) + .build()) + // spotless:on + .workableCasingModel(CosmicCore.id("block/casings/solid/high_temperature_fission_casing"), + CosmicCore.id("block/overlay/machine/roaster")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/WASP.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/WASP.java new file mode 100644 index 000000000..ad3c377eb --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/WASP.java @@ -0,0 +1,170 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.common.data.recipe.CosmicRecipeModifiers; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; +import com.gregtechceu.gtceu.common.data.GCYMBlocks; +import com.gregtechceu.gtceu.common.data.GTMaterials; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.HIGHLY_FLEXIBLE_REINFORCED_TRINAVINE_CASING; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.api.pattern.util.RelativeDirection.*; + +public class WASP { + + public final static MultiblockMachineDefinition WASP = REGISTRATE + .multiblock("wasp", WorkableElectricMultiblockMachine::new) + .langValue("Wide Asteroid Separation Platform [WASP]") + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.WASP_RECIPES) + .recipeModifier(CosmicRecipeModifiers::asteroidYieldModifier) + .appearanceBlock(HIGHLY_FLEXIBLE_REINFORCED_TRINAVINE_CASING) + .partAppearance((controller, part, side) -> HIGHLY_FLEXIBLE_REINFORCED_TRINAVINE_CASING.getDefaultState()) + .pattern(definition -> FactoryBlockPattern.start() + // spotless: off + .aisle(" ", " ", " B B ", + " C C ", " ", " ", + " ", " ", " ", + " ", " C C ", " B B ", + " ", " ") + .aisle(" ", " ", " B C C B ", + " C C ", " ", " ", + " ", " ", " ", + " ", " C C ", " B C C B ", + " ", " ") + .aisle(" ", " ", " BBCBCBB ", + " C C ", " ", " ", + " ", " ", " ", + " ", " C C ", " BBCBCBB ", + " ", " ") + .aisle(" ", " ", " BCCCB ", + " CCC ", " ", " ", + " ", " ", " ", + " ", " CCC ", " BCCCB ", + " ", " ") + .aisle(" ", " ", " CCCBBCBBCCC ", + " DCD ", " D A ", " ", + " ", " ", " ", + " D D ", " DCD ", " CCCBBCBBCCC ", + " ", " ") + .aisle(" ", " BCB ", " CDDDDBCBDDDDC ", + " A C A ", " A A ", " ", + " ", " ", " ", + " A A ", " A C A ", " CDDDDBCBDDDDC ", + " BCB ", " ") + .aisle(" ", " DBBBCBBBD ", " CDD C DDC ", + " A A ", " A A ", " ", + " ", " ", " ", + " A A ", " A A ", " CDD C DDC ", + " DBBBCBBBD ", " ") + .aisle(" AABCBAA ", " DB BCB BD ", " CD DC ", + " ", " ", " ", + " ", " ", " ", + " ", " ", " CD DC ", + " DB BCB BD ", " AABCBAA ") + .aisle(" AAABCBAAA ", " B E C E B ", "BBB CD E E DC BBB", + " A E E A ", " A E E A ", " E E ", + " E E ", " E E ", " E E ", + " A E E A ", " A E E A ", "BBB CD E E DC BBB", + " B E C E B ", " AAABCBAAA ") + .aisle(" AAABCBAAA ", " B B ", " BBBD DBBB ", + " A ", " AAA ", " ABA ", + " B ", " B ", " ABA ", + " AAA ", " A ", " BBBD DBBB ", + " B B ", " AAABCBAAA ") + .aisle(" BBBBBBBBB ", " BBB AAA BBB ", " CCCBB AAA BBCCC ", + "CCCCD AAA DCCCC", " D AAAAA D ", " AAAAA ", + " AAA ", " AAA ", " AAAAA ", + " D AAAAA D ", "CCCCD AAA DCCCC", " CCCBB AAA BBCCC ", + " BBB AAA BBB ", " BBBBBBBBB ") + .aisle(" CCCBBBCCC ", " CCCC A A CCCC ", " BCCCC A A CCCCB ", + " CCC AA AA CCC ", " AA AA ", " BA AB ", + " BA AB ", " BA AB ", " BA AB ", + " AA AA ", " CCC AA AA CCC ", " BCCCC A A CCCCB ", + " CCCC A A CCCC ", " CCCBQBCCC ") + .aisle(" BBBBBBBBB ", " BBB AAA BBB ", " CCCBB AAA BBCCC ", + "CCCCD AAA DCCCC", " D AAAAA D ", " AAAAA ", + " AAA ", " AAA ", " AAAAA ", + " D AAAAA D ", "CCCCD AAA DCCCC", " CCCBB AAA BBCCC ", + " BBB AAA BBB ", " BBBBBBBBB ") + .aisle(" AAABCBAAA ", " B B ", " BBBD DBBB ", + " A ", " AAA ", " ABA ", + " B ", " B ", " ABA ", + " AAA ", " A ", " BBBD DBBB ", + " B B ", " AAABCBAAA ") + .aisle(" AAABCBAAA ", " B E C E B ", "BBB CD E E DC BBB", + " A E E A ", " A E E A ", " E E ", + " E E ", " E E ", " E E ", + " A E E A ", " A E E A ", "BBB CD E E DC BBB", + " B E C E B ", " AAABCBAAA ") + .aisle(" AABCBAA ", " DB BCB BD ", " CD DC ", + " ", " ", " ", + " ", " ", " ", + " ", " ", " CD DC ", + " DB BCB BD ", " AABCBAA ") + .aisle(" ", " DBBBCBBBD ", " CDD C DDC ", + " A A ", " A A ", " ", + " ", " ", " ", + " A A ", " A A ", " CDD C DDC ", + " DBBBCBBBD ", " ") + .aisle(" ", " BCB ", " CDDDDBCBDDDDC ", + " A C A ", " A A ", " ", + " ", " ", " ", + " A A ", " A C A ", " CDDDDBCBDDDDC ", + " BCB ", " ") + .aisle(" ", " ", " CCCBBCBBCCC ", + " DCD ", " D D ", " ", + " ", " ", " ", + " D D ", " DCD ", " CCCBBCBBCCC ", + " ", " ") + .aisle(" ", " ", " BCCCB ", + " CCC ", " ", " ", + " ", " ", " ", + " ", " CCC ", " BCCCB ", + " ", " ") + .aisle(" ", " ", " BBCBCBB ", + " C C ", " ", " ", + " ", " ", " ", + " ", " C C ", " BBCBCBB ", + " ", " ") + .aisle(" ", " ", " B C C B ", + " C C ", " ", " ", + " ", " ", " ", + " ", " C C ", " B C C B ", + " ", " ") + .aisle(" ", " ", " B B ", + " C C ", " ", " ", + " ", " ", " ", + " ", " C C ", " B B ", + " ", " ") + // spotless: on + .where(' ', any()) + .where("Q", controller(blocks(definition.getBlock()))) + .where('C', blocks(CosmicBlocks.HIGH_TOLERANCE_RHENIUM_CASING.get())) + .where('A', blocks(CosmicBlocks.HIGHLY_FLEXIBLE_REINFORCED_TRINAVINE_CASING.get()) + .or(Predicates.abilities(PartAbility.IMPORT_ITEMS).setMaxGlobalLimited(4)) + .or(Predicates.abilities(PartAbility.EXPORT_ITEMS).setMaxGlobalLimited(1)) + .or(Predicates.abilities(PartAbility.INPUT_ENERGY).setMinGlobalLimited(1) + .setMaxGlobalLimited(2)) + .or(Predicates.abilities(PartAbility.IMPORT_FLUIDS).setMinGlobalLimited(1, 1) + .setMaxGlobalLimited(3, 3))) + .where('E', frames(GTMaterials.Neutronium)) + .where('D', blocks(GCYMBlocks.CASING_HIGH_TEMPERATURE_SMELTING.get())) + .where('B', blocks(CosmicBlocks.NAQUADAH_PRESSURE_RESISTANT_CASING.get())) + .build()) + .workableCasingModel(CosmicCore.id("block/casings/solid/highly_flexible_reinforced_trinavine_casing"), + CosmicCore.id("block/multiblock/mantle_bore")) + .hasBER(true) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/AlchemicalFissionReactor.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/AlchemicalFissionReactor.java new file mode 100644 index 000000000..de1f0f0ea --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/AlchemicalFissionReactor.java @@ -0,0 +1,176 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic; + +import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.fluids.store.FluidStorageKeys; +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.TickableSubscription; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.transfer.fluid.FluidHandlerList; +import com.gregtechceu.gtceu.common.data.GTMaterials; +import com.gregtechceu.gtceu.utils.FormattingUtil; + +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; + +import net.minecraft.network.chat.Component; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.IFluidHandler; + +import it.unimi.dsi.fastutil.longs.Long2ObjectMap; +import it.unimi.dsi.fastutil.longs.Long2ObjectMaps; +import it.unimi.dsi.fastutil.objects.Object2IntMap; +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; +import lombok.Getter; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +public class AlchemicalFissionReactor extends WorkableElectricMultiblockMachine { + + // Base Heat capacity (maybe we make it so there's ways to raise this so there's more 'buffer' in each zone. tbd + // that sounds like block predicates lol) + @Getter + public static long HEAT_CAPACITY = 10_000L; + @Getter + public static long COOLANT_DELTA = 0; + @Getter + public static long HEATING_DELTA = 10; + + // Heat Band Max Ranges of Reactor Heat % (eg. Low is 0-33%) + public static final int LOW = 33; + public static final int MODERATE = 66; + public static final int HIGH = 100; + + @Getter + @DescSynced + @Persisted + public static long heat = 0; + + @Nullable + protected FluidHandlerList inputFluidHandlers; + + @Getter + @DescSynced + @Persisted + public static long heatCapacity = HEAT_CAPACITY; + + @Nullable + protected TickableSubscription fissionLogicSubs; + + @DescSynced + private static final Object2IntMap coolantTiers = new Object2IntOpenHashMap<>(); + + static { + coolantTiers.put(GTMaterials.Oxygen.getFluid(FluidStorageKeys.LIQUID, 1), 16); + coolantTiers.put(GTMaterials.Helium.getFluid(FluidStorageKeys.LIQUID, 1), 64); + } + + protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( + AlchemicalFissionReactor.class, + WorkableElectricMultiblockMachine.MANAGED_FIELD_HOLDER); + + public AlchemicalFissionReactor(IMachineBlockEntity holder, Object... args) { + super(holder, args); + } + + @Override + @NotNull + public ManagedFieldHolder getFieldHolder() { + return MANAGED_FIELD_HOLDER; + } + + @Override + public void onStructureFormed() { + super.onStructureFormed(); + // I don't even know if this works I copied my old code from like 2024 :) + + List inputFluidContainers = new ArrayList<>(); + Long2ObjectMap ioMap = getMultiblockState().getMatchContext().getOrCreate("ioMap", + Long2ObjectMaps::emptyMap); + for (IMultiPart part : getParts()) { + IO io = ioMap.getOrDefault(part.self().getPos().asLong(), IO.BOTH); + if (io == IO.NONE || io == IO.OUT) continue; + var handlerLists = part.getRecipeHandlers(); + for (var handlerList : handlerLists) { + if ((handlerList.getHandlerIO() != IO.IN)) continue; + handlerList.getCapability(FluidRecipeCapability.CAP).stream() + .filter(IFluidHandler.class::isInstance) + .map(IFluidHandler.class::cast) + .forEach(inputFluidContainers::add); + } + } + + this.inputFluidHandlers = new FluidHandlerList(inputFluidContainers); + updateFissionSubscription(); + } + + @Override + public void onStructureInvalid() { + super.onStructureInvalid(); + updateFissionSubscription(); + heat = 0; + } + + protected void updateFissionSubscription() { + if (this.isFormed) { + fissionLogicSubs = subscribeServerTick(fissionLogicSubs, this::updateHeat); + } else if (fissionLogicSubs != null) { + fissionLogicSubs.unsubscribe(); + fissionLogicSubs = null; + } + } + + // Main Heating Logic + public void updateHeat() { + if (recipeLogic.isWorking()) { + if (heat >= HEAT_CAPACITY) { + heat = HEAT_CAPACITY - HEATING_DELTA; + } + heat += HEATING_DELTA; + } else { + heat -= HEATING_DELTA; + if (heat <= 0) { + heat = 0; + } + } + } + + /* + * Get all coolant tanks + * get all valid coolants + * drain all valid coolants + * convert what was drained into cooling + * apply / return coolant delta for that tick + */ + public void setCoolantDelta() { + if (inputFluidHandlers != null) { + for (var handler : inputFluidHandlers.handlers) { + FluidStack coolant = handler.getFluidInTank(0); + } + var test = inputFluidHandlers.getFluidInTank(0); + } + } + + @Override + public boolean onWorking() { + return super.onWorking(); + } + + // Todo, coolant drain stuff. + private void processCoolant() {} + + @Override + public void addDisplayText(List textList) { + super.addDisplayText(textList); + if (isFormed) { + textList.add(Component.translatable("cosmiccore.multiblock.heat_value", + FormattingUtil.formatNumber2Places(heat))); + textList.add(Component.translatable("cosmiccore.multiblock.heat_capacity", + FormattingUtil.formatNumber2Places(getHeatCapacity()))); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/CosmicLargeTurbineMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/CosmicLargeTurbineMachine.java new file mode 100644 index 000000000..13570c492 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/CosmicLargeTurbineMachine.java @@ -0,0 +1,213 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic; + +import com.gregtechceu.gtceu.api.capability.ITurbineMachine; +import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IRotorHolderMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.content.ContentModifier; +import com.gregtechceu.gtceu.api.recipe.ingredient.EnergyStack; +import com.gregtechceu.gtceu.api.recipe.modifier.ModifierFunction; +import com.gregtechceu.gtceu.api.recipe.modifier.ParallelLogic; +import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; +import com.gregtechceu.gtceu.common.machine.multiblock.generator.LargeTurbineMachine; +import com.gregtechceu.gtceu.utils.FormattingUtil; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; + +import lombok.Getter; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class CosmicLargeTurbineMachine extends WorkableElectricMultiblockMachine + implements ITieredMachine, ITurbineMachine { + + public static final int MIN_DURABILITY_TO_WARN = 10; + + private final long BASE_EU_OUTPUT; + @Getter + private final int tier; + + public CosmicLargeTurbineMachine(IMachineBlockEntity holder, int tier) { + super(holder); + this.tier = tier; + this.BASE_EU_OUTPUT = 3072; + } + + @Nullable + private IRotorHolderMachine getRotorHolder() { + for (IMultiPart part : getParts()) { + if (part instanceof IRotorHolderMachine rotorHolder) { + return rotorHolder; + } + } + return null; + } + + @Override + public long getOverclockVoltage() { + var rotorHolder = getRotorHolder(); + if (rotorHolder != null && rotorHolder.hasRotor()) + return BASE_EU_OUTPUT * rotorHolder.getTotalPower() / 100; + return 0; + } + + /** + * @return EUt multiplier that should be applied to the turbine's output + */ + protected double productionBoost() { + var rotorHolder = getRotorHolder(); + if (rotorHolder != null && rotorHolder.hasRotor()) { + int maxSpeed = rotorHolder.getMaxRotorHolderSpeed(); + int currentSpeed = rotorHolder.getRotorSpeed(); + if (currentSpeed >= maxSpeed) return 1; + return Math.pow(1.0 * currentSpeed / maxSpeed, 2); + } + return 0; + } + + @Override + public boolean hasRotor() { + var rotorHolder = getRotorHolder(); + return rotorHolder != null && rotorHolder.hasRotor(); + } + + @Override + public int getRotorSpeed() { + var rotorHolder = getRotorHolder(); + if (rotorHolder != null && rotorHolder.hasRotor()) { + return rotorHolder.getRotorSpeed(); + } + return 0; + } + + @Override + public int getMaxRotorHolderSpeed() { + var rotorHolder = getRotorHolder(); + if (rotorHolder != null && rotorHolder.hasRotor()) { + return rotorHolder.getMaxRotorHolderSpeed(); + } + return 0; + } + + @Override + public int getTotalEfficiency() { + var rotorHolder = getRotorHolder(); + if (rotorHolder != null && rotorHolder.hasRotor()) { + return rotorHolder.getTotalEfficiency(); + } + return -1; + } + + @Override + public long getCurrentProduction() { + return isActive() && recipeLogic.getLastRecipe() != null ? + recipeLogic.getLastRecipe().getOutputEUt().voltage() : 0; + } + + @Override + public int getRotorDurabilityPercent() { + var rotorHolder = getRotorHolder(); + if (rotorHolder != null && rotorHolder.hasRotor()) { + return rotorHolder.getRotorDurabilityPercent(); + } + return -1; + } + + ////////////////////////////////////// + // ****** Recipe Logic *******// + ////////////////////////////////////// + /** + * Recipe Modifier for Large Turbine Multiblocks - can be used as a valid {@link RecipeModifier} + *

+ * Recipe is fast parallelized up to {@code (baseEUt * power) / recipeEUt} times. + * Duration is then multiplied by the holder efficiency. + *

+ * + * @param machine a {@link LargeTurbineMachine} + * @param recipe recipe + * @return A {@link ModifierFunction} for the given Turbine Multiblock and recipe + */ + public static ModifierFunction recipeModifier(@NotNull MetaMachine machine, @NotNull GTRecipe recipe) { + if (!(machine instanceof CosmicLargeTurbineMachine turbineMachine)) { + return RecipeModifier.nullWrongType(CosmicLargeTurbineMachine.class, machine); + } + + var rotorHolder = turbineMachine.getRotorHolder(); + if (rotorHolder == null) return ModifierFunction.NULL; + + EnergyStack EUt = recipe.getOutputEUt(); + long turbineMaxVoltage = turbineMachine.getOverclockVoltage(); + double holderEfficiency = rotorHolder.getTotalEfficiency() / 100.0; + + if (EUt.isEmpty() || turbineMaxVoltage <= EUt.voltage() || holderEfficiency <= 0) return ModifierFunction.NULL; + + // get the amount of parallel required to match the desired output voltage + int maxParallel = (int) (turbineMaxVoltage / EUt.getTotalEU()); + int actualParallel = ParallelLogic.getParallelAmountFast(turbineMachine, recipe, maxParallel); + double eutMultiplier = turbineMachine.productionBoost() * actualParallel; + + return ModifierFunction.builder() + .inputModifier(ContentModifier.multiplier(actualParallel)) + .outputModifier(ContentModifier.multiplier(actualParallel)) + .eutMultiplier(eutMultiplier) + .parallels(actualParallel) + .durationMultiplier(holderEfficiency) + .build(); + } + + @Override + public boolean regressWhenWaiting() { + return false; + } + + @Override + public boolean canVoidRecipeOutputs(RecipeCapability capability) { + return true; + } + + ////////////////////////////////////// + // ******* GUI ********// + ////////////////////////////////////// + + @Override + public void addDisplayText(List textList) { + super.addDisplayText(textList); + if (isFormed()) { + var rotorHolder = getRotorHolder(); + + if (rotorHolder != null && rotorHolder.getRotorEfficiency() > 0) { + textList.add(Component.translatable("gtceu.multiblock.turbine.rotor_speed", + FormattingUtil.formatNumbers(rotorHolder.getRotorSpeed()), + FormattingUtil.formatNumbers(rotorHolder.getMaxRotorHolderSpeed()))); + textList.add(Component.translatable("gtceu.multiblock.turbine.efficiency", + rotorHolder.getTotalEfficiency())); + + long maxProduction = getOverclockVoltage(); + long currentProduction = getCurrentProduction(); + + if (isActive()) { + textList.add(3, Component.translatable("gtceu.multiblock.turbine.energy_per_tick", + FormattingUtil.formatNumbers(currentProduction), + FormattingUtil.formatNumbers(maxProduction))); + } + + int rotorDurability = rotorHolder.getRotorDurabilityPercent(); + if (rotorDurability > MIN_DURABILITY_TO_WARN) { + textList.add(Component.translatable("gtceu.multiblock.turbine.rotor_durability", rotorDurability)); + } else { + textList.add(Component.translatable("gtceu.multiblock.turbine.rotor_durability", rotorDurability) + .setStyle(Style.EMPTY.withColor(ChatFormatting.RED))); + } + } + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/DivingBellMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/DivingBellMachine.java new file mode 100644 index 000000000..3643535e0 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/DivingBellMachine.java @@ -0,0 +1,215 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic; + +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.common.teleporter.LandingZoneHelper; +import com.ghostipedia.cosmiccore.common.teleporter.SafeTeleporter; +import com.ghostipedia.cosmiccore.common.teleporter.TeleportOriginCap; +import com.ghostipedia.cosmiccore.common.teleporter.TeleportPadRegistry; + +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.TickableSubscription; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; + +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.phys.AABB; + +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +/** + * Diving Bell Machine Controller + * + * Detects players standing directly on top of the controller block and teleports them to the Deep Below dimension. + * - Energy cost: 500,000 EU per teleport + * - Cooldown: 100 ticks (5 seconds) + * - Only teleports one player per activation + */ +public class DivingBellMachine extends WorkableElectricMultiblockMachine { + + protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( + DivingBellMachine.class, + WorkableElectricMultiblockMachine.MANAGED_FIELD_HOLDER); + + // Configuration values + private static final int TELEPORT_COST_EU = 500000; // 500k EU per teleport + private static final int COOLDOWN_TICKS = 100; // 5 seconds - idk just in case players try to abuse it. + + // Teleport destination settings + private static final String TARGET_DIMENSION = "frontiers:the_deep_below"; // Dimension to teleport to + private static final int DESTINATION_SEARCH_START_Y = 100; // Y level to start searching for safe ground + + // State + @Persisted + private int cooldownRemaining = 0; + + protected TickableSubscription tickSubscription; + + public DivingBellMachine(IMachineBlockEntity holder, Object... args) { + super(holder, args); + } + + @Override + @NotNull + public ManagedFieldHolder getFieldHolder() { + return MANAGED_FIELD_HOLDER; + } + + @Override + public void onStructureFormed() { + super.onStructureFormed(); + // Subscribe to server ticks when structure forms + tickSubscription = subscribeServerTick(tickSubscription, this::checkForPlayers); + } + + @Override + public void onStructureInvalid() { + super.onStructureInvalid(); + // Unsubscribe when structure breaks + if (tickSubscription != null) { + tickSubscription.unsubscribe(); + tickSubscription = null; + } + } + + // Tick handler that checks for players and teleports them. + private void checkForPlayers() { + // Decrement cooldown + if (cooldownRemaining > 0) { + cooldownRemaining--; + return; + } + + // Check if we have enough energy + if (!hasEnoughEnergy()) { + return; + } + + // Detect players on top platform + List players = getPlayersOnPlatform(); + if (players.isEmpty()) { + return; + } + + // Teleport first player only (one at a time) + ServerPlayer target = players.get(0); + if (teleportPlayerToDeepBelow(target)) { + // Consume energy and start cooldown + consumeEnergy(TELEPORT_COST_EU); + cooldownRemaining = COOLDOWN_TICKS; + } + } + + // Check if there is enough energy for a teleport. + private boolean hasEnoughEnergy() { + long available = energyContainer.getEnergyStored(); + return available >= TELEPORT_COST_EU; + } + + // Consume energy for teleportation. + private void consumeEnergy(long amount) { + energyContainer.removeEnergy(amount); + } + + // Get all players standing directly on top of the controller block. + private List getPlayersOnPlatform() { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return List.of(); + } + + // Detection zone is 1 block directly above the controller + BlockPos controllerPos = getPos(); + BlockPos detectionPos = controllerPos.above(1); + + // 1x1 detection area (requires players to stand on top of the controller) + AABB detectionZone = new AABB( + detectionPos, + detectionPos.offset(1, 1, 1)); + + return serverLevel.getEntitiesOfClass(ServerPlayer.class, detectionZone); + } + + // Teleport a player to the Deep Below dimension. + private boolean teleportPlayerToDeepBelow(ServerPlayer player) { + if (!(getLevel() instanceof ServerLevel currentLevel)) { + return false; + } + + // Save origin data to player capability + player.getCapability(TeleportOriginCap.CAP).ifPresent(cap -> { + cap.setOriginDimension(currentLevel.dimension()); + cap.setOriginPosition(player.position()); + cap.setOriginRotation(player.getYRot(), player.getXRot()); + }); + + // Get Deep Below dimension + ResourceKey targetDim = getTargetDimension(); + ServerLevel deepBelow = player.server.getLevel(targetDim); + + if (deepBelow == null) { + player.displayClientMessage( + Component.translatable("cosmiccore.divingbell.dimension_missing"), true); + return false; + } + + // Find or create safe landing + BlockPos landingPos = getOrCreateSafeLanding(deepBelow, player); + + // Teleport (SafeTeleporter handles safety effects) + player.changeDimension(deepBelow, new SafeTeleporter(landingPos)); + + // Success message + player.displayClientMessage( + Component.translatable("cosmiccore.divingbell.descended"), true); + + return true; + } + + // Get the target dimension (Deep Below). + private ResourceKey getTargetDimension() { + ResourceLocation dimLoc = new ResourceLocation(TARGET_DIMENSION); + return ResourceKey.create(net.minecraft.core.registries.Registries.DIMENSION, dimLoc); + } + + // Find or create a safe landing platform in the Deep Below. + private BlockPos getOrCreateSafeLanding(ServerLevel deepBelow, ServerPlayer player) { + TeleportPadRegistry registry = TeleportPadRegistry.get(deepBelow); + + // Landing pad uses same X/Z as player's current position (vertical teleport) + BlockPos currentPos = player.blockPosition(); + int targetX = currentPos.getX(); + int targetZ = currentPos.getZ(); + + // Find safe Y level for this X/Z position + BlockPos safePos = LandingZoneHelper.findSafeYLevel(deepBelow, targetX, targetZ, DESTINATION_SEARCH_START_Y); + + // Check if escape pad already exists at this position + if (registry.hasPadAt(safePos) && + LandingZoneHelper.isPadIntact(deepBelow, safePos, CosmicBlocks.DIVING_BELL_ESCAPE_PAD.get())) { + // Reuse existing pad + return safePos; + } + + // Need to create new platform + LandingZoneHelper.buildPlatform(deepBelow, safePos, new LandingZoneHelper.PlatformOptions( + Blocks.STONE, + CosmicBlocks.DIVING_BELL_ESCAPE_PAD.get(), + 1 // 3x3 platform + )); + + // Register in saved data + registry.registerPad(safePos); + + return safePos; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/ExoticCombustionEngineMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/ExoticCombustionEngineMachine.java index e56653f60..08933e7c0 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/ExoticCombustionEngineMachine.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/ExoticCombustionEngineMachine.java @@ -3,9 +3,7 @@ import com.ghostipedia.cosmiccore.common.data.materials.CosmicMaterials; import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.capability.recipe.IRecipeHandler; import com.gregtechceu.gtceu.api.fluids.store.FluidStorageKeys; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.fancy.IFancyTooltip; @@ -23,6 +21,7 @@ import com.gregtechceu.gtceu.api.recipe.modifier.ParallelLogic; import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; import com.gregtechceu.gtceu.common.data.GTMaterials; +import com.gregtechceu.gtceu.data.recipe.builder.GTRecipeBuilder; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTMath; import com.gregtechceu.gtceu.utils.GTUtil; @@ -32,7 +31,6 @@ import net.minecraft.ChatFormatting; import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Style; import net.minecraftforge.fluids.FluidStack; @@ -40,7 +38,6 @@ import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import lombok.Getter; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.*; @@ -54,30 +51,58 @@ public class ExoticCombustionEngineMachine extends WorkableElectricMultiblockMac protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( ExoticCombustionEngineMachine.class, WorkableMultiblockMachine.MANAGED_FIELD_HOLDER); - // TODO: CosmicCore Lubricants for efficiency bonus - - private FluidStack currentLubricant; - private FluidStack currentBooster; + private String currentLubricant; + private String currentBooster; @Getter private final int tier; // Probably a bad idea, most likely a better way to do this + @Getter @DescSynced private static final Object2IntMap lubricantTiers = new Object2IntOpenHashMap<>(); + @Getter @DescSynced private static final Object2IntMap boostingTiers = new Object2IntOpenHashMap<>(); - private int runningTimer = 0; + static { // Boosting Tiers - boostingTiers.put(GTMaterials.Oxygen.getFluid(1), 1); - boostingTiers.put(GTMaterials.Oxygen.getFluid(FluidStorageKeys.LIQUID, 1), 2); - boostingTiers.put(CosmicMaterials.Ichor.getFluid(1), 3); + boostRecipes = new ArrayList<>(); + addBooster(CosmicMaterials.Ichor.getFluid(1), 3, 2); + addBooster(GTMaterials.Oxygen.getFluid(FluidStorageKeys.LIQUID, 1), 2, 1); + addBooster(GTMaterials.Oxygen.getFluid(1), 1, 1); // Lubricant Tiers - lubricantTiers.put(GTMaterials.Lubricant.getFluid(1), 2); - lubricantTiers.put(CosmicMaterials.Triphenylphosphine.getFluid(FluidStorageKeys.LIQUID, 1), 3); - lubricantTiers.put(CosmicMaterials.TearsOfTheUniverse.getFluid(FluidStorageKeys.LIQUID, 1), 4); + lubricantRecipes = new ArrayList<>(); + addLube(CosmicMaterials.TearsOfTheUniverse.getFluid(FluidStorageKeys.LIQUID, 1), 4, 288); + addLube(CosmicMaterials.Triphenylphosphine.getFluid(FluidStorageKeys.LIQUID, 1), 3, 144); + addLube(GTMaterials.Lubricant.getFluid(1), 2, 72); } + static List lubricantRecipes; + static List boostRecipes; + static final String LUBRICATION_KEY = "lubrication"; + static final String BOOST_KEY = "boost"; + static final String DURATION_KEY = "duration"; + + static void addLube(FluidStack lube, int lubrication, int duration) { + lubricantRecipes.add(GTRecipeBuilder.ofRaw() + .inputFluids(lube) + .addData(LUBRICATION_KEY, lubrication) + .addData(DURATION_KEY, duration) + .buildRawRecipe()); + } + + static void addBooster(FluidStack booster, int boost, int duration) { + boostRecipes.add(GTRecipeBuilder.ofRaw() + .inputFluids(booster) + .addData(BOOST_KEY, boost) + .addData(DURATION_KEY, duration) + .buildRawRecipe()); + } + + private int runningTimer = 0; + private int boostAmount = 0, boostDuration = 0; + private int lubeDuration = 0; + public ExoticCombustionEngineMachine(IMachineBlockEntity holder, int tier) { super(holder); this.tier = tier; @@ -85,13 +110,17 @@ public ExoticCombustionEngineMachine(IMachineBlockEntity holder, int tier) { private boolean isIntakesObstructed() { var dir = this.getFrontFacing(); - boolean mutableXZ = dir.getAxis() == Direction.Axis.Z; + var axis = dir.getAxis(); var centerPos = this.getPos().relative(dir); for (int x = -1; x < 2; x++) { for (int y = -1; y < 2; y++) { if (x == 0 && y == 0) continue; - var blockPos = centerPos.offset(mutableXZ ? x : 0, y, mutableXZ ? 0 : x); + var blockPos = switch (axis) { + case X -> centerPos.offset(0, x, y); + case Y -> centerPos.offset(x, 0, y); + case Z -> centerPos.offset(x, y, 0); + }; var blockState = this.getLevel().getBlockState(blockPos); if (!blockState.isAir()) return true; @@ -105,7 +134,7 @@ public long getOverclockVoltage() { return GTValues.V[tier]; } - public static ModifierFunction recipeModifier(@NotNull MetaMachine machine, @NotNull GTRecipe recipe) { + public static ModifierFunction recipeModifier(MetaMachine machine, GTRecipe recipe) { if (!(machine instanceof ExoticCombustionEngineMachine engineMachine)) { return RecipeModifier.nullWrongType(ExoticCombustionEngineMachine.class, machine); } @@ -113,45 +142,23 @@ public static ModifierFunction recipeModifier(@NotNull MetaMachine machine, @Not if (EUt * recipe.duration < 720) { return ModifierFunction.NULL; } - var fluidHolders = Objects - .requireNonNullElseGet(engineMachine.getCapabilitiesFlat(IO.IN, FluidRecipeCapability.CAP), - Collections::>emptyList) - .stream() - .map(container -> container.getContents().stream().filter(FluidStack.class::isInstance) - .map(FluidStack.class::cast).toList()) - .filter(container -> !container.isEmpty()) - .toList(); - - for (var fluidHolder : fluidHolders) { - for (var fluidStack : fluidHolder) { - if (boostingTiers.containsKey(fluidStack)) { - if (engineMachine.currentBooster == null || engineMachine.currentBooster.isEmpty() || - boostingTiers.getInt(fluidStack) > boostingTiers.getInt(engineMachine.currentBooster)) { - engineMachine.currentBooster = fluidStack; - } - } else if (lubricantTiers.containsKey(fluidStack)) { - if (engineMachine.currentLubricant == null || engineMachine.currentLubricant.isEmpty() || - lubricantTiers.getInt(fluidStack) > lubricantTiers.getInt(engineMachine.currentLubricant)) { - engineMachine.currentLubricant = fluidStack; - } - } - } - } + + Optional lubeRecipe = lubricantRecipes.stream().filter( + lr -> RecipeHelper.matchRecipe(engineMachine, lr).isSuccess()).findFirst(); // Has a variant of lubricant - if (EUt > 0 && !engineMachine.isIntakesObstructed() && engineMachine.currentLubricant != null && - !engineMachine.currentLubricant.isEmpty()) { + if (EUt > 0 && !engineMachine.isIntakesObstructed() && lubeRecipe.isPresent()) { int maxParallel = (int) (engineMachine.getOverclockVoltage() / EUt); int actualParallel = ParallelLogic.getParallelAmount(engineMachine, recipe, maxParallel); - int tier = lubricantTiers.getInt(engineMachine.currentLubricant); - float durationModifier = (lubricantTiers.getInt(engineMachine.currentLubricant) / 2.0F); - double eutMultiplier = 1; + int tier = lubeRecipe.get().data.getInt(LUBRICATION_KEY); + float durationModifier = (tier / 2.0F); + double eutMultiplier; int consumptionMult = 1; - if (engineMachine.currentBooster == null || engineMachine.currentBooster.isEmpty()) { + if (engineMachine.boostAmount == 0) { eutMultiplier = actualParallel; } else { - consumptionMult = boostingTiers.getInt(engineMachine.currentBooster) * 2; - eutMultiplier = actualParallel * (boostingTiers.getInt(engineMachine.currentBooster) * 3); + consumptionMult = engineMachine.boostAmount * 2; + eutMultiplier = actualParallel * engineMachine.boostAmount * 3; } return ModifierFunction.builder() @@ -178,53 +185,41 @@ public boolean onWorking() { } } - if (currentBooster != null && !currentBooster.isEmpty()) { - int consumptionRate = -1; - int tickCycle = -1; - if (currentBooster.isFluidEqual(GTMaterials.Oxygen.getFluid(1))) { - consumptionRate = 1; - tickCycle = 1; - } else if (currentBooster.isFluidEqual(GTMaterials.Oxygen.getFluid(FluidStorageKeys.LIQUID, 1))) { - consumptionRate = 4; - tickCycle = 1; - } else if (currentBooster.isFluidEqual(CosmicMaterials.Ichor.getFluid(1))) { - tickCycle = 2; - consumptionRate = 1; - } - if (tickCycle != -1 && runningTimer % tickCycle == 0) { - if (consumptionRate != -1 && currentBooster.getAmount() >= consumptionRate) { - currentBooster.shrink(consumptionRate); + + if (lubeDuration <= 0) { + for (GTRecipe lubeRecipe : lubricantRecipes) { + if (RecipeHelper.matchRecipe(this, lubeRecipe).isSuccess() && + RecipeHelper.handleRecipeIO(this, lubeRecipe, IO.IN, getRecipeLogic().getChanceCaches()) + .isSuccess()) { + lubeDuration = lubeRecipe.data.getInt(DURATION_KEY); + currentLubricant = RecipeHelper.getInputFluids(lubeRecipe).get(0).getTranslationKey(); + break; } } + // no lubricant matched + if (lubeDuration == 0) { + recipeLogic.interruptRecipe(); + return false; + } } - // Currently all lubricants are the same, however this may change, so assume this is left this way intentionally - // (Anyone else who reads this) - if (currentLubricant != null && !currentLubricant.isEmpty()) { - int consumptionRate = -1; - int tickCycle = -1; - if (currentLubricant.containsFluid(GTMaterials.Lubricant.getFluid(1))) { - tickCycle = 72; - consumptionRate = 1; // 1000/hr - } else if (currentLubricant - .containsFluid(CosmicMaterials.Triphenylphosphine.getFluid(FluidStorageKeys.LIQUID, 1))) { - tickCycle = 144; - consumptionRate = 1; // 500/hr - } else - if (currentLubricant.containsFluid( - CosmicMaterials.TearsOfTheUniverse.getFluid(FluidStorageKeys.LIQUID, 1))) { - tickCycle = 288; - consumptionRate = 1; // 250/hr - } - if (tickCycle != -1 && runningTimer % tickCycle == 0) { - if (consumptionRate != -1 && currentLubricant.getAmount() >= consumptionRate) { - currentLubricant.shrink(consumptionRate); - } else { - recipeLogic.interruptRecipe(); + lubeDuration--; + + if (boostDuration <= 0) { + boostDuration = 1; + boostAmount = 0; + for (GTRecipe boostRecipe : boostRecipes) { + if (RecipeHelper.matchRecipe(this, boostRecipe).isSuccess() && + RecipeHelper.handleRecipeIO(this, boostRecipe, IO.IN, getRecipeLogic().getChanceCaches()) + .isSuccess()) { + boostAmount = boostRecipe.data.getInt(BOOST_KEY); + boostDuration = boostRecipe.data.getInt(DURATION_KEY); + currentBooster = RecipeHelper.getInputFluids(boostRecipe).get(0).getTranslationKey(); + break; } } - } else if (currentLubricant != null) { - recipeLogic.interruptRecipe(); } + boostDuration--; + runningTimer++; if (runningTimer > 72000) runningTimer %= 72000; @@ -241,7 +236,7 @@ public void addDisplayText(List textList) { MultiblockDisplayText.Builder builder = MultiblockDisplayText.builder(textList, isFormed()) .setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()); var voltageName = Component.literal(GTValues.VNF[GTUtil.getFloorTierByVoltage(getOverclockVoltage())]); - var amperageName = currentBooster != null ? boostingTiers.getInt(currentBooster) * 3 : 1; + var amperageName = boostAmount != 0 ? boostAmount * 3 : boostAmount; if (recipeLogic.isSuspend() && !recipeLogic.getFancyTooltip().isEmpty()) { builder.addCustom(t -> t.add(recipeLogic.getFancyTooltip().get(0))); return; @@ -259,14 +254,14 @@ public void addDisplayText(List textList) { if (isFormed && currentBooster != null) { builder.addCustom(tl -> tl.add(Component .translatable("cosmiccore.multiblock.booster_used", - Component.translatable(currentBooster.getTranslationKey())) + Component.translatable(currentBooster)) .withStyle(ChatFormatting.AQUA))); } if (isFormed && currentLubricant != null) { builder.addCustom(tl -> tl.add(Component .translatable("cosmiccore.multiblock.lubricant_used", - Component.translatable(currentLubricant.getTranslationKey())) + Component.translatable(currentLubricant)) .withStyle(ChatFormatting.YELLOW))); } @@ -279,6 +274,7 @@ public String getRecipeFluidInputInfo() { GTRecipe recipe = recipeLogic.getLastRecipe(); if (recipe == null) { Iterator iterator = recipeLogic.searchRecipe(); + // noinspection ConstantValue recipe = iterator != null && iterator.hasNext() ? iterator.next() : null; if (recipe == null) return null; } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/LarvaMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/LarvaMachine.java new file mode 100644 index 000000000..4cc9df150 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/LarvaMachine.java @@ -0,0 +1,476 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.CosmicItems; +import com.ghostipedia.cosmiccore.common.data.materials.CosmicMaterials; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; +import com.gregtechceu.gtceu.api.data.tag.TagPrefix; +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.common.data.GTMaterials; +import com.gregtechceu.gtceu.common.machine.multiblock.part.ItemBusPartMachine; +import com.gregtechceu.gtceu.data.recipe.builder.GTRecipeBuilder; + +import net.minecraft.data.recipes.FinishedRecipe; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.Blocks; +import net.minecraftforge.fluids.FluidStack; + +import com.mojang.datafixers.util.Pair; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; + +import static com.gregtechceu.gtceu.common.data.GTRecipeTypes.SCANNER_RECIPES; +import static com.gregtechceu.gtceu.common.item.IntCircuitBehaviour.getCircuitConfiguration; + +public class LarvaMachine extends WorkableElectricMultiblockMachine { + + private static ItemStack getNamedPaper(String name) { + ItemStack stack = new ItemStack(Items.PAPER); + stack.setHoverName(Component.literal(name)); + return stack; + } + + public LarvaMachine(IMachineBlockEntity holder, Object... args) { + super(holder, args); + } + + public static String ASTROID_NBT_TYPE = "AsteroidType"; + public static String ASTROID_NBT_TIER = "Tier"; + public static String ASTEROID_SIZE = "Size"; + + private static Map> LARVA_LOOTTABLE = null; + private static Map LARVA_TIERS = null; + private static Map> LARVA_INPUTS = null; + private static Map RESEARCH_RECIPES = null; + + public static int getAsteroidSize(ItemStack stack) { + if (stack.isEmpty() || !stack.hasTag()) return 0; + return stack.getOrCreateTag().getInt(ASTEROID_SIZE); + } + + private static ItemStack setAsteroidSize(ItemStack stack, int size) { + if (stack.isEmpty()) return stack; + stack.getOrCreateTag().putInt(ASTEROID_SIZE, size); + return stack; + } + + public static ItemStack getAstroidDataChip(String id, int tier) { + ItemStack stack = CosmicItems.TARGETING_CHIP.asStack(); + stack.getOrCreateTag().putString(ASTROID_NBT_TYPE, id); + stack.getOrCreateTag().putInt(ASTROID_NBT_TIER, tier); + return stack; + } + + // This gets called from our CosmicRecipes class, not anywhere here. Put here to centralize recipe creation. + public static void generateTargettingChipRecipes(Consumer provider) { + SCANNER_RECIPES.recipeBuilder(CosmicCore.id("carbonic_asteroid")) + .inputItems(new ItemStack(Blocks.IRON_ORE.asItem(), 1)) + .inputItems(CosmicItems.TARGETING_CHIP.asStack()) + .outputItems(getAstroidDataChip("carbonic_asteroid", 1)) + .duration(40) + .EUt(GTValues.VA[GTValues.HV]) + .save(provider); + SCANNER_RECIPES.recipeBuilder(CosmicCore.id("ferric_asteroid")) + .inputItems(new ItemStack(Blocks.IRON_ORE.asItem(), 1)) + .inputItems(CosmicItems.TARGETING_CHIP.asStack()) + .outputItems(getAstroidDataChip("ferric_asteroid", 1)) + .duration(40) + .EUt(GTValues.VA[GTValues.HV]) + .save(provider); + + SCANNER_RECIPES.recipeBuilder(CosmicCore.id("rare_metal_asteroid")) + .inputItems(TagPrefix.rawOre, GTMaterials.Cooperite) + .inputItems(CosmicItems.TARGETING_CHIP.asStack()) + .outputItems(getAstroidDataChip("rare_metal_asteroid", 1)) + .duration(40) + .EUt(GTValues.VA[GTValues.HV]) + .save(provider); + SCANNER_RECIPES.recipeBuilder(CosmicCore.id("auric_asteroid")) + .inputItems(TagPrefix.rawOre, GTMaterials.Gold) + .inputItems(CosmicItems.TARGETING_CHIP.asStack()) + .outputItems(getAstroidDataChip("auric_asteroid", 1)) + .duration(40) + .EUt(GTValues.VA[GTValues.HV]) + .save(provider); + SCANNER_RECIPES.recipeBuilder(CosmicCore.id("brimstone_asteroid")) + .inputItems(TagPrefix.dust, GTMaterials.Netherrack) + .inputItems(CosmicItems.TARGETING_CHIP.asStack()) + .outputItems(getAstroidDataChip("brimstone_asteroid", 1)) + .duration(40) + .EUt(GTValues.VA[GTValues.HV]) + .save(provider); + SCANNER_RECIPES.recipeBuilder(CosmicCore.id("lith_asteroid")) + .inputItems(TagPrefix.rawOre, GTMaterials.CertusQuartz) + .inputItems(CosmicItems.TARGETING_CHIP.asStack()) + .outputItems(getAstroidDataChip("lith_asteroid", 1)) + .duration(40) + .EUt(GTValues.VA[GTValues.HV]) + .save(provider); + SCANNER_RECIPES.recipeBuilder(CosmicCore.id("mafic_asteroid")) + .inputItems(TagPrefix.rawOre, GTMaterials.Tungstate) + .inputItems(CosmicItems.TARGETING_CHIP.asStack()) + .outputItems(getAstroidDataChip("mafic_asteroid", 1)) + .duration(40) + .EUt(GTValues.VA[GTValues.HV]) + .save(provider); + SCANNER_RECIPES.recipeBuilder(CosmicCore.id("mossy_asteroid")) + .inputItems(TagPrefix.rawOre, GTMaterials.Emerald) + .inputItems(CosmicItems.TARGETING_CHIP.asStack()) + .outputItems(getAstroidDataChip("mossy_asteroid", 1)) + .duration(40) + .EUt(GTValues.VA[GTValues.HV]) + .save(provider); + SCANNER_RECIPES.recipeBuilder(CosmicCore.id("occult_asteroid")) + .inputItems(TagPrefix.rawOre, GTMaterials.Alunite) + .inputItems(CosmicItems.TARGETING_CHIP.asStack()) + .outputItems(getAstroidDataChip("occult_asteroid", 1)) + .duration(40) + .EUt(GTValues.VA[GTValues.HV]) + .save(provider); + SCANNER_RECIPES.recipeBuilder(CosmicCore.id("oxide_asteroid")) + .inputFluids(GTMaterials.Ice, 1000) + .inputItems(CosmicItems.TARGETING_CHIP.asStack()) + .outputItems(getAstroidDataChip("oxide_asteroid", 1)) + .duration(40) + .EUt(GTValues.VA[GTValues.HV]) + .save(provider); + SCANNER_RECIPES.recipeBuilder(CosmicCore.id("sanguine_asteroid")) + .inputItems(TagPrefix.rawOre, CosmicMaterials.Moondrop) + .inputItems(CosmicItems.TARGETING_CHIP.asStack()) + .outputItems(getAstroidDataChip("sanguine_asteroid", 1)) + .duration(40) + .EUt(GTValues.VA[GTValues.HV]) + .save(provider); + SCANNER_RECIPES.recipeBuilder(CosmicCore.id("wasteland_asteroid")) + .inputItems(TagPrefix.rawOre, CosmicMaterials.PaleOreBad) + .inputItems(CosmicItems.TARGETING_CHIP.asStack()) + .outputItems(getAstroidDataChip("wasteland_asteroid", 1)) + .duration(40) + .EUt(GTValues.VA[GTValues.HV]) + .save(provider); + } + + private static Map> getLarvaLoottable() { + if (LARVA_LOOTTABLE == null) { + LARVA_LOOTTABLE = new HashMap<>(); + // spotless: off + // Beetle Data Orb (NC) -> Tier (0-based)-> -> Astroid + LARVA_LOOTTABLE.put(getAstroidDataChip("carbonic_asteroid", 1), + Pair.of(0, CosmicItems.CARBON_ASTEROID.asStack())); + LARVA_LOOTTABLE.put(getAstroidDataChip("ferric_asteroid", 1), + Pair.of(0, CosmicItems.FERRIC_ASTEROID.asStack())); + LARVA_LOOTTABLE.put(getAstroidDataChip("rare_metal_asteroid", 1), + Pair.of(0, CosmicItems.RARE_METAL_ASTEROID.asStack())); + LARVA_LOOTTABLE.put(getAstroidDataChip("auric_asteroid", 1), + Pair.of(0, CosmicItems.AURIC_ASTEROID.asStack())); + LARVA_LOOTTABLE.put(getAstroidDataChip("brimstone_asteroid", 1), + Pair.of(0, CosmicItems.BRIMSTONE_ASTEROID.asStack())); + LARVA_LOOTTABLE.put(getAstroidDataChip("lith_asteroid", 1), + Pair.of(0, CosmicItems.LITH_ASTEROID.asStack())); + LARVA_LOOTTABLE.put(getAstroidDataChip("mafic_asteroid", 1), + Pair.of(0, CosmicItems.MAFIC_ASTEROID.asStack())); + LARVA_LOOTTABLE.put(getAstroidDataChip("mossy_asteroid", 1), + Pair.of(0, CosmicItems.MOSSY_ASTEROID.asStack())); + LARVA_LOOTTABLE.put(getAstroidDataChip("occult_asteroid", 1), + Pair.of(0, CosmicItems.OCCULT_ASTEROID.asStack())); + LARVA_LOOTTABLE.put(getAstroidDataChip("oxide_asteroid", 1), + Pair.of(0, CosmicItems.OXIDE_ASTEROID.asStack())); + LARVA_LOOTTABLE.put(getAstroidDataChip("sanguine_asteroid", 1), + Pair.of(0, CosmicItems.SANGUINE_ASTEROID.asStack())); + LARVA_LOOTTABLE.put(getAstroidDataChip("wasteland_asteroid", 1), + Pair.of(0, CosmicItems.WASTELAND_ASTEROID.asStack())); + // spotless: on + } + return LARVA_LOOTTABLE; + } + + private static Map getLarvaTiers() { + if (LARVA_TIERS == null) { + LARVA_TIERS = new HashMap<>(); + LARVA_TIERS.put(CosmicItems.HAULER_PROBE_GRADE_1.asStack(), 0); + LARVA_TIERS.put(CosmicItems.HAULER_PROBE_GRADE_2.asStack(), 1); + LARVA_TIERS.put(CosmicItems.HAULER_PROBE_GRADE_3.asStack(), 2); + LARVA_TIERS.put(CosmicItems.HAULER_PROBE_GRADE_4.asStack(), 3); + LARVA_TIERS.put(CosmicItems.HAULER_PROBE_GRADE_5.asStack(), 4); + } + return LARVA_TIERS; + } + + private static Map> getLarvaInputs() { + if (LARVA_INPUTS == null) { + LARVA_INPUTS = new HashMap<>(); + LARVA_INPUTS.put(0, Pair.of(CosmicItems.TUNGSTENSTEEL_NANOLATTICE_SPOOL.asStack(4), + GTMaterials.RocketFuel.getFluid(8000))); + LARVA_INPUTS.put(1, Pair.of(CosmicItems.TUNGSTENSTEEL_NANOLATTICE_SPOOL.asStack(16), + GTMaterials.RocketFuel.getFluid(16000))); + LARVA_INPUTS.put(2, Pair.of(CosmicItems.TUNGSTENSTEEL_NANOLATTICE_SPOOL.asStack(64), + GTMaterials.RocketFuel.getFluid(64000))); + LARVA_INPUTS.put(3, Pair.of(CosmicItems.TUNGSTENSTEEL_NANOLATTICE_SPOOL.asStack(256), + GTMaterials.RocketFuel.getFluid(256000))); + LARVA_INPUTS.put(4, Pair.of(CosmicItems.TUNGSTENSTEEL_NANOLATTICE_SPOOL.asStack(1024), + GTMaterials.RocketFuel.getFluid(1024000))); + } + return LARVA_INPUTS; + } + + @Override + protected @NotNull RecipeLogic createRecipeLogic(Object @NotNull... args) { + return new LarvaRecipeLogic(this); + } + + public static class LarvaRecipeLogic extends RecipeLogic { + + public LarvaRecipeLogic(LarvaMachine machine) { + super(machine); + } + + @Override + public @NotNull Iterator searchRecipe() { + var larvaMachine = (LarvaMachine) machine; + + // Available Fluid Stacks in the multiblock (for checking cable+coolant) + var availableFluids = new ArrayList(); + // Available Item Stacks in the multiblock (for checking cable+coolant) + var availableItems = new ArrayList(); + + // Inputs set to be consumed + var finalRecipeItemInputs = new ArrayList(); + var finalRecipeFluidInputs = new ArrayList(); + + // Outputs for the recipe + var finalRecipeItemOutputs = new ArrayList(); + + var fluidHandlers = machine.getCapabilitiesFlat(IO.IN, FluidRecipeCapability.CAP); + for (var handler : fluidHandlers) { + if (!(handler instanceof NotifiableFluidTank itemHandler)) continue; + for (var content : itemHandler.getContents()) { + if (!(content instanceof FluidStack stack)) continue; + availableFluids.add(stack.copy()); + } + } + + var itemHandlers = machine.getCapabilitiesFlat(IO.IN, ItemRecipeCapability.CAP); + for (var handler : itemHandlers) { + if (!(handler instanceof NotifiableItemStackHandler itemHandler)) continue; + for (var content : itemHandler.getContents()) { + if (!(content instanceof ItemStack stack)) continue; + availableItems.add(stack.copy()); + } + } + + var tiers = getLarvaTiers(); + var lootTable = getLarvaLoottable(); + var inputs = getLarvaInputs(); + + var parts = larvaMachine.getParts(); + for (var part : parts) { + // TODO: Make this specifically be our new bus + if (!(part instanceof ItemBusPartMachine itemBus)) continue; + if (!itemBus.getInventory().handlerIO.equals(IO.IN)) continue; + + // Find tier and output + // Enforced through the filters in the bus: 1 larva and 1 data orb per bus + var tier = -1; + ItemStack output = null; + + for (var content : itemBus.getInventory().getContents()) { + if (!(content instanceof ItemStack stack)) continue; + var tempTier = mapGet(tiers, stack); + if (tempTier == null) continue; + tier = tempTier; + } + if (tier == -1) continue; + + for (var content : itemBus.getInventory().getContents()) { + if (!(content instanceof ItemStack stack)) continue; + var loot = mapGet(lootTable, stack); + if (loot == null) continue; + // Tier is lower than needed for recipe; Throw here? Let the user know somehow? + if (tier < loot.getFirst()) continue; + output = loot.getSecond(); + } + if (output == null) continue; + + // TODO: For now circuit is a dumb parallel with 0 being 1x, 1 being 2x etc + + var circuit = itemBus.getCircuitInventory(); + var circuitStack = circuit.getStackInSlot(0); + var multiplier = getCircuitConfiguration(circuitStack) + 1; + + var recipeInputs = inputs.get(tier); + var itemInput = recipeInputs.getFirst().copy(); + var fluidInput = recipeInputs.getSecond().copy(); + var itemOutput = output.copy(); + itemInput.setCount(recipeInputs.getFirst().getCount() * multiplier); + fluidInput.setAmount(recipeInputs.getSecond().getAmount() * multiplier); + // Should do it? This'll set the NBT of the asteroid appropriately + var sizedAsteroid = setAsteroidSize(itemOutput, getCircuitConfiguration(circuitStack)); + + if (canConsumeItem(availableItems, itemInput) && + canConsumeFluid(availableFluids, fluidInput)) { + // Subtract the inputs from our list of available inputs + consumeItem(availableItems, itemInput); + // Subtract the inputs from our list of available inputs + consumeItem(availableItems, itemInput); + consumeFluid(availableFluids, fluidInput); + + // actually add inputs and outputs to the lists for the final recipe + finalRecipeItemInputs.add(itemInput); + finalRecipeFluidInputs.add(fluidInput); + finalRecipeItemOutputs.add(sizedAsteroid); + } else { + // not enough inputs + } + + } + if (finalRecipeItemOutputs.isEmpty()) { + return Collections.emptyIterator(); + } + + var builder = GTRecipeBuilder + .of(CosmicCore.id("larva_recipe"), CosmicRecipeTypes.BEES) + .EUt(GTValues.VA[GTValues.ZPM]) + .duration(20 * 60); + + for (var itemInput : finalRecipeItemInputs) { + builder.inputItems(itemInput); + } + for (var inputFluid : finalRecipeFluidInputs) { + builder.inputFluids(inputFluid); + } + for (var outputItem : finalRecipeItemOutputs) { + builder.outputItems(outputItem); + } + + return Collections.singleton(builder.buildRawRecipe()).iterator(); + } + + // Helper function for accessing map based on Itemstack.isSameItemSameTags + + private static V mapGet(Map map, ItemStack item) { + if (item == null) return null; + for (var entry : map.entrySet()) { + if (ItemStack.isSameItemSameTags(item, entry.getKey())) { + return entry.getValue(); + } + } + return null; + } + + /** + * Checks if the given item can be fully consumed from the list. + */ + private static boolean canConsumeItem(List available, ItemStack toConsume) { + if (toConsume.isEmpty()) { + return true; + } + + int remaining = toConsume.getCount(); + + for (ItemStack stack : available) { + if (ItemStack.isSameItemSameTags(stack, toConsume)) { + remaining -= stack.getCount(); + if (remaining <= 0) { + return true; + } + } + } + + return false; + } + + /** + * Attempts to consume the given item from the list. + * Returns true if the full amount was successfully removed, false otherwise. + * Mutates the list’s stack counts and empties stacks as needed. + */ + private static boolean consumeItem(List available, ItemStack toConsume) { + if (toConsume.isEmpty()) { + return true; + } + + int remaining = toConsume.getCount(); + + for (ItemStack stack : available) { + if (ItemStack.isSameItemSameTags(stack, toConsume)) { + int taken = Math.min(stack.getCount(), remaining); + stack.shrink(taken); + remaining -= taken; + if (remaining <= 0) { + return true; + } + } + } + + return false; // not enough found + } + + /** + * Checks if the given fluid can be fully consumed from the list. + */ + private static boolean canConsumeFluid(List available, FluidStack toConsume) { + if (toConsume.isEmpty()) { + return true; + } + + int needed = toConsume.getAmount(); + + for (FluidStack stack : available) { + if (toConsume.isFluidEqual(stack)) { + needed -= stack.getAmount(); + if (needed <= 0) { + return true; + } + } + } + + return false; + } + + /** + * Removes the given fluid amount from matching stacks in the list. + * Returns true if the full amount was successfully removed, false otherwise. + * Mutates the list’s FluidStacks. + */ + private static boolean consumeFluid(List available, FluidStack toConsume) { + if (toConsume.isEmpty()) { + return true; + } + + int remaining = toConsume.getAmount(); + + for (FluidStack stack : available) { + if (toConsume.isFluidEqual(stack)) { + int taken = Math.min(stack.getAmount(), remaining); + stack.shrink(taken); + remaining -= taken; + + if (remaining <= 0) { + return true; + } + } + } + + return false; + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/LinkTestStationMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/LinkTestStationMachine.java new file mode 100644 index 000000000..eff877628 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/LinkTestStationMachine.java @@ -0,0 +1,114 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.capability.ILinkedMultiblock; +import com.ghostipedia.cosmiccore.api.machine.multiblock.LinkedWorkableElectricMultiblockMachine; + +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; + +import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.GlobalPos; +import net.minecraft.network.chat.Component; + +import java.util.List; +import java.util.Set; + +/** + * Simple test multiblock for verifying cross-dimensional linking. + * Displays linked partners in UI and logs link events. + */ +public class LinkTestStationMachine extends LinkedWorkableElectricMultiblockMachine { + + protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( + LinkTestStationMachine.class, + LinkedWorkableElectricMultiblockMachine.MANAGED_FIELD_HOLDER); + + public LinkTestStationMachine(IMachineBlockEntity holder, Object... args) { + super(holder, args); + } + + @Override + public ManagedFieldHolder getFieldHolder() { + return MANAGED_FIELD_HOLDER; + } + + // ==================== Link Configuration ==================== + + @Override + public LinkRole getLinkRole() { + // Test station is a peer - can link bidirectionally + return LinkRole.PEER; + } + + @Override + public int getMaxPartners() { + // Allow up to 4 partners for testing + return 4; + } + + @Override + public boolean canLinkTo(GlobalPos partner, ILinkedMultiblock partnerMachine) { + // Accept links from any ILinkedMultiblock for testing + return true; + } + + // ==================== Link Lifecycle ==================== + + @Override + public void onLinkEstablished(GlobalPos partner) { + super.onLinkEstablished(partner); + CosmicCore.LOGGER.info("[LinkTestStation] Link established to {} in {}", + partner.pos(), partner.dimension().location()); + } + + @Override + public void onLinkBroken(GlobalPos partner) { + super.onLinkBroken(partner); + CosmicCore.LOGGER.info("[LinkTestStation] Link broken to {} in {}", + partner.pos(), partner.dimension().location()); + } + + // ==================== Display ==================== + + @Override + public void addDisplayText(List textList) { + super.addDisplayText(textList); + + if (!isFormed()) return; + + // Show link status + Set partners = getLinkedPartners(); + if (partners.isEmpty()) { + textList.add(Component.literal("No linked partners") + .withStyle(ChatFormatting.GRAY)); + textList.add(Component.literal("Use datastick to link") + .withStyle(ChatFormatting.DARK_GRAY)); + } else { + textList.add(Component.literal("Linked Partners: " + partners.size()) + .withStyle(ChatFormatting.GREEN)); + + for (GlobalPos partner : partners) { + String dim = partner.dimension().location().toString(); + String pos = String.format("[%d, %d, %d]", + partner.pos().getX(), + partner.pos().getY(), + partner.pos().getZ()); + + // Show if partner is online + boolean online = getPartnerMachine(partner) != null; + ChatFormatting color = online ? ChatFormatting.GREEN : ChatFormatting.RED; + String status = online ? "[+]" : "[-]"; + + textList.add(Component.literal(" " + status + " " + dim + " " + pos) + .withStyle(color)); + } + } + + // Show effective roles + LinkRole myRole = getLinkRole(); + textList.add(Component.literal("Role: " + myRole.name()) + .withStyle(ChatFormatting.AQUA)); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/MothCargoDropOffMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/MothCargoDropOffMachine.java new file mode 100644 index 000000000..222eaf65a --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/MothCargoDropOffMachine.java @@ -0,0 +1,140 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic; + +import com.ghostipedia.cosmiccore.api.capability.ILinkedMultiblock; +import com.ghostipedia.cosmiccore.api.machine.multiblock.LinkedWorkableMultiblockMachine; + +import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; + +import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.GlobalPos; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.items.IItemHandler; + +import java.util.ArrayList; +import java.util.List; + +/** + * Moth Cargo Drop Off - The "receiver" multiblock for the Cargo Moths system. + *

+ * Receives items and fluids from linked Moth Cargo Stations. + * Does NOT require power - just a place for moths to land! + *

+ * This is a simple, compact multiblock designed for easy placement at outposts. + */ +public class MothCargoDropOffMachine extends LinkedWorkableMultiblockMachine { + + protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( + MothCargoDropOffMachine.class, + LinkedWorkableMultiblockMachine.MANAGED_FIELD_HOLDER); + + // ==================== Constructor ==================== + + public MothCargoDropOffMachine(IMachineBlockEntity holder, Object... args) { + super(holder, args); + } + + @Override + public ManagedFieldHolder getFieldHolder() { + return MANAGED_FIELD_HOLDER; + } + + // ==================== Linking Overrides ==================== + + @Override + public LinkRole getLinkRole() { + // Drop Off is REMOTE - it receives from Stations but doesn't initiate + return LinkRole.REMOTE; + } + + @Override + public int getMaxPartners() { + // Can receive from multiple stations (N:1 support) + return 16; + } + + @Override + public boolean canLinkTo(GlobalPos partner, ILinkedMultiblock partnerMachine) { + // Only link to Cargo Stations + if (!(partnerMachine instanceof MothCargoStationMachine)) { + return false; + } + + // Same dimension only + GlobalPos myPos = getGlobalPos(); + if (myPos == null) return false; + + return myPos.dimension().equals(partner.dimension()); + } + + // ==================== Handler Access ==================== + + /** + * Get all item output handlers from the multiblock. + * Called by MothCargoStationMachine to insert items. + */ + public List getItemOutputHandlers() { + List handlers = new ArrayList<>(); + + var itemCaps = getCapabilitiesFlat(IO.OUT, ItemRecipeCapability.CAP); + if (itemCaps != null) { + for (var handler : itemCaps) { + if (handler instanceof NotifiableItemStackHandler itemHandler) { + handlers.add(itemHandler); + } + } + } + + return handlers; + } + + /** + * Get all fluid output handlers from the multiblock. + * Called by MothCargoStationMachine to insert fluids. + */ + public List getFluidOutputHandlers() { + List handlers = new ArrayList<>(); + + var fluidCaps = getCapabilitiesFlat(IO.OUT, FluidRecipeCapability.CAP); + if (fluidCaps != null) { + for (var handler : fluidCaps) { + if (handler instanceof NotifiableFluidTank fluidHandler) { + handlers.add(fluidHandler); + } + } + } + + return handlers; + } + + // ==================== UI ==================== + + @Override + public void addDisplayText(List textList) { + if (!isFormed()) { + textList.add(Component.literal("Structure not formed") + .setStyle(Style.EMPTY.withColor(ChatFormatting.RED))); + return; + } + + // Linked stations + int linkedCount = getLinkedPartners().size(); + if (linkedCount > 0) { + textList.add(Component.literal("Receiving from " + linkedCount + " station(s)") + .setStyle(Style.EMPTY.withColor(ChatFormatting.GREEN))); + } else { + textList.add(Component.literal("No stations linked!") + .setStyle(Style.EMPTY.withColor(ChatFormatting.RED))); + textList.add(Component.literal("Use a datastick to link to a Moth Cargo Station") + .setStyle(Style.EMPTY.withColor(ChatFormatting.GRAY))); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/MothCargoStationMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/MothCargoStationMachine.java new file mode 100644 index 000000000..1ae96a178 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/MothCargoStationMachine.java @@ -0,0 +1,657 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.capability.ILinkedMultiblock; +import com.ghostipedia.cosmiccore.api.machine.multiblock.LinkedWorkableMultiblockMachine; +import com.ghostipedia.cosmiccore.common.machine.multiblock.LinkedMultiblockHelper; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.MothCargoStation; + +import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.TickableSubscription; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; + +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.GlobalPos; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.items.IItemHandler; + +import lombok.Getter; +import lombok.Setter; + +import java.util.*; + +/** + * Moth Cargo Station - The "sender" multiblock for the Cargo Moths system. + *

+ * Ships items and fluids to linked Moth Cargo Drop Off stations using moths. + * Does NOT require power - just moths! + *

+ * Features: + *

    + *
  • Cycle-based shipping (configurable via moth home tiers)
  • + *
  • Multiple distribution modes (1:1, 1:N fill first, 1:N round robin, N:1)
  • + *
  • Feeding bonuses from honey/oil
  • + *
  • Same-dimension only linking
  • + *
+ */ +public class MothCargoStationMachine extends LinkedWorkableMultiblockMachine { + + protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( + MothCargoStationMachine.class, + LinkedWorkableMultiblockMachine.MANAGED_FIELD_HOLDER); + + // ==================== Constants ==================== + + /** Base items per moth per cycle (1 stack) */ + public static final int BASE_ITEMS_PER_MOTH = 64; + /** Base fluid per moth per cycle (1000 mB) */ + public static final int BASE_FLUID_PER_MOTH = 1000; + + /** Cycle times in ticks per tier (T1=60s, T2=30s, T3=15s, T4=5s) */ + public static final int[] CYCLE_TICKS_BY_TIER = { 1200, 600, 300, 100 }; + /** Moths per home by tier (T1=1, T2=2, T3=4, T4=8) */ + public static final int[] MOTHS_PER_HOME_BY_TIER = { 1, 2, 4, 8 }; + /** Max moth homes per station */ + public static final int MAX_MOTH_HOMES = 5; + + /** Feeding multipliers */ + public static final int MULTIPLIER_REGULAR_HONEY = 2; + public static final int MULTIPLIER_LOFTY_HONEY = 4; + public static final int MULTIPLIER_PALE_OIL = 8; + + // ==================== Distribution Modes ==================== + + public enum DistributionMode { + /** Direct 1:1 transfer to single receiver */ + DIRECT, + /** Fill receivers in order until full, then move to next */ + FILL_FIRST, + /** Distribute equally across all receivers (round robin) */ + ROUND_ROBIN + } + + // ==================== State ==================== + + @Persisted + @DescSynced + @Getter + @Setter + private DistributionMode distributionMode = DistributionMode.FILL_FIRST; + + @Persisted + @Getter + private int mothHomeTier = 1; // 1-4 + + @Persisted + @Getter + private int mothHomeCount = 0; // 0-5 + + @Persisted + private int ticksSinceLastCycle = 0; + + @Persisted + private int roundRobinIndex = 0; + + @Persisted + @DescSynced + @Getter + private int currentFeedingMultiplier = 1; + + private TickableSubscription shippingSubscription; + + // ==================== Constructor ==================== + + public MothCargoStationMachine(IMachineBlockEntity holder, Object... args) { + super(holder, args); + } + + @Override + public ManagedFieldHolder getFieldHolder() { + return MANAGED_FIELD_HOLDER; + } + + // ==================== Linking Overrides ==================== + + @Override + public LinkRole getLinkRole() { + // Station is the CONTROLLER - it initiates transfers to Drop Offs + return LinkRole.CONTROLLER; + } + + @Override + public int getMaxPartners() { + // Can link to multiple drop-off points + return 16; + } + + @Override + public boolean canLinkTo(GlobalPos partner, ILinkedMultiblock partnerMachine) { + // Only link to Drop Off stations + if (!(partnerMachine instanceof MothCargoDropOffMachine)) { + return false; + } + + // Same dimension only + GlobalPos myPos = getGlobalPos(); + if (myPos == null) return false; + + return myPos.dimension().equals(partner.dimension()); + } + + // ==================== Lifecycle ==================== + + @Override + public void onStructureFormed() { + super.onStructureFormed(); + + // Scan for moth homes in structure + scanForMothHomes(); + + subscribeToShipping(); + } + + @Override + public void onStructureInvalid() { + super.onStructureInvalid(); + unsubscribeFromShipping(); + // Reset moth home stats + mothHomeTier = 0; + mothHomeCount = 0; + } + + @Override + public void onUnload() { + super.onUnload(); + unsubscribeFromShipping(); + } + + /** + * Scan the multiblock structure for Forestry beehive blocks (used as moth homes). + * Sets mothHomeTier and mothHomeCount based on what's found. + * All moth homes must be the same tier. + * + * Tier mapping: + * T1: forestry:beehive_forest + * T2: forestry:beehive_lush + * T3: forestry:beehive_desert + * T4: forestry:beehive_end + */ + private void scanForMothHomes() { + Level level = getLevel(); + if (level == null) { + mothHomeTier = 0; + mothHomeCount = 0; + return; + } + + BlockPos controllerPos = getPos(); + int foundTier = 0; + int foundCount = 0; + boolean mixedTiers = false; + + // Scan a 7x7x7 region around the controller (covers 5x5x5 structure plus margin) + int scanRadius = 3; + for (int x = -scanRadius; x <= scanRadius; x++) { + for (int y = -scanRadius; y <= scanRadius; y++) { + for (int z = -scanRadius; z <= scanRadius; z++) { + BlockPos checkPos = controllerPos.offset(x, y, z); + Block block = level.getBlockState(checkPos).getBlock(); + ResourceLocation blockId = BuiltInRegistries.BLOCK.getKey(block); + + int tier = getBeehiveTier(blockId); + if (tier > 0) { + if (foundCount == 0) { + // First moth home found - set the tier + foundTier = tier; + foundCount = 1; + } else if (tier == foundTier) { + // Same tier - count it + foundCount++; + } else { + // Mixed tiers detected + mixedTiers = true; + } + } + } + } + } + + // Enforce same-tier requirement + if (mixedTiers) { + CosmicCore.LOGGER.warn("Moth Cargo Station at {} has mixed tier moth homes - using lowest functionality", + controllerPos); + // Still use what we found, but warn + } + + // Cap at max moth homes + foundCount = Math.min(foundCount, MAX_MOTH_HOMES); + + mothHomeTier = foundTier; + mothHomeCount = foundCount; + + CosmicCore.LOGGER.debug("Moth Cargo Station at {} found {} T{} moth homes", + controllerPos, mothHomeCount, mothHomeTier); + } + + /** + * Get the tier of a beehive block by its registry name. + * + * @return tier (1-4) or 0 if not a valid beehive + */ + private int getBeehiveTier(ResourceLocation blockId) { + if (blockId.equals(MothCargoStation.BEEHIVE_FOREST)) return 1; + if (blockId.equals(MothCargoStation.BEEHIVE_LUSH)) return 2; + if (blockId.equals(MothCargoStation.BEEHIVE_DESERT)) return 3; + if (blockId.equals(MothCargoStation.BEEHIVE_END)) return 4; + return 0; + } + + private void subscribeToShipping() { + if (shippingSubscription == null) { + shippingSubscription = subscribeServerTick(this::onShippingTick); + } + } + + private void unsubscribeFromShipping() { + if (shippingSubscription != null) { + shippingSubscription.unsubscribe(); + shippingSubscription = null; + } + } + + // ==================== Shipping Logic ==================== + + private void onShippingTick() { + if (!isFormed() || getLevel() == null || getLevel().isClientSide()) { + return; + } + + // Check if we have moths + if (mothHomeCount <= 0) { + return; + } + + ticksSinceLastCycle++; + + int cycleTime = getCycleTimeTicks(); + if (ticksSinceLastCycle >= cycleTime) { + ticksSinceLastCycle = 0; + performShippingCycle(); + } + } + + /** + * Get the cycle time in ticks based on moth home tier. + */ + public int getCycleTimeTicks() { + int tierIndex = Math.max(0, Math.min(mothHomeTier - 1, CYCLE_TICKS_BY_TIER.length - 1)); + return CYCLE_TICKS_BY_TIER[tierIndex]; + } + + /** + * Get total moths available for shipping. + */ + public int getTotalMoths() { + int tierIndex = Math.max(0, Math.min(mothHomeTier - 1, MOTHS_PER_HOME_BY_TIER.length - 1)); + return mothHomeCount * MOTHS_PER_HOME_BY_TIER[tierIndex]; + } + + /** + * Get capacity per cycle (items or mB). + */ + public int getCapacityPerCycle(boolean isFluid) { + int baseCapacity = isFluid ? BASE_FLUID_PER_MOTH : BASE_ITEMS_PER_MOTH; + return getTotalMoths() * baseCapacity * currentFeedingMultiplier; + } + + /** + * Perform one shipping cycle - transfer items/fluids to linked drop-offs. + */ + private void performShippingCycle() { + Set partners = getLinkedPartners(); + if (partners.isEmpty()) { + return; + } + + // Get list of valid, formed drop-off partners + List dropOffs = getActiveDropOffs(partners); + if (dropOffs.isEmpty()) { + return; + } + + // Calculate capacity for this cycle + int itemCapacity = getCapacityPerCycle(false); + int fluidCapacity = getCapacityPerCycle(true); + + // Ship items + shipItems(dropOffs, itemCapacity); + + // Ship fluids + shipFluids(dropOffs, fluidCapacity); + + // Consume feeding materials (TODO) + consumeFeedingMaterials(); + } + + /** + * Get active (formed and loaded) drop-off machines from partner list. + */ + private List getActiveDropOffs(Set partners) { + List result = new ArrayList<>(); + + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return result; + } + + for (GlobalPos partner : partners) { + MetaMachine machine = LinkedMultiblockHelper.getMachine(serverLevel.getServer(), partner); + if (machine instanceof MothCargoDropOffMachine dropOff && dropOff.isFormed()) { + result.add(dropOff); + } + } + + return result; + } + + /** + * Ship items to drop-offs based on distribution mode. + */ + private void shipItems(List dropOffs, int maxItems) { + // Get our input items + List inputHandlers = getItemInputHandlers(); + if (inputHandlers.isEmpty()) { + return; + } + + int remainingCapacity = maxItems; + + switch (distributionMode) { + case DIRECT -> { + // Ship to first drop-off only + if (!dropOffs.isEmpty()) { + remainingCapacity = shipItemsToDropOff(dropOffs.get(0), inputHandlers, remainingCapacity); + } + } + case FILL_FIRST -> { + // Fill each drop-off in order until capacity exhausted + for (MothCargoDropOffMachine dropOff : dropOffs) { + if (remainingCapacity <= 0) break; + remainingCapacity = shipItemsToDropOff(dropOff, inputHandlers, remainingCapacity); + } + } + case ROUND_ROBIN -> { + // Distribute items evenly starting from round robin index + int perDropOff = Math.max(1, remainingCapacity / dropOffs.size()); + for (int i = 0; i < dropOffs.size() && remainingCapacity > 0; i++) { + int index = (roundRobinIndex + i) % dropOffs.size(); + int toShip = Math.min(perDropOff, remainingCapacity); + int shipped = shipItemsToDropOff(dropOffs.get(index), inputHandlers, toShip); + remainingCapacity -= (toShip - shipped); + } + roundRobinIndex = (roundRobinIndex + 1) % dropOffs.size(); + } + } + } + + /** + * Ship items to a single drop-off, returns remaining capacity. + */ + private int shipItemsToDropOff(MothCargoDropOffMachine dropOff, List sources, int maxItems) { + List destHandlers = dropOff.getItemOutputHandlers(); + if (destHandlers.isEmpty()) { + return maxItems; + } + + int remaining = maxItems; + + for (IItemHandler source : sources) { + if (!(source instanceof NotifiableItemStackHandler sourceNotifiable)) { + continue; + } + + for (int slot = 0; slot < source.getSlots() && remaining > 0; slot++) { + // Use internal extract to bypass IO check + ItemStack stack = sourceNotifiable.extractItemInternal(slot, remaining, true); // Simulate + if (stack.isEmpty()) continue; + + // Try to insert into destination using internal method + ItemStack toInsert = stack.copy(); + int originalCount = toInsert.getCount(); + + for (IItemHandler dest : destHandlers) { + if (dest instanceof NotifiableItemStackHandler destNotifiable) { + // Use insertItemInternal which bypasses the IO check + for (int destSlot = 0; destSlot < dest.getSlots() && !toInsert.isEmpty(); destSlot++) { + toInsert = destNotifiable.insertItemInternal(destSlot, toInsert, false); + } + } else { + // Fallback to standard insertion + for (int destSlot = 0; destSlot < dest.getSlots() && !toInsert.isEmpty(); destSlot++) { + toInsert = dest.insertItem(destSlot, toInsert, false); + } + } + if (toInsert.isEmpty()) break; + } + + // Actually extract what we inserted + int inserted = originalCount - toInsert.getCount(); + if (inserted > 0) { + sourceNotifiable.extractItemInternal(slot, inserted, false); + remaining -= inserted; + } + } + } + + return remaining; + } + + /** + * Ship fluids to drop-offs based on distribution mode. + */ + private void shipFluids(List dropOffs, int maxFluid) { + List inputHandlers = getFluidInputHandlers(); + if (inputHandlers.isEmpty()) { + return; + } + + int remainingCapacity = maxFluid; + + switch (distributionMode) { + case DIRECT -> { + if (!dropOffs.isEmpty()) { + remainingCapacity = shipFluidsToDropOff(dropOffs.get(0), inputHandlers, remainingCapacity); + } + } + case FILL_FIRST -> { + for (MothCargoDropOffMachine dropOff : dropOffs) { + if (remainingCapacity <= 0) break; + remainingCapacity = shipFluidsToDropOff(dropOff, inputHandlers, remainingCapacity); + } + } + case ROUND_ROBIN -> { + int perDropOff = Math.max(1, remainingCapacity / dropOffs.size()); + for (int i = 0; i < dropOffs.size() && remainingCapacity > 0; i++) { + int index = (roundRobinIndex + i) % dropOffs.size(); + int toShip = Math.min(perDropOff, remainingCapacity); + int shipped = shipFluidsToDropOff(dropOffs.get(index), inputHandlers, toShip); + remainingCapacity -= (toShip - shipped); + } + } + } + } + + /** + * Ship fluids to a single drop-off, returns remaining capacity. + */ + private int shipFluidsToDropOff(MothCargoDropOffMachine dropOff, List sources, int maxFluid) { + List destHandlers = dropOff.getFluidOutputHandlers(); + if (destHandlers.isEmpty()) { + return maxFluid; + } + + int remaining = maxFluid; + + for (IFluidHandler source : sources) { + for (int tank = 0; tank < source.getTanks() && remaining > 0; tank++) { + FluidStack available = source.getFluidInTank(tank); + if (available.isEmpty()) continue; + + int toDrain = Math.min(available.getAmount(), remaining); + FluidStack drained = source.drain(new FluidStack(available, toDrain), + IFluidHandler.FluidAction.SIMULATE); + if (drained.isEmpty()) continue; + + // Try to insert into destination + int filled = 0; + for (IFluidHandler dest : destHandlers) { + int thisFill = dest.fill(drained.copy(), IFluidHandler.FluidAction.EXECUTE); + filled += thisFill; + drained.shrink(thisFill); + if (drained.isEmpty()) break; + } + + // Actually drain what we inserted + if (filled > 0) { + source.drain(new FluidStack(available, filled), IFluidHandler.FluidAction.EXECUTE); + remaining -= filled; + } + } + } + + return remaining; + } + + /** + * Consume feeding materials and update multiplier. + */ + private void consumeFeedingMaterials() { + // TODO: Check input bus for honey/oil and consume per cycle + // For now, default multiplier + currentFeedingMultiplier = 1; + } + + // ==================== Handler Access ==================== + + /** + * Get all item input handlers from the multiblock. + */ + private List getItemInputHandlers() { + List handlers = new ArrayList<>(); + + var itemCaps = getCapabilitiesFlat(IO.IN, ItemRecipeCapability.CAP); + if (itemCaps != null) { + for (var handler : itemCaps) { + if (handler instanceof NotifiableItemStackHandler itemHandler) { + handlers.add(itemHandler); + } + } + } + + return handlers; + } + + /** + * Get all fluid input handlers from the multiblock. + */ + private List getFluidInputHandlers() { + List handlers = new ArrayList<>(); + + var fluidCaps = getCapabilitiesFlat(IO.IN, FluidRecipeCapability.CAP); + if (fluidCaps != null) { + for (var handler : fluidCaps) { + if (handler instanceof NotifiableFluidTank fluidHandler) { + handlers.add(fluidHandler); + } + } + } + + return handlers; + } + + // ==================== UI ==================== + + @Override + public void addDisplayText(List textList) { + if (!isFormed()) { + textList.add(Component.literal("Structure not formed") + .setStyle(Style.EMPTY.withColor(ChatFormatting.RED))); + return; + } + + // Moth home info + if (mothHomeCount > 0) { + textList.add(Component.literal("Moth Homes: " + mothHomeCount + " (T" + mothHomeTier + ")") + .setStyle(Style.EMPTY.withColor(ChatFormatting.GREEN))); + textList.add(Component.literal("Total Moths: " + getTotalMoths()) + .setStyle(Style.EMPTY.withColor(ChatFormatting.AQUA))); + textList.add(Component.literal("Cycle Time: " + (getCycleTimeTicks() / 20) + "s") + .setStyle(Style.EMPTY.withColor(ChatFormatting.YELLOW))); + } else { + textList.add(Component.literal("No Moth Homes installed!") + .setStyle(Style.EMPTY.withColor(ChatFormatting.RED))); + } + + // Distribution mode + textList.add(Component.literal("Mode: " + distributionMode.name()) + .setStyle(Style.EMPTY.withColor(ChatFormatting.WHITE))); + + // Linked partners + int linkedCount = getLinkedPartners().size(); + if (linkedCount > 0) { + textList.add(Component.literal("Linked Drop-Offs: " + linkedCount) + .setStyle(Style.EMPTY.withColor(ChatFormatting.GREEN))); + } else { + textList.add(Component.literal("No Drop-Offs linked!") + .setStyle(Style.EMPTY.withColor(ChatFormatting.RED))); + } + + // Capacity info + if (mothHomeCount > 0) { + textList.add(Component + .literal("Capacity: " + getCapacityPerCycle(false) + " items / " + getCapacityPerCycle(true) + + " mB per cycle") + .setStyle(Style.EMPTY.withColor(ChatFormatting.GRAY))); + } + } + + @Override + protected InteractionResult onScrewdriverClick(Player playerIn, InteractionHand hand, Direction gridSide, + BlockHitResult hitResult) { + if (!isRemote()) { + // Cycle through distribution modes + DistributionMode[] modes = DistributionMode.values(); + int nextIndex = (distributionMode.ordinal() + 1) % modes.length; + distributionMode = modes[nextIndex]; + + playerIn.displayClientMessage( + Component.literal("Distribution Mode: " + distributionMode.name()) + .setStyle(Style.EMPTY.withColor(ChatFormatting.AQUA)), + true); + } + return InteractionResult.SUCCESS; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/MultithreadedMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/MultithreadedMachine.java new file mode 100644 index 000000000..1567f2411 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/MultithreadedMachine.java @@ -0,0 +1,500 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IMultithreadedMachine; + +import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.capability.recipe.IRecipeHandler; +import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.TickableSubscription; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockDisplayText; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.common.machine.multiblock.part.EnergyHatchPartMachine; +import com.gregtechceu.gtceu.utils.FormattingUtil; + +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.DyeColor; + +import it.unimi.dsi.fastutil.ints.Int2ObjectLinkedOpenHashMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.longs.Long2ObjectMaps; +import lombok.Getter; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +/** + * A multiblock machine that can run multiple independent recipes simultaneously. + * Each "thread" is assigned a color-coded set of input buses/hatches. + * The maximum number of threads is determined by the energy hatch amperage. + *

+ * Design: + * - 4A energy hatch = 4 max threads + * - 16A energy hatch = 16 max threads + * - Each thread needs a uniquely colored input bus/hatch pair + * - All threads share output buses/hatches + * - Energy is split evenly among active threads + */ +public class MultithreadedMachine extends WorkableElectricMultiblockMachine implements IMultithreadedMachine { + + protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( + MultithreadedMachine.class, WorkableElectricMultiblockMachine.MANAGED_FIELD_HOLDER); + + /** + * Maximum possible threads (limited by largest energy hatch amperage) + */ + public static final int MAX_THREADS = 16; + + /** + * Map of thread color -> RecipeLogic for that thread + */ + @Getter + private final Int2ObjectMap threadLogics = new Int2ObjectLinkedOpenHashMap<>(); + + /** + * Map of thread color -> input handler list for that thread + */ + private final Int2ObjectMap> threadInputHandlers = new Int2ObjectLinkedOpenHashMap<>(); + + /** + * Shared output handlers for all threads + */ + private List sharedOutputHandlers = new ArrayList<>(); + + /** + * Maximum number of threads allowed by the energy hatch + */ + @Persisted + @DescSynced + @Getter + private int maxThreads = 0; + + /** + * Currently active thread count + */ + @Persisted + @DescSynced + @Getter + private int activeThreadCount = 0; + + /** + * Total amperage available from energy hatch(es) + */ + @Getter + private int totalAmperage = 0; + + @Nullable + private TickableSubscription threadTickSubscription; + + public MultithreadedMachine(IMachineBlockEntity holder) { + super(holder); + } + + @Override + @NotNull + public ManagedFieldHolder getFieldHolder() { + return MANAGED_FIELD_HOLDER; + } + + @Override + protected RecipeLogic createRecipeLogic(Object... args) { + // We don't use the default recipe logic - we manage multiple thread logics instead + // Return a dummy that does nothing, actual work is done by thread logics + return new RecipeLogic(this) { + + @Override + public void serverTick() { + // Do nothing - threading is handled separately + } + }; + } + + @Override + public void onStructureFormed() { + super.onStructureFormed(); + + // Clear previous state + threadLogics.clear(); + threadInputHandlers.clear(); + sharedOutputHandlers.clear(); + maxThreads = 0; + totalAmperage = 0; + + // Detect energy hatch amperage to determine max threads + detectEnergyHatchAmperage(); + + // Partition input handlers by color + partitionHandlersByColor(); + + // Collect shared output handlers + collectOutputHandlers(); + + // Create thread logics for each color group + createThreadLogics(); + + // Start the thread tick subscription + updateThreadSubscription(); + } + + @Override + public void onStructureInvalid() { + super.onStructureInvalid(); + + // Deactivate all threads + for (MultithreadedRecipeLogic logic : threadLogics.values()) { + logic.deactivateThread(); + } + + threadLogics.clear(); + threadInputHandlers.clear(); + sharedOutputHandlers.clear(); + maxThreads = 0; + activeThreadCount = 0; + totalAmperage = 0; + + if (threadTickSubscription != null) { + threadTickSubscription.unsubscribe(); + threadTickSubscription = null; + } + } + + /** + * Detect the amperage of energy hatches to determine max thread count. + */ + private void detectEnergyHatchAmperage() { + Map ioMap = getMultiblockState().getMatchContext() + .getOrCreate("ioMap", Long2ObjectMaps::emptyMap); + + for (IMultiPart part : getParts()) { + if (part instanceof EnergyHatchPartMachine energyHatch) { + IO io = ioMap.getOrDefault(part.self().getPos().asLong(), IO.IN); + if (io == IO.IN || io == IO.BOTH) { + totalAmperage += energyHatch.getAmperage(); + } + } + } + + // Max threads = total amperage, capped at MAX_THREADS + maxThreads = Math.min(totalAmperage, MAX_THREADS); + } + + /** + * Partition input handlers by their paint color. + * Each unique color becomes a potential thread. + */ + private void partitionHandlersByColor() { + for (IMultiPart part : getParts()) { + var handlerLists = part.getRecipeHandlers(); + for (RecipeHandlerList handlerList : handlerLists) { + if (handlerList.getHandlerIO() == IO.IN || handlerList.getHandlerIO() == IO.BOTH) { + // Check if this handler has item or fluid capability (not just energy) + boolean hasItemOrFluid = handlerList.hasCapability(ItemRecipeCapability.CAP) || + handlerList.hasCapability(FluidRecipeCapability.CAP); + + if (hasItemOrFluid) { + int color = handlerList.getColor(); + threadInputHandlers.computeIfAbsent(color, k -> new ArrayList<>()).add(handlerList); + } + } + } + } + } + + /** + * Collect output handlers that will be shared by all threads. + */ + private void collectOutputHandlers() { + for (IMultiPart part : getParts()) { + var handlerLists = part.getRecipeHandlers(); + for (RecipeHandlerList handlerList : handlerLists) { + if (handlerList.getHandlerIO() == IO.OUT || handlerList.getHandlerIO() == IO.BOTH) { + // Check if this handler has item or fluid capability + boolean hasItemOrFluid = handlerList.hasCapability(ItemRecipeCapability.CAP) || + handlerList.hasCapability(FluidRecipeCapability.CAP); + + if (hasItemOrFluid) { + sharedOutputHandlers.add(handlerList); + } + } + } + } + } + + /** + * Create a MultithreadedRecipeLogic for each color group, up to maxThreads. + */ + private void createThreadLogics() { + int threadIndex = 0; + + // Calculate EU/t budget per thread + // Each thread gets 1A of voltage from the total amperage pool + // With 16A UV hatch and 16 threads, each gets 1A UV = 524,288 EU/t + // IMPORTANT: EnergyContainerList.getInputVoltage() returns TOTAL EU/t (voltage*amperage compacted) + // We need to use getHighestInputVoltage() which returns the actual per-amp voltage + long euPerThread = energyContainer != null ? energyContainer.getHighestInputVoltage() : 0; + + for (Int2ObjectMap.Entry> entry : threadInputHandlers.int2ObjectEntrySet()) { + if (threadIndex >= maxThreads) break; + + int color = entry.getIntKey(); + List inputHandlers = entry.getValue(); + + MultithreadedRecipeLogic logic = new MultithreadedRecipeLogic(this, threadIndex, color); + + // Set the EU/t budget for this thread + logic.setMaxEUtPerThread(euPerThread); + + // Build capability maps for this thread + Map> threadProxy = new EnumMap<>(IO.class); + Map, List>>> threadFlat = new EnumMap<>(IO.class); + + // Add input handlers (thread-specific, color-coded) + threadProxy.put(IO.IN, new ArrayList<>(inputHandlers)); + + // Add output handlers (shared) + threadProxy.put(IO.OUT, new ArrayList<>(sharedOutputHandlers)); + + // Build flattened map from proxy + for (Map.Entry> proxyEntry : threadProxy.entrySet()) { + IO io = proxyEntry.getKey(); + Map, List>> capMap = new HashMap<>(); + + for (RecipeHandlerList handlerList : proxyEntry.getValue()) { + for (var capEntry : handlerList.getHandlerMap().entrySet()) { + RecipeCapability cap = capEntry.getKey(); + List> handlers = capEntry.getValue(); + capMap.computeIfAbsent(cap, k -> new ArrayList<>()).addAll(handlers); + } + } + + threadFlat.put(io, capMap); + } + + // Also add energy handlers from machine for recipe EU consumption + addEnergyHandlersToThread(threadProxy, threadFlat); + + logic.setThreadCapabilitiesProxy(threadProxy); + logic.setThreadCapabilitiesFlat(threadFlat); + logic.activateThread(); + + threadLogics.put(color, logic); + threadIndex++; + } + + activeThreadCount = threadLogics.size(); + } + + /** + * Add energy handlers to a thread's capability maps so recipes can consume EU. + * Must add to both proxy and flat maps for full compatibility. + */ + private void addEnergyHandlersToThread( + Map> threadProxy, + Map, List>>> threadFlat) { + // Get energy handlers from the machine's global capabilities (proxy) + var machineProxy = getCapabilitiesProxy(); + if (machineProxy != null && machineProxy.containsKey(IO.IN)) { + for (RecipeHandlerList handlerList : machineProxy.get(IO.IN)) { + if (handlerList.hasCapability(EURecipeCapability.CAP)) { + threadProxy.computeIfAbsent(IO.IN, k -> new ArrayList<>()).add(handlerList); + } + } + } + + // Also add to flat map + var machineFlat = getCapabilitiesFlat(); + if (machineFlat != null && machineFlat.containsKey(IO.IN)) { + var inCaps = machineFlat.get(IO.IN); + if (inCaps != null && inCaps.containsKey(EURecipeCapability.CAP)) { + var energyHandlers = inCaps.get(EURecipeCapability.CAP); + if (energyHandlers != null && !energyHandlers.isEmpty()) { + threadFlat.computeIfAbsent(IO.IN, k -> new HashMap<>()) + .put(EURecipeCapability.CAP, new ArrayList<>(energyHandlers)); + } + } + } + } + + /** + * Update the tick subscription for thread processing. + */ + private void updateThreadSubscription() { + if (isFormed() && !threadLogics.isEmpty()) { + threadTickSubscription = subscribeServerTick(threadTickSubscription, this::tickThreads); + } else if (threadTickSubscription != null) { + threadTickSubscription.unsubscribe(); + threadTickSubscription = null; + } + } + + /** + * Called every server tick to process all thread logics. + */ + private void tickThreads() { + if (!isFormed() || !isWorkingEnabled()) return; + + // Calculate energy per thread + long availableEnergy = getEnergyPerThread(); + + // Tick each active thread + int runningThreads = 0; + for (MultithreadedRecipeLogic logic : threadLogics.values()) { + if (logic.isThreadActive()) { + // Each thread gets its share of energy + logic.serverTick(); + if (logic.isWorking()) { + runningThreads++; + } + } + } + + activeThreadCount = runningThreads; + } + + /** + * Calculate energy available per thread. + * Energy is split evenly among all active threads. + */ + private long getEnergyPerThread() { + if (energyContainer == null || activeThreadCount == 0) return 0; + return energyContainer.getInputVoltage() * totalAmperage / Math.max(1, getRunningThreadCount()); + } + + /** + * Get the number of threads currently running recipes. + */ + public int getRunningThreadCount() { + int count = 0; + for (MultithreadedRecipeLogic logic : threadLogics.values()) { + if (logic.isWorking()) count++; + } + return count; + } + + /** + * Get the input handlers for a specific thread color. + */ + @Nullable + public List getThreadInputHandlers(int color) { + return threadInputHandlers.get(color); + } + + /** + * Get the shared output handlers. + */ + public List getSharedOutputHandlers() { + return sharedOutputHandlers; + } + + /** + * Get a color name for display purposes. + */ + public static String getColorName(int color) { + if (color == -1) return "Unpainted"; + for (DyeColor dye : DyeColor.values()) { + if (dye.getFireworkColor() == color || dye.getTextColor() == color) { + return dye.getName(); + } + } + return "Color #" + Integer.toHexString(color); + } + + @Override + public void addDisplayText(List textList) { + // Basic multiblock status + var builder = MultiblockDisplayText.builder(textList, isFormed()) + .setWorkingStatus(isWorkingEnabled(), getRunningThreadCount() > 0); + + if (isFormed()) { + // Thread status header + builder.addCustom(tl -> { + tl.add(Component.translatable("cosmiccore.machine.multithreaded.thread_status") + .withStyle(ChatFormatting.AQUA)); + tl.add(Component.translatable("cosmiccore.machine.multithreaded.max_threads", + FormattingUtil.formatNumbers(maxThreads)) + .withStyle(ChatFormatting.GRAY)); + tl.add(Component.translatable("cosmiccore.machine.multithreaded.active_threads", + FormattingUtil.formatNumbers(getRunningThreadCount()), + FormattingUtil.formatNumbers(threadLogics.size())) + .withStyle(ChatFormatting.GRAY)); + }); + + // Per-thread status + builder.addCustom(tl -> { + for (MultithreadedRecipeLogic logic : threadLogics.values()) { + String colorName = getColorName(logic.getThreadColor()); + ChatFormatting statusColor = logic.isWorking() ? ChatFormatting.GREEN : ChatFormatting.YELLOW; + + String status; + if (logic.isWorking()) { + int percent = (int) (logic.getProgressPercent() * 100); + status = percent + "%"; + } else if (logic.isIdle()) { + status = "Idle"; + } else if (logic.isWaiting()) { + status = "Waiting"; + } else { + status = "Suspended"; + } + + tl.add(Component.literal(" [" + colorName + "] " + status) + .withStyle(statusColor)); + } + }); + + // Energy info + builder.addEnergyUsageLine(energyContainer); + builder.addEnergyTierLine(tier); + } + + getDefinition().getAdditionalDisplay().accept(this, textList); + } + + // === IMultithreadedMachine interface implementation === + + @Override + public Int2ObjectMap getThreadLogicsMap() { + return threadLogics; + } + + @Override + public int getMaxThreadCount() { + return maxThreads; + } + + @Override + public int getCurrentThreadCount() { + return threadLogics.size(); + } + + @Override + public boolean beforeWorking(@Nullable GTRecipe recipe) { + // Called by individual thread logics + return super.beforeWorking(recipe); + } + + @Override + public boolean onWorking() { + // Called by individual thread logics + return super.onWorking(); + } + + @Override + public void afterWorking() { + // Called by individual thread logics + super.afterWorking(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/MultithreadedRecipeLogic.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/MultithreadedRecipeLogic.java new file mode 100644 index 000000000..99fc1f7aa --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/MultithreadedRecipeLogic.java @@ -0,0 +1,435 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic; + +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.capability.recipe.IRecipeCapabilityHolder; +import com.gregtechceu.gtceu.api.capability.recipe.IRecipeHandler; +import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; +import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; +import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.recipe.ActionResult; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.RecipeHelper; +import com.gregtechceu.gtceu.api.recipe.modifier.ModifierFunction; + +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; + +import lombok.Getter; +import lombok.Setter; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.*; +import java.util.Iterator; + +/** + * A RecipeLogic instance that represents a single "thread" in a MultithreadedMachine. + * Each thread can process one recipe independently of other threads. + *

+ * This class implements IRecipeCapabilityHolder to provide a filtered view of handlers + * that only includes this thread's color-coded inputs and shared outputs. + */ +public class MultithreadedRecipeLogic extends RecipeLogic implements IRecipeCapabilityHolder { + + public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( + MultithreadedRecipeLogic.class, RecipeLogic.MANAGED_FIELD_HOLDER); + + @Getter + private final int threadIndex; + + @Getter + private final int threadColor; + + @Persisted + @DescSynced + @Getter + private boolean threadActive = false; + + /** + * Maximum EU/t this thread can use. + * Set by the parent MultithreadedMachine based on energy hatch amperage / thread count. + */ + @Setter + @Getter + private long maxEUtPerThread = 0; + + /** + * This thread's capability proxy - filtered to only include its handlers. + * Set by the parent MultithreadedMachine. + */ + @Setter + private Map> threadCapabilitiesProxy = new EnumMap<>(IO.class); + + /** + * Flattened capability map for this thread. + */ + @Setter + private Map, List>>> threadCapabilitiesFlat = new EnumMap<>(IO.class); + + public MultithreadedRecipeLogic(IRecipeLogicMachine machine, int threadIndex, int threadColor) { + super(machine); + this.threadIndex = threadIndex; + this.threadColor = threadColor; + } + + @Override + public ManagedFieldHolder getFieldHolder() { + return MANAGED_FIELD_HOLDER; + } + + // === IRecipeCapabilityHolder implementation === + // These methods provide a filtered view of handlers for this thread only + + @Override + public Map> getCapabilitiesProxy() { + return threadCapabilitiesProxy; + } + + @Override + public Map, List>>> getCapabilitiesFlat() { + return threadCapabilitiesFlat; + } + + /** + * Called by the parent machine to activate this thread. + */ + public void activateThread() { + this.threadActive = true; + } + + /** + * Called by the parent machine to deactivate this thread. + */ + public void deactivateThread() { + this.threadActive = false; + if (isWorking()) { + setStatus(Status.IDLE); + this.progress = 0; + this.duration = 0; + this.lastRecipe = null; + } + } + + /** + * Check if this thread can process recipes. + */ + public boolean canWork() { + return threadActive && machine.isRecipeLogicAvailable(); + } + + @Override + public void serverTick() { + if (!canWork()) { + if (isWorking()) { + // Thread was deactivated mid-recipe, pause it + setStatus(Status.SUSPEND); + } + return; + } + super.serverTick(); + } + + /** + * Get the parent MultithreadedMachine. + */ + @Nullable + private MultithreadedMachine getParentMachine() { + if (machine instanceof MultithreadedMachine mtm) { + return mtm; + } + return null; + } + + /** + * Standard overclock voltage multiplier (4x per OC level). + */ + private static final double OC_VOLTAGE_FACTOR = 4.0; + + /** + * Standard overclock duration multiplier (0.5x per OC level - halves duration). + */ + private static final double OC_DURATION_FACTOR = 0.5; + + /** + * Calculate the maximum number of overclock levels that fit within the thread's EU/t budget. + * Each overclock level multiplies EU/t by 4 and halves duration. + * + * @param baseEUt The base recipe EU/t + * @return Number of overclock levels possible (0 = no overclocking) + */ + protected int calculateMaxOverclockLevels(long baseEUt) { + if (maxEUtPerThread <= 0 || baseEUt <= 0) { + return 0; + } + + int levels = 0; + long currentEUt = baseEUt; + + // Each OC level multiplies EU/t by 4 + while (currentEUt * OC_VOLTAGE_FACTOR <= maxEUtPerThread) { + currentEUt = (long) (currentEUt * OC_VOLTAGE_FACTOR); + levels++; + } + + return levels; + } + + /** + * Apply overclocking to a recipe within this thread's energy budget. + * Overclocking multiplies EU/t by 4 and halves duration per level. + * + * @param recipe The base recipe + * @return The overclocked recipe copy, or a copy of the original if no overclocking is possible + */ + @Nullable + protected GTRecipe applyThreadOverclock(GTRecipe recipe) { + long baseEUt = recipe.getInputEUt().getTotalEU(); + + // If base recipe exceeds budget, can't run at all + if (baseEUt > maxEUtPerThread && maxEUtPerThread > 0) { + return null; + } + + int ocLevels = calculateMaxOverclockLevels(baseEUt); + if (ocLevels <= 0) { + // No overclocking possible, return a copy of the recipe + return recipe.copy(); + } + + // Calculate overclocked values + double eutMultiplier = Math.pow(OC_VOLTAGE_FACTOR, ocLevels); + double durationMultiplier = Math.pow(OC_DURATION_FACTOR, ocLevels); + + // Build modifier to apply overclock + ModifierFunction modifier = ModifierFunction.builder() + .eutMultiplier(eutMultiplier) + .durationMultiplier(durationMultiplier) + .build(); + + // Apply to a COPY of the recipe to avoid modifying the original + return modifier.apply(recipe.copy()); + } + + /** + * Override to apply thread-specific recipe modification and check availability. + * Applies overclocking within the thread's energy budget. + * + * IMPORTANT: The 'match' parameter is the RAW recipe from the recipe type, + * NOT yet modified by the machine. We must NOT call machine.fullModifyRecipe() + * as that would apply overclock based on full machine power. + */ + @Override + public boolean checkMatchedRecipeAvailable(GTRecipe match) { + // Get the BASE recipe EU/t before any modification + long baseEUt = match.getInputEUt().getTotalEU(); + + // Check if base recipe fits within thread's budget + if (baseEUt > maxEUtPerThread && maxEUtPerThread > 0) { + // Base recipe too expensive for this thread + return false; + } + + // Apply our custom overclock within thread's energy budget + GTRecipe modified = applyThreadOverclock(match); + if (modified == null) { + return false; + } + + // Trim outputs to fit in output slots + GTRecipe trimmed = RecipeHelper.trimRecipeOutputs(modified, machine.getOutputLimits()); + if (trimmed == null) { + return false; + } + + // Check if the modified recipe matches our thread's inputs + ActionResult result = checkRecipe(trimmed); + if (result.isSuccess()) { + // Store the modified recipe for execution + setupRecipe(trimmed); + + // IMPORTANT: Store the original (unmodified) recipe for later re-application + // This is used by onRecipeFinish to re-overclock when repeating the recipe + if (lastRecipe != null && getStatus() == Status.WORKING) { + lastOriginRecipe = match; + lastFailedMatches = null; + return true; + } + } + return false; + } + + /** + * Override searchRecipe to use THIS THREAD as the capability holder, + * not the machine. This is critical for proper recipe filtering. + */ + @Override + public @NotNull Iterator searchRecipe() { + // Use THIS thread as the capability holder for recipe searching + return machine.getRecipeType().searchRecipe(this, r -> matchRecipe(r).isSuccess()); + } + + /** + * Override findAndHandleRecipe to ensure we ALWAYS go through our custom + * checkMatchedRecipeAvailable, even when re-running a cached recipe. + * The base implementation has a shortcut path that bypasses our EU budget checks. + */ + @Override + public void findAndHandleRecipe() { + lastFailedMatches = null; + + // If we have a cached origin recipe, try to re-apply our thread-specific overclock + if (!recipeDirty && lastOriginRecipe != null) { + // Re-apply OUR thread overclock to the origin recipe + GTRecipe modified = applyThreadOverclock(lastOriginRecipe); + if (modified != null) { + GTRecipe trimmed = RecipeHelper.trimRecipeOutputs(modified, machine.getOutputLimits()); + if (trimmed != null && checkRecipe(trimmed).isSuccess()) { + setupRecipe(trimmed); + recipeDirty = false; + return; + } + } + } + + // No valid cached recipe, search for a new one + lastRecipe = null; + lastOriginRecipe = null; + handleSearchingRecipes(searchRecipe()); + recipeDirty = false; + } + + /** + * Override checkRecipe to use this thread's capability holder. + * Also checks recipe conditions. + */ + @Override + public ActionResult checkRecipe(GTRecipe recipe) { + // First check recipe conditions + var conditionResult = RecipeHelper.checkConditions(recipe, this); + if (!conditionResult.isSuccess()) return conditionResult; + + // Use this thread as the capability holder for matching + return matchRecipe(recipe); + } + + /** + * Override to use this thread's capability holder for recipe matching. + * This ensures recipe searching uses this thread's handlers. + */ + @Override + protected ActionResult matchRecipe(GTRecipe recipe) { + // Use this thread as the capability holder instead of the machine + return RecipeHelper.matchContents(this, recipe); + } + + /** + * Override to use this thread's handlers instead of the machine's global handlers. + */ + @Override + protected ActionResult handleRecipeIO(GTRecipe recipe, IO io) { + // Use this thread as the capability holder instead of the machine + return RecipeHelper.handleRecipeIO(this, recipe, io, chanceCaches); + } + + /** + * Override to use this thread's handlers for tick-based IO. + */ + @Override + protected ActionResult handleTickRecipeIO(GTRecipe recipe, IO io) { + // Use this thread as the capability holder instead of the machine + return RecipeHelper.handleTickRecipeIO(this, recipe, io, chanceCaches); + } + + /** + * Override to use this thread's capability holder for tick recipe matching. + * This is critical for EU consumption - the base implementation uses the machine, + * but we need to use this thread's handlers. + */ + @Override + public ActionResult handleTickRecipe(GTRecipe recipe) { + if (recipe.hasTick()) { + // Use this thread as the capability holder for matching + var result = RecipeHelper.matchTickRecipe(this, recipe); + if (!result.isSuccess()) { + return result; + } + result = handleTickRecipeIO(recipe, IO.IN); + if (!result.isSuccess()) { + return result; + } + return handleTickRecipeIO(recipe, IO.OUT); + } + return ActionResult.SUCCESS; + } + + /** + * Override onRecipeFinish to prevent the base class from applying machine-level overclock. + * The base implementation calls machine.fullModifyRecipe(lastOriginRecipe) which would + * apply overclock based on full machine power, ignoring our thread budget. + */ + @Override + public void onRecipeFinish() { + machine.afterWorking(); + if (lastRecipe != null) { + // Reset run attempt tracking + // Note: runAttempt and runDelay are package-private in base class + // but we can still access them since we're in the same hierarchy + + consecutiveRecipes++; + handleRecipeIO(lastRecipe, IO.OUT); + + // CRITICAL: Do NOT call machine.fullModifyRecipe here! + // Instead, re-apply OUR thread-specific overclock to the origin recipe + if (lastOriginRecipe != null) { + GTRecipe modified = applyThreadOverclock(lastOriginRecipe); + if (modified == null) { + markLastRecipeDirty(); + } else { + // Trim outputs + GTRecipe trimmed = RecipeHelper.trimRecipeOutputs(modified, machine.getOutputLimits()); + if (trimmed == null) { + markLastRecipeDirty(); + } else { + lastRecipe = trimmed; + } + } + } else { + markLastRecipeDirty(); + } + + // Try to run the recipe again + var recipeCheck = checkRecipe(lastRecipe); + if (!recipeDirty && !isSuspendAfterFinish() && recipeCheck.isSuccess()) { + setupRecipe(lastRecipe); + } else { + if (isSuspendAfterFinish()) { + setStatus(Status.SUSPEND); + } else { + setStatus(Status.IDLE); + } + consecutiveRecipes = 0; + progress = 0; + duration = 0; + isActive = false; + } + } + } + + /** + * Get the recipe currently being processed by this thread. + */ + @Nullable + public GTRecipe getCurrentRecipe() { + return lastRecipe; + } + + /** + * Get progress as a percentage (0.0 to 1.0) + */ + public double getProgressPercent() { + if (duration == 0) return 0; + return (double) progress / duration; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/RegressionPersistentWorkableElectricMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/RegressionPersistentWorkableElectricMachine.java new file mode 100644 index 000000000..4a5c33faf --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/RegressionPersistentWorkableElectricMachine.java @@ -0,0 +1,34 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic; + +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; + +public class RegressionPersistentWorkableElectricMachine extends WorkableElectricMultiblockMachine { + + public RegressionPersistentWorkableElectricMachine(IMachineBlockEntity holder, Object... args) { + super(holder, args); + } + + @Override + public boolean regressWhenWaiting() { + return false; + } + + // TODO: Machine Fails and recipe voids if per-Tick is not satisfied. + @Override + public boolean onWorking() { + // var logic = this.getRecipeLogic(); + // var recipe = recipeLogic.getLastRecipe(); + // + // if (recipe != null && recipeLogic.isWorking()) { + // var validIngredients = RecipeHelper.matchTickRecipe(this.getRecipeLogic().machine, recipe); + // if (!validIngredients.isSuccess()) { + // recipeLogic.interruptRecipe(); + // recipeLogic.setStatus(RecipeLogic.Status.SUSPEND); + // return false; + // } + // return super.onWorking(); + // } + return super.onWorking(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/StarLadderMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/StarLadderMachine.java new file mode 100644 index 000000000..ad00810d3 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/StarLadderMachine.java @@ -0,0 +1,67 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic; + +import com.ghostipedia.cosmiccore.api.capability.ILinkedMultiblock; +import com.ghostipedia.cosmiccore.api.machine.multiblock.LinkedWorkableElectricMultiblockMachine; +import com.ghostipedia.cosmiccore.common.machine.multiblock.LinkedMultiblockHelper; + +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; + +import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.GlobalPos; +import net.minecraft.network.chat.Component; + +import java.util.List; + +public class StarLadderMachine extends LinkedWorkableElectricMultiblockMachine { + + protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( + StarLadderMachine.class, + LinkedWorkableElectricMultiblockMachine.MANAGED_FIELD_HOLDER); + + public StarLadderMachine(IMachineBlockEntity holder, Object... args) { + super(holder, args); + } + + @Override + public ManagedFieldHolder getFieldHolder() { + return MANAGED_FIELD_HOLDER; + } + + @Override + public LinkRole getLinkRole() { + return LinkRole.CONTROLLER; + } + + @Override + public int getMaxPartners() { + return 1; + } + + @Override + public boolean canLinkTo(GlobalPos partner, ILinkedMultiblock partnerMachine) { + return partnerMachine instanceof StarLadderResearchHubMachine; + } + + @Override + public void addDisplayText(List textList) { + super.addDisplayText(textList); + if (!isFormed()) return; + + GlobalPos hub = getLinkedPartners().stream().findFirst().orElse(null); + if (hub == null) { + textList.add(Component.literal("No linked Research Hub").withStyle(ChatFormatting.GRAY)); + return; + } + + boolean online = getPartnerMachine(hub) != null; + textList.add(Component.literal("Research Hub: " + (online ? "Online" : "Offline")) + .withStyle(online ? ChatFormatting.GREEN : ChatFormatting.RED)); + textList.add(Component.literal(" " + LinkedMultiblockHelper.getDimensionName(hub.dimension().location())) + .withStyle(ChatFormatting.GRAY)); + textList.add(Component.literal(" [%d, %d, %d]".formatted( + hub.pos().getX(), hub.pos().getY(), hub.pos().getZ())) + .withStyle(ChatFormatting.GRAY)); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/StarLadderResearchHubMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/StarLadderResearchHubMachine.java new file mode 100644 index 000000000..651c9323c --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/StarLadderResearchHubMachine.java @@ -0,0 +1,547 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic; + +import com.ghostipedia.cosmiccore.api.capability.ILinkedMultiblock; +import com.ghostipedia.cosmiccore.api.machine.multiblock.LinkedWorkableElectricMultiblockMachine; +import com.ghostipedia.cosmiccore.client.renderer.RingUpgradePreviewRenderer; +import com.ghostipedia.cosmiccore.common.machine.multiblock.LinkedMultiblockHelper; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.StarLadderResearchHub; + +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.pattern.BlockPattern; + +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import com.lowdragmc.lowdraglib.syncdata.annotation.UpdateListener; +import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.GlobalPos; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import lombok.Getter; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class StarLadderResearchHubMachine extends LinkedWorkableElectricMultiblockMachine { + + protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( + StarLadderResearchHubMachine.class, + LinkedWorkableElectricMultiblockMachine.MANAGED_FIELD_HOLDER); + + private static final ResourceKey REQUIRED_DIMENSION = ResourceKey.create( + Registries.DIMENSION, new ResourceLocation("ad_astra", "earth_orbit")); + + @Persisted + @DescSynced + @UpdateListener(methodName = "onRingTierSynced") + @Getter + private int ringTier = 0; + + @Persisted + @DescSynced + @UpdateListener(methodName = "onRingPreviewSynced") + @Getter + private boolean ringPreviewEnabled = false; + + @Persisted + @DescSynced + @Getter + private int partialRingIndex = 0; + + public StarLadderResearchHubMachine(IMachineBlockEntity holder, Object... args) { + super(holder, args); + } + + @OnlyIn(Dist.CLIENT) + @SuppressWarnings("unused") + protected void onRingPreviewSynced(boolean newValue, boolean oldValue) { + if (newValue) { + RingUpgradePreviewRenderer.enablePreview(getPos(), getFrontFacing(), ringTier); + } else { + RingUpgradePreviewRenderer.disablePreview(getPos()); + } + } + + @OnlyIn(Dist.CLIENT) + @SuppressWarnings("unused") + protected void onRingTierSynced(int newValue, int oldValue) { + if (ringPreviewEnabled) { + RingUpgradePreviewRenderer.updatePreview(getPos(), getFrontFacing(), newValue); + } + } + + public void toggleRingPreview() { + // ringTier is 0-3, max tier is 3 + if (!isFormed() || ringTier >= 3) { + ringPreviewEnabled = false; + return; + } + ringPreviewEnabled = !ringPreviewEnabled; + } + + public boolean canUpgrade() { + // Can upgrade from 0 (to build T1) up through 2 (to build T3) + return isFormed() && ringTier < 3; + } + + public Block getNextRingBlock() { + if (!canUpgrade()) return null; + return RingUpgradePreviewRenderer.getRingBlock(ringTier + 1); + } + + public int getNextRingBlockCount() { + if (!canUpgrade()) return 0; + return RingUpgradePreviewRenderer.getRingBlockCount(ringTier + 1); + } + + public Set getNextRingPositions() { + if (!canUpgrade()) return Set.of(); + return RingUpgradePreviewRenderer.calculateRingPositions(getPos(), getFrontFacing(), ringTier + 1); + } + + public Map getNextRingPositionsWithBlocks() { + if (!canUpgrade()) return Map.of(); + return RingUpgradePreviewRenderer.calculateRingPositionsWithBlocks(getPos(), getFrontFacing(), ringTier + 1); + } + + public int autoBuildNextRing(Player player) { + if (!canUpgrade() || getLevel() == null) return 0; + + Map positionsWithBlocks = getNextRingPositionsWithBlocks(); + if (positionsWithBlocks.isEmpty()) return 0; + + boolean isCreative = player.isCreative(); + int placed = 0; + + for (Map.Entry entry : positionsWithBlocks.entrySet()) { + BlockPos pos = entry.getKey(); + Block targetBlock = entry.getValue(); + + if (!getLevel().isEmptyBlock(pos)) continue; + + if (!isCreative) { + // Find and consume a matching block from player inventory + ItemStack consumed = consumeBlockFromInventory(player, targetBlock); + if (consumed.isEmpty()) continue; // Try next position, might have different block type + } + + // Place the block + getLevel().setBlock(pos, targetBlock.defaultBlockState(), Block.UPDATE_ALL); + + // Play place sound + SoundType soundType = targetBlock.defaultBlockState().getSoundType(); + getLevel().playSound(null, pos, soundType.getPlaceSound(), SoundSource.BLOCKS, + (soundType.getVolume() + 1.0F) / 2.0F, soundType.getPitch() * 0.8F); + + placed++; + } + + return placed; + } + + private ItemStack consumeBlockFromInventory(Player player, Block targetBlock) { + for (int i = 0; i < player.getInventory().getContainerSize(); i++) { + ItemStack stack = player.getInventory().getItem(i); + if (stack.isEmpty()) continue; + + if (stack.getItem() instanceof BlockItem blockItem) { + if (blockItem.getBlock() == targetBlock) { + ItemStack consumed = stack.split(1); + if (stack.isEmpty()) { + player.getInventory().setItem(i, ItemStack.EMPTY); + } + return consumed; + } + } + } + return ItemStack.EMPTY; + } + + public int countBlocksInInventory(Player player, Block targetBlock) { + int count = 0; + for (int i = 0; i < player.getInventory().getContainerSize(); i++) { + ItemStack stack = player.getInventory().getItem(i); + if (stack.isEmpty()) continue; + + if (stack.getItem() instanceof BlockItem blockItem) { + if (blockItem.getBlock() == targetBlock) { + count += stack.getCount(); + } + } + } + return count; + } + + public int countEmptyRingPositions() { + if (!canUpgrade() || getLevel() == null) return 0; + + Map positions = getNextRingPositionsWithBlocks(); + int empty = 0; + for (BlockPos pos : positions.keySet()) { + if (getLevel().isEmptyBlock(pos)) { + empty++; + } + } + return empty; + } + + public Map countEmptyRingPositionsByBlock() { + if (!canUpgrade() || getLevel() == null) return Map.of(); + + Map positions = getNextRingPositionsWithBlocks(); + Map counts = new java.util.HashMap<>(); + for (Map.Entry entry : positions.entrySet()) { + if (getLevel().isEmptyBlock(entry.getKey())) { + counts.merge(entry.getValue(), 1, Integer::sum); + } + } + return counts; + } + + public Map getNextRingBlockCounts() { + if (!canUpgrade()) return Map.of(); + return RingUpgradePreviewRenderer.getDeltaBlockCounts(ringTier); + } + + @Override + public ManagedFieldHolder getFieldHolder() { + return MANAGED_FIELD_HOLDER; + } + + @Override + public void onStructureFormed() { + super.onStructureFormed(); + + // Use the tier from the pattern that matched during checkPattern() + this.ringTier = Math.max(0, lastMatchedTier); + this.partialRingIndex = 0; // No partial rings with strict pattern matching + + // Disable preview if max tier reached (T3 is max) + if (ringPreviewEnabled && ringTier >= 3) { + ringPreviewEnabled = false; + } + } + + @Override + public void onStructureInvalid() { + super.onStructureInvalid(); + this.ringTier = 0; + this.partialRingIndex = 0; + this.ringPreviewEnabled = false; + } + + @Override + protected InteractionResult onScrewdriverClick(Player playerIn, InteractionHand hand, + Direction gridSide, BlockHitResult hitResult) { + if (!isRemote()) { + if (playerIn.isShiftKeyDown()) { + // Shift+Screwdriver = Auto-build + return handleAutoBuild(playerIn); + } else { + // Normal Screwdriver = Toggle preview + return handlePreviewToggle(playerIn); + } + } + return super.onScrewdriverClick(playerIn, hand, gridSide, hitResult); + } + + @Override + protected InteractionResult onSoftMalletClick(Player playerIn, InteractionHand hand, + Direction gridSide, BlockHitResult hitResult) { + if (!isRemote()) { + if (playerIn.isShiftKeyDown()) { + // Shift+Soft Mallet = Debug auto-build T0 only (creative mode only) + return handleDebugBuildT0(playerIn); + } + } + return super.onSoftMalletClick(playerIn, hand, gridSide, hitResult); + } + + private InteractionResult handlePreviewToggle(Player player) { + if (canUpgrade()) { + toggleRingPreview(); + + if (ringPreviewEnabled) { + int totalCount = getNextRingBlockCount(); + player.displayClientMessage( + Component.literal("Ring Preview: ON") + .withStyle(ChatFormatting.GREEN) + .append(Component.literal(" (" + totalCount + " blocks needed)") + .withStyle(ChatFormatting.GRAY)), + true); + } else { + player.displayClientMessage( + Component.literal("Ring Preview: OFF").withStyle(ChatFormatting.RED), + true); + } + return InteractionResult.SUCCESS; + } else if (ringTier >= 3) { + player.displayClientMessage( + Component.literal("Maximum tier reached!").withStyle(ChatFormatting.GOLD), + true); + return InteractionResult.SUCCESS; + } + return InteractionResult.PASS; + } + + private InteractionResult handleAutoBuild(Player player) { + if (!canUpgrade()) { + if (ringTier >= 3) { + player.displayClientMessage( + Component.literal("Maximum tier reached!").withStyle(ChatFormatting.GOLD), + true); + } + return InteractionResult.SUCCESS; + } + + int needed = countEmptyRingPositions(); + + if (needed == 0) { + player.displayClientMessage( + Component.literal("Ring already complete! Break and rebuild structure to upgrade tier.") + .withStyle(ChatFormatting.YELLOW), + true); + return InteractionResult.SUCCESS; + } + + // Check if player has any of the required blocks (skip for creative) + if (!player.isCreative()) { + Map neededByBlock = countEmptyRingPositionsByBlock(); + boolean hasAnyBlocks = false; + for (Block block : neededByBlock.keySet()) { + if (countBlocksInInventory(player, block) > 0) { + hasAnyBlocks = true; + break; + } + } + + if (!hasAnyBlocks) { + player.displayClientMessage( + Component.literal("Missing blocks for next tier!").withStyle(ChatFormatting.RED), + true); + return InteractionResult.SUCCESS; + } + } + + int placed = autoBuildNextRing(player); + int remaining = countEmptyRingPositions(); + + if (remaining == 0) { + player.displayClientMessage( + Component.literal("Ring complete! ").withStyle(ChatFormatting.GREEN) + .append(Component.literal("Placed " + placed + " blocks.") + .withStyle(ChatFormatting.WHITE)), + true); + // Play a completion sound + getLevel().playSound(null, getPos(), SoundEvents.PLAYER_LEVELUP, SoundSource.BLOCKS, 0.5F, 1.0F); + + // Force structure re-evaluation by invalidating first, then rechecking + // This ensures onStructureFormed() is called again with the new tier + onStructureInvalid(); + getMultiblockState().setError(null); + if (checkPattern()) { + onStructureFormed(); + } + } else { + player.displayClientMessage( + Component.literal("Placed " + placed + " blocks. ").withStyle(ChatFormatting.YELLOW) + .append(Component.literal(remaining + " positions remaining.") + .withStyle(ChatFormatting.GRAY)), + true); + } + + return InteractionResult.SUCCESS; + } + + /** + * Auto-build T0 structure for easier testing. + * Only works in creative mode. Use Shift+Soft Mallet to trigger. + */ + private InteractionResult handleDebugBuildT0(Player player) { + if (!player.isCreative()) { + player.displayClientMessage( + Component.literal("Creative mode only!").withStyle(ChatFormatting.RED), + true); + return InteractionResult.SUCCESS; + } + + if (getLevel() == null) return InteractionResult.PASS; + + Map t0Positions = RingUpgradePreviewRenderer.calculateRingPositionsWithBlocks( + getPos(), getFrontFacing(), 0); + + if (t0Positions.isEmpty()) { + player.displayClientMessage( + Component.literal("No T0 positions found!").withStyle(ChatFormatting.RED), + true); + return InteractionResult.SUCCESS; + } + + int placed = 0; + int skipped = 0; + for (Map.Entry entry : t0Positions.entrySet()) { + BlockPos pos = entry.getKey(); + Block targetBlock = entry.getValue(); + + if (!getLevel().isEmptyBlock(pos)) { + skipped++; + continue; + } + + getLevel().setBlock(pos, targetBlock.defaultBlockState(), Block.UPDATE_ALL); + + SoundType soundType = targetBlock.defaultBlockState().getSoundType(); + getLevel().playSound(null, pos, soundType.getPlaceSound(), SoundSource.BLOCKS, + (soundType.getVolume() + 1.0F) / 2.0F, soundType.getPitch() * 0.8F); + + placed++; + } + + player.displayClientMessage( + Component.literal("Built T0: ").withStyle(ChatFormatting.LIGHT_PURPLE) + .append(Component.literal(placed + " blocks placed, " + skipped + " skipped") + .withStyle(ChatFormatting.WHITE)), + true); + + getLevel().playSound(null, getPos(), SoundEvents.PLAYER_LEVELUP, SoundSource.BLOCKS, 0.5F, 1.2F); + + // Force structure re-evaluation + onStructureInvalid(); + getMultiblockState().setError(null); + if (checkPattern()) { + onStructureFormed(); + } + + return InteractionResult.SUCCESS; + } + + // Cache of tier patterns for checkPattern - built lazily + private static BlockPattern[] tierPatterns; + + // Tracks which tier pattern matched during the last successful checkPattern() + // This is used by onStructureFormed() to set the correct tier + private int lastMatchedTier = -1; + + private static BlockPattern[] getTierPatterns() { + if (tierPatterns == null) { + tierPatterns = new BlockPattern[] { + StarLadderResearchHub.buildT0Pattern(), + StarLadderResearchHub.buildT1Pattern(), + StarLadderResearchHub.buildT2Pattern(), + StarLadderResearchHub.buildT3Pattern() + }; + } + return tierPatterns; + } + + @Override + public boolean checkPattern() { + // TODO: Re-enable dimension check after testing + // Check dimension requirement + // if (getLevel() != null && !getLevel().dimension().equals(REQUIRED_DIMENSION)) { + // return false; + // } + + // Try each tier pattern from T3 to T0 (highest first) + // The highest tier that matches determines the structure's tier + var state = getMultiblockState(); + + for (int tier = 3; tier >= 0; tier--) { + BlockPattern pattern = getTierPatterns()[tier]; + if (pattern.checkPatternAt(state, false)) { + lastMatchedTier = tier; + return true; + } + state.setError(null); + } + + lastMatchedTier = -1; + return false; + } + + @Override + public LinkRole getLinkRole() { + return LinkRole.REMOTE; + } + + @Override + public int getMaxPartners() { + return 1; + } + + @Override + public boolean canLinkTo(GlobalPos partner, ILinkedMultiblock partnerMachine) { + return partnerMachine instanceof StarLadderMachine; + } + + @Override + public void addDisplayText(List textList) { + super.addDisplayText(textList); + if (!isFormed()) return; + + // Display tier (0-3) + textList.add(Component.literal("Tier: T" + ringTier) + .withStyle(ChatFormatting.AQUA)); + + // Display upgrade info if not at max tier + if (canUpgrade()) { + // Show what's needed for next tier + Map neededByBlock = countEmptyRingPositionsByBlock(); + if (!neededByBlock.isEmpty()) { + textList.add(Component.literal("Next Tier (T" + (ringTier + 1) + ") Needs:") + .withStyle(ChatFormatting.GRAY)); + for (Map.Entry entry : neededByBlock.entrySet()) { + textList.add(Component.literal(" " + entry.getValue() + "x ") + .withStyle(ChatFormatting.WHITE) + .append(entry.getKey().getName().copy().withStyle(ChatFormatting.YELLOW))); + } + } + + if (ringPreviewEnabled) { + textList.add(Component.literal(" [Preview: ON]") + .withStyle(ChatFormatting.GREEN)); + } else { + textList.add(Component.literal(" [Screwdriver: preview | Shift: build]") + .withStyle(ChatFormatting.DARK_GRAY)); + } + } else if (ringTier >= 3) { + textList.add(Component.literal("Maximum tier reached!") + .withStyle(ChatFormatting.GOLD)); + } + + GlobalPos ladder = getLinkedPartners().stream().findFirst().orElse(null); + if (ladder == null) { + textList.add(Component.literal("Not linked to Star Ladder").withStyle(ChatFormatting.GRAY)); + return; + } + + boolean online = getPartnerMachine(ladder) != null; + textList.add(Component.literal("Star Ladder: " + (online ? "Online" : "Offline")) + .withStyle(online ? ChatFormatting.GREEN : ChatFormatting.RED)); + textList.add(Component.literal(" " + LinkedMultiblockHelper.getDimensionName(ladder.dimension().location())) + .withStyle(ChatFormatting.GRAY)); + textList.add(Component.literal(" [%d, %d, %d]".formatted( + ladder.pos().getX(), ladder.pos().getY(), ladder.pos().getZ())) + .withStyle(ChatFormatting.GRAY)); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/modular/MultiblockInit.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/modular/MultiblockInit.java index 16b5dffa1..06a75602f 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/modular/MultiblockInit.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/modular/MultiblockInit.java @@ -1,34 +1,33 @@ package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.modular; -import com.ghostipedia.cosmiccore.common.data.CosmicModularMachines; import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.*; -import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.modular.VomahineShredder.ShredderMultiblock; // Class for Bulk-Init public class MultiblockInit { public static void init() { // Vomahine Modular Hardware - ShredderMultiblock.init(); + // ShredderMultiblock.init(); // MegaStructures PrismaticOreFoundry.init(); StellarIris.init(); - StellarStarBallast.init(); + StellarSmeltingModule.init(); + // StellarStarBallast.init(); HemophagicTransfuser.init(); PlasmiteDistillery.init(); HeavyAssembler.init(); PCBFoundry.init(); WelderMulti.init(); CryogenicsChamber.init(); - StarLadder.init(); + // StarLadderOld.init(); VoidMiner.init(); FluidVoidRig.init(); VoraxReactor.init(); SpiritCrucible.init(); AtmoPump.init(); DroneStation.init(); - CosmicModularMachines.init(); + // CosmicModularMachines.init(); ManaDigitizer.init(); ArcaneDistillery.init(); BioVat.init(); @@ -52,5 +51,27 @@ public static void init() { SteamMixer.init(); SufferingChamber.init(); TitanFusion.init(); + DawnForge.init(); + MegaProductionAlveary.init(); + ManaEtchingFactory.init(); + ArcaneCrucible.init(); + CinderHearth.init(); + PyrothermicRefinery.init(); + EclipsedDawnForge.init(); + WASP.init(); + LARVA.init(); + Roaster.init(); + VileFissionReactor.init(); + VoidSaltReactor.init(); + AtomicReconstructor.init(); + DivingBell.init(); + LinkTestStation.init(); + StarLadder.init(); + StarLadderResearchHub.init(); + // KryosynCrackingChamber.init(); + + // Cargo Moths System + MothCargoStation.init(); + MothCargoDropOff.init(); } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/modular/StarLadder.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/modular/StarLadderOld.java similarity index 96% rename from src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/modular/StarLadder.java rename to src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/modular/StarLadderOld.java index e95ae7002..1940c34a8 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/modular/StarLadder.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/modular/StarLadderOld.java @@ -41,9 +41,9 @@ import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; import static com.gregtechceu.gtceu.api.pattern.Predicates.*; -public class StarLadder extends WorkableElectricMultiblockMachine implements IMultiblockProvider { +public class StarLadderOld extends WorkableElectricMultiblockMachine implements IMultiblockProvider { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(StarLadder.class, + protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(StarLadderOld.class, WorkableElectricMultiblockMachine.MANAGED_FIELD_HOLDER); @Nullable protected EnergyContainerList inputEnergyContainers; @@ -52,7 +52,7 @@ public class StarLadder extends WorkableElectricMultiblockMachine implements IMu protected boolean isFuelable; private final Collection starLadderReceivers = ConcurrentHashMap.newKeySet(); - public StarLadder(IMachineBlockEntity holder, Object... args) { + public StarLadderOld(IMachineBlockEntity holder, Object... args) { super(holder, args); } @@ -126,7 +126,8 @@ public void isfuelable(boolean fuelable) { // .addTooltips(Component.translatable("gtceu.multiblock.pattern.error.coils")); // } - public static final MultiblockMachineDefinition STAR_LADDER = REGISTRATE.multiblock("star_ladder", StarLadder::new) + public static final MultiblockMachineDefinition STAR_LADDER = REGISTRATE + .multiblock("star_ladder", StarLadderOld::new) .rotationState(RotationState.NON_Y_AXIS) .recipeType(GTRecipeTypes.DUMMY_RECIPES) .recipeModifier(GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK_SUBTICK)) diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/BeeHolderPartMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/BeeHolderPartMachine.java new file mode 100644 index 000000000..1e7152a1c --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/BeeHolderPartMachine.java @@ -0,0 +1,113 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.part; + +import com.ghostipedia.cosmiccore.api.CosmicGuiTextures; + +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.gui.fancy.FancyMachineUIWidget; +import com.gregtechceu.gtceu.api.gui.widget.BlockableSlotWidget; +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; +import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; +import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; + +import com.lowdragmc.lowdraglib.gui.modular.ModularUI; +import com.lowdragmc.lowdraglib.gui.widget.ImageWidget; +import com.lowdragmc.lowdraglib.gui.widget.Widget; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; + +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; + +import forestry.api.ForestryCapabilities; +import forestry.api.apiculture.genetics.IBee; +import forestry.api.genetics.IIndividual; +import forestry.api.genetics.capability.IIndividualHandlerItem; +import lombok.Getter; +import lombok.Setter; +import org.jetbrains.annotations.NotNull; + +public class BeeHolderPartMachine extends MultiblockPartMachine implements IMachineLife, IFancyUIMachine { + + @Persisted + @Getter + private final BeeHolderHandler heldBees; + @Getter + @Setter + @Persisted + @DescSynced + public boolean isLocked; + + protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( + BeeHolderPartMachine.class, MultiblockPartMachine.MANAGED_FIELD_HOLDER); + + public BeeHolderPartMachine(IMachineBlockEntity holder) { + super(holder); + heldBees = new BeeHolderHandler(this); + } + + public class BeeHolderHandler extends NotifiableItemStackHandler { + + public BeeHolderHandler(MetaMachine machine) { + super(machine, 4, IO.IN, IO.BOTH, size -> new CustomItemStackHandler(size) { + + @Override + public int getSlotLimit(int slot) { + return 4; + } + }); + } + + @Override + public int getSlotLimit(int slot) { + return 4; + } + + @Override + public @NotNull ItemStack extractItem(int slot, int amount, boolean simulate) { + if (!isLocked()) { + return super.extractItem(slot, amount, simulate); + } + return ItemStack.EMPTY; + } + + @Override + public boolean isItemValid(int slot, @NotNull ItemStack stack) { + var optionalForgeCap = stack.getCapability(ForestryCapabilities.INDIVIDUAL_HANDLER_ITEM, null); + if (!optionalForgeCap.isPresent()) return false; + IIndividualHandlerItem cap = optionalForgeCap.resolve().get(); + IIndividual individual = cap.getIndividual(); + return individual instanceof IBee bee; + } + } + + @Override + public Widget createUIWidget() { + return new WidgetGroup(0, 0, 176, 65) + .addWidget(new ImageWidget(8, 5, 160, 60, CosmicGuiTextures.BEE_HOLDER_OVERLAY)) + .addWidget(new BlockableSlotWidget(heldBees, 0, 37, 26).setIsBlocked(this::isLocked) + .setBackground(GuiTextures.SLOT, CosmicGuiTextures.BEE_OVERLAY)) + .addWidget(new BlockableSlotWidget(heldBees, 1, 65, 26).setIsBlocked(this::isLocked) + .setBackground(GuiTextures.SLOT, CosmicGuiTextures.BEE_OVERLAY)) + .addWidget(new BlockableSlotWidget(heldBees, 2, 93, 26).setIsBlocked(this::isLocked) + .setBackground(GuiTextures.SLOT, CosmicGuiTextures.BEE_OVERLAY)) + .addWidget(new BlockableSlotWidget(heldBees, 3, 121, 26).setIsBlocked(this::isLocked) + .setBackground(GuiTextures.SLOT, CosmicGuiTextures.BEE_OVERLAY)); + } + + @Override + public ModularUI createUI(Player entityPlayer) { + return new ModularUI(176, 65, this, entityPlayer).widget(new FancyMachineUIWidget(this, 176, 65)); + } + + @Override + public ManagedFieldHolder getFieldHolder() { + return MANAGED_FIELD_HOLDER; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/EmberHatchPartMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/EmberHatchPartMachine.java index 7576b5ca2..805464532 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/EmberHatchPartMachine.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/EmberHatchPartMachine.java @@ -28,6 +28,7 @@ public class EmberHatchPartMachine extends TieredIOPartMachine { // Cache that updates when emberContainer.capability updates, synced for the UI @DescSynced + @Persisted public double cachedEmber = 0; @Persisted @@ -58,11 +59,11 @@ public Widget createUIWidget() { } public static double getMaxCapacity(int tier) { - return Math.pow(tier, 2) * 1000; + return 1000 * Math.pow(4, tier); } public static double getMaxConsumption(int tier) { - return Math.pow(tier, 2) * 250; + return 500 * Math.pow(4, tier); } @Override diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/ModuleHatchPartMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/ModuleHatchPartMachine.java new file mode 100644 index 000000000..6fe1b8113 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/ModuleHatchPartMachine.java @@ -0,0 +1,124 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.part; + +import com.ghostipedia.cosmiccore.common.data.CosmicItems; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; +import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; + +import com.lowdragmc.lowdraglib.gui.widget.Widget; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; +import com.lowdragmc.lowdraglib.jei.IngredientIO; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; + +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; + +import lombok.Getter; + +import java.util.List; + +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +public class ModuleHatchPartMachine extends TieredIOPartMachine implements IMachineLife { + + protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( + ModuleHatchPartMachine.class, + TieredIOPartMachine.MANAGED_FIELD_HOLDER); + @Getter + @Persisted + private final NotifiableItemStackHandler inventory; + + public ModuleHatchPartMachine(IMachineBlockEntity holder, int tier) { + super(holder, tier, IO.IN); + this.inventory = new NotifiableItemStackHandler(this, getSlots(tier), IO.IN); + this.inventory.setFilter(ModuleHatchPartMachine::isModule); + } + + private static List MODULES = null; + + private static boolean isModule(ItemStack stack) { + if (MODULES == null) { + MODULES = List.of( + CosmicItems.PROD_MOD_1.asItem(), + CosmicItems.PROD_MOD_2.asItem(), + CosmicItems.PROD_MOD_3.asItem(), + CosmicItems.PROD_MOD_4.asItem(), + CosmicItems.PARA_MOD_1.asItem(), + CosmicItems.PARA_MOD_2.asItem(), + CosmicItems.PARA_MOD_3.asItem(), + CosmicItems.PARA_MOD_4.asItem(), + CosmicItems.RESONANT_MODULE.asItem(), + CosmicItems.PROTOCYTE_MOD.asItem(), + CosmicItems.FUSION_MODULE_MK1.asItem()); + } + return MODULES.contains(stack.getItem()); + } + + private int getSlots(int tier) { + // Always have 4 slots, change this to give different slots per tier + switch (tier) { + case GTValues.UV: + return 4; + case GTValues.UHV: + return 8; + case GTValues.UEV: + return 12; + default: + return 4; + } + } + + ////////////////////////////////////// + // ***** Initialization ******// + ////////////////////////////////////// + @Override + public ManagedFieldHolder getFieldHolder() { + return MANAGED_FIELD_HOLDER; + } + + @Override + public void onMachineRemoved() { + clearInventory(getInventory().storage); + } + + protected RecipeHandlerList getHandlerList() { + return RecipeHandlerList.NO_DATA; + } + + ////////////////////////////////////// + // ********** GUI ***********// + ////////////////////////////////////// + + @Override + public Widget createUIWidget() { + int rowSize = 4; + int colSize = this.getInventory().getSlots() / 4; + var group = new WidgetGroup(0, 0, 18 * rowSize + 16, 18 * colSize + 16); + var container = new WidgetGroup(4, 4, 18 * rowSize + 8, 18 * colSize + 8); + int index = 0; + for (int y = 0; y < colSize; y++) { + for (int x = 0; x < rowSize; x++) { + container.addWidget( + new SlotWidget(getInventory().storage, index++, 4 + x * 18, 4 + y * 18, true, io.support(IO.IN)) + .setBackgroundTexture(GuiTextures.SLOT) + .setIngredientIO(IngredientIO.INPUT)); + } + } + + container.setBackground(GuiTextures.BACKGROUND_INVERSE); + group.addWidget(container); + + return group; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/steam/WeakSteamParallelMultiBlockMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/steam/WeakSteamParallelMultiBlockMachine.java index 2abf3fca3..132a9f7b0 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/steam/WeakSteamParallelMultiBlockMachine.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/steam/WeakSteamParallelMultiBlockMachine.java @@ -1,144 +1,60 @@ package com.ghostipedia.cosmiccore.common.machine.multiblock.steam; import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; -import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; -import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.UITemplate; import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IDisplayUIMachine; -import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; -import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; -import com.gregtechceu.gtceu.api.machine.steam.SteamEnergyRecipeHandler; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; import com.gregtechceu.gtceu.api.recipe.content.ContentModifier; import com.gregtechceu.gtceu.api.recipe.modifier.ModifierFunction; import com.gregtechceu.gtceu.api.recipe.modifier.ParallelLogic; -import com.gregtechceu.gtceu.common.data.GTMaterials; -import com.gregtechceu.gtceu.config.ConfigHolder; - -import com.lowdragmc.lowdraglib.gui.modular.ModularUI; -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.widget.ComponentPanelWidget; -import com.lowdragmc.lowdraglib.gui.widget.DraggableScrollableWidgetGroup; -import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; - -import net.minecraft.ChatFormatting; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.Style; -import net.minecraft.world.entity.player.Player; +import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; +import com.gregtechceu.gtceu.common.machine.multiblock.steam.SteamParallelMultiblockMachine; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.List; - -public class WeakSteamParallelMultiBlockMachine extends WorkableMultiblockMachine implements IDisplayUIMachine { - public static final int MAX_PARALLELS = 4; +public class WeakSteamParallelMultiBlockMachine extends SteamParallelMultiblockMachine { - @Nullable - private SteamEnergyRecipeHandler steamEnergy = null; - - // if in millibuckets, this is 0.5, Meaning 2mb of steam -> 1 EU + // if in millibuckets, this is 0.5, Meaning 0.5mb of steam -> 1 EU private static final double CONVERSION_RATE = 0.5D; public WeakSteamParallelMultiBlockMachine(IMachineBlockEntity holder, Object... args) { super(holder, args); + setMaxParallels(4); } @Override - public void onStructureFormed() { - super.onStructureFormed(); - for (var part : getParts()) { - var handlers = part.getRecipeHandlers(); - for (var hl : handlers) { - if (!hl.isValid(IO.IN)) continue; - for (var fluidHandler : hl.getCapability(FluidRecipeCapability.CAP)) { - if (!(fluidHandler instanceof NotifiableFluidTank nft)) continue; - if (nft.isFluidValid(0, GTMaterials.Steam.getFluid(1)) && - PartAbility.STEAM.isApplicable(part.self().getDefinition().getBlock())) { - steamEnergy = new SteamEnergyRecipeHandler(nft, CONVERSION_RATE); - addHandlerList(RecipeHandlerList.of(IO.IN, steamEnergy)); - return; - } - - } - } - } - if (steamEnergy == null) { - onStructureInvalid(); - } + public double getConversionRate() { + return CONVERSION_RATE; } public static ModifierFunction recipeModifier(@NotNull MetaMachine machine, @NotNull GTRecipe recipe) { if (RecipeHelper.getRecipeEUtTier(recipe) > GTValues.LV) return ModifierFunction.NULL; - long euTick = RecipeHelper.getRecipeEUtTier(recipe); + // long euTick = RecipeHelper.getRecipeEUtTier(recipe); int parallel = ParallelLogic.getParallelAmount(machine, recipe, 4); - double eutMulti = (euTick * 0.5 * parallel <= 32) ? (parallel * 0.5) : (32.0 / euTick); + // double eutMulti = (euTick * 0.5 * parallel <= 32) ? (parallel * 0.5) : (32.0 / euTick); return ModifierFunction.builder() - .inputModifier(ContentModifier.multiplier(parallel)) - .outputModifier(ContentModifier.multiplier(parallel)) + .modifyAllContents(ContentModifier.multiplier(parallel)) + .eutModifier(ContentModifier.multiplier(parallel)) .durationMultiplier(parallel * 0.75) .parallels(parallel) .build(); } - @Override - public void addDisplayText(List textList) { - IDisplayUIMachine.super.addDisplayText(textList); - if (isFormed()) { - var handlers = getCapabilitiesFlat(IO.IN, EURecipeCapability.CAP); - if (!handlers.isEmpty() && handlers.get(0) instanceof SteamEnergyRecipeHandler steamHandler) { - if (steamHandler.getCapacity() > 0) { - long steamStored = steamHandler.getStored(); - textList.add(Component.translatable("gtceu.multiblock.steam.steam_stored", steamStored, - steamHandler.getCapacity())); - } - } - - if (!isWorkingEnabled()) { - textList.add(Component.translatable("gtceu.multiblock.work_paused")); - - } else if (isActive()) { - textList.add(Component.translatable("gtceu.multiblock.running")); - int currentProgress = (int) (recipeLogic.getProgressPercent() * 100); - textList.add(Component.translatable("gtceu.multiblock.parallel", MAX_PARALLELS)); - textList.add(Component.translatable("gtceu.multiblock.progress_percent", currentProgress)); - } else { - textList.add(Component.translatable("gtceu.multiblock.idling")); - } - - if (recipeLogic.isWaiting()) { - textList.add(Component.translatable("gtceu.multiblock.steam.low_steam") - .setStyle(Style.EMPTY.withColor(ChatFormatting.RED))); - } - } - } - - @Override - public IGuiTexture getScreenTexture() { - return GuiTextures.DISPLAY_STEAM.get(ConfigHolder.INSTANCE.machines.steelSteamMultiblocks); - } - - @Override - public ModularUI createUI(Player entityPlayer) { - var screen = new DraggableScrollableWidgetGroup(7, 4, 162, 121).setBackground(getScreenTexture()); - screen.addWidget(new LabelWidget(4, 5, self().getBlockState().getBlock().getDescriptionId())); - screen.addWidget(new ComponentPanelWidget(4, 17, this::addDisplayText) - .setMaxWidthLimit(150) - .clickHandler(this::handleDisplayClick)); - return new ModularUI(176, 216, this, entityPlayer) - .background(GuiTextures.BACKGROUND_STEAM.get(ConfigHolder.INSTANCE.machines.steelSteamMultiblocks)) - .widget(screen) - .widget(UITemplate.bindPlayerInventory(entityPlayer.getInventory(), - GuiTextures.SLOT_STEAM.get(ConfigHolder.INSTANCE.machines.steelSteamMultiblocks), 7, 134, - true)); + public static RecipeModifier recipeModifierCanRunAtMost(int tier) { + return (@NotNull MetaMachine machine, @NotNull GTRecipe recipe) -> { + if (RecipeHelper.getRecipeEUtTier(recipe) > tier) return ModifierFunction.NULL; + // long euTick = RecipeHelper.getRecipeEUtTier(recipe); + int parallel = ParallelLogic.getParallelAmount(machine, recipe, 4); + // double eutMulti = (euTick * 0.5 * parallel <= 32) ? (parallel * 0.5) : (32.0 / euTick); + + return ModifierFunction.builder() + .modifyAllContents(ContentModifier.multiplier(parallel)) + .eutModifier(ContentModifier.multiplier(parallel)) + .durationMultiplier(parallel * 0.75) + .parallels(parallel) + .build(); + }; } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/mob/DimensionMobScaling.java b/src/main/java/com/ghostipedia/cosmiccore/common/mob/DimensionMobScaling.java new file mode 100644 index 000000000..32d533123 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/mob/DimensionMobScaling.java @@ -0,0 +1,151 @@ +package com.ghostipedia.cosmiccore.common.mob; + +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.Level; + +import java.util.HashMap; +import java.util.Map; + +/** + * Defines mob stat scaling per dimension. + * Higher tier dimensions have stronger mobs to match progression. + */ +public final class DimensionMobScaling { + + private DimensionMobScaling() {} + + /** + * Scaling configuration for a dimension. + */ + public static class ScalingConfig { + + public final double healthMultiplier; + public final double damageMultiplier; + public final double armorMultiplier; + public final double speedMultiplier; + + public ScalingConfig(double health, double damage, double armor, double speed) { + this.healthMultiplier = health; + this.damageMultiplier = damage; + this.armorMultiplier = armor; + this.speedMultiplier = speed; + } + + /** + * Create a config with just health/damage multipliers (armor and speed unchanged). + */ + public static ScalingConfig basic(double health, double damage) { + return new ScalingConfig(health, damage, 1.0, 1.0); + } + + /** + * Create a config with all stats scaled uniformly. + */ + public static ScalingConfig uniform(double multiplier) { + return new ScalingConfig(multiplier, multiplier, multiplier, 1.0); + } + } + + // Default config for unregistered dimensions (no scaling) + public static final ScalingConfig DEFAULT = new ScalingConfig(1.0, 1.0, 1.0, 1.0); + + // Dimension -> Scaling config map + private static final Map, ScalingConfig> DIMENSION_SCALING = new HashMap<>(); + + // --- Dimension Keys --- + + // Vanilla + public static final ResourceKey NETHER = Level.NETHER; + public static final ResourceKey END = Level.END; + + // Aether + private static ResourceKey aetherDim(String name) { + return ResourceKey.create(Registries.DIMENSION, new ResourceLocation("aether", name)); + } + + public static final ResourceKey AETHER = aetherDim("the_aether"); + + // Undergarden + private static ResourceKey undergardenDim(String name) { + return ResourceKey.create(Registries.DIMENSION, new ResourceLocation("undergarden", name)); + } + + public static final ResourceKey UNDERGARDEN = undergardenDim("undergarden"); + + // Ad Astra + private static ResourceKey adAstraDim(String name) { + return ResourceKey.create(Registries.DIMENSION, new ResourceLocation("ad_astra", name)); + } + + public static final ResourceKey MOON = adAstraDim("moon"); + public static final ResourceKey MOON_ORBIT = adAstraDim("moon_orbit"); + public static final ResourceKey MARS = adAstraDim("mars"); + public static final ResourceKey MARS_ORBIT = adAstraDim("mars_orbit"); + public static final ResourceKey VENUS = adAstraDim("venus"); + public static final ResourceKey VENUS_ORBIT = adAstraDim("venus_orbit"); + public static final ResourceKey MERCURY = adAstraDim("mercury"); + public static final ResourceKey MERCURY_ORBIT = adAstraDim("mercury_orbit"); + public static final ResourceKey GLACIO = adAstraDim("glacio"); + public static final ResourceKey GLACIO_ORBIT = adAstraDim("glacio_orbit"); + public static final ResourceKey EARTH_ORBIT = adAstraDim("earth_orbit"); + + // Frontiers - The Deep Below + private static ResourceKey frontiersDim(String name) { + return ResourceKey.create(Registries.DIMENSION, new ResourceLocation("frontiers", name)); + } + + public static final ResourceKey DEEP_BELOW = frontiersDim("the_deep_below"); + + /** + * Register all dimension scaling configurations. + * Called during mod initialization. + */ + public static void registerScaling() { + // Tier 1: Nether - 2x HP, 1.5x damage + register(NETHER, ScalingConfig.basic(2.0, 1.5)); + + // Tier 2: Aether - 3x HP, 2x damage + register(AETHER, ScalingConfig.basic(3.0, 2.0)); + + // Tier 3: Undergarden - 4x HP, 2.5x damage + register(UNDERGARDEN, ScalingConfig.basic(4.0, 2.5)); + + // Tier 4: Ad Astra planets/orbits - 5x HP, 3x damage + for (ResourceKey dim : new ResourceKey[] { + MOON, MOON_ORBIT, MARS, MARS_ORBIT, VENUS, VENUS_ORBIT, + MERCURY, MERCURY_ORBIT, GLACIO, GLACIO_ORBIT, EARTH_ORBIT + }) { + register(dim, ScalingConfig.basic(5.0, 3.0)); + } + + // Tier 5: The Deep Below - 6x HP, 4x damage + register(DEEP_BELOW, ScalingConfig.basic(6.0, 4.0)); + + // The End - 2.5x HP, 2x damage (between Nether and Aether) + register(END, ScalingConfig.basic(2.5, 2.0)); + } + + /** + * Register scaling for a dimension. + */ + public static void register(ResourceKey dimension, ScalingConfig config) { + DIMENSION_SCALING.put(dimension, config); + } + + /** + * Get the scaling config for a dimension. + * Returns DEFAULT if dimension has no registered scaling. + */ + public static ScalingConfig getScaling(ResourceKey dimension) { + return DIMENSION_SCALING.getOrDefault(dimension, DEFAULT); + } + + /** + * Check if a dimension has custom scaling registered. + */ + public static boolean hasScaling(ResourceKey dimension) { + return DIMENSION_SCALING.containsKey(dimension); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/mob/MobScalingHandler.java b/src/main/java/com/ghostipedia/cosmiccore/common/mob/MobScalingHandler.java new file mode 100644 index 000000000..aae903792 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/mob/MobScalingHandler.java @@ -0,0 +1,140 @@ +package com.ghostipedia.cosmiccore.common.mob; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.mob.DimensionMobScaling.ScalingConfig; + +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.ai.attributes.AttributeInstance; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraftforge.event.entity.EntityJoinLevelEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; + +import java.util.UUID; + +/** + * Handles applying dimension-based stat scaling to mobs when they spawn/load. + */ +@Mod.EventBusSubscriber(modid = CosmicCore.MOD_ID, bus = Mod.EventBusSubscriber.Bus.FORGE) +public final class MobScalingHandler { + + private MobScalingHandler() {} + + // Unique UUIDs for our attribute modifiers + private static final UUID HEALTH_MODIFIER_UUID = UUID.fromString("c05a1c01-d1a3-5ca1-1a00-bea17bb005a1"); + private static final UUID DAMAGE_MODIFIER_UUID = UUID.fromString("c05a1c02-d1a3-5ca1-1a00-da4a3eb005a2"); + private static final UUID ARMOR_MODIFIER_UUID = UUID.fromString("c05a1c03-d1a3-5ca1-1a00-a4a04b005a03"); + private static final UUID SPEED_MODIFIER_UUID = UUID.fromString("c05a1c04-d1a3-5ca1-1a00-5beedb005a04"); + + private static final String MODIFIER_NAME = "Dimension Scaling"; + + // NBT tag to mark entities as already scaled (prevents double-scaling on chunk reload) + private static final String SCALED_TAG = "cosmiccore:dimension_scaled"; + + @SubscribeEvent + public static void onEntityJoinLevel(EntityJoinLevelEvent event) { + Entity entity = event.getEntity(); + Level level = event.getLevel(); + + // Only process on server side + if (level.isClientSide()) return; + + // Only scale hostile/neutral mobs, not players or passive animals + if (!shouldScale(entity)) return; + + LivingEntity living = (LivingEntity) entity; + + // Check if already scaled (prevents double-scaling) + if (living.getPersistentData().getBoolean(SCALED_TAG)) return; + + // Get scaling config for this dimension + ScalingConfig config = DimensionMobScaling.getScaling(level.dimension()); + + // Skip if no scaling needed + if (config == DimensionMobScaling.DEFAULT) return; + + // Apply scaling + applyScaling(living, config); + + // Mark as scaled + living.getPersistentData().putBoolean(SCALED_TAG, true); + } + + /** + * Determine if an entity should receive dimension scaling. + */ + private static boolean shouldScale(Entity entity) { + // Must be a living entity + if (!(entity instanceof LivingEntity)) return false; + + // Don't scale players + if (entity instanceof Player) return false; + + // Scale all monsters (hostile mobs) + if (entity instanceof Monster) return true; + + // Scale neutral mobs (Mob class but not Monster) + // This includes wolves, iron golems, piglins, etc. + if (entity instanceof Mob) return true; + + return false; + } + + /** + * Apply scaling modifiers to a living entity. + */ + private static void applyScaling(LivingEntity entity, ScalingConfig config) { + // Health - use MULTIPLY_BASE so it multiplies the base value + applyMultiplier(entity, Attributes.MAX_HEALTH, HEALTH_MODIFIER_UUID, config.healthMultiplier); + + // Heal to full after increasing max health + if (config.healthMultiplier > 1.0) { + entity.setHealth(entity.getMaxHealth()); + } + + // Damage + applyMultiplier(entity, Attributes.ATTACK_DAMAGE, DAMAGE_MODIFIER_UUID, config.damageMultiplier); + + // Armor + if (config.armorMultiplier != 1.0) { + applyMultiplier(entity, Attributes.ARMOR, ARMOR_MODIFIER_UUID, config.armorMultiplier); + } + + // Speed + if (config.speedMultiplier != 1.0) { + applyMultiplier(entity, Attributes.MOVEMENT_SPEED, SPEED_MODIFIER_UUID, config.speedMultiplier); + } + } + + /** + * Apply a multiplicative attribute modifier. + */ + private static void applyMultiplier(LivingEntity entity, + net.minecraft.world.entity.ai.attributes.Attribute attribute, + UUID uuid, double multiplier) { + AttributeInstance instance = entity.getAttribute(attribute); + if (instance == null) return; + + // Remove existing modifier if present + instance.removeModifier(uuid); + + // MULTIPLY_BASE means: final = base * (1 + modifier) + // So for 2x, we need modifier = 1.0 (base * 2) + // For 3x, we need modifier = 2.0 (base * 3) + double modifierValue = multiplier - 1.0; + + if (modifierValue != 0.0) { + instance.addPermanentModifier(new AttributeModifier( + uuid, + MODIFIER_NAME, + modifierValue, + AttributeModifier.Operation.MULTIPLY_BASE)); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/network/CCoreNetwork.java b/src/main/java/com/ghostipedia/cosmiccore/common/network/CCoreNetwork.java index 4942bfbca..bc7018ad3 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/network/CCoreNetwork.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/network/CCoreNetwork.java @@ -2,7 +2,14 @@ import com.ghostipedia.cosmiccore.CosmicCore; import com.ghostipedia.cosmiccore.common.network.packet.AbyssTimeWarnPacket; +import com.ghostipedia.cosmiccore.common.network.packet.BootsControlPacket; +import com.ghostipedia.cosmiccore.common.network.packet.OxygenWarnPacket; +import com.ghostipedia.cosmiccore.common.network.packet.StellarUpgradePacket; +import com.ghostipedia.cosmiccore.common.network.packet.SyncOxygenBarPacket; import com.ghostipedia.cosmiccore.common.network.packet.SyncTimeBarPacket; +import com.ghostipedia.cosmiccore.common.reflection.network.SyncQuakeMovementPacket; +import com.ghostipedia.cosmiccore.common.reflection.ui.ScarSelectionPackets; +import com.ghostipedia.cosmiccore.common.reflection.ui.VoidUIPackets; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceKey; @@ -78,5 +85,20 @@ public static void init() { INITIALIZED = true; register(SyncTimeBarPacket.class, SyncTimeBarPacket::new, NetworkDirection.PLAY_TO_CLIENT); register(AbyssTimeWarnPacket.class, AbyssTimeWarnPacket::new, NetworkDirection.PLAY_TO_CLIENT); + register(SyncOxygenBarPacket.class, SyncOxygenBarPacket::new, NetworkDirection.PLAY_TO_CLIENT); + register(OxygenWarnPacket.class, OxygenWarnPacket::new, NetworkDirection.PLAY_TO_CLIENT); + register(SyncQuakeMovementPacket.class, SyncQuakeMovementPacket::new, NetworkDirection.PLAY_TO_CLIENT); + + // Stellar IRIS upgrade packet (client -> server) + register(StellarUpgradePacket.class, StellarUpgradePacket::new, NetworkDirection.PLAY_TO_SERVER); + + // Boots control packet (client -> server) + register(BootsControlPacket.class, BootsControlPacket::new, NetworkDirection.PLAY_TO_SERVER); + + // Void UI packets + VoidUIPackets.register(); + + // Scar selection packets (Cluster of Perpetuity) + ScarSelectionPackets.register(); } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/network/packet/BootsControlPacket.java b/src/main/java/com/ghostipedia/cosmiccore/common/network/packet/BootsControlPacket.java new file mode 100644 index 000000000..56dff309a --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/network/packet/BootsControlPacket.java @@ -0,0 +1,101 @@ +package com.ghostipedia.cosmiccore.common.network.packet; + +import com.ghostipedia.cosmiccore.common.item.armor.boots.ICosmicBoots; +import com.ghostipedia.cosmiccore.common.network.CCoreNetwork; + +import com.gregtechceu.gtceu.api.item.armor.ArmorComponentItem; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.network.NetworkEvent; + +/** + * Packet sent from client to server when player presses boot control keybinds. + */ +public class BootsControlPacket implements CCoreNetwork.INetPacket { + + public enum Action { + SPEED_INCREASE, + SPEED_DECREASE, + JUMP_INCREASE, + JUMP_DECREASE, + TOGGLE_STEP, + TOGGLE_INERTIA + } + + private final Action action; + + public BootsControlPacket(Action action) { + this.action = action; + } + + public BootsControlPacket(FriendlyByteBuf buf) { + this.action = buf.readEnum(Action.class); + } + + @Override + public void encode(FriendlyByteBuf buffer) { + buffer.writeEnum(action); + } + + @Override + public void execute(NetworkEvent.Context context) { + ServerPlayer player = context.getSender(); + if (player == null) return; + + ItemStack boots = player.getItemBySlot(EquipmentSlot.FEET); + if (!isCosmicBoots(boots)) return; + + String messageKey = null; + Object messageArg = null; + + switch (action) { + case SPEED_INCREASE -> { + double newValue = ICosmicBoots.changeSpeedModifier(boots, ICosmicBoots.MODIFIER_INCREMENT); + messageKey = "cosmiccore.boots.message.speed"; + messageArg = String.format("%.0f%%", newValue * 100); + } + case SPEED_DECREASE -> { + double newValue = ICosmicBoots.changeSpeedModifier(boots, -ICosmicBoots.MODIFIER_INCREMENT); + messageKey = "cosmiccore.boots.message.speed"; + messageArg = String.format("%.0f%%", newValue * 100); + } + case JUMP_INCREASE -> { + double newValue = ICosmicBoots.changeJumpModifier(boots, ICosmicBoots.MODIFIER_INCREMENT); + messageKey = "cosmiccore.boots.message.jump"; + messageArg = String.format("%.0f%%", newValue * 100); + } + case JUMP_DECREASE -> { + double newValue = ICosmicBoots.changeJumpModifier(boots, -ICosmicBoots.MODIFIER_INCREMENT); + messageKey = "cosmiccore.boots.message.jump"; + messageArg = String.format("%.0f%%", newValue * 100); + } + case TOGGLE_STEP -> { + boolean enabled = ICosmicBoots.toggleStepAssist(boots); + messageKey = "cosmiccore.boots.message.step"; + messageArg = enabled ? "\u00a7aON" : "\u00a7cOFF"; + } + case TOGGLE_INERTIA -> { + boolean enabled = ICosmicBoots.toggleInertiaCancel(boots); + messageKey = "cosmiccore.boots.message.inertia"; + messageArg = enabled ? "\u00a7aON" : "\u00a7cOFF"; + } + } + + if (messageKey != null) { + player.displayClientMessage(Component.translatable(messageKey, messageArg), true); + } + } + + /** + * Check if the item is a CosmicCore boots item. + */ + private static boolean isCosmicBoots(ItemStack stack) { + if (stack.isEmpty()) return false; + if (!(stack.getItem() instanceof ArmorComponentItem armorItem)) return false; + return armorItem.getArmorLogic() instanceof ICosmicBoots; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/network/packet/OxygenWarnPacket.java b/src/main/java/com/ghostipedia/cosmiccore/common/network/packet/OxygenWarnPacket.java new file mode 100644 index 000000000..09b0eb498 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/network/packet/OxygenWarnPacket.java @@ -0,0 +1,38 @@ +package com.ghostipedia.cosmiccore.common.network.packet; + +import com.ghostipedia.cosmiccore.common.network.CCoreNetwork; + +import net.minecraft.client.Minecraft; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; +import net.minecraftforge.network.NetworkEvent; + +public class OxygenWarnPacket implements CCoreNetwork.INetPacket { + + private final String message; + private final int seconds; + + public OxygenWarnPacket(String message, int seconds) { + this.message = message; + this.seconds = seconds; + } + + public OxygenWarnPacket(FriendlyByteBuf buf) { + this.message = buf.readUtf(); + this.seconds = buf.readVarInt(); + } + + @Override + public void encode(FriendlyByteBuf buffer) { + buffer.writeUtf(message); + buffer.writeVarInt(seconds); + } + + @Override + public void execute(NetworkEvent.Context context) { + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> Minecraft.getInstance().execute( + () -> Minecraft.getInstance().gui.setOverlayMessage(Component.translatable(message, seconds), false))); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/network/packet/StellarUpgradePacket.java b/src/main/java/com/ghostipedia/cosmiccore/common/network/packet/StellarUpgradePacket.java new file mode 100644 index 000000000..357c3a8d4 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/network/packet/StellarUpgradePacket.java @@ -0,0 +1,75 @@ +package com.ghostipedia.cosmiccore.common.network.packet; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine; +import com.ghostipedia.cosmiccore.api.machine.multiblock.StellarIrisUpgrade; +import com.ghostipedia.cosmiccore.common.network.CCoreNetwork; + +import com.gregtechceu.gtceu.api.machine.MetaMachine; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; +import net.minecraftforge.network.NetworkEvent; + +import javax.annotation.Nullable; + +/** + * Packet for managing stellar IRIS upgrades. + * Sent from client to server to unlock or level up upgrades. + * Upgrades are permanent and cannot be refunded. + */ +public class StellarUpgradePacket implements CCoreNetwork.INetPacket { + + private final BlockPos machinePos; + @Nullable + private final StellarIrisUpgrade upgrade; + @SuppressWarnings("unused") + private final boolean isRespec; // Kept for backwards compatibility but ignored + + public StellarUpgradePacket(BlockPos machinePos, @Nullable StellarIrisUpgrade upgrade, boolean isRespec) { + this.machinePos = machinePos; + this.upgrade = upgrade; + this.isRespec = isRespec; + } + + public StellarUpgradePacket(FriendlyByteBuf buffer) { + this.machinePos = buffer.readBlockPos(); + this.isRespec = buffer.readBoolean(); // Read but ignore + if (buffer.readBoolean()) { + this.upgrade = buffer.readEnum(StellarIrisUpgrade.class); + } else { + this.upgrade = null; + } + } + + @Override + public void encode(FriendlyByteBuf buffer) { + buffer.writeBlockPos(machinePos); + buffer.writeBoolean(false); // Respec no longer supported + buffer.writeBoolean(upgrade != null); + if (upgrade != null) { + buffer.writeEnum(upgrade); + } + } + + @Override + public void execute(NetworkEvent.Context context) { + ServerPlayer player = context.getSender(); + if (player == null) return; + + // Get the machine using GTCEu's MetaMachine pattern + if (!(MetaMachine.getMachine(player.level(), machinePos) instanceof IrisMultiblockMachine machine)) { + return; + } + + // Verify player is close enough + if (player.distanceToSqr(machinePos.getX() + 0.5, machinePos.getY() + 0.5, machinePos.getZ() + 0.5) > 64) { + return; + } + + // Respec is no longer supported - upgrades are permanent + if (upgrade != null) { + machine.tryUnlockUpgrade(upgrade); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/network/packet/SyncOxygenBarPacket.java b/src/main/java/com/ghostipedia/cosmiccore/common/network/packet/SyncOxygenBarPacket.java new file mode 100644 index 000000000..554863932 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/network/packet/SyncOxygenBarPacket.java @@ -0,0 +1,45 @@ +package com.ghostipedia.cosmiccore.common.network.packet; + +import com.ghostipedia.cosmiccore.client.CosmicHudGuiOverlay; +import com.ghostipedia.cosmiccore.common.network.CCoreNetwork; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; +import net.minecraftforge.network.NetworkEvent; + +public class SyncOxygenBarPacket implements CCoreNetwork.INetPacket { + + private final long left; + private final long max; + private final boolean show; + private final double ratePerSecond; // signed ticks/sec; negative = draining + + public SyncOxygenBarPacket(long left, long max, boolean show, double ratePerSecond) { + this.left = left; + this.max = max; + this.show = show; + this.ratePerSecond = ratePerSecond; + } + + public SyncOxygenBarPacket(FriendlyByteBuf buf) { + this.left = buf.readVarLong(); + this.max = buf.readVarLong(); + this.show = buf.readBoolean(); + this.ratePerSecond = buf.readDouble(); + } + + @Override + public void encode(FriendlyByteBuf buf) { + buf.writeVarLong(left); + buf.writeVarLong(max); + buf.writeBoolean(show); + buf.writeDouble(ratePerSecond); + } + + @Override + public void execute(NetworkEvent.Context ctx) { + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, + () -> () -> CosmicHudGuiOverlay.setOxygenBar(left, max, show, ratePerSecond)); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/recipe/condition/CosmicConditions.java b/src/main/java/com/ghostipedia/cosmiccore/common/recipe/condition/CosmicConditions.java index ff6af60f0..3e4de2610 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/recipe/condition/CosmicConditions.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/recipe/condition/CosmicConditions.java @@ -4,5 +4,9 @@ public class CosmicConditions { public static void register() { TitanCondition.register(); + LinkedPartnerCondition.register(); + LinkedPartnerDimensionCondition.register(); + LinkedPartnerDimensionItemCondition.register(); + LinkedPartnerDimensionFluidCondition.register(); } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/recipe/condition/LinkedPartnerCondition.java b/src/main/java/com/ghostipedia/cosmiccore/common/recipe/condition/LinkedPartnerCondition.java new file mode 100644 index 000000000..c48d48249 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/recipe/condition/LinkedPartnerCondition.java @@ -0,0 +1,116 @@ +package com.ghostipedia.cosmiccore.common.recipe.condition; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.LinkedWorkableElectricMultiblockMachine; + +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.RecipeCondition; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; +import com.gregtechceu.gtceu.api.registry.GTRegistries; + +import net.minecraft.network.chat.Component; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import org.jetbrains.annotations.NotNull; + +/** + * Recipe condition that requires the machine to have linked partners. + *

+ * Can be configured to require: + * - A minimum number of linked partners + * - At least one partner to be formed (structure valid) + * - At least one partner to be actively working (running a recipe) + */ +public class LinkedPartnerCondition extends RecipeCondition { + + /** Minimum number of linked partners required */ + public int minPartners; + /** If true, at least one partner must have a valid structure */ + public boolean requireFormed; + /** If true, at least one partner must be actively running a recipe */ + public boolean requireWorking; + + public static final Codec CODEC = RecordCodecBuilder + .create(instance -> RecipeCondition.isReverse(instance) + .and(Codec.INT.optionalFieldOf("min_partners", 1).forGetter(val -> val.minPartners)) + .and(Codec.BOOL.optionalFieldOf("require_formed", false).forGetter(val -> val.requireFormed)) + .and(Codec.BOOL.optionalFieldOf("require_working", false).forGetter(val -> val.requireWorking)) + .apply(instance, LinkedPartnerCondition::new)); + + public static RecipeConditionType TYPE; + + public LinkedPartnerCondition(boolean isReverse, int minPartners, boolean requireFormed, boolean requireWorking) { + this.isReverse = isReverse; + this.minPartners = minPartners; + this.requireFormed = requireFormed; + this.requireWorking = requireWorking; + } + + public LinkedPartnerCondition(int minPartners, boolean requireFormed, boolean requireWorking) { + this(false, minPartners, requireFormed, requireWorking); + } + + public LinkedPartnerCondition(int minPartners) { + this(false, minPartners, false, false); + } + + public LinkedPartnerCondition() { + this(1); + } + + public static void register() { + TYPE = GTRegistries.RECIPE_CONDITIONS.register("linked_partner", + new RecipeConditionType<>(LinkedPartnerCondition::new, LinkedPartnerCondition.CODEC)); + } + + @Override + public RecipeConditionType getType() { + return TYPE; + } + + @Override + public Component getTooltips() { + if (requireWorking) { + return Component.translatable("cosmiccore.recipe.condition.linked_partner.working", minPartners); + } else if (requireFormed) { + return Component.translatable("cosmiccore.recipe.condition.linked_partner.formed", minPartners); + } else { + return Component.translatable("cosmiccore.recipe.condition.linked_partner.tooltip", minPartners); + } + } + + @Override + protected boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic recipeLogic) { + if (!(recipeLogic.getMachine() instanceof LinkedWorkableElectricMultiblockMachine linkedMachine)) { + return false; + } + + // Check minimum partner count + int partnerCount = linkedMachine.getLinkedPartners().size(); + if (partnerCount < minPartners) { + return false; + } + + // Check if any partner needs to be formed + if (requireFormed) { + if (linkedMachine.countFormedPartners() < 1) { + return false; + } + } + + // Check if any partner needs to be working + if (requireWorking) { + if (!linkedMachine.anyPartnerWorking()) { + return false; + } + } + + return true; + } + + @Override + public RecipeCondition createTemplate() { + return new LinkedPartnerCondition(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/recipe/condition/LinkedPartnerDimensionCondition.java b/src/main/java/com/ghostipedia/cosmiccore/common/recipe/condition/LinkedPartnerDimensionCondition.java new file mode 100644 index 000000000..817bc53d4 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/recipe/condition/LinkedPartnerDimensionCondition.java @@ -0,0 +1,92 @@ +package com.ghostipedia.cosmiccore.common.recipe.condition; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.LinkedWorkableElectricMultiblockMachine; + +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.RecipeCondition; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; +import com.gregtechceu.gtceu.api.registry.GTRegistries; + +import net.minecraft.core.GlobalPos; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import org.jetbrains.annotations.NotNull; + +/** + * Recipe condition that requires a linked partner to be in a specific dimension. + *

+ * Use cases: + * - "Requires partner in Sun Orbit" for solar plasma collection + * - "Requires partner in The Deep Below" for mining operations + * - "Requires partner in Moon" for low-gravity processing + */ +public class LinkedPartnerDimensionCondition extends RecipeCondition { + + /** The dimension the partner must be in */ + public ResourceLocation dimension; + + public static final Codec CODEC = RecordCodecBuilder + .create(instance -> RecipeCondition.isReverse(instance) + .and(ResourceLocation.CODEC.fieldOf("dimension").forGetter(val -> val.dimension)) + .apply(instance, LinkedPartnerDimensionCondition::new)); + + public static RecipeConditionType TYPE; + + public LinkedPartnerDimensionCondition(boolean isReverse, ResourceLocation dimension) { + this.isReverse = isReverse; + this.dimension = dimension; + } + + public LinkedPartnerDimensionCondition(ResourceLocation dimension) { + this(false, dimension); + } + + public LinkedPartnerDimensionCondition(String dimension) { + this(false, new ResourceLocation(dimension)); + } + + public LinkedPartnerDimensionCondition() { + this.dimension = new ResourceLocation("minecraft:overworld"); + } + + public static void register() { + TYPE = GTRegistries.RECIPE_CONDITIONS.register("linked_partner_dimension", + new RecipeConditionType<>(LinkedPartnerDimensionCondition::new, LinkedPartnerDimensionCondition.CODEC)); + } + + @Override + public RecipeConditionType getType() { + return TYPE; + } + + @Override + public Component getTooltips() { + return Component.translatable("cosmiccore.recipe.condition.linked_partner_dimension.tooltip", + dimension.toString()); + } + + @Override + protected boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic recipeLogic) { + if (!(recipeLogic.getMachine() instanceof LinkedWorkableElectricMultiblockMachine linkedMachine)) { + return false; + } + + // Check if any linked partner is in the required dimension + for (GlobalPos partner : linkedMachine.getLinkedPartners()) { + if (partner.dimension().location().equals(dimension)) { + return true; + } + } + + return false; + } + + @Override + public RecipeCondition createTemplate() { + return new LinkedPartnerDimensionCondition(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/recipe/condition/LinkedPartnerDimensionFluidCondition.java b/src/main/java/com/ghostipedia/cosmiccore/common/recipe/condition/LinkedPartnerDimensionFluidCondition.java new file mode 100644 index 000000000..91af45cd8 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/recipe/condition/LinkedPartnerDimensionFluidCondition.java @@ -0,0 +1,136 @@ +package com.ghostipedia.cosmiccore.common.recipe.condition; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.LinkedWorkableElectricMultiblockMachine; +import com.ghostipedia.cosmiccore.common.machine.multiblock.LinkedMultiblockHelper; + +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.RecipeCondition; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; +import com.gregtechceu.gtceu.api.registry.GTRegistries; + +import net.minecraft.core.GlobalPos; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.material.Fluid; +import net.minecraftforge.fluids.FluidStack; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import org.jetbrains.annotations.NotNull; + +import java.util.UUID; + +/** + * Recipe condition that requires a linked partner in a specific dimension + * to have a specific fluid in its input hatches. + *

+ * Use cases: + * - "Requires partner in Sun Orbit with Solar Plasma" + * - "Requires partner in Deep Below with Molten Core fluid" + */ +public class LinkedPartnerDimensionFluidCondition extends RecipeCondition { + + public ResourceLocation dimension; + public ResourceLocation fluidId; + public int minAmount; + + public static final Codec CODEC = RecordCodecBuilder + .create(instance -> RecipeCondition.isReverse(instance) + .and(ResourceLocation.CODEC.fieldOf("dimension").forGetter(val -> val.dimension)) + .and(ResourceLocation.CODEC.fieldOf("fluid").forGetter(val -> val.fluidId)) + .and(Codec.INT.optionalFieldOf("amount", 1000).forGetter(val -> val.minAmount)) + .apply(instance, LinkedPartnerDimensionFluidCondition::new)); + + public static RecipeConditionType TYPE; + + public LinkedPartnerDimensionFluidCondition(boolean isReverse, ResourceLocation dimension, ResourceLocation fluidId, + int minAmount) { + this.isReverse = isReverse; + this.dimension = dimension; + this.fluidId = fluidId; + this.minAmount = minAmount; + } + + public LinkedPartnerDimensionFluidCondition(ResourceLocation dimension, ResourceLocation fluidId, int minAmount) { + this(false, dimension, fluidId, minAmount); + } + + public LinkedPartnerDimensionFluidCondition(String dimension, Fluid fluid, int minAmount) { + this(false, new ResourceLocation(dimension), BuiltInRegistries.FLUID.getKey(fluid), minAmount); + } + + public LinkedPartnerDimensionFluidCondition(String dimension, Fluid fluid) { + this(dimension, fluid, 1000); + } + + public LinkedPartnerDimensionFluidCondition() { + this.dimension = new ResourceLocation("minecraft:overworld"); + this.fluidId = new ResourceLocation("minecraft:water"); + this.minAmount = 1000; + } + + public static void register() { + TYPE = GTRegistries.RECIPE_CONDITIONS.register("linked_partner_dimension_fluid", + new RecipeConditionType<>(LinkedPartnerDimensionFluidCondition::new, + LinkedPartnerDimensionFluidCondition.CODEC)); + } + + @Override + public RecipeConditionType getType() { + return TYPE; + } + + @Override + public Component getTooltips() { + Fluid fluid = BuiltInRegistries.FLUID.get(fluidId); + String fluidName = new FluidStack(fluid, 1000).getDisplayName().getString(); + return Component.translatable("cosmiccore.recipe.condition.linked_partner_dimension_fluid.tooltip", + minAmount, fluidName, dimension.toString()); + } + + @Override + protected boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic recipeLogic) { + if (!(recipeLogic.getMachine() instanceof LinkedWorkableElectricMultiblockMachine linkedMachine)) { + return false; + } + + if (!(linkedMachine.getLevel() instanceof ServerLevel serverLevel)) { + return false; + } + + UUID owner = linkedMachine.getTeamUUID(); + if (owner == null) return false; + + GlobalPos myPos = linkedMachine.getGlobalPos(); + Fluid targetFluid = BuiltInRegistries.FLUID.get(fluidId); + + // Check each partner in the required dimension + for (GlobalPos partner : linkedMachine.getLinkedPartners()) { + if (!partner.dimension().location().equals(dimension)) { + continue; + } + + // Check if this partner has the required fluid + boolean hasFluid = LinkedMultiblockHelper.partnerHasFluid( + serverLevel.getServer(), + owner, + myPos, + partner, + (FluidStack stack) -> stack.getFluid().isSame(targetFluid) && stack.getAmount() >= minAmount); + + if (hasFluid) { + return true; + } + } + + return false; + } + + @Override + public RecipeCondition createTemplate() { + return new LinkedPartnerDimensionFluidCondition(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/recipe/condition/LinkedPartnerDimensionItemCondition.java b/src/main/java/com/ghostipedia/cosmiccore/common/recipe/condition/LinkedPartnerDimensionItemCondition.java new file mode 100644 index 000000000..6a3f88aea --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/recipe/condition/LinkedPartnerDimensionItemCondition.java @@ -0,0 +1,136 @@ +package com.ghostipedia.cosmiccore.common.recipe.condition; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.LinkedWorkableElectricMultiblockMachine; +import com.ghostipedia.cosmiccore.common.machine.multiblock.LinkedMultiblockHelper; + +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.RecipeCondition; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; +import com.gregtechceu.gtceu.api.registry.GTRegistries; + +import net.minecraft.core.GlobalPos; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import org.jetbrains.annotations.NotNull; + +import java.util.UUID; + +/** + * Recipe condition that requires a linked partner in a specific dimension + * to have a specific item in its input hatches. + *

+ * Use cases: + * - "Requires partner in Sun Orbit with Solar Collector item" + * - "Requires partner in Moon with Helium-3 canister" + */ +public class LinkedPartnerDimensionItemCondition extends RecipeCondition { + + public ResourceLocation dimension; + public ResourceLocation itemId; + public int minCount; + + public static final Codec CODEC = RecordCodecBuilder + .create(instance -> RecipeCondition.isReverse(instance) + .and(ResourceLocation.CODEC.fieldOf("dimension").forGetter(val -> val.dimension)) + .and(ResourceLocation.CODEC.fieldOf("item").forGetter(val -> val.itemId)) + .and(Codec.INT.optionalFieldOf("count", 1).forGetter(val -> val.minCount)) + .apply(instance, LinkedPartnerDimensionItemCondition::new)); + + public static RecipeConditionType TYPE; + + public LinkedPartnerDimensionItemCondition(boolean isReverse, ResourceLocation dimension, ResourceLocation itemId, + int minCount) { + this.isReverse = isReverse; + this.dimension = dimension; + this.itemId = itemId; + this.minCount = minCount; + } + + public LinkedPartnerDimensionItemCondition(ResourceLocation dimension, ResourceLocation itemId, int minCount) { + this(false, dimension, itemId, minCount); + } + + public LinkedPartnerDimensionItemCondition(String dimension, Item item, int minCount) { + this(false, new ResourceLocation(dimension), BuiltInRegistries.ITEM.getKey(item), minCount); + } + + public LinkedPartnerDimensionItemCondition(String dimension, Item item) { + this(dimension, item, 1); + } + + public LinkedPartnerDimensionItemCondition() { + this.dimension = new ResourceLocation("minecraft:overworld"); + this.itemId = new ResourceLocation("minecraft:stone"); + this.minCount = 1; + } + + public static void register() { + TYPE = GTRegistries.RECIPE_CONDITIONS.register("linked_partner_dimension_item", + new RecipeConditionType<>(LinkedPartnerDimensionItemCondition::new, + LinkedPartnerDimensionItemCondition.CODEC)); + } + + @Override + public RecipeConditionType getType() { + return TYPE; + } + + @Override + public Component getTooltips() { + Item item = BuiltInRegistries.ITEM.get(itemId); + String itemName = item.getDescription().getString(); + return Component.translatable("cosmiccore.recipe.condition.linked_partner_dimension_item.tooltip", + minCount, itemName, dimension.toString()); + } + + @Override + protected boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic recipeLogic) { + if (!(recipeLogic.getMachine() instanceof LinkedWorkableElectricMultiblockMachine linkedMachine)) { + return false; + } + + if (!(linkedMachine.getLevel() instanceof ServerLevel serverLevel)) { + return false; + } + + UUID owner = linkedMachine.getTeamUUID(); + if (owner == null) return false; + + GlobalPos myPos = linkedMachine.getGlobalPos(); + Item targetItem = BuiltInRegistries.ITEM.get(itemId); + + // Check each partner in the required dimension + for (GlobalPos partner : linkedMachine.getLinkedPartners()) { + if (!partner.dimension().location().equals(dimension)) { + continue; + } + + // Check if this partner has the required item + boolean hasItem = LinkedMultiblockHelper.partnerHasItem( + serverLevel.getServer(), + owner, + myPos, + partner, + (ItemStack stack) -> stack.is(targetItem) && stack.getCount() >= minCount); + + if (hasItem) { + return true; + } + } + + return false; + } + + @Override + public RecipeCondition createTemplate() { + return new LinkedPartnerDimensionItemCondition(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/IReflection.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/IReflection.java new file mode 100644 index 000000000..958527257 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/IReflection.java @@ -0,0 +1,225 @@ +package com.ghostipedia.cosmiccore.common.reflection; + +import net.minecraft.resources.ResourceLocation; + +import java.util.Map; +import java.util.Set; + +/** + * Interface for the Reflection capability - tracks player soul erosion and bargains. + * The Reflection is YOU - a fragment of self that remembers what you were before immortality. + */ +public interface IReflection { + + // ---- Shards (Currency) ---- + + /** + * @return current shard balance (Shards of Perpetuity consumed via right-click) + */ + int getShardBalance(); + + /** + * Sets shard balance. + */ + void setShardBalance(int shards); + + /** + * Adds shards to balance. + */ + void addShards(int amount); + + /** + * Attempts to spend shards. Returns true if successful. + */ + boolean spendShards(int amount); + + // ---- Soul Capacity ---- + + /** + * @return base soul capacity (default 100, can be expanded) + */ + int getBaseCapacity(); + + /** + * Sets base capacity (for permanent expansions). + */ + void setBaseCapacity(int capacity); + + /** + * @return bonus capacity from gear/temporary effects + */ + int getBonusCapacity(); + + /** + * Sets bonus capacity (from curios, armor, etc.). + */ + void setBonusCapacity(int bonus); + + /** + * @return total capacity (base + bonus) + */ + default int getTotalCapacity() { + return getBaseCapacity() + getBonusCapacity(); + } + + /** + * @return current weight used by active bargains + */ + int getUsedCapacity(); + + /** + * @return remaining capacity available + */ + default int getRemainingCapacity() { + return getTotalCapacity() - getUsedCapacity(); + } + + /** + * Check if a bargain can fit within current capacity. + */ + default boolean canFitBargain(int weight) { + return getRemainingCapacity() >= weight; + } + + // ---- Erosion ---- + + /** + * @return total erosion accumulated (1 death = 1 erosion, bargains add more) + */ + int getErosion(); + + /** + * Sets total erosion value. + */ + void setErosion(int erosion); + + /** + * Adds erosion. Use for deaths, bargains, power usage. + */ + void addErosion(int amount); + + /** + * @return total number of deaths tracked + */ + int getDeathCount(); + + /** + * Increment death counter and add 1 erosion. + */ + void recordDeath(); + + // ---- Bargains ---- + + /** + * @return set of bargain IDs the player has accepted + */ + Set getActiveBargains(); + + /** + * @return true if player has this bargain active + */ + boolean hasBargain(ResourceLocation bargainId); + + /** + * Accept a bargain. Does NOT add erosion - caller should handle cost. + */ + void acceptBargain(ResourceLocation bargainId); + + /** + * Defy (remove) a bargain. The scar remains tracked separately. + */ + void defy(ResourceLocation bargainId); + + /** + * @return set of bargain IDs that have been defied (scars) + */ + Set getDefianceScars(); + + /** + * @return true if this bargain was defied (scarred) + */ + boolean hasDefianceScar(ResourceLocation bargainId); + + /** + * Remove a defiance scar, allowing the bargain to be accepted again. + * Used by Clusters of Perpetuity. + */ + void removeScar(ResourceLocation bargainId); + + // ---- Threshold Tracking ---- + + /** + * @return the highest threshold index the player has seen (0-9) + */ + int getHighestThresholdSeen(); + + /** + * Mark a threshold as seen. + */ + void setHighestThresholdSeen(int threshold); + + // ---- First Encounter ---- + + /** + * @return true if the reflection has awakened (first deaths occurred) + */ + boolean hasAwakened(); + + /** + * Mark the reflection as awakened. + */ + void setAwakened(boolean awakened); + + /** + * @return true if the awakening sequence (first bargain offer) has been shown + */ + boolean hasCompletedAwakeningSequence(); + + /** + * Mark the awakening sequence as completed. + */ + void setAwakeningSequenceCompleted(boolean completed); + + // ---- Command Usage Tracking ---- + + /** + * Get recent usage count for a command (for cost escalation). + * + * @param commandId the command identifier (e.g., "home", "back") + * @return number of uses in the current escalation window + */ + int getCommandUsageCount(String commandId); + + /** + * Record a command use. + */ + void recordCommandUse(String commandId); + + /** + * Reset command usage (called when cooldown expires). + */ + void resetCommandUsage(String commandId); + + /** + * @return timestamp of last command use for cooldown tracking + */ + long getLastCommandUseTime(String commandId); + + // ---- Memory / Context ---- + + /** + * Store arbitrary data for whisper/dialogue context. + * Examples: death causes, dimensions visited, etc. + */ + Map getMemory(); + + /** + * Increment a memory counter. + */ + void rememberEvent(String eventKey); + + /** + * Get count for a specific memory. + */ + int getMemoryCount(String eventKey); +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ReflectionCapability.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ReflectionCapability.java new file mode 100644 index 000000000..a073ad797 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ReflectionCapability.java @@ -0,0 +1,89 @@ +package com.ghostipedia.cosmiccore.common.reflection; + +import com.ghostipedia.cosmiccore.CosmicCore; + +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraftforge.common.capabilities.*; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.event.AttachCapabilitiesEvent; +import net.minecraftforge.event.entity.player.PlayerEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; + +import java.util.Optional; + +import javax.annotation.Nullable; + +/** + * Capability provider for the Reflection system. + * Handles attachment to players and persistence across death/respawn. + */ +@Mod.EventBusSubscriber(modid = CosmicCore.MOD_ID) +public class ReflectionCapability { + + private ReflectionCapability() {} + + public static final Capability CAP = CapabilityManager.get(new CapabilityToken<>() {}); + + /** + * Get the reflection data for a player. + */ + public static Optional get(Player player) { + return player.getCapability(CAP).resolve(); + } + + /** + * Get the reflection data, or throw if not present. + */ + public static IReflection getOrThrow(Player player) { + return get(player).orElseThrow(() -> new IllegalStateException("Player missing Reflection capability")); + } + + public static class Provider implements ICapabilityProvider, ICapabilitySerializable { + + private final ReflectionData impl = new ReflectionData(); + private final LazyOptional opt = LazyOptional.of(() -> impl); + + @Override + public LazyOptional getCapability(Capability cap, @Nullable Direction side) { + return cap == CAP ? opt.cast() : LazyOptional.empty(); + } + + @Override + public CompoundTag serializeNBT() { + return impl.saveTag(); + } + + @Override + public void deserializeNBT(CompoundTag nbt) { + impl.loadTag(nbt); + } + } + + @SubscribeEvent + public static void registerCaps(RegisterCapabilitiesEvent event) { + event.register(IReflection.class); + } + + @SubscribeEvent + public static void attach(AttachCapabilitiesEvent event) { + if (event.getObject() instanceof Player) { + event.addCapability(CosmicCore.id("reflection"), new Provider()); + } + } + + @SubscribeEvent + public static void clone(PlayerEvent.Clone event) { + // Preserve reflection data across death/respawn and dimension changes + event.getOriginal().reviveCaps(); + event.getOriginal().getCapability(CAP).ifPresent(old -> event.getEntity().getCapability(CAP).ifPresent(now -> { + if (now instanceof ReflectionData newCap && old instanceof ReflectionData oldCap) { + newCap.loadTag(oldCap.saveTag()); + } + })); + event.getOriginal().invalidateCaps(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ReflectionCommand.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ReflectionCommand.java new file mode 100644 index 000000000..c257a4781 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ReflectionCommand.java @@ -0,0 +1,311 @@ +package com.ghostipedia.cosmiccore.common.reflection; + +import com.ghostipedia.cosmiccore.common.network.CCoreNetwork; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.BargainRegistry; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.QuakeMovementBargain; +import com.ghostipedia.cosmiccore.common.reflection.network.SyncQuakeMovementPacket; +import com.ghostipedia.cosmiccore.common.reflection.ui.VoidUIPackets; + +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.Commands; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; + +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.arguments.IntegerArgumentType; +import com.mojang.brigadier.arguments.StringArgumentType; + +/** + * Debug/test commands for the Reflection system. + * /reflection status - Show current erosion, deaths, bargains + * /reflection add_erosion - Add erosion + * /reflection accept - Accept a bargain + * /reflection defy - Defy a bargain + * /reflection awaken - Force awakening + * /reflection reset - Reset all reflection data + */ +public class ReflectionCommand { + + public static void register(CommandDispatcher dispatcher) { + dispatcher.register( + Commands.literal("reflection") + .requires(source -> source.hasPermission(2)) // Op level 2 + .then(Commands.literal("status") + .executes(ctx -> showStatus(ctx.getSource()))) + .then(Commands.literal("add_erosion") + .then(Commands.argument("amount", IntegerArgumentType.integer(1, 1000)) + .executes(ctx -> addErosion(ctx.getSource(), + IntegerArgumentType.getInteger(ctx, "amount"))))) + .then(Commands.literal("accept") + .then(Commands.argument("bargain", StringArgumentType.string()) + .executes(ctx -> acceptBargain(ctx.getSource(), + StringArgumentType.getString(ctx, "bargain"))))) + .then(Commands.literal("defy") + .then(Commands.argument("bargain", StringArgumentType.string()) + .executes(ctx -> defyBargain(ctx.getSource(), + StringArgumentType.getString(ctx, "bargain"))))) + .then(Commands.literal("awaken") + .executes(ctx -> forceAwaken(ctx.getSource()))) + .then(Commands.literal("reset") + .executes(ctx -> resetData(ctx.getSource()))) + .then(Commands.literal("list_bargains") + .executes(ctx -> listBargains(ctx.getSource()))) + .then(Commands.literal("mirror") + .executes(ctx -> openMirror(ctx.getSource())) + .then(Commands.argument("bargain", StringArgumentType.string()) + .executes(ctx -> openMirrorWithBargain(ctx.getSource(), + StringArgumentType.getString(ctx, "bargain")))))); + } + + private static int showStatus(CommandSourceStack source) { + ServerPlayer player = source.getPlayer(); + if (player == null) { + source.sendFailure(Component.literal("Must be run by a player")); + return 0; + } + + ReflectionCapability.get(player).ifPresentOrElse(reflection -> { + source.sendSuccess(() -> Component.literal("=== Reflection Status ==="), false); + source.sendSuccess(() -> Component.literal("Erosion: " + reflection.getErosion()), false); + source.sendSuccess(() -> Component.literal("Deaths: " + reflection.getDeathCount()), false); + source.sendSuccess(() -> Component.literal("Awakened: " + reflection.hasAwakened()), false); + source.sendSuccess(() -> Component.literal("Threshold: " + reflection.getHighestThresholdSeen() + + " (current: " + ReflectionConstants.getThresholdIndex(reflection.getErosion()) + ")"), false); + source.sendSuccess( + () -> Component + .literal("Color Tier: " + ReflectionConstants.getSoulColorTier(reflection.getErosion())), + false); + + source.sendSuccess(() -> Component.literal("Active Bargains:"), false); + if (reflection.getActiveBargains().isEmpty()) { + source.sendSuccess(() -> Component.literal(" (none)"), false); + } else { + for (ResourceLocation id : reflection.getActiveBargains()) { + source.sendSuccess(() -> Component.literal(" - " + id), false); + } + } + + if (!reflection.getDefianceScars().isEmpty()) { + source.sendSuccess(() -> Component.literal("Defiance Scars:"), false); + for (ResourceLocation id : reflection.getDefianceScars()) { + source.sendSuccess(() -> Component.literal(" - " + id), false); + } + } + + // Command usage info + source.sendSuccess(() -> Component.literal("Command Costs:"), false); + int homeCost = ReflectionConstants.getCommandCost(reflection, "home"); + int backCost = ReflectionConstants.getCommandCost(reflection, "back"); + int homeUsage = reflection.getCommandUsageCount("home"); + int backUsage = reflection.getCommandUsageCount("back"); + source.sendSuccess(() -> Component.literal(" /home: " + homeCost + " erosion (used " + homeUsage + "x)"), + false); + source.sendSuccess(() -> Component.literal(" /back: " + backCost + " erosion (used " + backUsage + "x)"), + false); + }, () -> source.sendFailure(Component.literal("No reflection data found"))); + + return 1; + } + + private static int addErosion(CommandSourceStack source, int amount) { + ServerPlayer player = source.getPlayer(); + if (player == null) { + source.sendFailure(Component.literal("Must be run by a player")); + return 0; + } + + ReflectionCapability.get(player).ifPresentOrElse(reflection -> { + int oldErosion = reflection.getErosion(); + reflection.addErosion(amount); + int newErosion = reflection.getErosion(); + + source.sendSuccess(() -> Component.literal("Added " + amount + " erosion. Total: " + newErosion), false); + + if (ReflectionConstants.crossedNewThreshold(oldErosion, newErosion)) { + int threshold = ReflectionConstants.getThresholdIndex(newErosion); + source.sendSuccess(() -> Component.literal("Crossed threshold " + threshold + "!"), false); + } + }, () -> source.sendFailure(Component.literal("No reflection data found"))); + + return 1; + } + + private static int acceptBargain(CommandSourceStack source, String bargainId) { + ServerPlayer player = source.getPlayer(); + if (player == null) { + source.sendFailure(Component.literal("Must be run by a player")); + return 0; + } + + ResourceLocation id = new ResourceLocation("cosmiccore", bargainId); + + return BargainRegistry.get(id).map(bargain -> { + ReflectionCapability.get(player).ifPresentOrElse(reflection -> { + if (reflection.hasBargain(id)) { + source.sendFailure(Component.literal("Already have this bargain")); + return; + } + + // Calculate and apply cost + int cost = BargainRegistry.calculateCost(player, bargain); + reflection.addErosion(cost); + reflection.acceptBargain(id); + + // Call the bargain's accept handler + bargain.onAccept(player, bargain.getAnswers().get(0)); // Use first answer for testing + + // Sync to client if this is the quake movement bargain + if (id.equals(QuakeMovementBargain.INSTANCE.getId())) { + CCoreNetwork.sendToPlayer(player, new SyncQuakeMovementPacket(true)); + } + + source.sendSuccess(() -> Component.literal("Accepted bargain: " + bargain.getName().getString() + + " (cost: " + cost + " erosion)"), false); + }, () -> source.sendFailure(Component.literal("No reflection data found"))); + return 1; + }).orElseGet(() -> { + source.sendFailure(Component.literal("Unknown bargain: " + id)); + return 0; + }); + } + + private static int defyBargain(CommandSourceStack source, String bargainId) { + ServerPlayer player = source.getPlayer(); + if (player == null) { + source.sendFailure(Component.literal("Must be run by a player")); + return 0; + } + + ResourceLocation id = new ResourceLocation("cosmiccore", bargainId); + + return BargainRegistry.get(id).map(bargain -> { + ReflectionCapability.get(player).ifPresentOrElse(reflection -> { + if (!reflection.hasBargain(id)) { + source.sendFailure(Component.literal("Don't have this bargain")); + return; + } + + // Calculate and apply defiance cost + int cost = BargainRegistry.calculateDefianceCost(player, bargain); + reflection.addErosion(cost); + reflection.defy(id); + + // Call the bargain's defy handler + bargain.onDefy(player); + + // Sync to client if this is the quake movement bargain + if (id.equals(QuakeMovementBargain.INSTANCE.getId())) { + CCoreNetwork.sendToPlayer(player, new SyncQuakeMovementPacket(false)); + } + + source.sendSuccess(() -> Component.literal("Defied bargain: " + bargain.getName().getString() + + " (cost: " + cost + " erosion, debuff remains)"), false); + }, () -> source.sendFailure(Component.literal("No reflection data found"))); + return 1; + }).orElseGet(() -> { + source.sendFailure(Component.literal("Unknown bargain: " + id)); + return 0; + }); + } + + private static int forceAwaken(CommandSourceStack source) { + ServerPlayer player = source.getPlayer(); + if (player == null) { + source.sendFailure(Component.literal("Must be run by a player")); + return 0; + } + + ReflectionCapability.get(player).ifPresentOrElse(reflection -> { + reflection.setAwakened(true); + source.sendSuccess(() -> Component.literal("Reflection awakened."), false); + }, () -> source.sendFailure(Component.literal("No reflection data found"))); + + return 1; + } + + private static int resetData(CommandSourceStack source) { + ServerPlayer player = source.getPlayer(); + if (player == null) { + source.sendFailure(Component.literal("Must be run by a player")); + return 0; + } + + ReflectionCapability.get(player).ifPresentOrElse(reflection -> { + // Reset by loading empty data + if (reflection instanceof ReflectionData data) { + data.loadTag(new net.minecraft.nbt.CompoundTag()); + } + + // Sync all bargain states to client (all should now be false) + CCoreNetwork.sendToPlayer(player, new SyncQuakeMovementPacket(false)); + // Add more bargain syncs here as they're implemented + + source.sendSuccess(() -> Component.literal("Reflection data reset."), false); + }, () -> source.sendFailure(Component.literal("No reflection data found"))); + + return 1; + } + + private static int listBargains(CommandSourceStack source) { + source.sendSuccess(() -> Component.literal("=== Available Bargains ==="), false); + + var allBargains = BargainRegistry.getAll(); + source.sendSuccess(() -> Component.literal("Total registered: " + allBargains.size()), false); + + for (Bargain bargain : allBargains) { + // Capture in final variable for lambda + final Bargain b = bargain; + source.sendSuccess(() -> Component.literal("- " + b.getId().getPath() + + " (" + b.getName().getString() + ") [" + b.getTier().name() + "]"), false); + } + + return 1; + } + + private static int openMirror(CommandSourceStack source) { + ServerPlayer player = source.getPlayer(); + if (player == null) { + source.sendFailure(Component.literal("Must be run by a player")); + return 0; + } + + // Force awaken if not already + ReflectionCapability.get(player).ifPresent(reflection -> { + if (!reflection.hasAwakened()) { + reflection.setAwakened(true); + } + }); + + VoidUIPackets.sendOpenVoidScreen(player); + return 1; + } + + private static int openMirrorWithBargain(CommandSourceStack source, String bargainId) { + ServerPlayer player = source.getPlayer(); + if (player == null) { + source.sendFailure(Component.literal("Must be run by a player")); + return 0; + } + + ResourceLocation id = new ResourceLocation("cosmiccore", bargainId); + + return BargainRegistry.get(id).map(bargain -> { + // Force awaken if not already + ReflectionCapability.get(player).ifPresent(reflection -> { + if (!reflection.hasAwakened()) { + reflection.setAwakened(true); + } + }); + + VoidUIPackets.sendOpenVoidScreen(player, id); + source.sendSuccess(() -> Component.literal("Opened mirror with bargain: " + bargain.getName().getString()), + false); + return 1; + }).orElseGet(() -> { + source.sendFailure(Component.literal("Unknown bargain: " + id)); + return 0; + }); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ReflectionCommands.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ReflectionCommands.java new file mode 100644 index 000000000..9360362a9 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ReflectionCommands.java @@ -0,0 +1,63 @@ +package com.ghostipedia.cosmiccore.common.reflection; + +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.BackBargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.HomeBargain; + +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.Commands; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; + +import com.mojang.brigadier.CommandDispatcher; + +/** + * Registers the /home and /back commands that are unlocked via Reflection bargains. + */ +public class ReflectionCommands { + + public static void register(CommandDispatcher dispatcher) { + // /home command - teleport to spawn/bed + dispatcher.register( + Commands.literal("home") + .executes(ctx -> { + ServerPlayer player = ctx.getSource().getPlayer(); + if (player == null) return 0; + + // Check if they have the bargain + boolean hasBargain = ReflectionCapability.get(player) + .map(r -> r.hasBargain(HomeBargain.INSTANCE.getId())) + .orElse(false); + + if (!hasBargain) { + player.displayClientMessage( + Component.literal("§7§o*You haven't bargained for this power.*"), + false); + return 0; + } + + return HomeBargain.executeHome(player) ? 1 : 0; + })); + + // /back command - return to last death location + dispatcher.register( + Commands.literal("back") + .executes(ctx -> { + ServerPlayer player = ctx.getSource().getPlayer(); + if (player == null) return 0; + + // Check if they have the bargain + boolean hasBargain = ReflectionCapability.get(player) + .map(r -> r.hasBargain(BackBargain.INSTANCE.getId())) + .orElse(false); + + if (!hasBargain) { + player.displayClientMessage( + Component.literal("§7§o*You haven't bargained for this power.*"), + false); + return 0; + } + + return BackBargain.executeBack(player) ? 1 : 0; + })); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ReflectionConstants.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ReflectionConstants.java new file mode 100644 index 000000000..72769cb4f --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ReflectionConstants.java @@ -0,0 +1,146 @@ +package com.ghostipedia.cosmiccore.common.reflection; + +/** + * Constants for the Reflection system - erosion thresholds, costs, etc. + */ +public final class ReflectionConstants { + + private ReflectionConstants() {} + + // ---- Erosion Thresholds ---- + // These trigger mandatory reflection encounters + + public static final int[] THRESHOLDS = { + 25, // Threshold 0: Curious - "You're starting to show wear." + 50, // Threshold 1: Observational - "We've died enough to notice now." + 100, // Threshold 2: Familiar - "This is becoming routine, isn't it?" + 200, // Threshold 3: Ambiguous - "You're changing faster than I expected." + 350, // Threshold 4: Philosophical - "Do you remember what we looked like before?" + 500, // Threshold 5: Heavy - "Halfway to... something." + 666, // Threshold 6: Ominous - Silence. Just stares. + 800, // Threshold 7: Unsettling - "I'm having trouble telling us apart." + 900, // Threshold 8: Quiet - "Almost there. Thank you for looking." + 1000 // Threshold 9: Unknown - "We're just... this now." + }; + + /** + * Get the threshold index for a given erosion value. + * Returns -1 if below first threshold. + */ + public static int getThresholdIndex(int erosion) { + for (int i = THRESHOLDS.length - 1; i >= 0; i--) { + if (erosion >= THRESHOLDS[i]) { + return i; + } + } + return -1; + } + + /** + * Check if a new threshold was crossed. + */ + public static boolean crossedNewThreshold(int oldErosion, int newErosion) { + return getThresholdIndex(newErosion) > getThresholdIndex(oldErosion); + } + + // ---- Bargain Cost Scaling ---- + // Bargains cost more at higher corruption + + public static final int[][] BARGAIN_COST_RANGES = { + { 0, 100, 25, 50 }, // 0-100 erosion: costs 25-50 + { 101, 300, 75, 150 }, // 101-300 erosion: costs 75-150 + { 301, 500, 150, 250 }, // 301-500 erosion: costs 150-250 + { 501, 750, 250, 400 }, // 501-750 erosion: costs 250-400 + { 751, Integer.MAX_VALUE, 400, 600 } // 751+: costs 400-600 + }; + + /** + * Get the base cost range for a bargain at the given erosion level. + * Returns [minCost, maxCost] + */ + public static int[] getBargainCostRange(int currentErosion) { + for (int[] range : BARGAIN_COST_RANGES) { + if (currentErosion >= range[0] && currentErosion <= range[1]) { + return new int[] { range[2], range[3] }; + } + } + // Fallback to highest tier + return new int[] { 400, 600 }; + } + + // ---- Command Cost Escalation ---- + // /home and /back costs double with repeated use + + public static final int HOME_BASE_COST = 1; + public static final int BACK_BASE_COST = 2; + public static final int HOME_COST_CEILING = 16; + public static final int BACK_COST_CEILING = 32; + public static final int HOME_UNLOCK_COST = 12; + public static final int BACK_UNLOCK_COST = 12; + + /** Cooldown before command usage count resets (15 minutes in milliseconds) */ + public static final long COMMAND_USAGE_RESET_TIME = 15 * 60 * 1000L; + + /** + * Calculate command cost based on usage count. + * Cost doubles each use until ceiling. + */ + public static int calculateCommandCost(int baseCost, int ceiling, int usageCount) { + if (usageCount <= 0) return baseCost; + int cost = baseCost * (1 << usageCount); // baseCost * 2^usageCount + return Math.min(cost, ceiling); + } + + /** + * Get the current cost for a command bargain, accounting for usage escalation. + */ + public static int getCommandCost(IReflection reflection, String command) { + int usageCount = reflection.getCommandUsageCount(command); + + return switch (command) { + case "home" -> calculateCommandCost(HOME_BASE_COST, HOME_COST_CEILING, usageCount); + case "back" -> calculateCommandCost(BACK_BASE_COST, BACK_COST_CEILING, usageCount); + default -> 1; + }; + } + + // ---- Soul Color Ranges ---- + // For visualization + + public static final int[][] SOUL_COLOR_RANGES = { + { 0, 50 }, // Pale white/silver + { 51, 150 }, // Faint blue tint + { 151, 300 }, // Deep blue/purple + { 301, 500 }, // Violet/crimson threads + { 501, 750 }, // Dark red/black veins + { 751, 1000 }, // Mostly black, faint glow + { 1001, Integer.MAX_VALUE } // Void-like, inverted + }; + + /** + * Get the soul color tier (0-6) for visualization. + */ + public static int getSoulColorTier(int erosion) { + for (int i = 0; i < SOUL_COLOR_RANGES.length; i++) { + if (erosion >= SOUL_COLOR_RANGES[i][0] && erosion <= SOUL_COLOR_RANGES[i][1]) { + return i; + } + } + return SOUL_COLOR_RANGES.length - 1; + } + + // ---- Defiance Costs ---- + + /** Multiplier for defiance erosion spike (applied to original bargain cost) */ + public static final float DEFIANCE_COST_MULTIPLIER = 2.5f; + + // ---- Awakening ---- + + /** Number of deaths before the reflection awakens */ + public static final int DEATHS_TO_AWAKEN = 3; + + // ---- Blink Power ---- + + /** Erosion cost per blink use */ + public static final float BLINK_EROSION_PER_USE = 0.5f; +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ReflectionData.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ReflectionData.java new file mode 100644 index 000000000..34b4ce242 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ReflectionData.java @@ -0,0 +1,340 @@ +package com.ghostipedia.cosmiccore.common.reflection; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.StringTag; +import net.minecraft.nbt.Tag; +import net.minecraft.resources.ResourceLocation; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + * Implementation of IReflection - stores all soul/erosion/bargain data for a player. + */ +public class ReflectionData implements IReflection { + + // Currency and capacity + private int shardBalance = 0; + private int baseCapacity = 100; + private int bonusCapacity = 0; + + // Erosion and death tracking + private int erosion = 0; + private int deathCount = 0; + private int highestThresholdSeen = -1; + private boolean awakened = false; + private boolean awakeningSequenceCompleted = false; + + private final Set activeBargains = new HashSet<>(); + private final Set defianceScars = new HashSet<>(); + private final Map commandUsageCount = new HashMap<>(); + private final Map commandLastUseTime = new HashMap<>(); + private final Map memory = new HashMap<>(); + + // ---- Shards (Currency) ---- + + @Override + public int getShardBalance() { + return shardBalance; + } + + @Override + public void setShardBalance(int shards) { + this.shardBalance = Math.max(0, shards); + } + + @Override + public void addShards(int amount) { + this.shardBalance = Math.max(0, this.shardBalance + amount); + } + + @Override + public boolean spendShards(int amount) { + if (shardBalance >= amount) { + shardBalance -= amount; + return true; + } + return false; + } + + // ---- Soul Capacity ---- + + @Override + public int getBaseCapacity() { + return baseCapacity; + } + + @Override + public void setBaseCapacity(int capacity) { + this.baseCapacity = Math.max(0, capacity); + } + + @Override + public int getBonusCapacity() { + return bonusCapacity; + } + + @Override + public void setBonusCapacity(int bonus) { + this.bonusCapacity = Math.max(0, bonus); + } + + @Override + public int getUsedCapacity() { + // Calculate weight from all active bargains + int totalWeight = 0; + for (ResourceLocation bargainId : activeBargains) { + var bargainOpt = com.ghostipedia.cosmiccore.common.reflection.bargain.BargainRegistry.get(bargainId); + if (bargainOpt.isPresent()) { + totalWeight += bargainOpt.get().getWeight(); + } + } + return totalWeight; + } + + // ---- Erosion ---- + + @Override + public int getErosion() { + return erosion; + } + + @Override + public void setErosion(int erosion) { + this.erosion = Math.max(0, erosion); + } + + @Override + public void addErosion(int amount) { + this.erosion = Math.max(0, this.erosion + amount); + } + + @Override + public int getDeathCount() { + return deathCount; + } + + @Override + public void recordDeath() { + deathCount++; + addErosion(1); + } + + // ---- Bargains ---- + + @Override + public Set getActiveBargains() { + return new HashSet<>(activeBargains); + } + + @Override + public boolean hasBargain(ResourceLocation bargainId) { + return activeBargains.contains(bargainId); + } + + @Override + public void acceptBargain(ResourceLocation bargainId) { + activeBargains.add(bargainId); + } + + @Override + public void defy(ResourceLocation bargainId) { + if (activeBargains.remove(bargainId)) { + defianceScars.add(bargainId); + } + } + + @Override + public Set getDefianceScars() { + return new HashSet<>(defianceScars); + } + + @Override + public boolean hasDefianceScar(ResourceLocation bargainId) { + return defianceScars.contains(bargainId); + } + + @Override + public void removeScar(ResourceLocation bargainId) { + defianceScars.remove(bargainId); + } + + // ---- Threshold Tracking ---- + + @Override + public int getHighestThresholdSeen() { + return highestThresholdSeen; + } + + @Override + public void setHighestThresholdSeen(int threshold) { + this.highestThresholdSeen = Math.max(this.highestThresholdSeen, threshold); + } + + // ---- First Encounter ---- + + @Override + public boolean hasAwakened() { + return awakened; + } + + @Override + public void setAwakened(boolean awakened) { + this.awakened = awakened; + } + + @Override + public boolean hasCompletedAwakeningSequence() { + return awakeningSequenceCompleted; + } + + @Override + public void setAwakeningSequenceCompleted(boolean completed) { + this.awakeningSequenceCompleted = completed; + } + + // ---- Command Usage Tracking ---- + + @Override + public int getCommandUsageCount(String commandId) { + return commandUsageCount.getOrDefault(commandId, 0); + } + + @Override + public void recordCommandUse(String commandId) { + commandUsageCount.merge(commandId, 1, Integer::sum); + commandLastUseTime.put(commandId, System.currentTimeMillis()); + } + + @Override + public void resetCommandUsage(String commandId) { + commandUsageCount.remove(commandId); + } + + @Override + public long getLastCommandUseTime(String commandId) { + return commandLastUseTime.getOrDefault(commandId, 0L); + } + + // ---- Memory / Context ---- + + @Override + public Map getMemory() { + return new HashMap<>(memory); + } + + @Override + public void rememberEvent(String eventKey) { + memory.merge(eventKey, 1, Integer::sum); + } + + @Override + public int getMemoryCount(String eventKey) { + return memory.getOrDefault(eventKey, 0); + } + + // ---- NBT Persistence ---- + + public CompoundTag saveTag() { + CompoundTag root = new CompoundTag(); + + // Currency and capacity + root.putInt("shardBalance", shardBalance); + root.putInt("baseCapacity", baseCapacity); + root.putInt("bonusCapacity", bonusCapacity); + + // Core stats + root.putInt("erosion", erosion); + root.putInt("deathCount", deathCount); + root.putInt("highestThresholdSeen", highestThresholdSeen); + root.putBoolean("awakened", awakened); + root.putBoolean("awakeningSequenceCompleted", awakeningSequenceCompleted); + + // Active bargains + ListTag bargainList = new ListTag(); + for (ResourceLocation bargain : activeBargains) { + bargainList.add(StringTag.valueOf(bargain.toString())); + } + root.put("activeBargains", bargainList); + + // Defiance scars + ListTag scarList = new ListTag(); + for (ResourceLocation scar : defianceScars) { + scarList.add(StringTag.valueOf(scar.toString())); + } + root.put("defianceScars", scarList); + + // Command usage + CompoundTag cmdUsage = new CompoundTag(); + for (Map.Entry entry : commandUsageCount.entrySet()) { + cmdUsage.putInt(entry.getKey(), entry.getValue()); + } + root.put("commandUsageCount", cmdUsage); + + CompoundTag cmdTime = new CompoundTag(); + for (Map.Entry entry : commandLastUseTime.entrySet()) { + cmdTime.putLong(entry.getKey(), entry.getValue()); + } + root.put("commandLastUseTime", cmdTime); + + // Memory + CompoundTag memoryTag = new CompoundTag(); + for (Map.Entry entry : memory.entrySet()) { + memoryTag.putInt(entry.getKey(), entry.getValue()); + } + root.put("memory", memoryTag); + + return root; + } + + public void loadTag(CompoundTag root) { + // Currency and capacity (with defaults for backwards compatibility) + shardBalance = root.getInt("shardBalance"); + baseCapacity = root.contains("baseCapacity") ? root.getInt("baseCapacity") : 100; + bonusCapacity = root.getInt("bonusCapacity"); + + // Core stats + erosion = root.getInt("erosion"); + deathCount = root.getInt("deathCount"); + highestThresholdSeen = root.getInt("highestThresholdSeen"); + awakened = root.getBoolean("awakened"); + awakeningSequenceCompleted = root.getBoolean("awakeningSequenceCompleted"); + + // Active bargains + activeBargains.clear(); + ListTag bargainList = root.getList("activeBargains", Tag.TAG_STRING); + for (Tag tag : bargainList) { + activeBargains.add(new ResourceLocation(tag.getAsString())); + } + + // Defiance scars + defianceScars.clear(); + ListTag scarList = root.getList("defianceScars", Tag.TAG_STRING); + for (Tag tag : scarList) { + defianceScars.add(new ResourceLocation(tag.getAsString())); + } + + // Command usage + commandUsageCount.clear(); + CompoundTag cmdUsage = root.getCompound("commandUsageCount"); + for (String key : cmdUsage.getAllKeys()) { + commandUsageCount.put(key, cmdUsage.getInt(key)); + } + + commandLastUseTime.clear(); + CompoundTag cmdTime = root.getCompound("commandLastUseTime"); + for (String key : cmdTime.getAllKeys()) { + commandLastUseTime.put(key, cmdTime.getLong(key)); + } + + // Memory + memory.clear(); + CompoundTag memoryTag = root.getCompound("memory"); + for (String key : memoryTag.getAllKeys()) { + memory.put(key, memoryTag.getInt(key)); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ReflectionEventHandler.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ReflectionEventHandler.java new file mode 100644 index 000000000..7b21df7f9 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ReflectionEventHandler.java @@ -0,0 +1,282 @@ +package com.ghostipedia.cosmiccore.common.reflection; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.network.CCoreNetwork; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.BargainRegistry; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.BackBargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.QuakeMovementBargain; +import com.ghostipedia.cosmiccore.common.reflection.network.SyncQuakeMovementPacket; +import com.ghostipedia.cosmiccore.common.reflection.ui.VoidUIPackets; +import com.ghostipedia.cosmiccore.common.reflection.whisper.WhisperSystem; + +import net.minecraft.server.level.ServerPlayer; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.event.entity.living.LivingDeathEvent; +import net.minecraftforge.event.entity.player.PlayerEvent; +import net.minecraftforge.eventbus.api.EventPriority; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +/** + * Handles Reflection system events - deaths, ticks, thresholds, awakening. + */ +@Mod.EventBusSubscriber(modid = CosmicCore.MOD_ID) +public class ReflectionEventHandler { + + // Track players who just died so we can whisper on respawn + private static final Map pendingDeathWhispers = new HashMap<>(); + + // Track pending respawn events (what UI to open after respawn) + private static final Map pendingRespawnEvents = new HashMap<>(); + + /** + * Types of respawn events that trigger UI + */ + private enum RespawnEventType { + AWAKENING, // First 3rd death - offer quake movement + THRESHOLD, // Crossed erosion milestone + CONTEXTUAL_BARGAIN // Offer relevant bargain (e.g., /back after death) + } + + private record RespawnEvent(RespawnEventType type, int data) { + + static RespawnEvent awakening() { + return new RespawnEvent(RespawnEventType.AWAKENING, 0); + } + + static RespawnEvent threshold(int index) { + return new RespawnEvent(RespawnEventType.THRESHOLD, index); + } + + static RespawnEvent contextualBargain(int bargainType) { + // 0 = back bargain, 1 = home bargain (can expand later) + return new RespawnEvent(RespawnEventType.CONTEXTUAL_BARGAIN, bargainType); + } + } + + @SubscribeEvent(priority = EventPriority.LOWEST) + public static void onPlayerDeath(LivingDeathEvent event) { + if (!(event.getEntity() instanceof ServerPlayer player)) return; + + // Record death location for /back bargain + BackBargain.recordDeath(player); + + ReflectionCapability.get(player).ifPresent(reflection -> { + int oldErosion = reflection.getErosion(); + int oldDeathCount = reflection.getDeathCount(); + + // Record death - adds 1 erosion + reflection.recordDeath(); + + // Remember the death cause for whispers/context + String deathCause = categorizeDeathCause(event.getSource().getMsgId()); + reflection.rememberEvent("death." + deathCause); + reflection.rememberEvent("death.total"); + + // Determine what event to queue for respawn + // Priority: Awakening > Threshold > Contextual Bargain + + // Check for awakening (first time reaching 3 deaths) + boolean justAwakened = false; + if (!reflection.hasAwakened() && reflection.getDeathCount() >= ReflectionConstants.DEATHS_TO_AWAKEN) { + reflection.setAwakened(true); + justAwakened = true; + CosmicCore.LOGGER.info("Reflection awakened for player {}", player.getName().getString()); + } + + // Queue respawn event + if (justAwakened && !reflection.hasCompletedAwakeningSequence()) { + // Priority 1: Awakening sequence (first time player reaches 3 deaths) + pendingRespawnEvents.put(player.getUUID(), RespawnEvent.awakening()); + CosmicCore.LOGGER.info("Queued awakening sequence for {}", player.getName().getString()); + } else { + // Check for threshold crossing + int newErosion = reflection.getErosion(); + if (ReflectionConstants.crossedNewThreshold(oldErosion, newErosion)) { + int newThreshold = ReflectionConstants.getThresholdIndex(newErosion); + if (newThreshold > reflection.getHighestThresholdSeen()) { + // Priority 2: Threshold encounter + pendingRespawnEvents.put(player.getUUID(), RespawnEvent.threshold(newThreshold)); + CosmicCore.LOGGER.info("Queued threshold {} encounter for {}", + newThreshold, player.getName().getString()); + } + } else if (reflection.hasAwakened() && !reflection.hasBargain(BackBargain.INSTANCE.getId())) { + // Priority 3: Contextual bargain offer (offer /back if they don't have it) + pendingRespawnEvents.put(player.getUUID(), RespawnEvent.contextualBargain(0)); + CosmicCore.LOGGER.info("Queued contextual /back bargain offer for {}", + player.getName().getString()); + } + } + + // Queue whisper for after respawn (if awakened and no UI event pending) + if (reflection.hasAwakened() && !pendingRespawnEvents.containsKey(player.getUUID())) { + pendingDeathWhispers.put(player.getUUID(), deathCause); + } + + CosmicCore.LOGGER.debug("Player {} died. Deaths: {}, Erosion: {}", + player.getName().getString(), reflection.getDeathCount(), reflection.getErosion()); + }); + } + + @SubscribeEvent + public static void onPlayerRespawn(PlayerEvent.PlayerRespawnEvent event) { + if (!(event.getEntity() instanceof ServerPlayer player)) return; + + ReflectionCapability.get(player).ifPresent(reflection -> { + // Sync bargain states to client after respawn + syncBargainStates(player, reflection); + + // Check for pending respawn event + RespawnEvent pendingEvent = pendingRespawnEvents.remove(player.getUUID()); + if (pendingEvent != null) { + // Delay the UI slightly to ensure player is fully loaded + player.getServer().execute(() -> { + processRespawnEvent(player, reflection, pendingEvent); + }); + // Clear any whisper since we're showing UI + pendingDeathWhispers.remove(player.getUUID()); + } else { + // Send death whisper after respawn (if no UI event) + String deathCause = pendingDeathWhispers.remove(player.getUUID()); + if (deathCause != null && reflection.hasAwakened()) { + // Schedule whisper for next tick + player.getServer().execute(() -> { + WhisperSystem.triggerEvent(player, WhisperSystem.WhisperEvent.DEATH); + }); + } + } + }); + } + + /** + * Process a pending respawn event - opens the appropriate UI. + */ + private static void processRespawnEvent(ServerPlayer player, IReflection reflection, RespawnEvent event) { + switch (event.type()) { + case AWAKENING -> { + // Awakening sequence: offer Quake Movement bargain + CosmicCore.LOGGER.info("Triggering awakening sequence for {}", player.getName().getString()); + VoidUIPackets.sendOpenVoidScreen(player, QuakeMovementBargain.INSTANCE.getId()); + reflection.setAwakeningSequenceCompleted(true); + } + case THRESHOLD -> { + // Threshold encounter: show milestone dialogue + int thresholdIndex = event.data(); + CosmicCore.LOGGER.info("Triggering threshold {} encounter for {}", + thresholdIndex, player.getName().getString()); + VoidUIPackets.sendThresholdEncounter(player, thresholdIndex); + reflection.setHighestThresholdSeen(thresholdIndex); + } + case CONTEXTUAL_BARGAIN -> { + // Contextual bargain offer + int bargainType = event.data(); + if (bargainType == 0 && !reflection.hasBargain(BackBargain.INSTANCE.getId())) { + // Offer /back bargain + CosmicCore.LOGGER.info("Triggering contextual /back bargain offer for {}", + player.getName().getString()); + VoidUIPackets.sendOpenVoidScreen(player, BackBargain.INSTANCE.getId()); + } + // Can add more contextual bargains here (e.g., bargainType == 1 for /home) + } + } + } + + @SubscribeEvent + public static void onPlayerTick(TickEvent.PlayerTickEvent event) { + if (event.phase != TickEvent.Phase.END) return; + if (!(event.player instanceof ServerPlayer player)) return; + + // Tick active bargains + for (Bargain bargain : BargainRegistry.getActive(player)) { + bargain.tick(player); + } + + // Command usage cooldown check + ReflectionCapability.get(player).ifPresent(reflection -> { + long now = System.currentTimeMillis(); + + // Reset command usage if cooldown expired + for (String cmd : new String[] { "home", "back" }) { + long lastUse = reflection.getLastCommandUseTime(cmd); + if (lastUse > 0 && (now - lastUse) > ReflectionConstants.COMMAND_USAGE_RESET_TIME) { + reflection.resetCommandUsage(cmd); + } + } + }); + + // Whisper system tick (runs periodically, not every tick) + if (player.tickCount % 100 == 0) { // Every 5 seconds + WhisperSystem.tick(player); + } + } + + @SubscribeEvent + public static void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent event) { + if (!(event.getEntity() instanceof ServerPlayer player)) return; + + ReflectionCapability.get(player).ifPresent(reflection -> { + CosmicCore.LOGGER.debug("Player {} logged in. Erosion: {}, Deaths: {}, Awakened: {}", + player.getName().getString(), + reflection.getErosion(), + reflection.getDeathCount(), + reflection.hasAwakened()); + + // Sync bargain states to client + syncBargainStates(player, reflection); + }); + } + + /** + * Sync all client-side bargain states to a player. + * Called on login and respawn to ensure client knows about active bargains. + */ + private static void syncBargainStates(ServerPlayer player, IReflection reflection) { + // Sync Quake Movement bargain + boolean hasQuake = reflection.hasBargain(QuakeMovementBargain.INSTANCE.getId()); + CCoreNetwork.sendToPlayer(player, new SyncQuakeMovementPacket(hasQuake)); + + // Add more bargain syncs here as they're implemented + } + + /** + * Categorize death cause for memory tracking. + */ + private static String categorizeDeathCause(String msgId) { + if (msgId == null) return "unknown"; + + // Fall damage + if (msgId.contains("fall") || msgId.contains("stalagmite")) return "fall"; + + // Fire/lava + if (msgId.contains("fire") || msgId.contains("lava") || msgId.contains("burn") || msgId.contains("inFire") || + msgId.contains("onFire")) + return "fire"; + + // Drowning/suffocation + if (msgId.contains("drown") || msgId.contains("suffocate") || msgId.contains("inWall")) return "suffocation"; + + // Void + if (msgId.contains("void") || msgId.contains("outOfWorld")) return "void"; + + // Freezing + if (msgId.contains("freeze") || msgId.contains("cold")) return "freeze"; + + // Starving + if (msgId.contains("starve")) return "starve"; + + // Combat + if (msgId.contains("mob") || msgId.contains("player") || msgId.contains("arrow") || msgId.contains("thrown") || + msgId.contains("explosion")) + return "combat"; + + // Magic + if (msgId.contains("magic") || msgId.contains("wither") || msgId.contains("indirectMagic")) return "magic"; + + return "other"; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ReflectionLang.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ReflectionLang.java new file mode 100644 index 000000000..45b243a23 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ReflectionLang.java @@ -0,0 +1,304 @@ +package com.ghostipedia.cosmiccore.common.reflection; + +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; + +/** + * Translation key helper for the Reflection system. + * All translatable strings should go through this class. + * + * Key structure: + * - reflection.cosmiccore.bargain.[id].name - Bargain display name + * - reflection.cosmiccore.bargain.[id].description - Bargain description + * - reflection.cosmiccore.bargain.[id].dialogue.[n] - Offer dialogue lines + * - reflection.cosmiccore.bargain.[id].question - The philosophical question + * - reflection.cosmiccore.bargain.[id].answer.[answerId].text - Answer button text + * - reflection.cosmiccore.bargain.[id].answer.[answerId].response - Reflection's response + * - reflection.cosmiccore.bargain.[id].answer.[answerId].power.[n] - Power description lines + * - reflection.cosmiccore.bargain.[id].answer.[answerId].drawback.[n] - Drawback description lines + * - reflection.cosmiccore.bargain.[id].accept.[n] - Post-accept dialogue + * - reflection.cosmiccore.bargain.[id].refuse.[n] - Refuse dialogue + * - reflection.cosmiccore.bargain.[id].defy - Message when defying + * - reflection.cosmiccore.bargain.[id].visual - Soul visual description + * + * - reflection.cosmiccore.threshold.[n].dialogue.[m] - Threshold dialogue lines + * - reflection.cosmiccore.threshold.[n].question - Threshold question + * - reflection.cosmiccore.threshold.[n].response - Acknowledge response + * + * - reflection.cosmiccore.ui.[key] - UI strings + */ +public class ReflectionLang { + + private static final String PREFIX = "reflection.cosmiccore."; + + // ========================================================================= + // Bargain Keys + // ========================================================================= + + public static MutableComponent bargainName(String bargainId) { + return Component.translatable(PREFIX + "bargain." + bargainId + ".name"); + } + + public static MutableComponent bargainDescription(String bargainId) { + return Component.translatable(PREFIX + "bargain." + bargainId + ".description"); + } + + public static MutableComponent bargainDialogue(String bargainId, int index) { + return Component.translatable(PREFIX + "bargain." + bargainId + ".dialogue." + index); + } + + public static MutableComponent bargainQuestion(String bargainId) { + return Component.translatable(PREFIX + "bargain." + bargainId + ".question"); + } + + public static MutableComponent answerText(String bargainId, String answerId) { + return Component.translatable(PREFIX + "bargain." + bargainId + ".answer." + answerId + ".text"); + } + + public static MutableComponent answerResponse(String bargainId, String answerId) { + return Component.translatable(PREFIX + "bargain." + bargainId + ".answer." + answerId + ".response"); + } + + public static MutableComponent answerPower(String bargainId, String answerId, int index) { + return Component.translatable(PREFIX + "bargain." + bargainId + ".answer." + answerId + ".power." + index); + } + + public static MutableComponent answerDrawback(String bargainId, String answerId, int index) { + return Component.translatable(PREFIX + "bargain." + bargainId + ".answer." + answerId + ".drawback." + index); + } + + public static MutableComponent bargainAccept(String bargainId, int index) { + return Component.translatable(PREFIX + "bargain." + bargainId + ".accept." + index); + } + + public static MutableComponent bargainRefuse(String bargainId, int index) { + return Component.translatable(PREFIX + "bargain." + bargainId + ".refuse." + index); + } + + public static MutableComponent bargainOnAccept(String bargainId) { + return Component.translatable(PREFIX + "bargain." + bargainId + ".on_accept"); + } + + public static MutableComponent bargainOnDefy(String bargainId) { + return Component.translatable(PREFIX + "bargain." + bargainId + ".on_defy"); + } + + public static MutableComponent bargainSuffocation(String bargainId) { + return Component.translatable(PREFIX + "bargain." + bargainId + ".suffocation"); + } + + // ========================================================================= + // Threshold Encounter Keys + // ========================================================================= + + public static MutableComponent thresholdDialogue(int thresholdIndex, int lineIndex) { + return Component.translatable(PREFIX + "threshold." + thresholdIndex + ".dialogue." + lineIndex); + } + + public static MutableComponent thresholdQuestion(int thresholdIndex) { + return Component.translatable(PREFIX + "threshold." + thresholdIndex + ".question"); + } + + public static MutableComponent thresholdResponse(int thresholdIndex) { + return Component.translatable(PREFIX + "threshold." + thresholdIndex + ".response"); + } + + // ========================================================================= + // UI Keys + // ========================================================================= + + public static MutableComponent ui(String key) { + return Component.translatable(PREFIX + "ui." + key); + } + + // Common UI strings + public static MutableComponent uiYourBargains() { + return ui("your_bargains"); + } + + public static MutableComponent uiAvailableBargains() { + return ui("available_bargains"); + } + + public static MutableComponent uiDefiance() { + return ui("defiance"); + } + + public static MutableComponent uiScrollUp() { + return ui("scroll_up"); + } + + public static MutableComponent uiScrollDown() { + return ui("scroll_down"); + } + + public static MutableComponent uiSoulErosion() { + return ui("soul_erosion"); + } + + public static MutableComponent uiUnlockCost(int cost) { + return Component.translatable(PREFIX + "ui.unlock_cost", cost); + } + + public static MutableComponent uiDefianceCost(int cost) { + return Component.translatable(PREFIX + "ui.defiance_cost", cost); + } + + public static MutableComponent uiBack() { + return ui("back"); + } + + public static MutableComponent uiContinue() { + return ui("continue"); + } + + public static MutableComponent uiAcknowledge() { + return ui("acknowledge"); + } + + public static MutableComponent uiReviewBargains(int count) { + return Component.translatable(PREFIX + "ui.review_bargains", count); + } + + public static MutableComponent uiBrowseBargains(int count) { + return Component.translatable(PREFIX + "ui.browse_bargains", count); + } + + public static MutableComponent uiGazeConstellation() { + return ui("gaze_constellation"); + } + + public static MutableComponent uiJustLook() { + return ui("just_look"); + } + + public static MutableComponent uiLeave() { + return ui("leave"); + } + + public static MutableComponent uiForeverScarred() { + return ui("forever_scarred"); + } + + public static MutableComponent uiClickToBargain() { + return ui("click_to_bargain"); + } + + public static MutableComponent uiClickToDefy(int cost) { + return Component.translatable(PREFIX + "ui.click_to_defy", cost); + } + + public static MutableComponent uiPower() { + return ui("power"); + } + + public static MutableComponent uiDrawback() { + return ui("drawback"); + } + + public static MutableComponent uiCost() { + return ui("cost"); + } + + // Hub dialogue responses + public static MutableComponent hubReviewResponse() { + return ui("hub.review_response"); + } + + public static MutableComponent hubBrowseResponse() { + return ui("hub.browse_response"); + } + + public static MutableComponent hubReflectResponse() { + return ui("hub.reflect_response"); + } + + public static MutableComponent hubLeaveResponse() { + return ui("hub.leave_response"); + } + + // Defiance confirmation + public static MutableComponent defianceConfirm() { + return ui("defiance.confirm"); + } + + public static MutableComponent defianceCancel() { + return ui("defiance.cancel"); + } + + public static MutableComponent defianceWarning1(String bargainName) { + return Component.translatable(PREFIX + "ui.defiance.warning1", bargainName); + } + + public static MutableComponent defianceWarning2(int cost) { + return Component.translatable(PREFIX + "ui.defiance.warning2", cost); + } + + public static MutableComponent defianceWarning3() { + return ui("defiance.warning3"); + } + + public static MutableComponent defianceWarning4() { + return ui("defiance.warning4"); + } + + // ========================================================================= + // Reflection Dialogue (Hub mode contextual greetings) + // ========================================================================= + + public static MutableComponent hubGreeting(String key) { + return Component.translatable(PREFIX + "hub.greeting." + key); + } + + // ========================================================================= + // Key generators for lang file generation + // ========================================================================= + + public static String keyBargainName(String bargainId) { + return PREFIX + "bargain." + bargainId + ".name"; + } + + public static String keyBargainDescription(String bargainId) { + return PREFIX + "bargain." + bargainId + ".description"; + } + + public static String keyBargainDialogue(String bargainId, int index) { + return PREFIX + "bargain." + bargainId + ".dialogue." + index; + } + + public static String keyBargainQuestion(String bargainId) { + return PREFIX + "bargain." + bargainId + ".question"; + } + + public static String keyAnswerText(String bargainId, String answerId) { + return PREFIX + "bargain." + bargainId + ".answer." + answerId + ".text"; + } + + public static String keyAnswerResponse(String bargainId, String answerId) { + return PREFIX + "bargain." + bargainId + ".answer." + answerId + ".response"; + } + + public static String keyAnswerPower(String bargainId, String answerId, int index) { + return PREFIX + "bargain." + bargainId + ".answer." + answerId + ".power." + index; + } + + public static String keyAnswerDrawback(String bargainId, String answerId, int index) { + return PREFIX + "bargain." + bargainId + ".answer." + answerId + ".drawback." + index; + } + + public static String keyThresholdDialogue(int thresholdIndex, int lineIndex) { + return PREFIX + "threshold." + thresholdIndex + ".dialogue." + lineIndex; + } + + public static String keyThresholdQuestion(int thresholdIndex) { + return PREFIX + "threshold." + thresholdIndex + ".question"; + } + + public static String keyThresholdResponse(int thresholdIndex) { + return PREFIX + "threshold." + thresholdIndex + ".response"; + } + + public static String keyUi(String key) { + return PREFIX + "ui." + key; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ThresholdEncounter.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ThresholdEncounter.java new file mode 100644 index 000000000..659775a5e --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ThresholdEncounter.java @@ -0,0 +1,49 @@ +package com.ghostipedia.cosmiccore.common.reflection; + +import net.minecraft.network.chat.Component; + +import java.util.ArrayList; +import java.util.List; + +/** + * Threshold encounters - mandatory reflection dialogues at erosion milestones. + * No bargain is offered - just the Reflection observing the player's degradation. + */ +public class ThresholdEncounter { + + // Number of dialogue lines per threshold (for building the list) + private static final int[] DIALOGUE_COUNTS = { 4, 4, 4, 4, 4, 4, 3, 4, 4, 4 }; + + /** + * Get the dialogue for a specific erosion threshold. + * + * @param thresholdIndex 0-9 matching ReflectionConstants.THRESHOLDS + */ + public static List getDialogue(int thresholdIndex) { + if (thresholdIndex < 0 || thresholdIndex >= DIALOGUE_COUNTS.length) { + return List.of(ReflectionLang.thresholdDialogue(0, 0)); // Fallback + } + + List dialogue = new ArrayList<>(); + int count = DIALOGUE_COUNTS[thresholdIndex]; + for (int i = 0; i < count; i++) { + dialogue.add(ReflectionLang.thresholdDialogue(thresholdIndex, i)); + } + return dialogue; + } + + /** + * Get the question/prompt for a specific threshold. + * These are rhetorical - player can only acknowledge. + */ + public static Component getQuestion(int thresholdIndex) { + return ReflectionLang.thresholdQuestion(thresholdIndex); + } + + /** + * Get the response to the player's acknowledgment. + */ + public static Component getAcknowledgeResponse(int thresholdIndex) { + return ReflectionLang.thresholdResponse(thresholdIndex); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/Bargain.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/Bargain.java new file mode 100644 index 000000000..391e81f1e --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/Bargain.java @@ -0,0 +1,326 @@ +package com.ghostipedia.cosmiccore.common.reflection.bargain; + +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; + +import java.util.List; +import java.util.Optional; + +/** + * Base class for all bargains in the Reflection system. + * A bargain represents a deal with your reflection - power for erosion. + * + * Economy: + * - Shards of Perpetuity: Currency to accept bargains (quest-gated) + * - Weight: How much soul capacity this bargain consumes (0-100 base capacity) + * - Erosion: Consequence of accepting (accumulates, drives visuals/whispers) + */ +public abstract class Bargain { + + private final ResourceLocation id; + private final BargainTier tier; + private final int shardCost; + private final int weight; + private final int erosionCost; + + protected Bargain(ResourceLocation id, BargainTier tier, int shardCost, int weight, int erosionCost) { + this.id = id; + this.tier = tier; + this.shardCost = shardCost; + this.weight = weight; + this.erosionCost = erosionCost; + } + + /** + * Legacy constructor for backwards compatibility during migration. + * + * @deprecated Use the new constructor with shardCost, weight, and erosionCost + */ + @Deprecated + protected Bargain(ResourceLocation id, BargainTier tier, int baseCost) { + this(id, tier, 0, 0, baseCost); + } + + /** + * @return unique identifier for this bargain + */ + public ResourceLocation getId() { + return id; + } + + /** + * @return what corruption range this bargain is available in + */ + public BargainTier getTier() { + return tier; + } + + /** + * @return shard cost to accept this bargain (Shards of Perpetuity currency) + */ + public int getShardCost() { + return shardCost; + } + + /** + * @return weight against soul capacity (base 100 capacity) + */ + public int getWeight() { + return weight; + } + + /** + * @return erosion gained when accepting this bargain + */ + public int getErosionCost() { + return erosionCost; + } + + /** + * @return base erosion cost (modified by current corruption level) + * @deprecated Use getErosionCost() instead + */ + @Deprecated + public int getBaseCost() { + return erosionCost; + } + + /** + * @return the display name of this bargain + */ + public abstract Component getName(); + + /** + * @return description shown in the mirror interface + */ + public abstract Component getDescription(); + + /** + * @return the reflection's dialogue when offering this bargain + */ + public abstract List getOfferDialogue(Player player); + + /** + * @return the philosophical question posed by the reflection + */ + public abstract Component getQuestion(); + + /** + * @return possible answers to the question + */ + public abstract List getAnswers(); + + /** + * Check if this bargain can be offered to the player. + * Override for custom conditions beyond tier requirements. + */ + public boolean canOffer(Player player, int currentErosion) { + return tier.isAvailableAt(currentErosion); + } + + /** + * Check if context makes this bargain relevant (for curated offers). + * Examples: hunger bargain offered when player is starving, + * fall damage bargain offered after dying to fall damage. + */ + public boolean isContextuallyRelevant(Player player, BargainContext context) { + return true; // Override in subclasses + } + + /** + * Called when the player accepts this bargain with a specific answer. + * Apply the power/effects here. + */ + public abstract void onAccept(Player player, BargainAnswer answer); + + /** + * Called when the player defies (removes) this bargain. + * Remove the power but NOT the debuff (scar). + */ + public abstract void onDefy(Player player); + + /** + * Called every tick while this bargain is active. + * Override for passive effects, erosion-per-use, etc. + */ + public void tick(Player player) { + // Default: no tick behavior + } + + /** + * @return the soul visual transformation for this bargain + */ + public abstract BargainVisual getSoulVisual(); + + /** + * @return display name for UI purposes + */ + public Component getDisplayName() { + return getName(); + } + + /** + * @return power description lines for tooltips/hub + */ + public List getPowerDescriptions() { + // Default: derive from description + return List.of(Component.literal("\u00A7a" + getDescription().getString())); + } + + /** + * @return drawback description lines for tooltips/hub + */ + public List getDrawbackDescriptions() { + // Default: generic drawback showing all costs + List drawbacks = new java.util.ArrayList<>(); + if (shardCost > 0) { + drawbacks.add(Component.literal("\u00A7b" + shardCost + " shards")); + } + if (weight > 0) { + drawbacks.add(Component.literal("\u00A7d" + weight + " weight")); + } + if (erosionCost > 0) { + drawbacks.add(Component.literal("\u00A7c+" + erosionCost + " erosion")); + } + return drawbacks.isEmpty() ? List.of(Component.literal("\u00A7aFree")) : drawbacks; + } + + /** + * @return dialogue the reflection says after accepting + */ + public List getAcceptDialogue(Player player, BargainAnswer answer) { + return List.of(Component.literal("How does it feel?")); + } + + /** + * @return dialogue the reflection says if the player refuses + */ + public List getRefuseDialogue(Player player) { + return List.of(Component.literal("...Maybe next time.")); + } + + /** + * Tiers determine when bargains become available. + */ + public enum BargainTier { + + /** Available at low corruption (0-100). Early game traps. */ + EARLY(0, 100), + /** Available at low-mid corruption (0-300). */ + EARLY_MID(0, 300), + /** Only available at mid corruption (100-500). */ + MID(100, 500), + /** Only available at high corruption (300-750). */ + LATE(300, 750), + /** Only available at very high corruption (500+). The dangerous stuff. */ + EXTREME(500, Integer.MAX_VALUE), + /** Always available, cost scales. */ + ANY(0, Integer.MAX_VALUE); + + private final int minErosion; + private final int maxErosion; + + BargainTier(int minErosion, int maxErosion) { + this.minErosion = minErosion; + this.maxErosion = maxErosion; + } + + public boolean isAvailableAt(int erosion) { + return erosion >= minErosion && erosion <= maxErosion; + } + + public int getMinErosion() { + return minErosion; + } + + public int getMaxErosion() { + return maxErosion; + } + } + + /** + * Represents an answer choice in a bargain dialogue. + */ + public record BargainAnswer( + String id, + Component text, + Optional reflectionResponse, + boolean grantsFullPower, + float costModifier, + List powerDescription, + List drawbacks) { + + public BargainAnswer(String id, Component text) { + this(id, text, Optional.empty(), true, 1.0f, List.of(), List.of()); + } + + public BargainAnswer(String id, Component text, Component response) { + this(id, text, Optional.of(response), true, 1.0f, List.of(), List.of()); + } + + public BargainAnswer withCostModifier(float modifier) { + return new BargainAnswer(id, text, reflectionResponse, grantsFullPower, modifier, powerDescription, + drawbacks); + } + + public BargainAnswer withReducedPower() { + return new BargainAnswer(id, text, reflectionResponse, false, costModifier, powerDescription, drawbacks); + } + + /** + * Add power description lines that show on hover. + */ + public BargainAnswer withPower(Component... powers) { + return new BargainAnswer(id, text, reflectionResponse, grantsFullPower, costModifier, List.of(powers), + drawbacks); + } + + /** + * Add drawback/curse description lines that show on hover. + */ + public BargainAnswer withDrawbacks(Component... curses) { + return new BargainAnswer(id, text, reflectionResponse, grantsFullPower, costModifier, powerDescription, + List.of(curses)); + } + + /** + * Add both power and drawback descriptions. + */ + public BargainAnswer withDetails(List powers, List curses) { + return new BargainAnswer(id, text, reflectionResponse, grantsFullPower, costModifier, powers, curses); + } + } + + /** + * Visual transformation data for the soul portrait. + */ + public record BargainVisual( + String visualType, + String description) { + + public static BargainVisual of(String type, String desc) { + return new BargainVisual(type, desc); + } + } + + /** + * Context for determining if a bargain is relevant to offer. + */ + public record BargainContext( + Optional lastDeathCause, + Optional currentDimension, + boolean isLowHealth, + boolean isHungry, + boolean isSuffocating, + boolean isBurning, + boolean isFreezing) { + + public static BargainContext empty() { + return new BargainContext( + Optional.empty(), + Optional.empty(), + false, false, false, false, false); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/BargainRegistry.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/BargainRegistry.java new file mode 100644 index 000000000..f721cba29 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/BargainRegistry.java @@ -0,0 +1,179 @@ +package com.ghostipedia.cosmiccore.common.reflection.bargain; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCapability; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * Registry for all bargains in the Reflection system. + * Bargains are registered here and can be looked up by ID or filtered by context. + */ +public final class BargainRegistry { + + private BargainRegistry() {} + + private static final Map BARGAINS = new LinkedHashMap<>(); + + /** + * Register a bargain. Called during mod initialization. + */ + public static void register(Bargain bargain) { + if (BARGAINS.containsKey(bargain.getId())) { + CosmicCore.LOGGER.warn("Duplicate bargain registration: {}", bargain.getId()); + } + BARGAINS.put(bargain.getId(), bargain); + CosmicCore.LOGGER.debug("Registered bargain: {}", bargain.getId()); + } + + /** + * Get a bargain by ID. + */ + public static Optional get(ResourceLocation id) { + return Optional.ofNullable(BARGAINS.get(id)); + } + + /** + * Get all registered bargains. + */ + public static Collection getAll() { + return Collections.unmodifiableCollection(BARGAINS.values()); + } + + /** + * Get all bargains available to a player at their current erosion level. + */ + public static List getAvailable(Player player) { + return ReflectionCapability.get(player).map(reflection -> { + int erosion = reflection.getErosion(); + return BARGAINS.values().stream() + .filter(b -> b.canOffer(player, erosion)) + .filter(b -> !reflection.hasBargain(b.getId())) + .collect(Collectors.toList()); + }).orElse(Collections.emptyList()); + } + + /** + * Get bargains that are contextually relevant to offer. + * Used for curated offers in the mirror interface. + */ + public static List getContextualOffers(Player player, Bargain.BargainContext context, int maxOffers) { + return ReflectionCapability.get(player).map(reflection -> { + int erosion = reflection.getErosion(); + + // Get all available bargains + List available = BARGAINS.values().stream() + .filter(b -> b.canOffer(player, erosion)) + .filter(b -> !reflection.hasBargain(b.getId())) + .collect(Collectors.toList()); + + // Prioritize contextually relevant ones + List relevant = available.stream() + .filter(b -> b.isContextuallyRelevant(player, context)) + .limit(maxOffers) + .collect(Collectors.toList()); + + // If we don't have enough relevant ones, fill with others + if (relevant.size() < maxOffers) { + available.stream() + .filter(b -> !relevant.contains(b)) + .limit(maxOffers - relevant.size()) + .forEach(relevant::add); + } + + return relevant; + }).orElse(Collections.emptyList()); + } + + /** + * Get all active bargains for a player. + */ + public static List getActive(Player player) { + return ReflectionCapability.get(player).map(reflection -> reflection.getActiveBargains().stream() + .map(BargainRegistry::get) + .filter(Optional::isPresent) + .map(Optional::get) + .collect(Collectors.toList())).orElse(Collections.emptyList()); + } + + /** + * Get all bargains the player has defied (for showing scars). + */ + public static List getDefied(Player player) { + return ReflectionCapability.get(player).map(reflection -> reflection.getDefianceScars().stream() + .map(BargainRegistry::get) + .filter(Optional::isPresent) + .map(Optional::get) + .collect(Collectors.toList())).orElse(Collections.emptyList()); + } + + /** + * Check if the player can defy a specific bargain. + */ + public static boolean canDefy(Player player, ResourceLocation bargainId) { + return ReflectionCapability.get(player) + .map(reflection -> reflection.hasBargain(bargainId)) + .orElse(false); + } + + /** + * Calculate the cost of a bargain for the player. + * Takes into account current erosion level and bargain base cost. + */ + public static int calculateCost(Player player, Bargain bargain) { + return ReflectionCapability.get(player).map(reflection -> { + int erosion = reflection.getErosion(); + int baseCost = bargain.getBaseCost(); + + // Scale cost based on current erosion + float multiplier = 1.0f; + if (erosion > 750) multiplier = 2.0f; + else if (erosion > 500) multiplier = 1.75f; + else if (erosion > 300) multiplier = 1.5f; + else if (erosion > 100) multiplier = 1.25f; + + return Math.round(baseCost * multiplier); + }).orElse(bargain.getBaseCost()); + } + + /** + * Calculate the defiance cost for removing a bargain. + */ + public static int calculateDefianceCost(Player player, Bargain bargain) { + int originalCost = calculateCost(player, bargain); + return Math.round(originalCost * 2.5f); // Defiance costs 2.5x the original + } + + /** + * Calculate the defiance cost without player context (client-side). + * Uses base cost * 2.5 + */ + public static int calculateDefianceCost(Bargain bargain) { + return Math.round(bargain.getBaseCost() * 2.5f); + } + + /** + * Get available bargains based on pre-synced active and scar sets (client-side). + */ + public static List getAvailable(Set activeBargains, Set scars) { + return BARGAINS.values().stream() + .filter(b -> !activeBargains.contains(b.getId())) + .filter(b -> !scars.contains(b.getId())) + .collect(Collectors.toList()); + } + + /** + * Get active bargains based on pre-synced set (client-side). + */ + public static List getActive(Set activeBargains) { + return activeBargains.stream() + .map(BargainRegistry::get) + .filter(Optional::isPresent) + .map(Optional::get) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/CosmicBargains.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/CosmicBargains.java new file mode 100644 index 000000000..6337d75dc --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/CosmicBargains.java @@ -0,0 +1,64 @@ +package com.ghostipedia.cosmiccore.common.reflection.bargain; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.ArmorBargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.BackBargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.DepthsBargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.FallImmunityBargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.FireImmunityBargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.HealthBargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.HomeBargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.HungerBargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.NightVisionBargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.QuakeMovementBargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.ReachBargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.StepAssistBargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.StrengthBargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.SwiftnessBargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.VoidResistanceBargain; + +/** + * Registers all bargains for the Reflection system. + * Called during mod initialization. + */ +public final class CosmicBargains { + + private CosmicBargains() {} + + public static void init() { + CosmicCore.LOGGER.info("Registering Reflection bargains..."); + + // EARLY TIER - Gateway bargains (0-100 erosion) + safeRegister("QuakeMovementBargain", () -> BargainRegistry.register(QuakeMovementBargain.INSTANCE)); + safeRegister("StepAssistBargain", () -> BargainRegistry.register(StepAssistBargain.INSTANCE)); + safeRegister("NightVisionBargain", () -> BargainRegistry.register(NightVisionBargain.INSTANCE)); + safeRegister("SwiftnessBargain", () -> BargainRegistry.register(SwiftnessBargain.INSTANCE)); + + // EARLY_MID TIER - Building addiction (0-300) + safeRegister("HomeBargain", () -> BargainRegistry.register(HomeBargain.INSTANCE)); + safeRegister("BackBargain", () -> BargainRegistry.register(BackBargain.INSTANCE)); + safeRegister("HealthBargain", () -> BargainRegistry.register(HealthBargain.INSTANCE)); + safeRegister("StrengthBargain", () -> BargainRegistry.register(StrengthBargain.INSTANCE)); + safeRegister("DepthsBargain", () -> BargainRegistry.register(DepthsBargain.INSTANCE)); + + // MID TIER - Significant commitment (100-500) + safeRegister("ReachBargain", () -> BargainRegistry.register(ReachBargain.INSTANCE)); + safeRegister("FallImmunityBargain", () -> BargainRegistry.register(FallImmunityBargain.INSTANCE)); + safeRegister("HungerBargain", () -> BargainRegistry.register(HungerBargain.INSTANCE)); + safeRegister("ArmorBargain", () -> BargainRegistry.register(ArmorBargain.INSTANCE)); + safeRegister("FireImmunityBargain", () -> BargainRegistry.register(FireImmunityBargain.INSTANCE)); + + // LATE TIER - Deep corruption (300-750) + safeRegister("VoidResistanceBargain", () -> BargainRegistry.register(VoidResistanceBargain.INSTANCE)); + + CosmicCore.LOGGER.info("Registered {} bargains", BargainRegistry.getAll().size()); + } + + private static void safeRegister(String name, Runnable registrar) { + try { + registrar.run(); + } catch (Throwable t) { + CosmicCore.LOGGER.error("Failed to register bargain: {}", name, t); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/ArmorBargain.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/ArmorBargain.java new file mode 100644 index 000000000..38fc5e31c --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/ArmorBargain.java @@ -0,0 +1,158 @@ +package com.ghostipedia.cosmiccore.common.reflection.bargain.impl; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCapability; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionLang; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; + +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.player.Player; + +import java.util.List; +import java.util.UUID; + +/** + * Armor Bargain: More armor, but slower movement. + * + * POWER: +8 armor (equivalent to full iron armor) + * DRAWBACK: 15% slower movement speed + * + * Thematically: Your flesh has calcified, hardened against blows. But that + * hardness comes with weight. Every step is heavier. You're safer... but + * slower. A walking fortress that can't flee. + * + * This creates tank gameplay - you can stand and fight but can't escape. + * Good for holding ground, bad for kiting or hit-and-run. + */ +public class ArmorBargain extends Bargain { + + public static final ResourceLocation ID = CosmicCore.id("carapace"); + public static final ArmorBargain INSTANCE = new ArmorBargain(); + private static final String BARGAIN_ID = "carapace"; + private static final UUID ARMOR_MODIFIER_UUID = UUID.fromString("e2a9b0c8-5678-8901-cdef-012345678901"); + private static final UUID SPEED_MODIFIER_UUID = UUID.fromString("e2a9b0c8-5678-8901-cdef-012345678902"); + + /** Movement speed penalty (0.15 = 15% slower) */ + public static final float SPEED_PENALTY = -0.15f; + + private ArmorBargain() { + super( + ID, + BargainTier.MID, + 64, // shardCost + 25, // weight + 100 // erosion + ); + } + + @Override + public Component getName() { + return ReflectionLang.bargainName(BARGAIN_ID); + } + + @Override + public Component getDescription() { + return ReflectionLang.bargainDescription(BARGAIN_ID); + } + + @Override + public List getOfferDialogue(Player player) { + return List.of( + ReflectionLang.bargainDialogue(BARGAIN_ID, 0), + ReflectionLang.bargainDialogue(BARGAIN_ID, 1), + ReflectionLang.bargainDialogue(BARGAIN_ID, 2), + ReflectionLang.bargainDialogue(BARGAIN_ID, 3), + ReflectionLang.bargainDialogue(BARGAIN_ID, 4)); + } + + @Override + public Component getQuestion() { + return ReflectionLang.bargainQuestion(BARGAIN_ID); + } + + @Override + public List getAnswers() { + return List.of( + new BargainAnswer("survive", ReflectionLang.answerText(BARGAIN_ID, "survive"), + ReflectionLang.answerResponse(BARGAIN_ID, "survive")) + .withDetails( + List.of( + ReflectionLang.answerPower(BARGAIN_ID, "survive", 0), + ReflectionLang.answerPower(BARGAIN_ID, "survive", 1)), + List.of( + ReflectionLang.answerDrawback(BARGAIN_ID, "survive", 0), + ReflectionLang.answerDrawback(BARGAIN_ID, "survive", 1))), + new BargainAnswer("refuse", ReflectionLang.answerText(BARGAIN_ID, "refuse"), + ReflectionLang.answerResponse(BARGAIN_ID, "refuse")) + .withReducedPower()); + } + + @Override + public void onAccept(Player player, BargainAnswer answer) { + if (answer.id().equals("survive")) { + applyArmorBoost(player); + applySpeedPenalty(player); + player.displayClientMessage(ReflectionLang.bargainOnAccept(BARGAIN_ID), false); + } + } + + @Override + public void onDefy(Player player) { + removeArmorBoost(player); + removeSpeedPenalty(player); + player.displayClientMessage(ReflectionLang.bargainOnDefy(BARGAIN_ID), false); + } + + @Override + public BargainVisual getSoulVisual() { + return BargainVisual.of("shell", "The soul's surface appears calcified, plated, moving slowly"); + } + + public static void applyArmorBoost(Player player) { + var attribute = player.getAttribute(Attributes.ARMOR); + if (attribute != null) { + attribute.removeModifier(ARMOR_MODIFIER_UUID); + attribute.addPermanentModifier(new AttributeModifier( + ARMOR_MODIFIER_UUID, "Reflection Carapace", 8.0, AttributeModifier.Operation.ADDITION)); + } + } + + public static void removeArmorBoost(Player player) { + var attribute = player.getAttribute(Attributes.ARMOR); + if (attribute != null) { + attribute.removeModifier(ARMOR_MODIFIER_UUID); + } + } + + public static void applySpeedPenalty(Player player) { + var attribute = player.getAttribute(Attributes.MOVEMENT_SPEED); + if (attribute != null) { + attribute.removeModifier(SPEED_MODIFIER_UUID); + attribute.addPermanentModifier(new AttributeModifier( + SPEED_MODIFIER_UUID, "Carapace Weight", SPEED_PENALTY, AttributeModifier.Operation.MULTIPLY_TOTAL)); + } + } + + public static void removeSpeedPenalty(Player player) { + var attribute = player.getAttribute(Attributes.MOVEMENT_SPEED); + if (attribute != null) { + attribute.removeModifier(SPEED_MODIFIER_UUID); + } + } + + // ========================================================================= + // Static helper methods + // ========================================================================= + + /** + * Check if a player has the Calcified Flesh bargain active. + */ + public static boolean hasBargain(Player player) { + return ReflectionCapability.get(player) + .map(reflection -> reflection.hasBargain(ID)) + .orElse(false); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/BackBargain.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/BackBargain.java new file mode 100644 index 000000000..fcd3860f4 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/BackBargain.java @@ -0,0 +1,227 @@ +package com.ghostipedia.cosmiccore.common.reflection.bargain.impl; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCapability; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionConstants; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionLang; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; + +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +/** + * The /back bargain - return to your last death location. + * + * Even more of a trap than /home. You WILL die. You WILL want your stuff back. + * And every time you use it, the cost grows. + * + * Base cost: 2 erosion + * Quick use penalty: Doubles each time used within 15 minutes (2 -> 4 -> 8 -> 16 -> 32) + * Ceiling: 32 erosion per use + * Reset: After 15 minutes of no use, resets to base cost + */ +public class BackBargain extends Bargain { + + private static final ResourceLocation ID = CosmicCore.id("back"); + public static final BackBargain INSTANCE = new BackBargain(); + private static final String BARGAIN_ID = "back"; + + // Track last death positions per player + private static final Map lastDeathLocations = new HashMap<>(); + + private BackBargain() { + super( + ID, + BargainTier.EARLY, + 0, // shardCost - FREE (poisoned apple - per-use costs add up) + 0, // weight - FREE (doesn't consume soul capacity) + 100 // erosion - significant upfront cost + per-use escalation + ); + } + + @Override + public Component getName() { + return ReflectionLang.bargainName(BARGAIN_ID); + } + + @Override + public Component getDescription() { + return ReflectionLang.bargainDescription(BARGAIN_ID); + } + + @Override + public List getOfferDialogue(Player player) { + return List.of( + ReflectionLang.bargainDialogue(BARGAIN_ID, 0), + ReflectionLang.bargainDialogue(BARGAIN_ID, 1), + ReflectionLang.bargainDialogue(BARGAIN_ID, 2)); + } + + @Override + public Component getQuestion() { + return ReflectionLang.bargainQuestion(BARGAIN_ID); + } + + @Override + public List getAnswers() { + return List.of( + new BargainAnswer("accept", ReflectionLang.answerText(BARGAIN_ID, "accept"), + ReflectionLang.answerResponse(BARGAIN_ID, "accept")) + .withDetails( + List.of( + ReflectionLang.answerPower(BARGAIN_ID, "accept", 0), + ReflectionLang.answerPower(BARGAIN_ID, "accept", 1)), + List.of( + ReflectionLang.answerDrawback(BARGAIN_ID, "accept", 0), + ReflectionLang.answerDrawback(BARGAIN_ID, "accept", 1))), + new BargainAnswer("refuse", ReflectionLang.answerText(BARGAIN_ID, "refuse"), + ReflectionLang.answerResponse(BARGAIN_ID, "refuse")) + .withReducedPower()); + } + + @Override + public void onAccept(Player player, BargainAnswer answer) { + if (answer.id().equals("accept")) { + player.displayClientMessage(ReflectionLang.bargainOnAccept(BARGAIN_ID), false); + } + } + + @Override + public void onDefy(Player player) { + player.displayClientMessage(ReflectionLang.bargainOnDefy(BARGAIN_ID), false); + } + + @Override + public BargainVisual getSoulVisual() { + return BargainVisual.of("echo", "A faint afterimage follows you, showing where death last found you"); + } + + @Override + public void tick(Player player) { + // No passive effects + } + + /** + * Record a death location for a player. + * Called from death event handler. + */ + public static void recordDeath(ServerPlayer player) { + lastDeathLocations.put(player.getUUID(), new DeathLocation( + player.level().dimension(), + player.position())); + } + + /** + * Execute the /back teleport. + * Called when player uses the command (if they have the bargain). + * + * @return true if teleport succeeded, false otherwise + */ + public static boolean executeBack(ServerPlayer player) { + return ReflectionCapability.get(player).map(reflection -> { + if (!reflection.hasBargain(ID)) { + player.displayClientMessage( + Component.literal("\u00A7cYou haven't made this bargain."), + false); + return false; + } + + // Check for death location + DeathLocation deathLoc = lastDeathLocations.get(player.getUUID()); + if (deathLoc == null) { + player.displayClientMessage( + Component.literal("\u00A7cYou have no death to return to."), + false); + return false; + } + + // Get the target dimension + ServerLevel targetLevel = player.server.getLevel(deathLoc.dimension); + if (targetLevel == null) { + player.displayClientMessage( + Component.literal("\u00A7cThat place no longer exists."), + false); + return false; + } + + // Calculate current cost based on usage + int cost = ReflectionConstants.getCommandCost(reflection, "back"); + + // Apply erosion cost + reflection.addErosion(cost); + reflection.recordCommandUse("back"); + + // Teleport (handling cross-dimension) + Vec3 pos = deathLoc.position; + if (player.level().dimension() != deathLoc.dimension) { + player.teleportTo(targetLevel, pos.x, pos.y, pos.z, player.getYRot(), player.getXRot()); + } else { + player.teleportTo(pos.x, pos.y, pos.z); + } + + // Effects + player.level().playSound(null, player.blockPosition(), + SoundEvents.ENDERMAN_TELEPORT, SoundSource.PLAYERS, 1.0f, 0.5f); + + // Feedback based on cost - gets increasingly ominous + if (cost <= 4) { + player.displayClientMessage( + Component.literal("\u00A77\u00A7o*You return to where you fell.*"), + true); + } else if (cost <= 12) { + player.displayClientMessage( + Component.literal("\u00A77\u00A7o*Again you return. The ground remembers your blood.*"), + true); + } else if (cost <= 24) { + player.displayClientMessage( + Component.literal("\u00A77\u00A7o*How many times have you died here? Does it matter anymore?*"), + true); + } else { + player.displayClientMessage( + Component.literal("\u00A77\u00A7o*Death. Return. Death. Return. You've made this a ritual.*"), + true); + } + + // Show cost in chat + player.displayClientMessage( + Component.literal("\u00A78[Erosion +" + cost + "]"), + false); + + // Clear the death location after use (can't spam back to same spot) + lastDeathLocations.remove(player.getUUID()); + + return true; + }).orElse(false); + } + + /** + * Check if a player has a death location recorded. + */ + public static boolean hasDeathLocation(UUID playerId) { + return lastDeathLocations.containsKey(playerId); + } + + /** + * Clear death location (on logout, etc.) + */ + public static void clearDeathLocation(UUID playerId) { + lastDeathLocations.remove(playerId); + } + + private record DeathLocation( + ResourceKey dimension, + Vec3 position) {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/DepthsBargain.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/DepthsBargain.java new file mode 100644 index 000000000..09af29ee6 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/DepthsBargain.java @@ -0,0 +1,145 @@ +package com.ghostipedia.cosmiccore.common.reflection.bargain.impl; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCapability; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionLang; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; + +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.player.Player; + +import java.util.List; + +/** + * Depths Bargain: Enhanced lung capacity, but instant death on suffocation. + * + * POWER: +50% oxygen capacity (90 seconds -> 135 seconds base air) + * DRAWBACK: When oxygen reaches 0, you instantly die instead of taking gradual damage. + * + * Thematically: Your lungs have been remade by the depths. They can hold more, + * but they've forgotten how to struggle - when they fail, they fail completely. + * + * This replaces the old "infinite water breathing" bargain with something more + * interesting and balanced - a meaningful power boost with a meaningful risk. + */ +public class DepthsBargain extends Bargain { + + public static final ResourceLocation ID = CosmicCore.id("depths"); + public static final DepthsBargain INSTANCE = new DepthsBargain(); + private static final String BARGAIN_ID = "depths"; + + /** Multiplier for max oxygen capacity (1.5 = 50% more) */ + public static final float OXYGEN_CAPACITY_MULTIPLIER = 1.5f; + + private DepthsBargain() { + super( + ID, + BargainTier.EARLY_MID, + 64, // shardCost + 15, // weight + 75 // erosion + ); + } + + @Override + public Component getName() { + return ReflectionLang.bargainName(BARGAIN_ID); + } + + @Override + public Component getDescription() { + return ReflectionLang.bargainDescription(BARGAIN_ID); + } + + @Override + public List getOfferDialogue(Player player) { + return List.of( + ReflectionLang.bargainDialogue(BARGAIN_ID, 0), + ReflectionLang.bargainDialogue(BARGAIN_ID, 1), + ReflectionLang.bargainDialogue(BARGAIN_ID, 2), + ReflectionLang.bargainDialogue(BARGAIN_ID, 3), + ReflectionLang.bargainDialogue(BARGAIN_ID, 4), + ReflectionLang.bargainDialogue(BARGAIN_ID, 5)); + } + + @Override + public Component getQuestion() { + return ReflectionLang.bargainQuestion(BARGAIN_ID); + } + + @Override + public List getAnswers() { + return List.of( + new BargainAnswer("embrace", + ReflectionLang.answerText(BARGAIN_ID, "embrace"), + ReflectionLang.answerResponse(BARGAIN_ID, "embrace")) + .withDetails( + List.of( + ReflectionLang.answerPower(BARGAIN_ID, "embrace", 0), + ReflectionLang.answerPower(BARGAIN_ID, "embrace", 1)), + List.of( + ReflectionLang.answerDrawback(BARGAIN_ID, "embrace", 0), + ReflectionLang.answerDrawback(BARGAIN_ID, "embrace", 1))), + new BargainAnswer("refuse", + ReflectionLang.answerText(BARGAIN_ID, "refuse"), + ReflectionLang.answerResponse(BARGAIN_ID, "refuse")) + .withReducedPower()); + } + + @Override + public void onAccept(Player player, BargainAnswer answer) { + if (!answer.id().equals("refuse")) { + player.displayClientMessage(ReflectionLang.bargainOnAccept(BARGAIN_ID), false); + } + } + + @Override + public void onDefy(Player player) { + player.displayClientMessage(ReflectionLang.bargainOnDefy(BARGAIN_ID), false); + } + + @Override + public BargainVisual getSoulVisual() { + return BargainVisual.of("gills", "depths_visual"); + } + + // ========================================================================= + // Static helper methods for OxygenLogic integration + // ========================================================================= + + /** + * Check if a player has the Depths bargain active. + */ + public static boolean hasBargain(Player player) { + return ReflectionCapability.get(player) + .map(reflection -> reflection.hasBargain(ID)) + .orElse(false); + } + + /** + * Get the oxygen capacity multiplier for a player. + * Returns 1.0 if they don't have the bargain. + */ + public static float getCapacityMultiplier(Player player) { + return hasBargain(player) ? OXYGEN_CAPACITY_MULTIPLIER : 1.0f; + } + + /** + * Check if this player should die instantly when oxygen reaches 0. + * Returns true if they have the bargain (the drawback). + */ + public static boolean shouldInstantKillOnSuffocation(Player player) { + return hasBargain(player); + } + + /** + * Execute instant death for suffocation (for use in OxygenLogic). + */ + public static void executeInstantSuffocation(ServerPlayer player) { + player.displayClientMessage(ReflectionLang.bargainSuffocation(BARGAIN_ID), false); + // Deal massive damage to ensure death - using drown damage type + player.hurt(player.damageSources().drown(), Float.MAX_VALUE); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/FallImmunityBargain.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/FallImmunityBargain.java new file mode 100644 index 000000000..40bf40a5a --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/FallImmunityBargain.java @@ -0,0 +1,166 @@ +package com.ghostipedia.cosmiccore.common.reflection.bargain.impl; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCapability; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionLang; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; + +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.damagesource.DamageTypes; +import net.minecraft.world.entity.player.Player; + +import java.util.List; + +/** + * Fall Damage Bargain: Reduced fall damage with fly-swatter vulnerability. + * + * POWER: 80% fall damage reduction - falls barely hurt you + * DRAWBACK: 50% increased damage from player attacks and explosions + * + * Thematically: Your body has learned to absorb impact, becoming soft and + * yielding on landing. But that softness makes you more vulnerable to + * intentional force - a sword, an arrow, an explosion. The ground forgives + * you, but other players won't. + * + * This creates interesting PvP dynamics - the bargain holder is great at + * exploration but vulnerable in combat. + */ +public class FallImmunityBargain extends Bargain { + + public static final ResourceLocation ID = CosmicCore.id("soft_landing"); + public static final FallImmunityBargain INSTANCE = new FallImmunityBargain(); + private static final String BARGAIN_ID = "soft_landing"; + + /** Fall damage multiplier (0.2 = 80% reduction) */ + public static final float FALL_DAMAGE_MULTIPLIER = 0.2f; + + /** Combat damage multiplier (1.5 = 50% more damage from players/explosions) */ + public static final float COMBAT_DAMAGE_MULTIPLIER = 1.5f; + + private FallImmunityBargain() { + super( + ID, + BargainTier.MID, + 64, // shardCost + 25, // weight + 100 // erosion + ); + } + + @Override + public Component getName() { + return ReflectionLang.bargainName(BARGAIN_ID); + } + + @Override + public Component getDescription() { + return ReflectionLang.bargainDescription(BARGAIN_ID); + } + + @Override + public List getOfferDialogue(Player player) { + return List.of( + ReflectionLang.bargainDialogue(BARGAIN_ID, 0), + ReflectionLang.bargainDialogue(BARGAIN_ID, 1), + ReflectionLang.bargainDialogue(BARGAIN_ID, 2), + ReflectionLang.bargainDialogue(BARGAIN_ID, 3), + ReflectionLang.bargainDialogue(BARGAIN_ID, 4)); + } + + @Override + public Component getQuestion() { + return ReflectionLang.bargainQuestion(BARGAIN_ID); + } + + @Override + public List getAnswers() { + return List.of( + new BargainAnswer("yes", ReflectionLang.answerText(BARGAIN_ID, "yes"), + ReflectionLang.answerResponse(BARGAIN_ID, "yes")) + .withDetails( + List.of( + ReflectionLang.answerPower(BARGAIN_ID, "yes", 0), + ReflectionLang.answerPower(BARGAIN_ID, "yes", 1)), + List.of( + ReflectionLang.answerDrawback(BARGAIN_ID, "yes", 0), + ReflectionLang.answerDrawback(BARGAIN_ID, "yes", 1))), + new BargainAnswer("refuse", ReflectionLang.answerText(BARGAIN_ID, "refuse"), + ReflectionLang.answerResponse(BARGAIN_ID, "refuse")) + .withReducedPower()); + } + + @Override + public boolean isContextuallyRelevant(Player player, BargainContext context) { + return context.lastDeathCause().map(cause -> cause.contains("fall")).orElse(false); + } + + @Override + public void onAccept(Player player, BargainAnswer answer) { + if (answer.id().equals("yes")) { + player.displayClientMessage(ReflectionLang.bargainOnAccept(BARGAIN_ID), false); + } + } + + @Override + public void onDefy(Player player) { + player.displayClientMessage(ReflectionLang.bargainOnDefy(BARGAIN_ID), false); + } + + @Override + public BargainVisual getSoulVisual() { + return BargainVisual.of("floating", "The soul hovers slightly, its form diffuse and yielding"); + } + + // ========================================================================= + // Static helper methods for damage integration + // ========================================================================= + + /** + * Check if a player has the Phantom Weight bargain active. + */ + public static boolean hasBargain(Player player) { + return ReflectionCapability.get(player) + .map(reflection -> reflection.hasBargain(ID)) + .orElse(false); + } + + /** + * Modify fall damage for a player with this bargain. + */ + public static float modifyFallDamage(Player player, float originalDamage) { + if (hasBargain(player)) { + return originalDamage * FALL_DAMAGE_MULTIPLIER; + } + return originalDamage; + } + + /** + * Modify combat damage (player attacks, explosions) for a player with this bargain. + */ + public static float modifyCombatDamage(Player player, float originalDamage) { + if (hasBargain(player)) { + return originalDamage * COMBAT_DAMAGE_MULTIPLIER; + } + return originalDamage; + } + + /** + * Check if a damage source is fall-related. + */ + public static boolean isFallDamage(DamageSource source) { + return source.is(DamageTypes.FALL) || + source.is(DamageTypes.FLY_INTO_WALL); + } + + /** + * Check if a damage source is combat-related (player attacks, explosions). + */ + public static boolean isCombatDamage(DamageSource source) { + return source.is(DamageTypes.PLAYER_ATTACK) || + source.is(DamageTypes.EXPLOSION) || + source.is(DamageTypes.PLAYER_EXPLOSION) || + source.getEntity() instanceof Player; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/FireImmunityBargain.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/FireImmunityBargain.java new file mode 100644 index 000000000..968063b00 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/FireImmunityBargain.java @@ -0,0 +1,171 @@ +package com.ghostipedia.cosmiccore.common.reflection.bargain.impl; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCapability; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionLang; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; + +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.damagesource.DamageTypes; +import net.minecraft.world.entity.player.Player; + +import java.util.List; + +/** + * Cinder Bargain: Fire resistance with cold vulnerability. + * + * POWER: 75% fire/lava damage reduction (not immunity!) + * DRAWBACK: 2x damage from freezing/cold sources + * + * Thematically: Your soul burns with borrowed heat. Fire recognizes you as kin + * and holds back its fury - but cold now bites twice as deep. You've traded + * one element's wrath for another's. + */ +public class FireImmunityBargain extends Bargain { + + public static final ResourceLocation ID = CosmicCore.id("cinder"); + public static final FireImmunityBargain INSTANCE = new FireImmunityBargain(); + private static final String BARGAIN_ID = "cinder"; + + /** Fire damage multiplier (0.25 = 75% reduction) */ + public static final float FIRE_DAMAGE_MULTIPLIER = 0.25f; + + /** Cold damage multiplier (2.0 = double damage) */ + public static final float COLD_DAMAGE_MULTIPLIER = 2.0f; + + private FireImmunityBargain() { + super( + ID, + BargainTier.MID, + 64, // shardCost + 25, // weight + 100 // erosion + ); + } + + @Override + public Component getName() { + return ReflectionLang.bargainName(BARGAIN_ID); + } + + @Override + public Component getDescription() { + return ReflectionLang.bargainDescription(BARGAIN_ID); + } + + @Override + public List getOfferDialogue(Player player) { + return List.of( + ReflectionLang.bargainDialogue(BARGAIN_ID, 0), + ReflectionLang.bargainDialogue(BARGAIN_ID, 1), + ReflectionLang.bargainDialogue(BARGAIN_ID, 2), + ReflectionLang.bargainDialogue(BARGAIN_ID, 3), + ReflectionLang.bargainDialogue(BARGAIN_ID, 4)); + } + + @Override + public Component getQuestion() { + return ReflectionLang.bargainQuestion(BARGAIN_ID); + } + + @Override + public List getAnswers() { + return List.of( + new BargainAnswer("burn", ReflectionLang.answerText(BARGAIN_ID, "burn"), + ReflectionLang.answerResponse(BARGAIN_ID, "burn")) + .withDetails( + List.of( + ReflectionLang.answerPower(BARGAIN_ID, "burn", 0), + ReflectionLang.answerPower(BARGAIN_ID, "burn", 1)), + List.of( + ReflectionLang.answerDrawback(BARGAIN_ID, "burn", 0), + ReflectionLang.answerDrawback(BARGAIN_ID, "burn", 1))), + new BargainAnswer("refuse", ReflectionLang.answerText(BARGAIN_ID, "refuse"), + ReflectionLang.answerResponse(BARGAIN_ID, "refuse")) + .withReducedPower()); + } + + @Override + public boolean isContextuallyRelevant(Player player, BargainContext context) { + return context.isBurning(); + } + + @Override + public void onAccept(Player player, BargainAnswer answer) { + if (!answer.id().equals("refuse")) { + player.displayClientMessage(ReflectionLang.bargainOnAccept(BARGAIN_ID), false); + } + } + + @Override + public void onDefy(Player player) { + player.displayClientMessage(ReflectionLang.bargainOnDefy(BARGAIN_ID), false); + } + + @Override + public void tick(Player player) { + // Extinguish fire visual faster (still take reduced damage, but less annoying burning animation) + if (player.getRemainingFireTicks() > 20) { + player.setRemainingFireTicks(20); + } + } + + @Override + public BargainVisual getSoulVisual() { + return BargainVisual.of("ember", "Faint embers drift from the soul's form, it radiates warmth but shivers"); + } + + // ========================================================================= + // Static helper methods for damage integration + // ========================================================================= + + /** + * Check if a player has the Cinder bargain active. + */ + public static boolean hasBargain(Player player) { + return ReflectionCapability.get(player) + .map(reflection -> reflection.hasBargain(ID)) + .orElse(false); + } + + /** + * Modify fire damage for a player with this bargain. + * Returns the modified damage amount. + */ + public static float modifyFireDamage(Player player, float originalDamage) { + if (hasBargain(player)) { + return originalDamage * FIRE_DAMAGE_MULTIPLIER; + } + return originalDamage; + } + + /** + * Modify cold/freeze damage for a player with this bargain. + * Returns the modified damage amount. + */ + public static float modifyColdDamage(Player player, float originalDamage) { + if (hasBargain(player)) { + return originalDamage * COLD_DAMAGE_MULTIPLIER; + } + return originalDamage; + } + + /** + * Check if a damage source is fire-related. + */ + public static boolean isFireDamage(DamageSource source) { + return source.is(DamageTypes.IN_FIRE) || + source.is(DamageTypes.ON_FIRE) || + source.is(DamageTypes.LAVA) || + source.is(DamageTypes.HOT_FLOOR); + } + + /** + * Check if a damage source is cold-related. + */ + public static boolean isColdDamage(DamageSource source) { + return source.is(DamageTypes.FREEZE); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/HealthBargain.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/HealthBargain.java new file mode 100644 index 000000000..f9e31622a --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/HealthBargain.java @@ -0,0 +1,150 @@ +package com.ghostipedia.cosmiccore.common.reflection.bargain.impl; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCapability; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionLang; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; + +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.player.Player; + +import java.util.List; +import java.util.UUID; + +/** + * Health Bargain: More max health, but healing is less effective. + * + * POWER: +10 max health (5 hearts) + * DRAWBACK: Healing from potions and instant health is 50% less effective + * + * Thematically: Your body has expanded beyond its natural limits. There's more + * of you now... but that borrowed flesh resists healing. Potions can't fully + * reach it. Regeneration struggles against what shouldn't exist. + * + * This creates interesting gameplay - you can tank more hits, but recovering + * from damage is harder. Good for exploration, risky for extended combat. + */ +public class HealthBargain extends Bargain { + + public static final ResourceLocation ID = CosmicCore.id("vitality"); + public static final HealthBargain INSTANCE = new HealthBargain(); + private static final String BARGAIN_ID = "vitality"; + private static final UUID MODIFIER_UUID = UUID.fromString("a8c5b6d4-1234-4567-89ab-cdef01234567"); + + /** Healing reduction multiplier (0.5 = 50% less healing from potions) */ + public static final float HEALING_REDUCTION = 0.5f; + + private HealthBargain() { + super( + ID, + BargainTier.EARLY_MID, + 64, // shardCost + 25, // weight + 100 // erosion + ); + } + + @Override + public Component getName() { + return ReflectionLang.bargainName(BARGAIN_ID); + } + + @Override + public Component getDescription() { + return ReflectionLang.bargainDescription(BARGAIN_ID); + } + + @Override + public List getOfferDialogue(Player player) { + return List.of( + ReflectionLang.bargainDialogue(BARGAIN_ID, 0), + ReflectionLang.bargainDialogue(BARGAIN_ID, 1), + ReflectionLang.bargainDialogue(BARGAIN_ID, 2), + ReflectionLang.bargainDialogue(BARGAIN_ID, 3), + ReflectionLang.bargainDialogue(BARGAIN_ID, 4)); + } + + @Override + public Component getQuestion() { + return ReflectionLang.bargainQuestion(BARGAIN_ID); + } + + @Override + public List getAnswers() { + return List.of( + new BargainAnswer("accept", ReflectionLang.answerText(BARGAIN_ID, "accept"), + ReflectionLang.answerResponse(BARGAIN_ID, "accept")) + .withDetails( + List.of( + ReflectionLang.answerPower(BARGAIN_ID, "accept", 0), + ReflectionLang.answerPower(BARGAIN_ID, "accept", 1)), + List.of( + ReflectionLang.answerDrawback(BARGAIN_ID, "accept", 0), + ReflectionLang.answerDrawback(BARGAIN_ID, "accept", 1))), + new BargainAnswer("refuse", ReflectionLang.answerText(BARGAIN_ID, "refuse"), + ReflectionLang.answerResponse(BARGAIN_ID, "refuse")) + .withReducedPower()); + } + + @Override + public void onAccept(Player player, BargainAnswer answer) { + if (answer.id().equals("accept")) { + applyHealthBoost(player); + player.displayClientMessage(ReflectionLang.bargainOnAccept(BARGAIN_ID), false); + } + } + + @Override + public void onDefy(Player player) { + removeHealthBoost(player); + player.displayClientMessage(ReflectionLang.bargainOnDefy(BARGAIN_ID), false); + } + + @Override + public BargainVisual getSoulVisual() { + return BargainVisual.of("swollen", "The soul appears bloated, stretched, rejecting attempts to mend it"); + } + + public static void applyHealthBoost(Player player) { + var attribute = player.getAttribute(Attributes.MAX_HEALTH); + if (attribute != null) { + attribute.removeModifier(MODIFIER_UUID); + attribute.addPermanentModifier(new AttributeModifier( + MODIFIER_UUID, "Reflection Vitality", 10.0, AttributeModifier.Operation.ADDITION)); + } + } + + public static void removeHealthBoost(Player player) { + var attribute = player.getAttribute(Attributes.MAX_HEALTH); + if (attribute != null) { + attribute.removeModifier(MODIFIER_UUID); + } + } + + // ========================================================================= + // Static helper methods for healing integration + // ========================================================================= + + /** + * Check if a player has the Borrowed Vitality bargain active. + */ + public static boolean hasBargain(Player player) { + return ReflectionCapability.get(player) + .map(reflection -> reflection.hasBargain(ID)) + .orElse(false); + } + + /** + * Modify healing amount for a player with this bargain. + * Returns the modified healing amount. + */ + public static float modifyHealing(Player player, float originalHealing) { + if (hasBargain(player)) { + return originalHealing * HEALING_REDUCTION; + } + return originalHealing; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/HomeBargain.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/HomeBargain.java new file mode 100644 index 000000000..f68e63489 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/HomeBargain.java @@ -0,0 +1,201 @@ +package com.ghostipedia.cosmiccore.common.reflection.bargain.impl; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCapability; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionConstants; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionLang; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; + +import java.util.List; +import java.util.Optional; + +/** + * The /home bargain - teleport to spawn/bed. + * + * This is the "poisoned apple" - offered early, seems cheap, but costs escalate + * with repeated quick use. The Reflection knows you'll become dependent on it. + * + * Base cost: 1 erosion (seems cheap!) + * Quick use penalty: Doubles each time used within 15 minutes (1 -> 2 -> 4 -> 8 -> 16) + * Ceiling: 16 erosion per use + * Reset: After 15 minutes of no use, resets to base cost + */ +public class HomeBargain extends Bargain { + + private static final ResourceLocation ID = CosmicCore.id("home"); + public static final HomeBargain INSTANCE = new HomeBargain(); + private static final String BARGAIN_ID = "home"; + + private HomeBargain() { + super( + ID, + BargainTier.EARLY, + 0, // shardCost - FREE (poisoned apple - per-use costs add up) + 0, // weight - FREE (doesn't consume soul capacity) + 100 // erosion - significant upfront cost + per-use escalation + ); + } + + @Override + public Component getName() { + return ReflectionLang.bargainName(BARGAIN_ID); + } + + @Override + public Component getDescription() { + return ReflectionLang.bargainDescription(BARGAIN_ID); + } + + @Override + public List getOfferDialogue(Player player) { + return List.of( + ReflectionLang.bargainDialogue(BARGAIN_ID, 0), + ReflectionLang.bargainDialogue(BARGAIN_ID, 1), + ReflectionLang.bargainDialogue(BARGAIN_ID, 2)); + } + + @Override + public Component getQuestion() { + return ReflectionLang.bargainQuestion(BARGAIN_ID); + } + + @Override + public List getAnswers() { + return List.of( + new BargainAnswer("accept", ReflectionLang.answerText(BARGAIN_ID, "accept"), + ReflectionLang.answerResponse(BARGAIN_ID, "accept")) + .withDetails( + List.of( + ReflectionLang.answerPower(BARGAIN_ID, "accept", 0), + ReflectionLang.answerPower(BARGAIN_ID, "accept", 1)), + List.of( + ReflectionLang.answerDrawback(BARGAIN_ID, "accept", 0), + ReflectionLang.answerDrawback(BARGAIN_ID, "accept", 1))), + new BargainAnswer("refuse", ReflectionLang.answerText(BARGAIN_ID, "refuse"), + ReflectionLang.answerResponse(BARGAIN_ID, "refuse")) + .withReducedPower()); + } + + @Override + public void onAccept(Player player, BargainAnswer answer) { + if (answer.id().equals("accept")) { + player.displayClientMessage(ReflectionLang.bargainOnAccept(BARGAIN_ID), false); + } + } + + @Override + public void onDefy(Player player) { + player.displayClientMessage(ReflectionLang.bargainOnDefy(BARGAIN_ID), false); + } + + @Override + public BargainVisual getSoulVisual() { + return BargainVisual.of("threads", "Faint silver threads extending outward, always pointing home"); + } + + @Override + public void tick(Player player) { + // No passive effects - this is an on-demand ability + } + + /** + * Execute the /home teleport. + * Called when player uses the command (if they have the bargain). + * + * @return true if teleport succeeded, false otherwise + */ + public static boolean executeHome(ServerPlayer player) { + return ReflectionCapability.get(player).map(reflection -> { + if (!reflection.hasBargain(ID)) { + player.displayClientMessage( + Component.literal("\u00A7cYou haven't made this bargain."), + false); + return false; + } + + // Calculate current cost based on usage + int cost = ReflectionConstants.getCommandCost(reflection, "home"); + + // Find home location (bed or world spawn) + Optional homePos = findHomePosition(player); + if (homePos.isEmpty()) { + player.displayClientMessage( + Component.literal("\u00A7cYou have no home to return to."), + false); + return false; + } + + Vec3 home = homePos.get(); + + // Apply erosion cost + reflection.addErosion(cost); + reflection.recordCommandUse("home"); + + // Teleport + player.teleportTo(home.x, home.y, home.z); + + // Effects + player.level().playSound(null, player.blockPosition(), + SoundEvents.ENDERMAN_TELEPORT, SoundSource.PLAYERS, 1.0f, 0.8f); + + // Feedback based on cost + if (cost <= 2) { + player.displayClientMessage( + Component.literal("\u00A77\u00A7o*You feel the familiar pull of home.*"), + true); + } else if (cost <= 8) { + player.displayClientMessage( + Component.literal("\u00A77\u00A7o*The path feels... worn. Familiar. Too familiar.*"), + true); + } else { + player.displayClientMessage( + Component.literal( + "\u00A77\u00A7o*Home. Again. Always home. Do you even remember the world outside?*"), + true); + } + + // Show cost in chat + player.displayClientMessage( + Component.literal("\u00A78[Erosion +" + cost + "]"), + false); + + return true; + }).orElse(false); + } + + private static Optional findHomePosition(ServerPlayer player) { + // Check for bed spawn first + BlockPos bedPos = player.getRespawnPosition(); + if (bedPos != null) { + ServerLevel respawnLevel = player.server.getLevel(player.getRespawnDimension()); + if (respawnLevel != null) { + // Find safe spawn near bed + Optional bedSpawn = Player.findRespawnPositionAndUseSpawnBlock( + respawnLevel, bedPos, player.getRespawnAngle(), true, false); + if (bedSpawn.isPresent()) { + return bedSpawn; + } + } + } + + // Fall back to world spawn + ServerLevel overworld = player.server.getLevel(Level.OVERWORLD); + if (overworld != null) { + BlockPos spawnPos = overworld.getSharedSpawnPos(); + return Optional.of(new Vec3(spawnPos.getX() + 0.5, spawnPos.getY(), spawnPos.getZ() + 0.5)); + } + + return Optional.empty(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/HungerBargain.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/HungerBargain.java new file mode 100644 index 000000000..082eb7112 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/HungerBargain.java @@ -0,0 +1,149 @@ +package com.ghostipedia.cosmiccore.common.reflection.bargain.impl; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCapability; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionLang; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; + +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.food.FoodData; + +import java.util.List; + +/** + * Hunger Bargain: Reduced hunger drain, but food doesn't restore health. + * + * POWER: Hunger depletes 75% slower - you rarely need to eat + * DRAWBACK: Food no longer triggers natural regeneration - you can't heal by eating + * + * Thematically: Your body has forgotten hunger... but also forgotten how to draw + * life from food. You can eat, but it only fills the stomach - it doesn't nourish. + * You'll need potions, golden apples, or other means to heal. + * + * This keeps hunger as a minor concern while creating an interesting healing + * limitation that changes combat strategy. + */ +public class HungerBargain extends Bargain { + + public static final ResourceLocation ID = CosmicCore.id("satiated"); + public static final HungerBargain INSTANCE = new HungerBargain(); + private static final String BARGAIN_ID = "satiated"; + + /** How often to restore hunger (every N ticks, prevents hunger drain) */ + public static final int HUNGER_RESTORE_INTERVAL = 80; // Every 4 seconds + + private HungerBargain() { + super( + ID, + BargainTier.MID, + 256, // shardCost - premium + 50, // weight - expensive commitment + 250 // erosion + ); + } + + @Override + public Component getName() { + return ReflectionLang.bargainName(BARGAIN_ID); + } + + @Override + public Component getDescription() { + return ReflectionLang.bargainDescription(BARGAIN_ID); + } + + @Override + public List getOfferDialogue(Player player) { + return List.of( + ReflectionLang.bargainDialogue(BARGAIN_ID, 0), + ReflectionLang.bargainDialogue(BARGAIN_ID, 1), + ReflectionLang.bargainDialogue(BARGAIN_ID, 2), + ReflectionLang.bargainDialogue(BARGAIN_ID, 3), + ReflectionLang.bargainDialogue(BARGAIN_ID, 4)); + } + + @Override + public Component getQuestion() { + return ReflectionLang.bargainQuestion(BARGAIN_ID); + } + + @Override + public List getAnswers() { + return List.of( + new BargainAnswer("empty", ReflectionLang.answerText(BARGAIN_ID, "empty"), + ReflectionLang.answerResponse(BARGAIN_ID, "empty")) + .withDetails( + List.of( + ReflectionLang.answerPower(BARGAIN_ID, "empty", 0), + ReflectionLang.answerPower(BARGAIN_ID, "empty", 1)), + List.of( + ReflectionLang.answerDrawback(BARGAIN_ID, "empty", 0), + ReflectionLang.answerDrawback(BARGAIN_ID, "empty", 1))), + new BargainAnswer("refuse", ReflectionLang.answerText(BARGAIN_ID, "refuse"), + ReflectionLang.answerResponse(BARGAIN_ID, "refuse")) + .withReducedPower()); + } + + @Override + public boolean isContextuallyRelevant(Player player, BargainContext context) { + return context.isHungry(); + } + + @Override + public void onAccept(Player player, BargainAnswer answer) { + if (answer.id().equals("empty")) { + player.displayClientMessage(ReflectionLang.bargainOnAccept(BARGAIN_ID), false); + } + } + + @Override + public void onDefy(Player player) { + player.displayClientMessage(ReflectionLang.bargainOnDefy(BARGAIN_ID), false); + } + + @Override + public void tick(Player player) { + // Periodically restore some hunger to simulate 75% slower drain + // Instead of keeping it full, we restore 1 hunger every 4 seconds + // This means hunger still exists but drains very slowly + if (player.level().getGameTime() % HUNGER_RESTORE_INTERVAL == 0) { + FoodData food = player.getFoodData(); + if (food.getFoodLevel() < 20) { + food.setFoodLevel(Math.min(20, food.getFoodLevel() + 1)); + } + // Keep saturation moderate (but not max - allows some natural drain) + if (food.getSaturationLevel() < 2.0f) { + food.setSaturation(2.0f); + } + } + } + + @Override + public BargainVisual getSoulVisual() { + return BargainVisual.of("hollow", + "The soul's midsection is translucent, food passes through without nourishing"); + } + + // ========================================================================= + // Static helper methods for healing integration + // ========================================================================= + + /** + * Check if a player has the Hollow Satiation bargain active. + */ + public static boolean hasBargain(Player player) { + return ReflectionCapability.get(player) + .map(reflection -> reflection.hasBargain(ID)) + .orElse(false); + } + + /** + * Check if natural regeneration should be blocked for this player. + * Returns true if player has bargain and should NOT heal from food. + */ + public static boolean shouldBlockNaturalRegen(Player player) { + return hasBargain(player); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/NightVisionBargain.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/NightVisionBargain.java new file mode 100644 index 000000000..64b349e04 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/NightVisionBargain.java @@ -0,0 +1,183 @@ +package com.ghostipedia.cosmiccore.common.reflection.bargain.impl; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCapability; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionLang; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.player.Player; + +import java.util.List; + +/** + * Night Vision Bargain: See in darkness, but bright light hurts. + * + * POWER: Permanent night vision effect + * DRAWBACK: Bright light (sky light level 15) causes blindness and minor damage + * + * Thematically: Your eyes have been remade for the dark. They see perfectly + * in shadow... but the sun is now your enemy. You've traded one limitation + * for another - now you must hide from daylight or suffer. + * + * This creates interesting gameplay - underground exploration is trivial, + * but surface travel during day requires planning or infrastructure. + */ +public class NightVisionBargain extends Bargain { + + public static final ResourceLocation ID = CosmicCore.id("darksight"); + public static final NightVisionBargain INSTANCE = new NightVisionBargain(); + private static final String BARGAIN_ID = "darksight"; + + /** Light level at which blindness starts (bright sunlight) */ + public static final int BRIGHT_LIGHT_THRESHOLD = 14; + + /** Damage dealt per tick when in bright light (0.5 = 1 heart per second at 20 ticks/sec) */ + public static final float BRIGHT_LIGHT_DAMAGE = 0.5f; + + /** How often to apply light damage (every N ticks) */ + public static final int LIGHT_DAMAGE_INTERVAL = 20; + + private NightVisionBargain() { + super( + ID, + BargainTier.EARLY, + 256, // shardCost - premium + 25, // weight + 150 // erosion + ); + } + + @Override + public Component getName() { + return ReflectionLang.bargainName(BARGAIN_ID); + } + + @Override + public Component getDescription() { + return ReflectionLang.bargainDescription(BARGAIN_ID); + } + + @Override + public List getOfferDialogue(Player player) { + return List.of( + ReflectionLang.bargainDialogue(BARGAIN_ID, 0), + ReflectionLang.bargainDialogue(BARGAIN_ID, 1), + ReflectionLang.bargainDialogue(BARGAIN_ID, 2), + ReflectionLang.bargainDialogue(BARGAIN_ID, 3), + ReflectionLang.bargainDialogue(BARGAIN_ID, 4)); + } + + @Override + public Component getQuestion() { + return ReflectionLang.bargainQuestion(BARGAIN_ID); + } + + @Override + public List getAnswers() { + return List.of( + new BargainAnswer("yes", ReflectionLang.answerText(BARGAIN_ID, "yes"), + ReflectionLang.answerResponse(BARGAIN_ID, "yes")) + .withDetails( + List.of( + ReflectionLang.answerPower(BARGAIN_ID, "yes", 0), + ReflectionLang.answerPower(BARGAIN_ID, "yes", 1)), + List.of( + ReflectionLang.answerDrawback(BARGAIN_ID, "yes", 0), + ReflectionLang.answerDrawback(BARGAIN_ID, "yes", 1))), + new BargainAnswer("refuse", ReflectionLang.answerText(BARGAIN_ID, "refuse"), + ReflectionLang.answerResponse(BARGAIN_ID, "refuse")) + .withReducedPower()); + } + + @Override + public void onAccept(Player player, BargainAnswer answer) { + if (!answer.id().equals("refuse")) { + player.displayClientMessage(ReflectionLang.bargainOnAccept(BARGAIN_ID), false); + } + } + + @Override + public void onDefy(Player player) { + player.removeEffect(MobEffects.NIGHT_VISION); + player.removeEffect(MobEffects.BLINDNESS); + player.displayClientMessage(ReflectionLang.bargainOnDefy(BARGAIN_ID), false); + } + + @Override + public void tick(Player player) { + // Always apply night vision + if (!player.hasEffect(MobEffects.NIGHT_VISION) || + player.getEffect(MobEffects.NIGHT_VISION).getDuration() < 400) { + player.addEffect(new MobEffectInstance(MobEffects.NIGHT_VISION, 600, 0, true, false, false)); + } + + // Check light level - apply blindness and damage in bright light + BlockPos pos = player.blockPosition(); + int skyLight = player.level().getBrightness(net.minecraft.world.level.LightLayer.SKY, pos); + int blockLight = player.level().getBrightness(net.minecraft.world.level.LightLayer.BLOCK, pos); + int effectiveLight = Math.max(skyLight, blockLight); + + // Only sky light at max during day causes problems (not torches) + boolean inBrightSunlight = skyLight >= BRIGHT_LIGHT_THRESHOLD && + player.level().isDay() && + player.level().canSeeSky(pos); + + if (inBrightSunlight) { + // Apply blindness + if (!player.hasEffect(MobEffects.BLINDNESS) || + player.getEffect(MobEffects.BLINDNESS).getDuration() < 40) { + player.addEffect(new MobEffectInstance(MobEffects.BLINDNESS, 60, 0, true, false, true)); + } + + // Apply periodic damage + if (player.level().getGameTime() % LIGHT_DAMAGE_INTERVAL == 0) { + player.hurt(player.damageSources().magic(), BRIGHT_LIGHT_DAMAGE); + + // Occasional warning + if (player.level().getGameTime() % 100 == 0) { + player.displayClientMessage( + Component.literal("\u00A7c\u00A7o*The light burns! Seek shadow!*"), + true); + } + } + } + } + + @Override + public BargainVisual getSoulVisual() { + return BargainVisual.of("voidEyes", + "The soul's eyes are empty voids that somehow still see, flinching from light"); + } + + // ========================================================================= + // Static helper methods + // ========================================================================= + + /** + * Check if a player has the Void Sight bargain active. + */ + public static boolean hasBargain(Player player) { + return ReflectionCapability.get(player) + .map(reflection -> reflection.hasBargain(ID)) + .orElse(false); + } + + /** + * Check if a player is currently being hurt by light. + */ + public static boolean isBeingHurtByLight(Player player) { + if (!hasBargain(player)) return false; + + BlockPos pos = player.blockPosition(); + int skyLight = player.level().getBrightness(net.minecraft.world.level.LightLayer.SKY, pos); + + return skyLight >= BRIGHT_LIGHT_THRESHOLD && + player.level().isDay() && + player.level().canSeeSky(pos); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/QuakeMovementBargain.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/QuakeMovementBargain.java new file mode 100644 index 000000000..0819bcffa --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/QuakeMovementBargain.java @@ -0,0 +1,120 @@ +package com.ghostipedia.cosmiccore.common.reflection.bargain.impl; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionLang; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; + +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Player; + +import java.util.List; + +/** + * The First Bargain: Quake Movement + * + * Offered after the player dies a few times and realizes they're immortal. + * They're running from the realization of what they are. + * + * Power: Bunny hopping, air strafing, momentum preservation. + * Cost: Chose denial - some self-understanding paths locked. + */ +public class QuakeMovementBargain extends Bargain { + + public static final QuakeMovementBargain INSTANCE = new QuakeMovementBargain(); + private static final String BARGAIN_ID = "quake_movement"; + + private QuakeMovementBargain() { + super( + CosmicCore.id("quake_movement"), + BargainTier.EARLY, + 0, // shardCost - FREE (the hook to get players into the system) + 0, // weight - FREE (doesn't consume soul capacity) + 0 // erosion - FREE (truly no cost) + ); + } + + @Override + public Component getName() { + return ReflectionLang.bargainName(BARGAIN_ID); + } + + @Override + public Component getDescription() { + return ReflectionLang.bargainDescription(BARGAIN_ID); + } + + @Override + public List getOfferDialogue(Player player) { + return List.of( + ReflectionLang.bargainDialogue(BARGAIN_ID, 0), + ReflectionLang.bargainDialogue(BARGAIN_ID, 1), + ReflectionLang.bargainDialogue(BARGAIN_ID, 2), + ReflectionLang.bargainDialogue(BARGAIN_ID, 3)); + } + + @Override + public Component getQuestion() { + return ReflectionLang.bargainQuestion(BARGAIN_ID); + } + + @Override + public List getAnswers() { + return List.of( + new BargainAnswer( + "yes", + ReflectionLang.answerText(BARGAIN_ID, "yes"), + ReflectionLang.answerResponse(BARGAIN_ID, "yes")).withDetails( + List.of( + ReflectionLang.answerPower(BARGAIN_ID, "yes", 0), + ReflectionLang.answerPower(BARGAIN_ID, "yes", 1)), + List.of( + ReflectionLang.answerDrawback(BARGAIN_ID, "yes", 0))), + new BargainAnswer( + "refuse", + ReflectionLang.answerText(BARGAIN_ID, "refuse"), + ReflectionLang.answerResponse(BARGAIN_ID, "refuse")).withReducedPower()); + } + + @Override + public boolean isContextuallyRelevant(Player player, BargainContext context) { + // This bargain is always relevant for the first encounter + return true; + } + + @Override + public void onAccept(Player player, BargainAnswer answer) { + // The quake movement effect is applied via the movement handler + // This just marks the bargain as accepted + CosmicCore.LOGGER.info("Player {} accepted Quake Movement bargain with answer: {}", + player.getName().getString(), answer.id()); + } + + @Override + public void onDefy(Player player) { + CosmicCore.LOGGER.info("Player {} defied Quake Movement bargain", player.getName().getString()); + // Movement returns to normal, but they still remember running + } + + @Override + public BargainVisual getSoulVisual() { + return BargainVisual.of( + "quake_legs", + "Legs elongated, joints bent wrong, always slightly blurred"); + } + + @Override + public List getAcceptDialogue(Player player, BargainAnswer answer) { + return List.of( + ReflectionLang.bargainAccept(BARGAIN_ID, 0), + ReflectionLang.bargainAccept(BARGAIN_ID, 1), + ReflectionLang.bargainAccept(BARGAIN_ID, 2)); + } + + @Override + public List getRefuseDialogue(Player player) { + return List.of( + ReflectionLang.bargainRefuse(BARGAIN_ID, 0), + ReflectionLang.bargainRefuse(BARGAIN_ID, 1), + ReflectionLang.bargainRefuse(BARGAIN_ID, 2)); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/QuakeMovementHandler.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/QuakeMovementHandler.java new file mode 100644 index 000000000..ba621ccb0 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/QuakeMovementHandler.java @@ -0,0 +1,302 @@ +package com.ghostipedia.cosmiccore.common.reflection.bargain.impl; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.item.armor.boots.ICosmicBoots; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCapability; + +import com.gregtechceu.gtceu.api.item.armor.ArmorComponentItem; + +import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +@Mod.EventBusSubscriber(modid = CosmicCore.MOD_ID) +public class QuakeMovementHandler { + + private static final Map wasOnGround = new HashMap<>(); + private static final Map airTime = new HashMap<>(); + + private static boolean clientHasQuakeMovement = false; + + private static final double AIR_ACCELERATE = 200.0; + private static final double AIR_WISH_SPEED = 0.8; + private static final double BHOP_BOOST = 1.25; + private static final double MAX_SPEED = 1.2; + private static final double MIN_BHOP_SPEED = 0.08; + private static final double FRICTION_COUNTER = 0.85; + + private static final boolean DEBUG_MODE = false; + private static final double VANILLA_SPRINT_SPEED = 0.28; + private static final double VANILLA_SPRINT_JUMP_SPEED = 0.36; + + private static int lastBhopTick = 0; + private static int lastStrafeTick = 0; + private static double sessionMaxSpeed = 0; + + @OnlyIn(Dist.CLIENT) + public static void setClientHasQuakeMovement(boolean has) { + clientHasQuakeMovement = has; + CosmicCore.LOGGER.info("Client quake movement set to: {}", has); + } + + @SubscribeEvent + public static void onPlayerTick(TickEvent.PlayerTickEvent event) { + if (event.phase != TickEvent.Phase.START) return; + + Player player = event.player; + + if (!player.level().isClientSide()) return; + if (!clientHasQuakeMovement) return; + if (player != Minecraft.getInstance().player) return; + + if (player.isInWater() || player.isInLava() || player.isInFluidType((fluidType, height) -> height > 0.0)) + return; + + if (player.getAbilities().flying || player.isFallFlying()) + return; + + UUID uuid = player.getUUID(); + boolean onGround = player.onGround(); + boolean wasGrounded = wasOnGround.getOrDefault(uuid, true); + + Vec3 motion = player.getDeltaMovement(); + double horizontalSpeed = getHorizontalSpeed(motion); + + if (!onGround) { + airTime.merge(uuid, 1, Integer::sum); + } else { + airTime.put(uuid, 0); + } + + boolean didBhop = false; + if (onGround && !wasGrounded && horizontalSpeed > MIN_BHOP_SPEED) { + double oldSpeed = horizontalSpeed; + motion = applyBunnyHop(player, motion, horizontalSpeed); + player.setDeltaMovement(motion); + double newSpeed = getHorizontalSpeed(motion); + horizontalSpeed = newSpeed; + didBhop = newSpeed > oldSpeed; + + if (DEBUG_MODE && didBhop) { + lastBhopTick = player.tickCount; + } + } + + boolean didStrafe = false; + if (!onGround) { + double oldSpeed = getHorizontalSpeed(motion); + motion = applyAirAcceleration(player, motion); + player.setDeltaMovement(motion); + double newSpeed = getHorizontalSpeed(motion); + didStrafe = newSpeed > oldSpeed + 0.005; + + if (DEBUG_MODE && didStrafe) { + lastStrafeTick = player.tickCount; + } + } + + if (onGround && horizontalSpeed > MIN_BHOP_SPEED) { + motion = reduceGroundFriction(player, motion, horizontalSpeed); + player.setDeltaMovement(motion); + } + + if (DEBUG_MODE) { + double speed = getHorizontalSpeed(player.getDeltaMovement()); + if (speed > sessionMaxSpeed) { + sessionMaxSpeed = speed; + } + + StringBuilder status = new StringBuilder(); + + ChatFormatting speedColor = getSpeedColor(speed); + String speedMultiple = String.format("%.1fx", speed / VANILLA_SPRINT_SPEED); + + boolean recentBhop = (player.tickCount - lastBhopTick) < 20; + boolean recentStrafe = (player.tickCount - lastStrafeTick) < 10; + + if (recentBhop) { + status.append("§a[BHOP!] "); + } + if (recentStrafe && !onGround) { + status.append("§b[STRAFE] "); + } + + status.append(speedColor.toString()); + status.append(String.format("%.2f b/t (%s)", speed, speedMultiple)); + + if (sessionMaxSpeed > VANILLA_SPRINT_JUMP_SPEED) { + status.append(String.format(" §7| Max: §d%.2f", sessionMaxSpeed)); + } + + status.append(onGround ? " §7[G]" : " §e[AIR]"); + + float fwd = player.zza; + float strafe = player.xxa; + if (Math.abs(fwd) > 0.01 || Math.abs(strafe) > 0.01) { + status.append(String.format(" §8[%.1f/%.1f]", fwd, strafe)); + } + + player.displayClientMessage(Component.literal(status.toString()), true); + } + + wasOnGround.put(uuid, onGround); + } + + public static boolean hasQuakeMovement(Player player) { + return ReflectionCapability.get(player) + .map(reflection -> reflection.hasBargain(QuakeMovementBargain.INSTANCE.getId())) + .orElse(false); + } + + private static Vec3 applyBunnyHop(Player player, Vec3 motion, double currentSpeed) { + double maxSpeed = getEffectiveMaxSpeed(player); + double boostedSpeed = Math.min(currentSpeed * BHOP_BOOST, maxSpeed); + + if (boostedSpeed > currentSpeed && currentSpeed > 0) { + double scale = boostedSpeed / currentSpeed; + return new Vec3(motion.x * scale, motion.y, motion.z * scale); + } + + return motion; + } + + private static Vec3 applyAirAcceleration(Player player, Vec3 motion) { + float forward = player.zza; + float strafe = player.xxa; + + if (Math.abs(forward) < 0.01 && Math.abs(strafe) < 0.01) { + return motion; + } + + float yaw = player.getYRot() * ((float) Math.PI / 180f); + + double wishX = -Math.sin(yaw) * forward + Math.cos(yaw) * strafe; + double wishZ = Math.cos(yaw) * forward + Math.sin(yaw) * strafe; + + double wishLength = Math.sqrt(wishX * wishX + wishZ * wishZ); + if (wishLength > 0.01) { + wishX /= wishLength; + wishZ /= wishLength; + } else { + return motion; + } + + double currentWishSpeed = motion.x * wishX + motion.z * wishZ; + double addSpeed = AIR_WISH_SPEED - currentWishSpeed; + + if (addSpeed <= 0) { + return motion; + } + + double accelSpeed = AIR_ACCELERATE * 0.05 * AIR_WISH_SPEED; + + if (accelSpeed > addSpeed) { + accelSpeed = addSpeed; + } + + double newX = motion.x + accelSpeed * wishX; + double newZ = motion.z + accelSpeed * wishZ; + + double maxSpeed = getEffectiveMaxSpeed(player); + double newSpeed = Math.sqrt(newX * newX + newZ * newZ); + if (newSpeed > maxSpeed) { + double scale = maxSpeed / newSpeed; + newX *= scale; + newZ *= scale; + } + + return new Vec3(newX, motion.y, newZ); + } + + private static Vec3 reduceGroundFriction(Player player, Vec3 motion, double currentSpeed) { + double boost = 1.0 + FRICTION_COUNTER; + + double newX = motion.x * boost; + double newZ = motion.z * boost; + + double newSpeed = Math.sqrt(newX * newX + newZ * newZ); + + double maxSpeed = getEffectiveMaxSpeed(player); + if (newSpeed > maxSpeed) { + double scale = maxSpeed / newSpeed; + newX *= scale; + newZ *= scale; + } + + if (newSpeed > currentSpeed * 1.01) { + double scale = currentSpeed / newSpeed; + newX *= scale; + newZ *= scale; + } + + return new Vec3(newX, motion.y, newZ); + } + + private static double getHorizontalSpeed(Vec3 motion) { + return Math.sqrt(motion.x * motion.x + motion.z * motion.z); + } + + private static double getEffectiveMaxSpeed(Player player) { + ItemStack boots = player.getItemBySlot(EquipmentSlot.FEET); + if (!boots.isEmpty() && boots.getItem() instanceof ArmorComponentItem armorItem) { + if (armorItem.getArmorLogic() instanceof ICosmicBoots cosmicBoots) { + double bootSpeed = cosmicBoots.getEffectiveMaxSpeed(boots); + if (bootSpeed <= 0) { + return MAX_SPEED; + } + return bootSpeed; + } + } + return MAX_SPEED; + } + + public static void removePlayer(UUID uuid) { + wasOnGround.remove(uuid); + airTime.remove(uuid); + } + + @OnlyIn(Dist.CLIENT) + private static void sendDebugMessage(Player player, ChatFormatting color, String format, Object... args) { + if (!DEBUG_MODE) return; + String msg = String.format(format, args); + player.displayClientMessage( + Component.literal("[QUAKE] ").withStyle(ChatFormatting.GOLD) + .append(Component.literal(msg).withStyle(color)), + true); + } + + private static ChatFormatting getSpeedColor(double speed) { + if (speed >= 1.0) return ChatFormatting.LIGHT_PURPLE; + if (speed >= 0.6) return ChatFormatting.RED; + if (speed >= VANILLA_SPRINT_JUMP_SPEED) return ChatFormatting.YELLOW; + if (speed >= VANILLA_SPRINT_SPEED) return ChatFormatting.GREEN; + return ChatFormatting.GRAY; + } + + private static String getSpeedComparison(double speed) { + double sprintMultiple = speed / VANILLA_SPRINT_SPEED; + if (speed < 0.05) { + return "(standing)"; + } else if (speed < VANILLA_SPRINT_SPEED) { + return String.format("(%.0f%% of sprint)", sprintMultiple * 100); + } else if (speed < VANILLA_SPRINT_JUMP_SPEED) { + return String.format("(%.1fx sprint)", sprintMultiple); + } else { + return String.format("(%.1fx sprint, %.1fx sprint-jump)", + sprintMultiple, speed / VANILLA_SPRINT_JUMP_SPEED); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/ReachBargain.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/ReachBargain.java new file mode 100644 index 000000000..e0d64f6e0 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/ReachBargain.java @@ -0,0 +1,125 @@ +package com.ghostipedia.cosmiccore.common.reflection.bargain.impl; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionLang; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; + +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.player.Player; +import net.minecraftforge.common.ForgeMod; + +import java.util.List; +import java.util.UUID; + +/** + * Reach Bargain: +2 block reach for mining/attacking + * + * Your arms stretch. Just a little. Just enough. + * Very useful QoL for building and combat. + */ +public class ReachBargain extends Bargain { + + public static final ResourceLocation ID = CosmicCore.id("reach"); + public static final ReachBargain INSTANCE = new ReachBargain(); + private static final String BARGAIN_ID = "reach"; + private static final UUID REACH_MODIFIER_UUID = UUID.fromString("d1f8e907-4567-7890-bcde-f01234567890"); + private static final UUID ATTACK_MODIFIER_UUID = UUID.fromString("d1f8e907-4567-7890-bcde-f01234567891"); + + private ReachBargain() { + super( + ID, + BargainTier.MID, + 64, // shardCost + 25, // weight + 100 // erosion + ); + } + + @Override + public Component getName() { + return ReflectionLang.bargainName(BARGAIN_ID); + } + + @Override + public Component getDescription() { + return ReflectionLang.bargainDescription(BARGAIN_ID); + } + + @Override + public List getOfferDialogue(Player player) { + return List.of( + ReflectionLang.bargainDialogue(BARGAIN_ID, 0), + ReflectionLang.bargainDialogue(BARGAIN_ID, 1), + ReflectionLang.bargainDialogue(BARGAIN_ID, 2), + ReflectionLang.bargainDialogue(BARGAIN_ID, 3)); + } + + @Override + public Component getQuestion() { + return ReflectionLang.bargainQuestion(BARGAIN_ID); + } + + @Override + public List getAnswers() { + return List.of( + new BargainAnswer("further", ReflectionLang.answerText(BARGAIN_ID, "further"), + ReflectionLang.answerResponse(BARGAIN_ID, "further")) + .withDetails( + List.of( + ReflectionLang.answerPower(BARGAIN_ID, "further", 0), + ReflectionLang.answerPower(BARGAIN_ID, "further", 1)), + List.of( + ReflectionLang.answerDrawback(BARGAIN_ID, "further", 0), + ReflectionLang.answerDrawback(BARGAIN_ID, "further", 1))), + new BargainAnswer("refuse", ReflectionLang.answerText(BARGAIN_ID, "refuse"), + ReflectionLang.answerResponse(BARGAIN_ID, "refuse")) + .withReducedPower()); + } + + @Override + public void onAccept(Player player, BargainAnswer answer) { + if (!answer.id().equals("refuse")) { + applyReachBoost(player); + } + } + + @Override + public void onDefy(Player player) { + removeReachBoost(player); + } + + @Override + public BargainVisual getSoulVisual() { + return BargainVisual.of("longArms", "The soul's arms extend slightly too far, joints in wrong places"); + } + + public static void applyReachBoost(Player player) { + var reachAttr = player.getAttribute(ForgeMod.BLOCK_REACH.get()); + if (reachAttr != null) { + reachAttr.removeModifier(REACH_MODIFIER_UUID); + reachAttr.addPermanentModifier(new AttributeModifier( + REACH_MODIFIER_UUID, "Reflection Reach", 2.0, AttributeModifier.Operation.ADDITION)); + } + + var attackAttr = player.getAttribute(ForgeMod.ENTITY_REACH.get()); + if (attackAttr != null) { + attackAttr.removeModifier(ATTACK_MODIFIER_UUID); + attackAttr.addPermanentModifier(new AttributeModifier( + ATTACK_MODIFIER_UUID, "Reflection Attack Reach", 2.0, AttributeModifier.Operation.ADDITION)); + } + } + + public static void removeReachBoost(Player player) { + var reachAttr = player.getAttribute(ForgeMod.BLOCK_REACH.get()); + if (reachAttr != null) { + reachAttr.removeModifier(REACH_MODIFIER_UUID); + } + + var attackAttr = player.getAttribute(ForgeMod.ENTITY_REACH.get()); + if (attackAttr != null) { + attackAttr.removeModifier(ATTACK_MODIFIER_UUID); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/StepAssistBargain.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/StepAssistBargain.java new file mode 100644 index 000000000..809b7bb47 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/StepAssistBargain.java @@ -0,0 +1,111 @@ +package com.ghostipedia.cosmiccore.common.reflection.bargain.impl; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionLang; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; + +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.player.Player; +import net.minecraftforge.common.ForgeMod; + +import java.util.List; +import java.util.UUID; + +/** + * Step Assist Bargain: Auto-step up 1.5 blocks + * + * Small obstacles no longer impede you. + * A minor convenience with a minor cost. + */ +public class StepAssistBargain extends Bargain { + + public static final ResourceLocation ID = CosmicCore.id("stride"); + public static final StepAssistBargain INSTANCE = new StepAssistBargain(); + private static final String BARGAIN_ID = "stride"; + private static final UUID MODIFIER_UUID = UUID.fromString("f3b0c1d9-6789-9012-def0-123456789012"); + + private StepAssistBargain() { + super( + ID, + BargainTier.EARLY, + 16, // shardCost - cheap starter + 10, // weight + 50 // erosion + ); + } + + @Override + public Component getName() { + return ReflectionLang.bargainName(BARGAIN_ID); + } + + @Override + public Component getDescription() { + return ReflectionLang.bargainDescription(BARGAIN_ID); + } + + @Override + public List getOfferDialogue(Player player) { + return List.of( + ReflectionLang.bargainDialogue(BARGAIN_ID, 0), + ReflectionLang.bargainDialogue(BARGAIN_ID, 1), + ReflectionLang.bargainDialogue(BARGAIN_ID, 2), + ReflectionLang.bargainDialogue(BARGAIN_ID, 3)); + } + + @Override + public Component getQuestion() { + return ReflectionLang.bargainQuestion(BARGAIN_ID); + } + + @Override + public List getAnswers() { + return List.of( + new BargainAnswer("accept", ReflectionLang.answerText(BARGAIN_ID, "accept"), + ReflectionLang.answerResponse(BARGAIN_ID, "accept")) + .withDetails( + List.of( + ReflectionLang.answerPower(BARGAIN_ID, "accept", 0), + ReflectionLang.answerPower(BARGAIN_ID, "accept", 1)), + List.of( + ReflectionLang.answerDrawback(BARGAIN_ID, "accept", 0))), + new BargainAnswer("refuse", ReflectionLang.answerText(BARGAIN_ID, "refuse"), + ReflectionLang.answerResponse(BARGAIN_ID, "refuse")) + .withReducedPower()); + } + + @Override + public void onAccept(Player player, BargainAnswer answer) { + if (!answer.id().equals("refuse")) { + applyStepAssist(player); + } + } + + @Override + public void onDefy(Player player) { + removeStepAssist(player); + } + + @Override + public BargainVisual getSoulVisual() { + return BargainVisual.of("tallLegs", "The soul's legs appear slightly elongated"); + } + + public static void applyStepAssist(Player player) { + var attribute = player.getAttribute(ForgeMod.STEP_HEIGHT_ADDITION.get()); + if (attribute != null) { + attribute.removeModifier(MODIFIER_UUID); + attribute.addPermanentModifier(new AttributeModifier( + MODIFIER_UUID, "Reflection Stride", 1.0, AttributeModifier.Operation.ADDITION)); + } + } + + public static void removeStepAssist(Player player) { + var attribute = player.getAttribute(ForgeMod.STEP_HEIGHT_ADDITION.get()); + if (attribute != null) { + attribute.removeModifier(MODIFIER_UUID); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/StrengthBargain.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/StrengthBargain.java new file mode 100644 index 000000000..bacdea037 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/StrengthBargain.java @@ -0,0 +1,159 @@ +package com.ghostipedia.cosmiccore.common.reflection.bargain.impl; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCapability; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionLang; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; + +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.player.Player; + +import java.util.List; +import java.util.UUID; + +/** + * Strength Bargain: More damage dealt, but more damage taken from mobs. + * + * POWER: +4 attack damage + * DRAWBACK: Take 25% more damage from hostile mobs + * + * Thematically: Violence begets violence. Your strikes carry borrowed fury... + * but that fury makes you a magnet for aggression. Mobs sense the violence + * in you and strike harder, as if responding to a challenge. + * + * This creates glass-cannon gameplay - you hit harder but can't afford to + * get hit. Rewards skilled combat but punishes mistakes. + */ +public class StrengthBargain extends Bargain { + + public static final ResourceLocation ID = CosmicCore.id("violence"); + public static final StrengthBargain INSTANCE = new StrengthBargain(); + private static final String BARGAIN_ID = "violence"; + private static final UUID MODIFIER_UUID = UUID.fromString("b9d6c7e5-2345-5678-9abc-def012345678"); + + /** Damage increase from mobs (1.25 = 25% more damage taken) */ + public static final float MOB_DAMAGE_MULTIPLIER = 1.25f; + + private StrengthBargain() { + super( + ID, + BargainTier.EARLY_MID, + 64, // shardCost + 25, // weight + 100 // erosion + ); + } + + @Override + public Component getName() { + return ReflectionLang.bargainName(BARGAIN_ID); + } + + @Override + public Component getDescription() { + return ReflectionLang.bargainDescription(BARGAIN_ID); + } + + @Override + public List getOfferDialogue(Player player) { + return List.of( + ReflectionLang.bargainDialogue(BARGAIN_ID, 0), + ReflectionLang.bargainDialogue(BARGAIN_ID, 1), + ReflectionLang.bargainDialogue(BARGAIN_ID, 2), + ReflectionLang.bargainDialogue(BARGAIN_ID, 3), + ReflectionLang.bargainDialogue(BARGAIN_ID, 4)); + } + + @Override + public Component getQuestion() { + return ReflectionLang.bargainQuestion(BARGAIN_ID); + } + + @Override + public List getAnswers() { + return List.of( + new BargainAnswer("accept", ReflectionLang.answerText(BARGAIN_ID, "accept"), + ReflectionLang.answerResponse(BARGAIN_ID, "accept")) + .withDetails( + List.of( + ReflectionLang.answerPower(BARGAIN_ID, "accept", 0), + ReflectionLang.answerPower(BARGAIN_ID, "accept", 1)), + List.of( + ReflectionLang.answerDrawback(BARGAIN_ID, "accept", 0), + ReflectionLang.answerDrawback(BARGAIN_ID, "accept", 1))), + new BargainAnswer("refuse", ReflectionLang.answerText(BARGAIN_ID, "refuse"), + ReflectionLang.answerResponse(BARGAIN_ID, "refuse")) + .withReducedPower()); + } + + @Override + public void onAccept(Player player, BargainAnswer answer) { + if (!answer.id().equals("refuse")) { + applyStrengthBoost(player); + player.displayClientMessage(ReflectionLang.bargainOnAccept(BARGAIN_ID), false); + } + } + + @Override + public void onDefy(Player player) { + removeStrengthBoost(player); + player.displayClientMessage(ReflectionLang.bargainOnDefy(BARGAIN_ID), false); + } + + @Override + public BargainVisual getSoulVisual() { + return BargainVisual.of("claws", "The soul's hands end in dark, sharp points, surrounded by hostile energy"); + } + + public static void applyStrengthBoost(Player player) { + var attribute = player.getAttribute(Attributes.ATTACK_DAMAGE); + if (attribute != null) { + attribute.removeModifier(MODIFIER_UUID); + attribute.addPermanentModifier(new AttributeModifier( + MODIFIER_UUID, "Reflection Violence", 4.0, AttributeModifier.Operation.ADDITION)); + } + } + + public static void removeStrengthBoost(Player player) { + var attribute = player.getAttribute(Attributes.ATTACK_DAMAGE); + if (attribute != null) { + attribute.removeModifier(MODIFIER_UUID); + } + } + + // ========================================================================= + // Static helper methods for damage integration + // ========================================================================= + + /** + * Check if a player has the Inherited Violence bargain active. + */ + public static boolean hasBargain(Player player) { + return ReflectionCapability.get(player) + .map(reflection -> reflection.hasBargain(ID)) + .orElse(false); + } + + /** + * Modify damage from mobs for a player with this bargain. + * Returns the modified damage amount. + */ + public static float modifyMobDamage(Player player, float originalDamage, DamageSource source) { + if (hasBargain(player) && isMobDamage(source)) { + return originalDamage * MOB_DAMAGE_MULTIPLIER; + } + return originalDamage; + } + + /** + * Check if a damage source is from a hostile mob. + */ + public static boolean isMobDamage(DamageSource source) { + return source.getEntity() instanceof Monster; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/SwiftnessBargain.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/SwiftnessBargain.java new file mode 100644 index 000000000..029c779c8 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/SwiftnessBargain.java @@ -0,0 +1,110 @@ +package com.ghostipedia.cosmiccore.common.reflection.bargain.impl; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionLang; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; + +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.player.Player; + +import java.util.List; +import java.util.UUID; + +/** + * Swiftness Bargain: +20% movement speed + * + * A minor stat boost for those who want to move faster. + * Less dramatic than Quake Movement, but always active. + */ +public class SwiftnessBargain extends Bargain { + + public static final ResourceLocation ID = CosmicCore.id("swiftness"); + public static final SwiftnessBargain INSTANCE = new SwiftnessBargain(); + private static final String BARGAIN_ID = "swiftness"; + private static final UUID MODIFIER_UUID = UUID.fromString("c0e7d8f6-3456-6789-abcd-ef0123456789"); + + private SwiftnessBargain() { + super( + ID, + BargainTier.EARLY, + 16, // shardCost - cheap starter + 10, // weight + 50 // erosion + ); + } + + @Override + public Component getName() { + return ReflectionLang.bargainName(BARGAIN_ID); + } + + @Override + public Component getDescription() { + return ReflectionLang.bargainDescription(BARGAIN_ID); + } + + @Override + public List getOfferDialogue(Player player) { + return List.of( + ReflectionLang.bargainDialogue(BARGAIN_ID, 0), + ReflectionLang.bargainDialogue(BARGAIN_ID, 1), + ReflectionLang.bargainDialogue(BARGAIN_ID, 2)); + } + + @Override + public Component getQuestion() { + return ReflectionLang.bargainQuestion(BARGAIN_ID); + } + + @Override + public List getAnswers() { + return List.of( + new BargainAnswer("accept", ReflectionLang.answerText(BARGAIN_ID, "accept"), + ReflectionLang.answerResponse(BARGAIN_ID, "accept")) + .withDetails( + List.of( + ReflectionLang.answerPower(BARGAIN_ID, "accept", 0), + ReflectionLang.answerPower(BARGAIN_ID, "accept", 1)), + List.of( + ReflectionLang.answerDrawback(BARGAIN_ID, "accept", 0))), + new BargainAnswer("refuse", ReflectionLang.answerText(BARGAIN_ID, "refuse"), + ReflectionLang.answerResponse(BARGAIN_ID, "refuse")) + .withReducedPower()); + } + + @Override + public void onAccept(Player player, BargainAnswer answer) { + if (!answer.id().equals("refuse")) { + applySpeedBoost(player); + } + } + + @Override + public void onDefy(Player player) { + removeSpeedBoost(player); + } + + @Override + public BargainVisual getSoulVisual() { + return BargainVisual.of("blur", "The soul's legs appear slightly blurred, always in motion"); + } + + public static void applySpeedBoost(Player player) { + var attribute = player.getAttribute(Attributes.MOVEMENT_SPEED); + if (attribute != null) { + attribute.removeModifier(MODIFIER_UUID); + attribute.addPermanentModifier(new AttributeModifier( + MODIFIER_UUID, "Reflection Swiftness", 0.2, AttributeModifier.Operation.MULTIPLY_TOTAL)); + } + } + + public static void removeSpeedBoost(Player player) { + var attribute = player.getAttribute(Attributes.MOVEMENT_SPEED); + if (attribute != null) { + attribute.removeModifier(MODIFIER_UUID); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/VoidResistanceBargain.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/VoidResistanceBargain.java new file mode 100644 index 000000000..87092a2b6 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/VoidResistanceBargain.java @@ -0,0 +1,192 @@ +package com.ghostipedia.cosmiccore.common.reflection.bargain.impl; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCapability; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionLang; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; + +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.player.Player; + +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Void Resistance Bargain: Survive falling into the void, but each save costs more. + * + * POWER: Teleport back to surface when falling into the void + * DRAWBACK: Each void save costs escalating erosion (10 -> 20 -> 40 -> 80...) + * + * Thematically: The void remembers each time you escape. Each rescue costs more + * of your soul. Eventually, the price becomes unbearable - and you must choose + * whether to pay it or accept oblivion. + * + * This creates tension around void exploration - you're safe, but not free. + * The escalating cost means reckless void-diving has consequences. + */ +public class VoidResistanceBargain extends Bargain { + + public static final ResourceLocation ID = CosmicCore.id("void_anchor"); + public static final VoidResistanceBargain INSTANCE = new VoidResistanceBargain(); + private static final String BARGAIN_ID = "void_anchor"; + + /** Base erosion cost for first void save */ + public static final int BASE_VOID_SAVE_COST = 10; + + /** Maximum cost cap (prevents infinite escalation) */ + public static final int MAX_VOID_SAVE_COST = 160; + + /** Track void save count per player for escalating costs */ + private static final Map voidSaveCount = new ConcurrentHashMap<>(); + + private VoidResistanceBargain() { + super( + ID, + BargainTier.LATE, + 0, // shardCost - FREE in shards, but massive commitment + 75, // weight - takes up most of your soul capacity + 500 // erosion - huge transformation + ); + } + + @Override + public Component getName() { + return ReflectionLang.bargainName(BARGAIN_ID); + } + + @Override + public Component getDescription() { + return ReflectionLang.bargainDescription(BARGAIN_ID); + } + + @Override + public List getOfferDialogue(Player player) { + return List.of( + ReflectionLang.bargainDialogue(BARGAIN_ID, 0), + ReflectionLang.bargainDialogue(BARGAIN_ID, 1), + ReflectionLang.bargainDialogue(BARGAIN_ID, 2), + ReflectionLang.bargainDialogue(BARGAIN_ID, 3), + ReflectionLang.bargainDialogue(BARGAIN_ID, 4), + ReflectionLang.bargainDialogue(BARGAIN_ID, 5)); + } + + @Override + public Component getQuestion() { + return ReflectionLang.bargainQuestion(BARGAIN_ID); + } + + @Override + public List getAnswers() { + return List.of( + new BargainAnswer("anchor", ReflectionLang.answerText(BARGAIN_ID, "anchor"), + ReflectionLang.answerResponse(BARGAIN_ID, "anchor")) + .withDetails( + List.of( + ReflectionLang.answerPower(BARGAIN_ID, "anchor", 0), + ReflectionLang.answerPower(BARGAIN_ID, "anchor", 1)), + List.of( + ReflectionLang.answerDrawback(BARGAIN_ID, "anchor", 0), + ReflectionLang.answerDrawback(BARGAIN_ID, "anchor", 1))), + new BargainAnswer("refuse", ReflectionLang.answerText(BARGAIN_ID, "refuse"), + ReflectionLang.answerResponse(BARGAIN_ID, "refuse")) + .withReducedPower()); + } + + @Override + public void onAccept(Player player, BargainAnswer answer) { + if (!answer.id().equals("refuse")) { + // Reset save count on fresh bargain acceptance + voidSaveCount.remove(player.getUUID()); + player.displayClientMessage(ReflectionLang.bargainOnAccept(BARGAIN_ID), false); + } + } + + @Override + public void onDefy(Player player) { + voidSaveCount.remove(player.getUUID()); + player.displayClientMessage(ReflectionLang.bargainOnDefy(BARGAIN_ID), false); + } + + @Override + public void tick(Player player) { + // Check if player is in the void + if (player.getY() < -128 && !player.isCreative() && !player.isSpectator()) { + if (!(player instanceof ServerPlayer serverPlayer)) return; + + // Calculate current cost + int saveCount = voidSaveCount.getOrDefault(player.getUUID(), 0); + int cost = Math.min(MAX_VOID_SAVE_COST, BASE_VOID_SAVE_COST * (1 << saveCount)); + + // Teleport back to surface + double x = player.getX(); + double z = player.getZ(); + double y = player.level().getHeight(net.minecraft.world.level.levelgen.Heightmap.Types.MOTION_BLOCKING, + (int) x, (int) z) + 1; + + player.teleportTo(x, y, z); + + // Apply erosion cost + ReflectionCapability.get(player).ifPresent(reflection -> { + reflection.addErosion(cost); + }); + + // Increment save count for next time + voidSaveCount.put(player.getUUID(), saveCount + 1); + + // Feedback - gets more ominous as cost increases + if (cost <= 20) { + player.displayClientMessage( + Component.literal( + "\u00A75\u00A7o*The void rejects you. Not yet, it whispers. [Erosion +" + cost + "]*"), + true); + } else if (cost <= 80) { + player.displayClientMessage( + Component.literal("\u00A75\u00A7o*The anchor strains. The void's grip tightens. [Erosion +" + + cost + "]*"), + true); + } else { + player.displayClientMessage( + Component.literal( + "\u00A74\u00A7o*The price is almost too high. The void is patient. It will have you eventually. [Erosion +" + + cost + "]*"), + true); + } + } + } + + @Override + public BargainVisual getSoulVisual() { + return BargainVisual.of("anchored", + "A dark chain extends from the soul downward, links multiplying with each save"); + } + + // ========================================================================= + // Static helper methods + // ========================================================================= + + /** + * Get the current void save cost for a player. + */ + public static int getCurrentCost(Player player) { + int saveCount = voidSaveCount.getOrDefault(player.getUUID(), 0); + return Math.min(MAX_VOID_SAVE_COST, BASE_VOID_SAVE_COST * (1 << saveCount)); + } + + /** + * Get the number of times a player has been saved from the void. + */ + public static int getSaveCount(Player player) { + return voidSaveCount.getOrDefault(player.getUUID(), 0); + } + + /** + * Clear save count for a player (on logout, etc.). + */ + public static void clearSaveCount(UUID playerId) { + voidSaveCount.remove(playerId); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/item/CapacityShardBehavior.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/item/CapacityShardBehavior.java new file mode 100644 index 000000000..f11d558f0 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/item/CapacityShardBehavior.java @@ -0,0 +1,82 @@ +package com.ghostipedia.cosmiccore.common.reflection.item; + +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCapability; + +import com.gregtechceu.gtceu.api.item.component.IAddInformation; +import com.gregtechceu.gtceu.api.item.component.IInteractionItem; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +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 org.jetbrains.annotations.Nullable; + +import java.util.List; + +/** + * Behavior for Large Shards of Perpetuity - consume to expand soul capacity. + */ +public class CapacityShardBehavior implements IInteractionItem, IAddInformation { + + private final int capacityGain; + + public CapacityShardBehavior(int capacityGain) { + this.capacityGain = capacityGain; + } + + @Override + public InteractionResultHolder use(Item item, Level level, Player player, InteractionHand hand) { + ItemStack stack = player.getItemInHand(hand); + + if (level.isClientSide()) { + return InteractionResultHolder.success(stack); + } + + return ReflectionCapability.get(player).map(reflection -> { + if (!reflection.hasAwakened()) { + player.displayClientMessage( + Component + .literal( + "The shard feels... dormant. Perhaps after you've seen yourself in the mirror.") + .withStyle(ChatFormatting.GRAY, ChatFormatting.ITALIC), + true); + return InteractionResultHolder.fail(stack); + } + + int count = player.isCrouching() ? stack.getCount() : 1; + int gained = count * capacityGain; + int oldCapacity = reflection.getBaseCapacity(); + + reflection.setBaseCapacity(oldCapacity + gained); + stack.shrink(count); + + player.displayClientMessage( + Component.literal("Soul expanded: " + oldCapacity + " \u2192 " + (oldCapacity + gained)) + .withStyle(ChatFormatting.LIGHT_PURPLE), + true); + + level.playSound(null, player.blockPosition(), + SoundEvents.BEACON_POWER_SELECT, SoundSource.PLAYERS, 0.6f, 0.9f); + + return InteractionResultHolder.consume(stack); + }).orElse(InteractionResultHolder.fail(stack)); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltip, TooltipFlag flag) { + tooltip.add(Component.literal("Right-click to expand soul capacity") + .withStyle(ChatFormatting.GRAY)); + tooltip.add(Component.literal("Shift+Right-click to consume entire stack") + .withStyle(ChatFormatting.DARK_GRAY)); + tooltip.add(Component.literal("+" + capacityGain + " capacity each") + .withStyle(ChatFormatting.LIGHT_PURPLE)); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/item/MirrorItem.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/item/MirrorItem.java new file mode 100644 index 000000000..dad9f074f --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/item/MirrorItem.java @@ -0,0 +1,83 @@ +package com.ghostipedia.cosmiccore.common.reflection.item; + +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCapability; +import com.ghostipedia.cosmiccore.common.reflection.ui.VoidUIPackets; + +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +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.Rarity; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; + +import java.util.List; + +import javax.annotation.Nullable; + +/** + * The Mirror - a handheld item that lets you face your Reflection. + * + * Right-click to gaze into the void and commune with your soul. + * The Reflection will offer bargains, show your erosion state, + * and speak to you about your journey. + * + * "It's just a mirror. Why does it feel like it's looking back?" + */ +public class MirrorItem extends Item { + + public MirrorItem(Properties properties) { + super(properties.stacksTo(1).rarity(Rarity.UNCOMMON)); + } + + @Override + public InteractionResultHolder use(Level level, Player player, InteractionHand hand) { + ItemStack stack = player.getItemInHand(hand); + + if (!level.isClientSide() && player instanceof ServerPlayer serverPlayer) { + // Check if the reflection has awakened + boolean awakened = ReflectionCapability.get(serverPlayer) + .map(r -> r.hasAwakened()) + .orElse(false); + + if (!awakened) { + // The mirror shows nothing yet + serverPlayer.displayClientMessage( + Component.literal("§7§oYou see only yourself. Nothing stirs within."), + true); + // Play subtle sound + level.playSound(null, player.blockPosition(), + SoundEvents.GLASS_HIT, SoundSource.PLAYERS, 0.5f, 0.8f); + } else { + // Open the mirror hub UI + VoidUIPackets.sendOpenHub(serverPlayer); + + // Play ominous sound + level.playSound(null, player.blockPosition(), + SoundEvents.AMBIENT_CAVE.value(), SoundSource.PLAYERS, 0.3f, 0.5f); + } + } + + // Cooldown to prevent spam + player.getCooldowns().addCooldown(this, 20); // 1 second + + return InteractionResultHolder.sidedSuccess(stack, level.isClientSide()); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltip, TooltipFlag flag) { + tooltip.add(Component.literal("§7A polished surface that reflects more than light.")); + tooltip.add(Component.literal("§8§oRight-click to gaze into the void.")); + } + + @Override + public boolean isFoil(ItemStack stack) { + // Enchanted glint when holding - looks mysterious + return true; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/item/ScarRemovalBehavior.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/item/ScarRemovalBehavior.java new file mode 100644 index 000000000..617a5ed14 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/item/ScarRemovalBehavior.java @@ -0,0 +1,90 @@ +package com.ghostipedia.cosmiccore.common.reflection.item; + +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCapability; +import com.ghostipedia.cosmiccore.common.reflection.ui.ScarSelectionPackets; + +import com.gregtechceu.gtceu.api.item.component.IAddInformation; +import com.gregtechceu.gtceu.api.item.component.IInteractionItem; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +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 org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.Set; + +/** + * Behavior for Clusters of Perpetuity - used to remove defiance scars. + * When a bargain is defied, it leaves a scar preventing re-acceptance. + * Clusters can heal these scars, allowing the bargain to be taken again. + * + * Usage: Right-click opens a selection UI to choose which scar to mend. + */ +public class ScarRemovalBehavior implements IInteractionItem, IAddInformation { + + public ScarRemovalBehavior() {} + + @Override + public InteractionResultHolder use(Item item, Level level, Player player, InteractionHand hand) { + ItemStack stack = player.getItemInHand(hand); + + if (level.isClientSide()) { + return InteractionResultHolder.success(stack); + } + + // Server-side only + if (!(player instanceof ServerPlayer serverPlayer)) { + return InteractionResultHolder.fail(stack); + } + + return ReflectionCapability.get(player).map(reflection -> { + if (!reflection.hasAwakened()) { + player.displayClientMessage( + Component.literal( + "The cluster feels... dormant. Perhaps after you've seen yourself in the mirror.") + .withStyle(ChatFormatting.GRAY, ChatFormatting.ITALIC), + true); + return InteractionResultHolder.fail(stack); + } + + Set scars = reflection.getDefianceScars(); + + if (scars.isEmpty()) { + player.displayClientMessage( + Component.literal("Your soul bears no scars to mend.") + .withStyle(ChatFormatting.GRAY, ChatFormatting.ITALIC), + true); + return InteractionResultHolder.fail(stack); + } + + // Open the scar selection UI + // The actual cluster consumption happens when the player selects a scar + ScarSelectionPackets.sendOpenScarSelection(serverPlayer, scars); + + return InteractionResultHolder.success(stack); + }).orElse(InteractionResultHolder.fail(stack)); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltip, TooltipFlag flag) { + tooltip.add(Component.literal("Right-click to mend a defiance scar") + .withStyle(ChatFormatting.GRAY)); + tooltip.add(Component.empty()); + tooltip.add(Component.literal("Scars mark bargains you've defied.") + .withStyle(ChatFormatting.DARK_PURPLE, ChatFormatting.ITALIC)); + tooltip.add(Component.literal("This cluster can heal one, letting you") + .withStyle(ChatFormatting.DARK_PURPLE, ChatFormatting.ITALIC)); + tooltip.add(Component.literal("accept that bargain once more.") + .withStyle(ChatFormatting.DARK_PURPLE, ChatFormatting.ITALIC)); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/item/ShardConsumeBehavior.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/item/ShardConsumeBehavior.java new file mode 100644 index 000000000..bb79afa44 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/item/ShardConsumeBehavior.java @@ -0,0 +1,95 @@ +package com.ghostipedia.cosmiccore.common.reflection.item; + +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCapability; + +import com.gregtechceu.gtceu.api.item.component.IAddInformation; +import com.gregtechceu.gtceu.api.item.component.IInteractionItem; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +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 org.jetbrains.annotations.Nullable; + +import java.util.List; + +/** + * Behavior for Shards of Perpetuity - right-click to consume and add to soul shard balance. + * Used as currency for bargains in the Reflection system. + */ +public class ShardConsumeBehavior implements IInteractionItem, IAddInformation { + + private final int shardValue; + + /** + * @param shardValue How many shards this item is worth when consumed + */ + public ShardConsumeBehavior(int shardValue) { + this.shardValue = shardValue; + } + + @Override + public InteractionResultHolder use(Item item, Level level, Player player, InteractionHand hand) { + ItemStack stack = player.getItemInHand(hand); + + if (level.isClientSide()) { + return InteractionResultHolder.success(stack); + } + + // Check if player has awakened (has the reflection capability active) + return ReflectionCapability.get(player).map(reflection -> { + if (!reflection.hasAwakened()) { + player.displayClientMessage( + Component + .literal( + "The shard feels... dormant. Perhaps after you've seen yourself in the mirror.") + .withStyle(ChatFormatting.GRAY, ChatFormatting.ITALIC), + true); + return InteractionResultHolder.fail(stack); + } + + // Calculate total shards to add (stack size * value) + int count = player.isCrouching() ? stack.getCount() : 1; + int totalShards = count * shardValue; + + // Add shards to balance + reflection.addShards(totalShards); + + // Consume items + stack.shrink(count); + + // Feedback + player.displayClientMessage( + Component.literal("+" + totalShards + " shards absorbed") + .withStyle(ChatFormatting.AQUA), + true); + + // Sound effect + level.playSound(null, player.blockPosition(), + SoundEvents.EXPERIENCE_ORB_PICKUP, SoundSource.PLAYERS, 0.5f, + 1.2f + (level.random.nextFloat() * 0.2f)); + + // Particle effect could be added here via packet + + return InteractionResultHolder.consume(stack); + }).orElse(InteractionResultHolder.fail(stack)); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltip, TooltipFlag flag) { + tooltip.add(Component.literal("Right-click to absorb into your soul") + .withStyle(ChatFormatting.GRAY)); + tooltip.add(Component.literal("Shift+Right-click to absorb entire stack") + .withStyle(ChatFormatting.DARK_GRAY)); + tooltip.add(Component.literal("Value: " + shardValue + " shard" + (shardValue > 1 ? "s" : "") + " each") + .withStyle(ChatFormatting.AQUA)); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/network/SyncQuakeMovementPacket.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/network/SyncQuakeMovementPacket.java new file mode 100644 index 000000000..a7f796f17 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/network/SyncQuakeMovementPacket.java @@ -0,0 +1,34 @@ +package com.ghostipedia.cosmiccore.common.reflection.network; + +import com.ghostipedia.cosmiccore.common.network.CCoreNetwork; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.QuakeMovementHandler; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.network.NetworkEvent; + +/** + * Syncs Quake movement bargain state from server to client. + */ +public class SyncQuakeMovementPacket implements CCoreNetwork.INetPacket { + + private final boolean hasQuakeMovement; + + public SyncQuakeMovementPacket(boolean hasQuakeMovement) { + this.hasQuakeMovement = hasQuakeMovement; + } + + public SyncQuakeMovementPacket(FriendlyByteBuf buffer) { + this.hasQuakeMovement = buffer.readBoolean(); + } + + @Override + public void encode(FriendlyByteBuf buffer) { + buffer.writeBoolean(hasQuakeMovement); + } + + @Override + public void execute(NetworkEvent.Context context) { + // This runs on the client + QuakeMovementHandler.setClientHasQuakeMovement(hasQuakeMovement); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ui/BargainConstellationScreen.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ui/BargainConstellationScreen.java new file mode 100644 index 000000000..724d4b9f2 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ui/BargainConstellationScreen.java @@ -0,0 +1,1124 @@ +package com.ghostipedia.cosmiccore.common.reflection.ui; + +import com.ghostipedia.cosmiccore.client.renderer.BackgroundRenderer; +import com.ghostipedia.cosmiccore.client.renderer.SoulAuraRenderer; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionConstants; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionLang; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.BargainRegistry; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.Set; + +import javax.annotation.Nullable; + +/** + * A constellation-style visual browser for bargains. + * + * Bargains appear as glowing nodes orbiting the player's soul. + * - Active bargains: Bright, pulsing with their signature color + * - Available bargains: Dim, waiting to be claimed + * - Scarred bargains: Cracked, dark, forever marked + * + * Click a node to see its details in a Thaumonomicon-style panel. + * From there, accept or (if active) defy the bargain. + */ +@OnlyIn(Dist.CLIENT) +public class BargainConstellationScreen extends Screen { + + // Player state + private final int erosion; + private final Set activeBargains; + private final Set defianceScars; + + // Economy state + private int shardBalance = 0; + private int usedCapacity = 0; + private int totalCapacity = 100; + + // All bargains organized into nodes + private final List nodes = new ArrayList<>(); + + // Visual state + private float fadeAlpha = 0f; + private int totalTicks = 0; + private float soulPulse = 0f; + private float soulBreath = 0f; + + // Interaction state + @Nullable + private BargainNode hoveredNode = null; + @Nullable + private BargainNode selectedNode = null; + private float selectionAnimation = 0f; + + // Detail panel animation - track previous for interpolation + private float panelSlide = 0f; // 0 = hidden, 1 = fully visible + private float panelSlidePrev = 0f; + private float selectionAnimationPrev = 0f; + + // Action button bounds for click detection + private int actionButtonX, actionButtonY, actionButtonWidth, actionButtonHeight; + private boolean actionButtonVisible = false; + + // Particles for atmosphere + private final List stars = new ArrayList<>(); + private final Random random = new Random(); + + // Pan and zoom state + private float viewOffsetX = 0f; + private float viewOffsetY = 0f; + private float zoom = 1.0f; + private boolean isDragging = false; + private double lastDragX, lastDragY; + + // Constants + private static final int FADE_TICKS = 30; + private static final int STAR_COUNT = 50; // Restored for better atmosphere + private static final float ORBIT_BASE_RADIUS = 120f; + private static final float ORBIT_RING_SPACING = 45f; + private static final float MIN_ZOOM = 0.5f; + private static final float MAX_ZOOM = 2.0f; + + // If true, skip fade-in (already coming from dark screen) + private boolean skipFadeIn = false; + + public BargainConstellationScreen(int erosion, Set activeBargains, + Set defianceScars) { + super(ReflectionLang.ui("constellation_title")); + this.erosion = erosion; + this.activeBargains = activeBargains; + this.defianceScars = defianceScars; + } + + public static void open(int erosion, Set activeBargains, Set defianceScars, + int shardBalance, int usedCapacity, int totalCapacity) { + openFromVoid(erosion, activeBargains, defianceScars, shardBalance, usedCapacity, totalCapacity); + } + + public static void openFromVoid(int erosion, Set activeBargains, + Set defianceScars, + int shardBalance, int usedCapacity, int totalCapacity) { + BargainConstellationScreen screen = new BargainConstellationScreen(erosion, activeBargains, defianceScars); + screen.skipFadeIn = true; + screen.fadeAlpha = 1f; + screen.shardBalance = shardBalance; + screen.usedCapacity = usedCapacity; + screen.totalCapacity = totalCapacity; + Minecraft.getInstance().setScreen(screen); + } + + public void setEconomyData(int shardBalance, int usedCapacity, int totalCapacity) { + this.shardBalance = shardBalance; + this.usedCapacity = usedCapacity; + this.totalCapacity = totalCapacity; + } + + @Override + protected void init() { + super.init(); + + // Initialize star particles + stars.clear(); + for (int i = 0; i < STAR_COUNT; i++) { + stars.add(new StarParticle(width, height, random)); + } + + // Build bargain nodes + buildConstellationNodes(); + } + + private void buildConstellationNodes() { + nodes.clear(); + + List allBargains = new ArrayList<>(BargainRegistry.getAll()); + + // Organize by tier into orbital rings + // Ring 0 (closest): EARLY, ANY + // Ring 1: EARLY_MID + // Ring 2: MID + // Ring 3: LATE + // Ring 4 (farthest): EXTREME + + int centerX = width / 2; + int centerY = height / 2; + + // Count bargains per ring for spacing + int[] ringCounts = new int[5]; + int[] ringIndices = new int[5]; + + for (Bargain bargain : allBargains) { + int ring = getTierRing(bargain.getTier()); + ringCounts[ring]++; + } + + // Place each bargain + for (Bargain bargain : allBargains) { + int ring = getTierRing(bargain.getTier()); + float radius = ORBIT_BASE_RADIUS + (ring * ORBIT_RING_SPACING); + + // Distribute evenly around the ring + int count = ringCounts[ring]; + int index = ringIndices[ring]++; + + // Offset each ring slightly so they don't all align + float ringOffset = ring * 0.3f; + float angle = (float) (2 * Math.PI * index / count) + ringOffset; + + // Determine node state + BargainNode.NodeState state; + if (activeBargains.contains(bargain.getId())) { + state = BargainNode.NodeState.ACTIVE; + } else if (defianceScars.contains(bargain.getId())) { + state = BargainNode.NodeState.SCARRED; + } else { + state = BargainNode.NodeState.AVAILABLE; + } + + nodes.add(new BargainNode(bargain, centerX, centerY, radius, angle, state)); + } + } + + private int getTierRing(Bargain.BargainTier tier) { + return switch (tier) { + case EARLY, ANY -> 0; + case EARLY_MID -> 1; + case MID -> 2; + case LATE -> 3; + case EXTREME -> 4; + }; + } + + @Override + public void tick() { + super.tick(); + totalTicks++; + + // Fade in + if (fadeAlpha < 1f) { + fadeAlpha = Math.min(1f, fadeAlpha + (1f / FADE_TICKS)); + } + + // Soul animations + soulPulse += 0.08f; + soulBreath += 0.03f; + + // Note: No constellation rotation - keeps nodes stationary for better UX + + // Update stars + for (StarParticle star : stars) { + star.tick(); + if (star.isDead()) { + star.reset(width, height, random); + } + } + + // Update node animations (pulse effects only) + for (BargainNode node : nodes) { + node.tick(); + } + + // Panel slide animation - save previous for interpolation + panelSlidePrev = panelSlide; + selectionAnimationPrev = selectionAnimation; + + if (selectedNode != null) { + panelSlide = Math.min(1f, panelSlide + 0.1f); + selectionAnimation += 0.15f; + } else { + panelSlide = Math.max(0f, panelSlide - 0.15f); + } + } + + @Override + public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTick) { + // Deep space galaxy background shader + BackgroundRenderer.render(graphics.pose(), BackgroundRenderer.BackgroundType.GALAXY, fadeAlpha, width, height); + + if (fadeAlpha < 0.1f) return; + + // Render additional star particles on top of shader background + for (StarParticle star : stars) { + star.render(graphics, fadeAlpha, partialTick); + } + + // Render vignette + renderVignette(graphics); + + // Render orbital rings (faint guide lines) + renderOrbitalRings(graphics); + + // Render connecting lines between nodes + renderConnections(graphics); + + // Update and render all nodes + // Update screen positions every frame for smooth dragging + int centerX = width / 2; + int centerY = height / 2; + hoveredNode = null; + for (BargainNode node : nodes) { + node.updateScreenPosition(centerX, centerY, viewOffsetX, viewOffsetY, zoom); + boolean hovered = node.isMouseOver(mouseX, mouseY); + if (hovered) { + hoveredNode = node; + } + node.render(graphics, font, fadeAlpha, hovered, node == selectedNode, totalTicks, zoom, partialTick); + } + + // Render central soul + renderSoulOrb(graphics, partialTick); + + // Render detail panel if node selected - interpolate for smooth animation + float smoothPanelSlide = panelSlidePrev + (panelSlide - panelSlidePrev) * partialTick; + if (smoothPanelSlide > 0.01f) { + renderDetailPanel(graphics, mouseX, mouseY, smoothPanelSlide); + } + + // Render hover tooltip for non-selected nodes + if (hoveredNode != null && hoveredNode != selectedNode) { + renderNodeTooltip(graphics, hoveredNode, mouseX, mouseY); + } + + // Render erosion indicator + renderErosionIndicator(graphics); + + // Render back hint + renderBackHint(graphics); + } + + private void renderVignette(GuiGraphics graphics) { + int vignetteStrength = (int) (fadeAlpha * 150); + int bandSize = 2; // 2px bands for smooth gradients + + for (int i = 0; i < 50; i += bandSize) { + int alpha = (int) (vignetteStrength * (1f - (float) i / 50f)); + int color = (alpha << 24); + graphics.fill(0, i, width, i + bandSize, color); + graphics.fill(0, height - i - bandSize, width, height - i, color); + } + + for (int i = 0; i < 70; i += bandSize) { + int alpha = (int) (vignetteStrength * (1f - (float) i / 70f) * 0.6f); + int color = (alpha << 24); + graphics.fill(i, 0, i + bandSize, height, color); + graphics.fill(width - i - bandSize, 0, width - i, height, color); + } + } + + private void renderOrbitalRings(GuiGraphics graphics) { + int centerX = width / 2 + (int) viewOffsetX; + int centerY = height / 2 + (int) viewOffsetY; + int alpha = (int) (fadeAlpha * 25); + + for (int ring = 0; ring < 5; ring++) { + float radius = (ORBIT_BASE_RADIUS + (ring * ORBIT_RING_SPACING)) * zoom; + int color = (alpha << 24) | 0x404060; + + // Draw ring as series of dashed segments (fewer draws) + int segments = 24; // Fixed low segment count for performance + for (int i = 0; i < segments; i += 2) { // Skip every other for dashed effect + float angle = (float) (2 * Math.PI * i / segments); + int x = centerX + (int) (Math.cos(angle) * radius); + int y = centerY + (int) (Math.sin(angle) * radius); + graphics.fill(x - 1, y - 1, x + 2, y + 2, color); + } + } + } + + private void renderConnections(GuiGraphics graphics) { + // Draw faint lines from soul to each bargain (brighter for active) + int centerX = width / 2 + (int) viewOffsetX; + int centerY = height / 2 + (int) viewOffsetY; + + for (BargainNode node : nodes) { + int[] color = node.getColor(); + int alpha; + + // Different visibility based on state + switch (node.state) { + case ACTIVE -> alpha = (int) (fadeAlpha * 60); // Brightest + case AVAILABLE -> alpha = (int) (fadeAlpha * 20); // Dim + case SCARRED -> alpha = (int) (fadeAlpha * 10); // Very faint + default -> alpha = (int) (fadeAlpha * 15); + } + + int lineColor = (alpha << 24) | (color[0] << 16) | (color[1] << 8) | color[2]; + + // Line from center to node + drawLine(graphics, centerX, centerY, (int) node.screenX, (int) node.screenY, lineColor); + } + } + + private void drawLine(GuiGraphics graphics, int x1, int y1, int x2, int y2, int color) { + int dx = Math.abs(x2 - x1); + int dy = Math.abs(y2 - y1); + int steps = Math.max(dx, dy); + if (steps == 0) return; + + // Draw fewer, larger dots for performance + int dotSpacing = Math.max(8, steps / 12); // Max ~12 dots per line + for (int i = 0; i <= steps; i += dotSpacing) { + int x = x1 + (x2 - x1) * i / steps; + int y = y1 + (y2 - y1) * i / steps; + graphics.fill(x, y, x + 2, y + 2, color); + } + } + + private void renderSoulOrb(GuiGraphics graphics, float partialTick) { + int centerX = width / 2 + (int) viewOffsetX; + int centerY = height / 2 + (int) viewOffsetY; + + int[] rgb = getSoulColor(); + + // Smooth animation with partialTick for 60fps fluidity + float smoothBreath = soulBreath + (0.03f * partialTick); + float smoothPulse = soulPulse + (0.08f * partialTick); + float breath = (float) Math.sin(smoothBreath) * 0.05f + 1f; + float pulse = (float) Math.sin(smoothPulse) * 0.08f + 1f; + int baseRadius = (int) (30 * zoom); + int radius = (int) (baseRadius * breath * pulse); + + int alpha = (int) (fadeAlpha * 255); + + // Render ethereal flame aura BEHIND the soul orb + int auraRadius = (int) (baseRadius * 1.8f * zoom); + SoulAuraRenderer.render( + graphics.pose(), + centerX, centerY, + auraRadius, + erosion, + fadeAlpha * 0.8f, + width, height); + + // Outer glow - use 4px steps + for (int r = radius + 30; r > radius; r -= 4) { + float glowProgress = (float) (r - radius) / 30f; + int glowAlpha = (int) ((1f - glowProgress) * 35 * fadeAlpha); + int color = (glowAlpha << 24) | (rgb[0] << 16) | (rgb[1] << 8) | rgb[2]; + drawCircleFast(graphics, centerX, centerY, r, color); + } + + // Core - use 3px steps + for (int r = radius; r > 0; r -= 3) { + float coreProgress = (float) r / radius; + int coreAlpha = (int) (alpha * (0.6f + 0.4f * coreProgress)); + int lr = Math.min(255, rgb[0] + (int) ((255 - rgb[0]) * (1f - coreProgress) * 0.3f)); + int lg = Math.min(255, rgb[1] + (int) ((255 - rgb[1]) * (1f - coreProgress) * 0.3f)); + int lb = Math.min(255, rgb[2] + (int) ((255 - rgb[2]) * (1f - coreProgress) * 0.3f)); + int color = (coreAlpha << 24) | (lr << 16) | (lg << 8) | lb; + drawCircleFast(graphics, centerX, centerY, r, color); + } + } + + private void drawCircle(GuiGraphics graphics, int cx, int cy, int radius, int color) { + for (int y = -radius; y <= radius; y++) { + int halfWidth = (int) Math.sqrt(radius * radius - y * y); + graphics.fill(cx - halfWidth, cy + y, cx + halfWidth + 1, cy + y + 1, color); + } + } + + private void drawCircleFast(GuiGraphics graphics, int cx, int cy, int radius, int color) { + if (radius <= 0) return; + + // For small radii, use precise 1px drawing + if (radius <= 6) { + drawCircle(graphics, cx, cy, radius, color); + return; + } + + // Use 2px bands for good quality + int bandSize = 2; + + for (int y = -radius; y <= radius; y += bandSize) { + int halfWidth = (int) Math.sqrt(radius * radius - y * y); + int bandEnd = Math.min(y + bandSize, radius + 1); + graphics.fill(cx - halfWidth, cy + y, cx + halfWidth + 1, cy + bandEnd, color); + } + } + + private int[] getSoulColor() { + int tier = ReflectionConstants.getSoulColorTier(erosion); + return switch (tier) { + case 0 -> new int[] { 220, 220, 235 }; + case 1 -> new int[] { 180, 200, 255 }; + case 2 -> new int[] { 140, 120, 220 }; + case 3 -> new int[] { 180, 80, 160 }; + case 4 -> new int[] { 160, 50, 50 }; + case 5 -> new int[] { 80, 30, 30 }; + default -> new int[] { 20, 10, 30 }; + }; + } + + private void renderDetailPanel(GuiGraphics graphics, int mouseX, int mouseY, float smoothPanelSlide) { + if (selectedNode == null) return; + + Bargain bargain = selectedNode.bargain; + + // Panel dimensions - wider to fit text better + int panelWidth = 240; + int maxTextWidth = panelWidth - 20; // 10px padding on each side + + // Calculate dynamic height based on content + int contentHeight = 36; // Header space (title + tier) + + // Cost section height (variable based on what costs exist) + // These are reused later for rendering and affordability checks + int shardCost = bargain.getShardCost(); + int weightCost = bargain.getWeight(); + int erosionCost = bargain.getErosionCost(); + int remainingCapacity = totalCapacity - usedCapacity; + int costLines = 0; + if (shardCost > 0) costLines++; + if (weightCost > 0) costLines++; + if (erosionCost > 0) costLines++; + if (costLines == 0) costLines = 1; // "Free" line + contentHeight += costLines * 11 + 12; // costs + divider spacing + + for (Component line : bargain.getPowerDescriptions()) { + contentHeight += wrapText(line.getString(), maxTextWidth).size() * 11; + } + contentHeight += 30; // Action hint space + + int panelHeight = Math.max(180, contentHeight); + + // Slide in from right - use interpolated value for smooth animation + int panelX = width - (int) (smoothPanelSlide * (panelWidth + 20)); + int panelY = (height - panelHeight) / 2; + + int bgAlpha = (int) (fadeAlpha * smoothPanelSlide * 230); + int borderAlpha = (int) (fadeAlpha * smoothPanelSlide * 255); + + // Background + int bgColor = (bgAlpha << 24) | 0x101018; + graphics.fill(panelX, panelY, panelX + panelWidth, panelY + panelHeight, bgColor); + + // Border + int borderColor = (borderAlpha << 24) | 0x404080; + graphics.fill(panelX, panelY, panelX + panelWidth, panelY + 1, borderColor); + graphics.fill(panelX, panelY + panelHeight - 1, panelX + panelWidth, panelY + panelHeight, borderColor); + graphics.fill(panelX, panelY, panelX + 1, panelY + panelHeight, borderColor); + graphics.fill(panelX + panelWidth - 1, panelY, panelX + panelWidth, panelY + panelHeight, borderColor); + + int textAlpha = (int) (fadeAlpha * smoothPanelSlide * 255); + + // Title + String title = bargain.getDisplayName().getString(); + int[] nodeColor = selectedNode.getColor(); + int titleColor = (textAlpha << 24) | (nodeColor[0] << 16) | (nodeColor[1] << 8) | nodeColor[2]; + graphics.drawString(font, title, panelX + 10, panelY + 10, titleColor, false); + + // Tier + String tierStr = bargain.getTier().name(); + int subtitleColor = (textAlpha << 24) | 0x888888; + graphics.drawString(font, tierStr, panelX + 10, panelY + 24, subtitleColor, false); + + // Costs with affordability coloring (reusing variables from height calculation) + int costY = panelY + 36; + + if (shardCost > 0) { + boolean canAfford = shardBalance >= shardCost; + int shardTextColor = (textAlpha << 24) | (canAfford ? 0x55FFFF : 0xFF5555); + graphics.drawString(font, "\u2726 " + shardCost + " shards", panelX + 10, costY, shardTextColor, false); + costY += 11; + } + if (weightCost > 0) { + boolean canFit = remainingCapacity >= weightCost; + int weightTextColor = (textAlpha << 24) | (canFit ? 0xAA55FF : 0xFF5555); + graphics.drawString(font, "\u25C6 " + weightCost + " weight", panelX + 10, costY, weightTextColor, false); + costY += 11; + } + if (erosionCost > 0) { + int erosionTextColor = (textAlpha << 24) | 0xAA6666; + graphics.drawString(font, "+" + erosionCost + " erosion", panelX + 10, costY, erosionTextColor, false); + costY += 11; + } + if (shardCost == 0 && weightCost == 0 && erosionCost == 0) { + int freeColor = (textAlpha << 24) | 0x55FF55; + graphics.drawString(font, "Free", panelX + 10, costY, freeColor, false); + costY += 11; + } + + // Divider (dynamic position based on cost content) + int dividerY = costY + 4; + int dividerColor = ((textAlpha / 2) << 24) | 0x606080; + graphics.fill(panelX + 10, dividerY, panelX + panelWidth - 10, dividerY + 1, dividerColor); + + // Description / power with word wrapping + int descY = dividerY + 8; + int descColor = (textAlpha << 24) | 0xBBBBBB; + for (Component line : bargain.getPowerDescriptions()) { + for (String wrappedLine : wrapText(line.getString(), maxTextWidth)) { + graphics.drawString(font, wrappedLine, panelX + 10, descY, descColor, false); + descY += 11; + } + } + // Note: We don't render drawbacks here since cost is already shown at top + + // Action button based on state + String actionHint; + int hintColor; + boolean isClickable = false; + switch (selectedNode.state) { + case AVAILABLE -> { + // Check affordability (reuse variables from cost section above) + if (shardCost > shardBalance) { + actionHint = "Not enough shards (" + shardBalance + "/" + shardCost + ")"; + hintColor = 0x888888; + isClickable = false; + } else if (weightCost > remainingCapacity) { + actionHint = "Not enough soul capacity (" + remainingCapacity + "/" + weightCost + ")"; + hintColor = 0x888888; + isClickable = false; + } else { + actionHint = "[Click to make bargain]"; + hintColor = 0x80FF80; + isClickable = true; + } + } + case ACTIVE -> { + actionHint = "[Click to defy - costs " + BargainRegistry.calculateDefianceCost(bargain) + "]"; + hintColor = 0xFF8080; + isClickable = true; + } + case SCARRED -> { + actionHint = "Forever scarred"; + hintColor = 0x555555; + isClickable = false; + } + default -> { + actionHint = ""; + hintColor = 0; + isClickable = false; + } + } + + // Store action button bounds for click detection + actionButtonX = panelX + 10; + actionButtonY = panelY + panelHeight - 28; + actionButtonWidth = font.width(actionHint) + 16; + actionButtonHeight = 20; + actionButtonVisible = isClickable && smoothPanelSlide > 0.9f; + + if (isClickable) { + // Draw button background + int btnBgAlpha = (int) (fadeAlpha * smoothPanelSlide * 60); + int btnBgColor = (btnBgAlpha << 24) | (hintColor & 0xFFFFFF); + graphics.fill(actionButtonX - 4, actionButtonY, actionButtonX + actionButtonWidth, + actionButtonY + actionButtonHeight, btnBgColor); + + // Draw button border + int btnBorderAlpha = (int) (fadeAlpha * smoothPanelSlide * 150); + int btnBorderColor = (btnBorderAlpha << 24) | (hintColor & 0xFFFFFF); + graphics.fill(actionButtonX - 4, actionButtonY, actionButtonX + actionButtonWidth, actionButtonY + 1, + btnBorderColor); + graphics.fill(actionButtonX - 4, actionButtonY + actionButtonHeight - 1, actionButtonX + actionButtonWidth, + actionButtonY + actionButtonHeight, btnBorderColor); + graphics.fill(actionButtonX - 4, actionButtonY, actionButtonX - 3, actionButtonY + actionButtonHeight, + btnBorderColor); + graphics.fill(actionButtonX + actionButtonWidth - 1, actionButtonY, actionButtonX + actionButtonWidth, + actionButtonY + actionButtonHeight, btnBorderColor); + } + + int textColor = (textAlpha << 24) | (hintColor & 0xFFFFFF); + graphics.drawString(font, actionHint, actionButtonX, actionButtonY + 6, textColor, false); + } + + private List wrapText(String text, int maxWidth) { + List lines = new ArrayList<>(); + if (text == null || text.isEmpty()) { + return lines; + } + + // Handle color codes - preserve them across lines + String colorPrefix = ""; + if (text.startsWith("\u00A7") && text.length() >= 2) { + colorPrefix = text.substring(0, 2); + } + + String[] words = text.split(" "); + StringBuilder currentLine = new StringBuilder(); + + for (String word : words) { + String testLine = currentLine.length() == 0 ? word : currentLine + " " + word; + if (font.width(testLine) <= maxWidth) { + if (currentLine.length() > 0) currentLine.append(" "); + currentLine.append(word); + } else { + if (currentLine.length() > 0) { + lines.add(currentLine.toString()); + currentLine = new StringBuilder(colorPrefix + word); + } else { + // Single word too long, just add it + lines.add(word); + } + } + } + + if (currentLine.length() > 0) { + lines.add(currentLine.toString()); + } + + return lines; + } + + private void renderNodeTooltip(GuiGraphics graphics, BargainNode node, int mouseX, int mouseY) { + String name = node.bargain.getDisplayName().getString(); + int tooltipWidth = font.width(name) + 10; + int tooltipHeight = 16; + + int x = mouseX + 10; + int y = mouseY - tooltipHeight - 5; + + // Keep on screen + if (x + tooltipWidth > width - 10) x = width - tooltipWidth - 10; + if (y < 10) y = 10; + + int bgAlpha = (int) (fadeAlpha * 200); + int bgColor = (bgAlpha << 24) | 0x101018; + graphics.fill(x - 2, y - 2, x + tooltipWidth + 2, y + tooltipHeight + 2, bgColor); + + int[] nodeColor = node.getColor(); + int textColor = (255 << 24) | (nodeColor[0] << 16) | (nodeColor[1] << 8) | nodeColor[2]; + graphics.drawString(font, name, x + 3, y + 3, textColor, false); + } + + private void renderErosionIndicator(GuiGraphics graphics) { + int alpha = (int) (fadeAlpha * 100); + int color = (alpha << 24) | 0x555555; + + String text = "Soul Erosion: " + erosion; + graphics.drawString(font, text, 15, height - 25, color, false); + + // Render economy display in top right + renderEconomyDisplay(graphics); + } + + private void renderEconomyDisplay(GuiGraphics graphics) { + int alpha = (int) (fadeAlpha * 200); + if (alpha < 20) return; + + int rightMargin = width - 15; + int topY = 15; + + // Shard balance (aqua color) + int shardColor = (alpha << 24) | 0x55FFFF; + String shardText = "\u2726 " + shardBalance; + int shardWidth = font.width(shardText); + graphics.drawString(font, shardText, rightMargin - shardWidth, topY, shardColor, false); + + // Capacity display (purple color) + int capacityColor = (alpha << 24) | 0xAA55FF; + String capacityText = usedCapacity + "/" + totalCapacity + " soul"; + int capacityWidth = font.width(capacityText); + graphics.drawString(font, capacityText, rightMargin - capacityWidth, topY + 12, capacityColor, false); + + // Capacity bar + int barWidth = 60; + int barHeight = 4; + int barX = rightMargin - barWidth; + int barY = topY + 24; + + // Background + int bgColor = (alpha << 24) | 0x222222; + graphics.fill(barX, barY, barX + barWidth, barY + barHeight, bgColor); + + // Filled portion + float fillPercent = totalCapacity > 0 ? (float) usedCapacity / totalCapacity : 0f; + int fillWidth = (int) (barWidth * fillPercent); + int fillColor = fillPercent > 0.9f ? ((alpha << 24) | 0xFF5555) : + fillPercent > 0.7f ? ((alpha << 24) | 0xFFAA55) : + ((alpha << 24) | 0xAA55FF); + if (fillWidth > 0) { + graphics.fill(barX, barY, barX + fillWidth, barY + barHeight, fillColor); + } + } + + private void renderBackHint(GuiGraphics graphics) { + int alpha = (int) (fadeAlpha * 120); + int color = (alpha << 24) | 0x888888; + + String hint = "[ESC] Back"; + graphics.drawString(font, hint, 15, 15, color, false); + + // Zoom level indicator + String zoomHint = String.format("Zoom: %.0f%%", zoom * 100); + graphics.drawString(font, zoomHint, 15, 28, color, false); + + // Control hints - positioned below economy display (which takes ~40px) + String controlHint = "Scroll: Zoom | Right-click drag: Pan"; + int controlWidth = font.width(controlHint); + graphics.drawString(font, controlHint, width - controlWidth - 15, 55, color, false); + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + int mx = (int) mouseX; + int my = (int) mouseY; + + // Left click - select nodes or action buttons + if (button == 0) { + // Check if clicking on the action button in the detail panel + if (actionButtonVisible && selectedNode != null) { + if (mx >= actionButtonX - 4 && mx <= actionButtonX + actionButtonWidth && + my >= actionButtonY && my <= actionButtonY + actionButtonHeight) { + performNodeAction(selectedNode); + return true; + } + } + + // Check if clicking on a node + for (BargainNode node : nodes) { + if (node.isMouseOver(mx, my)) { + if (selectedNode == node) { + // Already selected - perform action + performNodeAction(node); + } else { + // Select this node + selectedNode = node; + selectionAnimation = 0f; + } + return true; + } + } + + // Clicking elsewhere deselects + selectedNode = null; + return true; + } + + // Middle or right click - start dragging + if (button == 1 || button == 2) { + isDragging = true; + lastDragX = mouseX; + lastDragY = mouseY; + return true; + } + + return super.mouseClicked(mouseX, mouseY, button); + } + + @Override + public boolean mouseReleased(double mouseX, double mouseY, int button) { + if (button == 1 || button == 2) { + isDragging = false; + return true; + } + return super.mouseReleased(mouseX, mouseY, button); + } + + @Override + public boolean mouseDragged(double mouseX, double mouseY, int button, double dragX, double dragY) { + if (isDragging) { + viewOffsetX += (float) (mouseX - lastDragX); + viewOffsetY += (float) (mouseY - lastDragY); + lastDragX = mouseX; + lastDragY = mouseY; + return true; + } + return super.mouseDragged(mouseX, mouseY, button, dragX, dragY); + } + + @Override + public boolean mouseScrolled(double mouseX, double mouseY, double delta) { + // Zoom in/out with scroll wheel + float oldZoom = zoom; + zoom += (float) delta * 0.1f; + zoom = Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, zoom)); + + // Adjust offset to zoom toward mouse position + if (oldZoom != zoom) { + float zoomRatio = zoom / oldZoom; + float mx = (float) mouseX - width / 2f; + float my = (float) mouseY - height / 2f; + viewOffsetX = (viewOffsetX - mx) * zoomRatio + mx; + viewOffsetY = (viewOffsetY - my) * zoomRatio + my; + } + + return true; + } + + private void performNodeAction(BargainNode node) { + switch (node.state) { + case AVAILABLE -> { + // Check if player can afford this bargain + int shardCost = node.bargain.getShardCost(); + int weight = node.bargain.getWeight(); + int remainingCapacity = totalCapacity - usedCapacity; + + if (shardCost > shardBalance) { + // Can't afford - not enough shards + return; + } + if (weight > remainingCapacity) { + // Can't fit - not enough soul capacity + return; + } + + // Open bargain offer dialogue in VoidScreen with economy data + VoidScreen.openWithBargain(node.bargain, erosion, activeBargains, + shardBalance, usedCapacity, totalCapacity); + } + case ACTIVE -> { + // TODO: Implement defiance from here + // For now, go back to hub which has defiance + onClose(); + } + case SCARRED -> { + // Can't do anything with scarred bargains + } + } + } + + @Override + public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + if (keyCode == 256) { // ESC + if (selectedNode != null) { + selectedNode = null; + return true; + } + onClose(); + return true; + } + return super.keyPressed(keyCode, scanCode, modifiers); + } + + @Override + public boolean isPauseScreen() { + return false; + } + + private static class BargainNode { + + final Bargain bargain; + final int centerX, centerY; + final float orbitRadius; + final float baseAngle; + final NodeState state; + + float screenX, screenY; + float pulsePhase; + + enum NodeState { + AVAILABLE, // Can be acquired + ACTIVE, // Currently owned + SCARRED // Defied - forever marked + } + + BargainNode(Bargain bargain, int centerX, int centerY, float orbitRadius, float baseAngle, NodeState state) { + this.bargain = bargain; + this.centerX = centerX; + this.centerY = centerY; + this.orbitRadius = orbitRadius; + this.baseAngle = baseAngle; + this.state = state; + this.pulsePhase = (float) (Math.random() * Math.PI * 2); + } + + void tick() { + // Only update animation phase - position is calculated in render for smooth dragging + pulsePhase += 0.1f; + } + + void updateScreenPosition(int viewCenterX, int viewCenterY, float offsetX, float offsetY, float zoom) { + float scaledRadius = orbitRadius * zoom; + screenX = viewCenterX + offsetX + (float) (Math.cos(baseAngle) * scaledRadius); + screenY = viewCenterY + offsetY + (float) (Math.sin(baseAngle) * scaledRadius); + } + + boolean isMouseOver(int mouseX, int mouseY) { + float dx = mouseX - screenX; + float dy = mouseY - screenY; + float radius = getRadius(); + return dx * dx + dy * dy <= radius * radius * 1.5f; // Slightly generous hitbox + } + + float getRadius(float zoom) { + float baseRadius = switch (state) { + case ACTIVE -> 10f; + case AVAILABLE -> 7f; + case SCARRED -> 6f; + }; + return baseRadius * zoom; + } + + float getRadius() { + // For mouse hit detection, use a generous radius + return switch (state) { + case ACTIVE -> 12f; + case AVAILABLE -> 10f; + case SCARRED -> 8f; + }; + } + + int[] getColor() { + if (state == NodeState.SCARRED) { + return new int[] { 60, 40, 50 }; // Dark, cracked + } + + // Unique color for each bargain type + String path = bargain.getId().getPath(); + return switch (path) { + // EARLY tier - cool/inviting colors + case "quake_movement" -> new int[] { 100, 200, 255 }; // Cyan - movement + case "stride" -> new int[] { 120, 220, 180 }; // Seafoam - step assist + case "darksight" -> new int[] { 160, 120, 255 }; // Violet - night vision + case "swiftness" -> new int[] { 255, 200, 100 }; // Amber - speed + + // EARLY_MID tier - warmer colors + case "home" -> new int[] { 255, 220, 100 }; // Gold - hearth + case "back" -> new int[] { 180, 100, 220 }; // Purple - death echo + case "vitality" -> new int[] { 255, 120, 120 }; // Coral - health + case "violence" -> new int[] { 220, 80, 80 }; // Crimson - strength + case "depths" -> new int[] { 80, 180, 220 }; // Ocean blue - water breathing + + // MID tier - more intense colors + case "reach" -> new int[] { 200, 160, 255 }; // Lavender - elongated grasp + case "soft_landing" -> new int[] { 180, 255, 180 }; // Mint - fall immunity + case "satiated" -> new int[] { 200, 180, 120 }; // Tan - no hunger + case "carapace" -> new int[] { 160, 160, 180 }; // Steel - armor + case "cinder" -> new int[] { 255, 140, 60 }; // Flame orange - fire immunity + + // LATE tier - darker/ominous + case "void_anchor" -> new int[] { 120, 60, 180 }; // Deep purple - void resistance + + default -> { + // Hash-based unique color as ultimate fallback + int hash = path.hashCode(); + int r = 100 + Math.abs(hash % 100); + int g = 100 + Math.abs((hash >> 8) % 100); + int b = 100 + Math.abs((hash >> 16) % 100); + yield new int[] { r, g, b }; + } + }; + } + + void render(GuiGraphics graphics, net.minecraft.client.gui.Font font, float fadeAlpha, + boolean hovered, boolean selected, int ticks, float zoom, float partialTick) { + int[] rgb = getColor(); + float radius = getRadius(zoom); + + // Pulse effect for active/hovered - smooth with partialTick + float pulse = 1f; + if (state == NodeState.ACTIVE || hovered || selected) { + float smoothPulse = pulsePhase + (0.1f * partialTick); + pulse = 1f + (float) Math.sin(smoothPulse) * 0.15f; + } + int renderRadius = (int) (radius * pulse); + + // Alpha based on state + float stateAlpha = switch (state) { + case ACTIVE -> 1f; + case AVAILABLE -> hovered ? 0.9f : 0.5f; + case SCARRED -> 0.3f; + }; + + int alpha = (int) (fadeAlpha * stateAlpha * 255); + + // Outer glow - only 3 bands instead of 8 for performance + if (state == NodeState.ACTIVE || hovered || selected) { + for (int r = renderRadius + 8; r > renderRadius; r -= 3) { + float glowProgress = (float) (r - renderRadius) / 8f; + int glowAlpha = (int) ((1f - glowProgress) * 60 * fadeAlpha * stateAlpha); + int color = (glowAlpha << 24) | (rgb[0] << 16) | (rgb[1] << 8) | rgb[2]; + drawNodeCircle(graphics, (int) screenX, (int) screenY, r, color); + } + } + + // Core + int coreColor = (alpha << 24) | (rgb[0] << 16) | (rgb[1] << 8) | rgb[2]; + drawNodeCircle(graphics, (int) screenX, (int) screenY, renderRadius, coreColor); + + // Selection ring - only 8 points instead of 12, smooth with partialTick + if (selected) { + int ringAlpha = (int) (fadeAlpha * 200); + int ringColor = (ringAlpha << 24) | 0xFFFFFF; + float smoothTicks = ticks + partialTick; + for (int i = 0; i < 8; i++) { + float angle = (float) (2 * Math.PI * i / 8) + smoothTicks * 0.05f; + int rx = (int) (screenX + Math.cos(angle) * (renderRadius + 5)); + int ry = (int) (screenY + Math.sin(angle) * (renderRadius + 5)); + graphics.fill(rx, ry, rx + 2, ry + 2, ringColor); + } + } + + // Scar cracks for defied bargains + if (state == NodeState.SCARRED) { + int crackAlpha = (int) (fadeAlpha * 150); + int crackColor = (crackAlpha << 24) | 0x200010; + Random crackRandom = new Random(bargain.getId().hashCode()); + for (int i = 0; i < 3; i++) { + float crackAngle = crackRandom.nextFloat() * (float) Math.PI * 2; + int cx = (int) (screenX + Math.cos(crackAngle) * radius * 0.5f); + int cy = (int) (screenY + Math.sin(crackAngle) * radius * 0.5f); + graphics.fill(cx - 1, cy - 1, cx + 2, cy + 2, crackColor); + } + } + } + + private void drawNodeCircle(GuiGraphics graphics, int cx, int cy, int radius, int color) { + for (int y = -radius; y <= radius; y++) { + int halfWidth = (int) Math.sqrt(radius * radius - y * y); + graphics.fill(cx - halfWidth, cy + y, cx + halfWidth + 1, cy + y + 1, color); + } + } + } + + private static class StarParticle { + + float x, y; + float twinklePhase; + float maxAlpha; + int lifetime; + int age; + + StarParticle(int screenWidth, int screenHeight, Random random) { + reset(screenWidth, screenHeight, random); + } + + void reset(int screenWidth, int screenHeight, Random random) { + x = random.nextFloat() * screenWidth; + y = random.nextFloat() * screenHeight; + twinklePhase = random.nextFloat() * (float) Math.PI * 2; + maxAlpha = 0.2f + random.nextFloat() * 0.4f; + lifetime = 200 + random.nextInt(300); + age = 0; + } + + void tick() { + age++; + twinklePhase += 0.08f; + } + + boolean isDead() { + return age >= lifetime; + } + + void render(GuiGraphics graphics, float screenAlpha, float partialTick) { + // Smooth twinkle with partialTick for 60fps animation + float smoothTwinkle = twinklePhase + (0.08f * partialTick); + float twinkle = (float) (Math.sin(smoothTwinkle) * 0.3f + 0.7f); + + // Fade in/out + float lifeFade = 1f; + float progress = (float) age / lifetime; + if (progress < 0.1f) lifeFade = progress / 0.1f; + else if (progress > 0.9f) lifeFade = (1f - progress) / 0.1f; + + int alpha = (int) (maxAlpha * twinkle * lifeFade * screenAlpha * 255); + if (alpha <= 0) return; + + int color = (alpha << 24) | 0xCCCCDD; + graphics.fill((int) x, (int) y, (int) x + 1, (int) y + 1, color); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ui/ScarSelectionPackets.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ui/ScarSelectionPackets.java new file mode 100644 index 000000000..16acfc345 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ui/ScarSelectionPackets.java @@ -0,0 +1,146 @@ +package com.ghostipedia.cosmiccore.common.reflection.ui; + +import com.ghostipedia.cosmiccore.common.data.CosmicItems; +import com.ghostipedia.cosmiccore.common.network.CCoreNetwork; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCapability; +import com.ghostipedia.cosmiccore.utils.StringUtil; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; +import net.minecraftforge.network.NetworkDirection; +import net.minecraftforge.network.NetworkEvent; + +import java.util.HashSet; +import java.util.Set; + +/** + * Network packets for Cluster of Perpetuity scar removal. + */ +public class ScarSelectionPackets { + + public static void register() { + CCoreNetwork.register(OpenScarSelectionPacket.class, OpenScarSelectionPacket::new, + NetworkDirection.PLAY_TO_CLIENT); + CCoreNetwork.register(ScarRemovalPacket.class, ScarRemovalPacket::new, + NetworkDirection.PLAY_TO_SERVER); + } + + public static void sendOpenScarSelection(ServerPlayer player, Set scars) { + CCoreNetwork.sendToPlayer(player, new OpenScarSelectionPacket(scars)); + } + + public static void sendScarRemoval(ResourceLocation scarId) { + CCoreNetwork.sendToServer(new ScarRemovalPacket(scarId)); + } + + // Server -> Client: Open the scar selection screen + public static class OpenScarSelectionPacket implements CCoreNetwork.INetPacket { + + private final Set scars; + + public OpenScarSelectionPacket(Set scars) { + this.scars = scars != null ? scars : Set.of(); + } + + public OpenScarSelectionPacket(FriendlyByteBuf buf) { + int count = buf.readVarInt(); + Set readScars = new HashSet<>(); + for (int i = 0; i < count; i++) { + readScars.add(buf.readResourceLocation()); + } + this.scars = readScars; + } + + @Override + public void encode(FriendlyByteBuf buf) { + buf.writeVarInt(scars.size()); + for (ResourceLocation id : scars) { + buf.writeResourceLocation(id); + } + } + + @Override + public void execute(NetworkEvent.Context ctx) { + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ScarSelectionScreen.open(scars)); + } + } + + // Client -> Server: Remove a specific scar (consumes Cluster from inventory) + public static class ScarRemovalPacket implements CCoreNetwork.INetPacket { + + private final ResourceLocation scarId; + + public ScarRemovalPacket(ResourceLocation scarId) { + this.scarId = scarId; + } + + public ScarRemovalPacket(FriendlyByteBuf buf) { + this.scarId = buf.readResourceLocation(); + } + + @Override + public void encode(FriendlyByteBuf buf) { + buf.writeResourceLocation(scarId); + } + + @Override + public void execute(NetworkEvent.Context ctx) { + ServerPlayer player = ctx.getSender(); + if (player == null) return; + + ReflectionCapability.get(player).ifPresent(reflection -> { + if (!reflection.hasDefianceScar(scarId)) { + player.displayClientMessage( + Component.literal("You don't have that scar.").withStyle(ChatFormatting.RED), + true); + return; + } + + ItemStack cluster = findCluster(player); + if (cluster.isEmpty()) { + player.displayClientMessage( + Component.literal("You need a Cluster of Perpetuity.").withStyle(ChatFormatting.RED), + true); + return; + } + + cluster.shrink(1); + reflection.removeScar(scarId); + + String name = StringUtil.toTitleCase(scarId.getPath()); + player.displayClientMessage( + Component.literal("The scar of '" + name + "' fades from your soul.") + .withStyle(ChatFormatting.LIGHT_PURPLE), + true); + + player.level().playSound(null, player.blockPosition(), + SoundEvents.BEACON_DEACTIVATE, SoundSource.PLAYERS, 0.6f, 1.2f); + }); + } + + private ItemStack findCluster(ServerPlayer player) { + // Check hands first + if (isCluster(player.getMainHandItem())) return player.getMainHandItem(); + if (isCluster(player.getOffhandItem())) return player.getOffhandItem(); + + // Search inventory + for (int i = 0; i < player.getInventory().getContainerSize(); i++) { + ItemStack stack = player.getInventory().getItem(i); + if (isCluster(stack)) return stack; + } + return ItemStack.EMPTY; + } + + private boolean isCluster(ItemStack stack) { + return !stack.isEmpty() && stack.is(CosmicItems.PERPETUITY_SHARD_MASSIVE.get()); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ui/ScarSelectionScreen.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ui/ScarSelectionScreen.java new file mode 100644 index 000000000..24176de40 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ui/ScarSelectionScreen.java @@ -0,0 +1,175 @@ +package com.ghostipedia.cosmiccore.common.reflection.ui; + +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.BargainRegistry; +import com.ghostipedia.cosmiccore.utils.StringUtil; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.Set; + +/** + * Simple selection screen for choosing which defiance scar to mend with a Cluster of Perpetuity. + */ +@OnlyIn(Dist.CLIENT) +public class ScarSelectionScreen extends Screen { + + private static final int ENTRY_WIDTH = 280; + private static final int ENTRY_HEIGHT = 32; + private static final int ENTRY_SPACING = 4; + private static final int MAX_VISIBLE = 6; + private static final int FADE_TICKS = 15; + + private final List entries = new ArrayList<>(); + private int hoveredIndex = -1; + private int scrollOffset = 0; + private int listStartY; + private int ticks = 0; + + public ScarSelectionScreen(Set scars) { + super(Component.literal("Mend a Scar")); + + for (ResourceLocation scarId : scars) { + Optional bargain = BargainRegistry.get(scarId); + String name = bargain.map(b -> b.getDisplayName().getString()) + .orElseGet(() -> StringUtil.toTitleCase(scarId.getPath())); + String desc = bargain.map(b -> b.getDescription().getString()) + .orElse("A forgotten bargain"); + entries.add(new ScarEntry(scarId, name, desc)); + } + } + + public static void open(Set scars) { + Minecraft.getInstance().setScreen(new ScarSelectionScreen(scars)); + } + + @Override + protected void init() { + super.init(); + int visibleCount = Math.min(entries.size(), MAX_VISIBLE); + listStartY = height / 2 - (visibleCount * (ENTRY_HEIGHT + ENTRY_SPACING)) / 2; + } + + @Override + public void tick() { + super.tick(); + if (ticks < FADE_TICKS) ticks++; + } + + private float getFade() { + return Math.min(1f, (float) ticks / FADE_TICKS); + } + + private int withAlpha(int color, float alpha) { + int a = (int) (((color >> 24) & 0xFF) * alpha * getFade()); + return (a << 24) | (color & 0x00FFFFFF); + } + + @Override + public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTick) { + renderBackground(graphics); + graphics.fill(0, 0, width, height, withAlpha(0xCC0a0a12, 1f)); + + // Title + Component title = Component.literal("Mend a Defiance Scar"); + graphics.drawCenteredString(font, title, width / 2, listStartY - 30, withAlpha(0xFFBB99DD, 1f)); + + // Subtitle + graphics.drawCenteredString(font, "Choose which scar to heal", width / 2, listStartY - 16, + withAlpha(0xFF888888, 1f)); + + // Entries + hoveredIndex = -1; + int visibleCount = Math.min(MAX_VISIBLE, entries.size()); + + for (int i = 0; i < visibleCount; i++) { + int entryIndex = i + scrollOffset; + if (entryIndex >= entries.size()) break; + + ScarEntry entry = entries.get(entryIndex); + int x = (width - ENTRY_WIDTH) / 2; + int y = listStartY + i * (ENTRY_HEIGHT + ENTRY_SPACING); + + boolean hovered = mouseX >= x && mouseX < x + ENTRY_WIDTH && mouseY >= y && mouseY < y + ENTRY_HEIGHT; + if (hovered) hoveredIndex = entryIndex; + + renderEntry(graphics, entry, x, y, hovered); + } + + // Scroll hints + if (scrollOffset > 0) { + graphics.drawCenteredString(font, "\u25B2", width / 2, listStartY - 8, withAlpha(0xFF666666, 1f)); + } + if (scrollOffset + MAX_VISIBLE < entries.size()) { + int bottomY = listStartY + visibleCount * (ENTRY_HEIGHT + ENTRY_SPACING); + graphics.drawCenteredString(font, "\u25BC", width / 2, bottomY, withAlpha(0xFF666666, 1f)); + } + + // Cancel hint + graphics.drawCenteredString(font, "ESC to cancel", width / 2, height - 20, withAlpha(0xFF555555, 1f)); + } + + private void renderEntry(GuiGraphics graphics, ScarEntry entry, int x, int y, boolean hovered) { + // Background + int bg = withAlpha(hovered ? 0xDD2a2a3a : 0xAA1a1a24, 1f); + graphics.fill(x, y, x + ENTRY_WIDTH, y + ENTRY_HEIGHT, bg); + + // Border + int border = withAlpha(hovered ? 0xFF8866AA : 0x88443355, 1f); + graphics.fill(x, y, x + ENTRY_WIDTH, y + 1, border); + graphics.fill(x, y + ENTRY_HEIGHT - 1, x + ENTRY_WIDTH, y + ENTRY_HEIGHT, border); + graphics.fill(x, y, x + 1, y + ENTRY_HEIGHT, border); + graphics.fill(x + ENTRY_WIDTH - 1, y, x + ENTRY_WIDTH, y + ENTRY_HEIGHT, border); + + // Icon + graphics.drawString(font, "\u2620", x + 8, y + (ENTRY_HEIGHT - font.lineHeight) / 2, + withAlpha(0xFFAA6688, 1f), false); + + // Name + int nameColor = withAlpha(hovered ? 0xFFDDCCEE : 0xFFAA99BB, 1f); + graphics.drawString(font, entry.name, x + 24, y + 6, nameColor, false); + + // Description (truncate if needed) + String desc = entry.description; + if (font.width(desc) > ENTRY_WIDTH - 32) { + desc = font.plainSubstrByWidth(desc, ENTRY_WIDTH - 40) + "..."; + } + graphics.drawString(font, desc, x + 24, y + 18, withAlpha(0xFF666677, 1f), false); + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (button == 0 && hoveredIndex >= 0 && hoveredIndex < entries.size()) { + ScarSelectionPackets.sendScarRemoval(entries.get(hoveredIndex).id); + onClose(); + return true; + } + return super.mouseClicked(mouseX, mouseY, button); + } + + @Override + public boolean mouseScrolled(double mouseX, double mouseY, double delta) { + if (entries.size() > MAX_VISIBLE) { + int maxScroll = entries.size() - MAX_VISIBLE; + scrollOffset = Math.max(0, Math.min(maxScroll, scrollOffset - (int) Math.signum(delta))); + return true; + } + return super.mouseScrolled(mouseX, mouseY, delta); + } + + @Override + public boolean isPauseScreen() { + return false; + } + + private record ScarEntry(ResourceLocation id, String name, String description) {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ui/VoidScreen.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ui/VoidScreen.java new file mode 100644 index 000000000..100f50786 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ui/VoidScreen.java @@ -0,0 +1,1716 @@ +package com.ghostipedia.cosmiccore.common.reflection.ui; + +import com.ghostipedia.cosmiccore.client.renderer.BackgroundRenderer; +import com.ghostipedia.cosmiccore.client.renderer.SoulAuraRenderer; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionConstants; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionLang; +import com.ghostipedia.cosmiccore.common.reflection.ThresholdEncounter; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain.BargainAnswer; +import com.ghostipedia.cosmiccore.common.reflection.bargain.BargainRegistry; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.Random; +import java.util.Set; + +import javax.annotation.Nullable; + +/** + * The Void UI - where you face your Reflection. + * + * A full-screen dark environment with: + * - Animated void background with floating particles + * - Soul orb visualization (color based on erosion, marks from bargains) + * - Dialogue text with typewriter effect and word wrapping + * - Stylized choice buttons for bargains + * - Vignette effect for atmosphere + */ +@OnlyIn(Dist.CLIENT) +public class VoidScreen extends Screen { + + // State machine + private VoidState state = VoidState.FADE_IN; + private int ticksInState = 0; + private int totalTicks = 0; + + // Mode determines what the screen does after dialogue + private VoidMode mode = VoidMode.REFLECTION; + + // Dialogue system + private final List dialogueQueue = new ArrayList<>(); + private int currentDialogueIndex = 0; + private String displayedText = ""; + private int charIndex = 0; + private int textTickCounter = 0; + + // Current bargain being offered (if any) + @Nullable + private Bargain currentBargain; + private List currentAnswers; + + // Threshold encounter mode (no bargain, just dialogue with acknowledgment) + private int thresholdIndex = -1; + private boolean isThresholdEncounter = false; + + // Hub mode - browsing bargains + private List availableBargains = new ArrayList<>(); + private List playerActiveBargains = new ArrayList<>(); + private int selectedBargainIndex = 0; + private int bargainListScrollOffset = 0; + @Nullable + private Bargain viewingBargain = null; // Currently viewing details of this bargain + + // Defiance scars for display + private Set defianceScars = Set.of(); + + // Flag to open constellation after dialogue + private boolean pendingConstellationOpen = false; + + // Player's active bargains (for soul marks) + private Set activeBargains = Set.of(); + + // Visual state + private float fadeAlpha = 0f; + private float soulPulse = 0f; + private float soulBreath = 0f; + private int erosion = 0; + + // Economy state + private int shardBalance = 0; + private int usedCapacity = 0; + private int totalCapacity = 100; + + // Particles + private final List particles = new ArrayList<>(); + private final Random random = new Random(); + + // Answer button state (custom rendering) + private final List answerButtons = new ArrayList<>(); + private int hoveredButton = -1; + + // Constants + private static final int FADE_TICKS = 40; + private static final int CHARS_PER_TICK = 2; + private static final int TICKS_BETWEEN_CHARS = 1; + private static final int MAX_LINE_WIDTH = 350; + private static final int PARTICLE_COUNT = 30; // Restored for better atmosphere + + public VoidScreen(int erosion) { + super(ReflectionLang.ui("void_title")); + this.erosion = erosion; + } + + public VoidScreen(int erosion, Set activeBargains) { + this(erosion); + this.activeBargains = activeBargains; + } + + public static void openWithBargain(Bargain bargain, int erosion) { + VoidScreen screen = new VoidScreen(erosion); + screen.currentBargain = bargain; + screen.setupBargainDialogue(); + Minecraft.getInstance().setScreen(screen); + } + + public static void openWithBargain(Bargain bargain, int erosion, Set activeBargains) { + VoidScreen screen = new VoidScreen(erosion, activeBargains); + screen.currentBargain = bargain; + screen.setupBargainDialogue(); + Minecraft.getInstance().setScreen(screen); + } + + public static void openWithBargain(Bargain bargain, int erosion, Set activeBargains, + int shardBalance, int usedCapacity, int totalCapacity) { + VoidScreen screen = new VoidScreen(erosion, activeBargains); + screen.currentBargain = bargain; + screen.shardBalance = shardBalance; + screen.usedCapacity = usedCapacity; + screen.totalCapacity = totalCapacity; + screen.setupBargainDialogue(); + Minecraft.getInstance().setScreen(screen); + } + + public static void openForReflection(int erosion) { + VoidScreen screen = new VoidScreen(erosion); + screen.setupReflectionDialogue(); + Minecraft.getInstance().setScreen(screen); + } + + public static void openForReflection(int erosion, Set activeBargains) { + VoidScreen screen = new VoidScreen(erosion, activeBargains); + screen.setupReflectionDialogue(); + Minecraft.getInstance().setScreen(screen); + } + + public static void openForReflection(int erosion, Set activeBargains, + int shardBalance, int usedCapacity, int totalCapacity) { + VoidScreen screen = new VoidScreen(erosion, activeBargains); + screen.shardBalance = shardBalance; + screen.usedCapacity = usedCapacity; + screen.totalCapacity = totalCapacity; + screen.setupReflectionDialogue(); + Minecraft.getInstance().setScreen(screen); + } + + public static void openForThreshold(int thresholdIndex, int erosion, Set activeBargains) { + VoidScreen screen = new VoidScreen(erosion, activeBargains); + screen.thresholdIndex = thresholdIndex; + screen.isThresholdEncounter = true; + screen.setupThresholdDialogue(); + Minecraft.getInstance().setScreen(screen); + } + + public static void openForHub(int erosion, Set activeBargains, + Set defianceScars) { + VoidScreen screen = new VoidScreen(erosion, activeBargains); + screen.mode = VoidMode.HUB; + screen.defianceScars = defianceScars != null ? defianceScars : Set.of(); + screen.setupHubDialogue(); + Minecraft.getInstance().setScreen(screen); + } + + public static void openForHub(int erosion, Set activeBargains, + Set defianceScars, + int shardBalance, int usedCapacity, int totalCapacity) { + VoidScreen screen = new VoidScreen(erosion, activeBargains); + screen.mode = VoidMode.HUB; + screen.defianceScars = defianceScars != null ? defianceScars : Set.of(); + screen.shardBalance = shardBalance; + screen.usedCapacity = usedCapacity; + screen.totalCapacity = totalCapacity; + screen.setupHubDialogue(); + Minecraft.getInstance().setScreen(screen); + } + + public void setEconomyData(int shardBalance, int usedCapacity, int totalCapacity) { + this.shardBalance = shardBalance; + this.usedCapacity = usedCapacity; + this.totalCapacity = totalCapacity; + } + + @Override + protected void init() { + super.init(); + // Initialize particles + particles.clear(); + for (int i = 0; i < PARTICLE_COUNT; i++) { + particles.add(new VoidParticle(width, height, random)); + } + } + + private void setupBargainDialogue() { + if (currentBargain == null) return; + + dialogueQueue.clear(); + + // Add the bargain's offer dialogue + if (minecraft != null && minecraft.player != null) { + for (Component line : currentBargain.getOfferDialogue(minecraft.player)) { + dialogueQueue.add(line.getString()); + } + } + + // Add the question + dialogueQueue.add(currentBargain.getQuestion().getString()); + + // Store answers for later + currentAnswers = currentBargain.getAnswers(); + } + + private void setupReflectionDialogue() { + dialogueQueue.clear(); + + // Contextual greeting based on erosion + int colorTier = ReflectionConstants.getSoulColorTier(erosion); + + if (erosion == 0) { + dialogueQueue.add(ReflectionLang.ui("reflection.no_erosion.0").getString()); + dialogueQueue.add(ReflectionLang.ui("reflection.no_erosion.1").getString()); + dialogueQueue.add(ReflectionLang.ui("reflection.no_erosion.2").getString()); + } else if (colorTier <= 1) { + dialogueQueue.add(ReflectionLang.ui("reflection.low_erosion.0").getString()); + dialogueQueue.add(ReflectionLang.ui("reflection.low_erosion.1").getString()); + } else if (colorTier <= 3) { + dialogueQueue.add(ReflectionLang.ui("reflection.mid_erosion.0").getString()); + dialogueQueue.add(ReflectionLang.ui("reflection.mid_erosion.1").getString()); + } else if (colorTier <= 5) { + dialogueQueue.add(ReflectionLang.ui("reflection.high_erosion.0").getString()); + dialogueQueue.add(ReflectionLang.ui("reflection.high_erosion.1").getString()); + } else { + dialogueQueue.add(ReflectionLang.ui("reflection.extreme_erosion.0").getString()); + dialogueQueue.add(ReflectionLang.ui("reflection.extreme_erosion.1").getString()); + } + + // If they have bargains, comment on them + if (!activeBargains.isEmpty()) { + dialogueQueue.add(ReflectionLang.ui("reflection.has_bargains.0").getString()); + dialogueQueue.add(ReflectionLang.ui("reflection.has_bargains.1").getString()); + } + } + + private void setupThresholdDialogue() { + dialogueQueue.clear(); + + // Get the threshold-specific dialogue + for (Component line : ThresholdEncounter.getDialogue(thresholdIndex)) { + dialogueQueue.add(line.getString()); + } + + // Add the rhetorical question/prompt + String question = ThresholdEncounter.getQuestion(thresholdIndex).getString(); + if (!question.isEmpty()) { + dialogueQueue.add(question); + } + } + + private void setupHubDialogue() { + dialogueQueue.clear(); + + // Contextual greeting based on player's state + int colorTier = ReflectionConstants.getSoulColorTier(erosion); + + if (!activeBargains.isEmpty()) { + // Has bargains - comment on them + if (colorTier >= 4) { + dialogueQueue.add(ReflectionLang.ui("hub.greeting.many_bargains_high.0").getString()); + dialogueQueue.add(ReflectionLang.ui("hub.greeting.many_bargains_high.1").getString()); + } else if (activeBargains.size() >= 3) { + dialogueQueue.add(ReflectionLang.ui("hub.greeting.many_bargains.0").getString()); + dialogueQueue.add(ReflectionLang.ui("hub.greeting.many_bargains.1").getString()); + } else { + dialogueQueue.add(ReflectionLang.ui("hub.greeting.has_bargains.0").getString()); + dialogueQueue.add(ReflectionLang.ui("hub.greeting.has_bargains.1").getString()); + } + } else if (!defianceScars.isEmpty()) { + // Has defied before - acknowledge the scars + dialogueQueue.add(ReflectionLang.ui("hub.greeting.has_scars.0").getString()); + dialogueQueue.add(ReflectionLang.ui("hub.greeting.has_scars.1").getString()); + dialogueQueue.add(ReflectionLang.ui("hub.greeting.has_scars.2").getString()); + } else if (erosion > 0) { + // Has erosion but no bargains - curious + dialogueQueue.add(ReflectionLang.ui("hub.greeting.erosion_no_bargains.0").getString()); + dialogueQueue.add(ReflectionLang.ui("hub.greeting.erosion_no_bargains.1").getString()); + dialogueQueue.add(ReflectionLang.ui("hub.greeting.erosion_no_bargains.2").getString()); + } else { + // Fresh - rare to hit hub with no erosion + dialogueQueue.add(ReflectionLang.ui("hub.greeting.fresh.0").getString()); + dialogueQueue.add(ReflectionLang.ui("hub.greeting.fresh.1").getString()); + } + + dialogueQueue.add(ReflectionLang.ui("hub.greeting.question").getString()); + } + + private void setupHubMenu() { + answerButtons.clear(); + + int buttonWidth = 280; + int buttonHeight = 28; + int startY = height / 2 + 40; + int spacing = 35; + + // Populate bargain lists for later + availableBargains = BargainRegistry.getAvailable(activeBargains, defianceScars); + playerActiveBargains = BargainRegistry.getActive(activeBargains); + + // Menu options + List menuOptions = new ArrayList<>(); + + // Option 1: View active bargains (if any) + if (!playerActiveBargains.isEmpty()) { + menuOptions.add(new BargainAnswer( + "view_active", + ReflectionLang.uiReviewBargains(playerActiveBargains.size()))); + } + + // Option 2: Browse the constellation (always show - displays all bargain states) + Component browseText = availableBargains.isEmpty() ? ReflectionLang.uiGazeConstellation() : + ReflectionLang.uiBrowseBargains(availableBargains.size()); + menuOptions.add(new BargainAnswer( + "browse_bargains", + browseText)); + + // Option 3: Just reflect (always available) + menuOptions.add(new BargainAnswer( + "just_reflect", + ReflectionLang.uiJustLook())); + + // Option 4: Leave + menuOptions.add(new BargainAnswer( + "leave", + ReflectionLang.uiLeave())); + + for (int i = 0; i < menuOptions.size(); i++) { + BargainAnswer option = menuOptions.get(i); + int x = (width - buttonWidth) / 2; + int y = startY + (i * spacing); + answerButtons.add(new AnswerButton(x, y, buttonWidth, buttonHeight, option, i)); + } + } + + private void setupBrowseBargains() { + answerButtons.clear(); + + int buttonWidth = 280; + int buttonHeight = 28; + int startY = height / 2 + 20; + int spacing = 35; + + List options = new ArrayList<>(); + + // List available bargains + for (Bargain bargain : availableBargains) { + String tierStr = getTierString(bargain.getTier()); + int cost = bargain.getBaseCost(); + + options.add(new BargainAnswer( + "view_" + bargain.getId().getPath(), + Component.literal(tierStr + bargain.getDisplayName().getString() + " \u00A78[" + cost + " " + + ReflectionLang.ui("erosion").getString() + "]"), + Optional.of(ReflectionLang.ui("browse.interesting_choice")), + false, 0, + bargain.getPowerDescriptions(), + bargain.getDrawbackDescriptions())); + } + + // Back option + options.add(new BargainAnswer( + "back", + ReflectionLang.uiBack())); + + for (int i = 0; i < options.size(); i++) { + BargainAnswer option = options.get(i); + int x = (width - buttonWidth) / 2; + int y = startY + (i * spacing); + answerButtons.add(new AnswerButton(x, y, buttonWidth, buttonHeight, option, i)); + } + } + + private void setupViewActiveBargains() { + answerButtons.clear(); + + int buttonWidth = 280; + int buttonHeight = 28; + int startY = height / 2 + 60; // Below the soul orb and orbiting marks + int spacing = 35; + + // Calculate max visible items based on screen height + int maxVisibleItems = Math.max(3, (height - startY - 80) / spacing); + + List allOptions = new ArrayList<>(); + + // List active bargains with defiance option + for (Bargain bargain : playerActiveBargains) { + int defianceCost = BargainRegistry.calculateDefianceCost(bargain); + + allOptions.add(new BargainAnswer( + "defy_" + bargain.getId().getPath(), + Component.literal("\u00A7c\u2717 " + bargain.getDisplayName().getString() + " \u00A78[" + + ReflectionLang.ui("defy").getString() + ": " + defianceCost + "]"), + Optional.of(ReflectionLang.ui("defiance.question")), + false, 0, + bargain.getPowerDescriptions(), + List.of( + ReflectionLang.uiDefianceCost(defianceCost), + ReflectionLang.ui("defiance.lose_power"), + ReflectionLang.ui("defiance.scar_remains")))); + } + + // Back option (always at the end) + allOptions.add(new BargainAnswer( + "back", + ReflectionLang.uiBack())); + + // Store total options for scroll calculation + viewActiveAllOptions = allOptions; + viewActiveMaxVisible = maxVisibleItems; + + // Clamp scroll offset + int maxScroll = Math.max(0, allOptions.size() - maxVisibleItems); + bargainListScrollOffset = Math.max(0, Math.min(bargainListScrollOffset, maxScroll)); + + // Create visible buttons with scroll offset applied + int visibleCount = Math.min(maxVisibleItems, allOptions.size() - bargainListScrollOffset); + for (int i = 0; i < visibleCount; i++) { + int optionIndex = i + bargainListScrollOffset; + BargainAnswer option = allOptions.get(optionIndex); + int x = (width - buttonWidth) / 2; + int y = startY + (i * spacing); + answerButtons.add(new AnswerButton(x, y, buttonWidth, buttonHeight, option, optionIndex)); + } + } + + // Track all options for scrolling + private List viewActiveAllOptions = new ArrayList<>(); + private int viewActiveMaxVisible = 5; + + private void setupDefianceConfirm(Bargain bargain) { + answerButtons.clear(); + + int buttonWidth = 280; + int buttonHeight = 28; + int startY = height / 2 + 60; + int spacing = 35; + + int defianceCost = BargainRegistry.calculateDefianceCost(bargain); + + // Add warning dialogue + dialogueQueue.clear(); + dialogueQueue.add(ReflectionLang.defianceWarning1(bargain.getDisplayName().getString()).getString()); + dialogueQueue.add(ReflectionLang.defianceWarning2(defianceCost).getString()); + dialogueQueue.add(ReflectionLang.defianceWarning3().getString()); + dialogueQueue.add(ReflectionLang.defianceWarning4().getString()); + currentDialogueIndex = 0; + charIndex = 0; + displayedText = ""; + + List options = new ArrayList<>(); + + // Confirm defiance - simple button, dialogue already explains consequences + options.add(new BargainAnswer( + "confirm_defiance", + ReflectionLang.defianceConfirm())); + + // Cancel + options.add(new BargainAnswer( + "cancel", + ReflectionLang.defianceCancel())); + + for (int i = 0; i < options.size(); i++) { + BargainAnswer option = options.get(i); + int x = (width - buttonWidth) / 2; + int y = startY + (i * spacing); + answerButtons.add(new AnswerButton(x, y, buttonWidth, buttonHeight, option, i)); + } + } + + private String getTierString(Bargain.BargainTier tier) { + return switch (tier) { + case EARLY -> "\u00A77"; // Gray - early game + case EARLY_MID -> "\u00A7f"; // White + case MID -> "\u00A7b"; // Aqua + case LATE -> "\u00A75"; // Purple + case EXTREME -> "\u00A74"; // Dark red - dangerous + case ANY -> "\u00A7e"; // Yellow - always available + }; + } + + @Override + public void tick() { + super.tick(); + ticksInState++; + totalTicks++; + + // Soul animations + soulPulse += 0.08f; + soulBreath += 0.03f; + + // Update particles + for (VoidParticle particle : particles) { + particle.tick(); + if (particle.isDead()) { + particle.reset(width, height, random); + } + } + + switch (state) { + case FADE_IN -> { + fadeAlpha = Math.min(1f, (float) ticksInState / FADE_TICKS); + if (ticksInState >= FADE_TICKS) { + transitionTo(VoidState.DIALOGUE); + } + } + case DIALOGUE -> { + tickDialogue(); + } + case AWAITING_CHOICE, HUB_MENU, BROWSE_BARGAINS, VIEW_ACTIVE, DEFIANCE_CONFIRM -> { + // Just wait for button interaction + } + case FADE_OUT -> { + fadeAlpha = Math.max(0f, 1f - (float) ticksInState / FADE_TICKS); + if (ticksInState >= FADE_TICKS) { + onClose(); + } + } + } + } + + private void tickDialogue() { + if (currentDialogueIndex >= dialogueQueue.size()) { + // Done with dialogue - what comes next depends on mode + + // Check for pending state transition first + if (pendingNextState != null) { + VoidState nextState = pendingNextState; + Runnable setup = pendingSetup; + pendingNextState = null; + pendingSetup = null; + transitionTo(nextState); + if (setup != null) { + setup.run(); + } + return; + } + + // Check if we should open the constellation browser + if (pendingConstellationOpen) { + pendingConstellationOpen = false; + BargainConstellationScreen.openFromVoid(erosion, activeBargains, defianceScars, + shardBalance, usedCapacity, totalCapacity); + return; + } + + if (currentBargain != null && currentAnswers != null) { + transitionTo(VoidState.AWAITING_CHOICE); + setupAnswerButtons(); + } else if (isThresholdEncounter) { + // Threshold encounter - show acknowledge button + transitionTo(VoidState.AWAITING_CHOICE); + setupThresholdAcknowledge(); + } else if (mode == VoidMode.HUB) { + // Hub mode - show menu + transitionTo(VoidState.HUB_MENU); + setupHubMenu(); + } else { + transitionTo(VoidState.FADE_OUT); + } + return; + } + + String fullText = dialogueQueue.get(currentDialogueIndex); + + textTickCounter++; + if (textTickCounter >= TICKS_BETWEEN_CHARS) { + textTickCounter = 0; + charIndex = Math.min(charIndex + CHARS_PER_TICK, fullText.length()); + displayedText = fullText.substring(0, charIndex); + } + } + + private void setupThresholdAcknowledge() { + answerButtons.clear(); + + int buttonWidth = 200; + int buttonHeight = 28; + int x = (width - buttonWidth) / 2; + int y = height / 2 + 60; + + // Single "acknowledge" button for threshold encounters + BargainAnswer acknowledge = new BargainAnswer( + "acknowledge", + ReflectionLang.uiAcknowledge()); + + answerButtons.add(new AnswerButton(x, y, buttonWidth, buttonHeight, acknowledge, 0)); + } + + private void setupAnswerButtons() { + answerButtons.clear(); + + if (currentAnswers == null) return; + + int buttonWidth = 280; + int buttonHeight = 28; + int startY = height / 2 + 60; + int spacing = 35; + + for (int i = 0; i < currentAnswers.size(); i++) { + BargainAnswer answer = currentAnswers.get(i); + int x = (width - buttonWidth) / 2; + int y = startY + (i * spacing); + + answerButtons.add(new AnswerButton(x, y, buttonWidth, buttonHeight, answer, i)); + } + } + + private void onAnswerSelected(BargainAnswer answer) { + // Handle threshold acknowledgment + if (isThresholdEncounter && answer.id().equals("acknowledge")) { + dialogueQueue.clear(); + String response = ThresholdEncounter.getAcknowledgeResponse(thresholdIndex).getString(); + if (!response.isEmpty()) { + dialogueQueue.add(response); + } + currentDialogueIndex = 0; + charIndex = 0; + displayedText = ""; + answerButtons.clear(); + isThresholdEncounter = false; + + if (response.isEmpty()) { + // Silent response, just fade out + transitionTo(VoidState.FADE_OUT); + } else { + transitionTo(VoidState.DIALOGUE); + } + return; + } + + // Handle hub menu choices + if (state == VoidState.HUB_MENU) { + handleHubMenuChoice(answer); + return; + } + + // Handle browse bargains choices + if (state == VoidState.BROWSE_BARGAINS) { + handleBrowseBargainsChoice(answer); + return; + } + + // Handle view active choices + if (state == VoidState.VIEW_ACTIVE) { + handleViewActiveChoice(answer); + return; + } + + // Handle defiance confirmation + if (state == VoidState.DEFIANCE_CONFIRM) { + handleDefianceConfirmChoice(answer); + return; + } + + if (currentBargain == null) return; + + // Send packet to server to process the choice + VoidUIPackets.sendBargainChoice(currentBargain.getId(), answer.id()); + + // Show response dialogue + dialogueQueue.clear(); + String response = answer.reflectionResponse() + .map(Component::getString) + .orElse("..."); + dialogueQueue.add(response); + currentDialogueIndex = 0; + charIndex = 0; + displayedText = ""; + + // Clear buttons and transition back to dialogue, then fade out + answerButtons.clear(); + currentBargain = null; + currentAnswers = null; + + transitionTo(VoidState.DIALOGUE); + } + + private void handleHubMenuChoice(BargainAnswer answer) { + answerButtons.clear(); + + switch (answer.id()) { + case "view_active" -> { + // Transition directly to VIEW_ACTIVE + transitionTo(VoidState.VIEW_ACTIVE); + setupViewActiveBargains(); + } + case "browse_bargains" -> { + // Open the constellation browser with economy data + BargainConstellationScreen.openFromVoid(erosion, activeBargains, defianceScars, + shardBalance, usedCapacity, totalCapacity); + } + case "just_reflect" -> { + // Just fade out + transitionTo(VoidState.FADE_OUT); + } + case "leave" -> { + transitionTo(VoidState.FADE_OUT); + } + } + } + + private void handleBrowseBargainsChoice(BargainAnswer answer) { + answerButtons.clear(); + + if (answer.id().equals("back")) { + // Return to hub menu + viewingBargain = null; + transitionTo(VoidState.HUB_MENU); + setupHubMenu(); + return; + } + + if (answer.id().startsWith("view_")) { + // View a specific bargain's details + String bargainPath = answer.id().substring(5); // Remove "view_" + for (Bargain bargain : availableBargains) { + if (bargain.getId().getPath().equals(bargainPath)) { + viewingBargain = bargain; + currentBargain = bargain; + currentAnswers = bargain.getAnswers(); + // Show the bargain's offer dialogue + setupBargainDialogue(); + transitionTo(VoidState.DIALOGUE); + return; + } + } + } + } + + private void handleViewActiveChoice(BargainAnswer answer) { + answerButtons.clear(); + + if (answer.id().equals("back")) { + viewingBargain = null; + transitionTo(VoidState.HUB_MENU); + setupHubMenu(); + return; + } + + if (answer.id().startsWith("defy_")) { + // Initiate defiance for a bargain + String bargainPath = answer.id().substring(5); + for (Bargain bargain : playerActiveBargains) { + if (bargain.getId().getPath().equals(bargainPath)) { + viewingBargain = bargain; + transitionTo(VoidState.DEFIANCE_CONFIRM); + setupDefianceConfirm(bargain); + return; + } + } + } + } + + private void handleDefianceConfirmChoice(BargainAnswer answer) { + answerButtons.clear(); + + if (answer.id().equals("cancel")) { + viewingBargain = null; + transitionTo(VoidState.VIEW_ACTIVE); + setupViewActiveBargains(); + return; + } + + if (answer.id().equals("confirm_defiance") && viewingBargain != null) { + // Send defiance packet to server + VoidUIPackets.sendDefianceChoice(viewingBargain.getId()); + + // Show dramatic response + dialogueQueue.clear(); + dialogueQueue.add("So be it."); + dialogueQueue.add("The power leaves you..."); + dialogueQueue.add("But the scar remains."); + currentDialogueIndex = 0; + charIndex = 0; + displayedText = ""; + + // Update local state + activeBargains.remove(viewingBargain.getId()); + defianceScars = new java.util.HashSet<>(defianceScars); + ((java.util.HashSet) defianceScars).add(viewingBargain.getId()); + playerActiveBargains = BargainRegistry.getActive(activeBargains); + + viewingBargain = null; + mode = VoidMode.REFLECTION; // Return to simple reflection mode + transitionTo(VoidState.DIALOGUE); + } + } + + private void showResponseThenState(String response, VoidState nextState, Runnable setupNext) { + dialogueQueue.clear(); + dialogueQueue.add(response); + currentDialogueIndex = 0; + charIndex = 0; + displayedText = ""; + + // Store what to do after dialogue + this.pendingNextState = nextState; + this.pendingSetup = setupNext; + mode = VoidMode.REFLECTION; // Temporarily switch mode so dialogue finishes normally + transitionTo(VoidState.DIALOGUE); + } + + private void showResponseThenFadeOut(String response) { + dialogueQueue.clear(); + dialogueQueue.add(response); + currentDialogueIndex = 0; + charIndex = 0; + displayedText = ""; + mode = VoidMode.REFLECTION; + transitionTo(VoidState.DIALOGUE); + } + + // Pending state for after response dialogue + @Nullable + private VoidState pendingNextState = null; + @Nullable + private Runnable pendingSetup = null; + + private void transitionTo(VoidState newState) { + state = newState; + ticksInState = 0; + } + + @Override + public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTick) { + // Mystical void background shader + BackgroundRenderer.render(graphics.pose(), BackgroundRenderer.BackgroundType.VOID, fadeAlpha, width, height); + + if (fadeAlpha < 0.1f) { + return; + } + + // Render void particles (on top of shader background) + renderParticles(graphics, partialTick); + + // Render vignette + renderVignette(graphics); + + // Render soul orb in center + renderSoulOrb(graphics, partialTick); + + // Render active bargain marks around soul + renderBargainMarks(graphics, partialTick); + + // Render dialogue text + if (state == VoidState.DIALOGUE || state == VoidState.AWAITING_CHOICE || + state == VoidState.HUB_MENU || state == VoidState.DEFIANCE_CONFIRM) { + renderDialogue(graphics); + } + + // Render state-specific headers + renderStateHeader(graphics); + + // Render click to continue hint + if (state == VoidState.DIALOGUE && currentDialogueIndex < dialogueQueue.size()) { + String fullText = dialogueQueue.get(currentDialogueIndex); + if (charIndex >= fullText.length()) { + renderContinueHint(graphics); + } + } + + // Render bargain cost preview (before buttons so tooltip can cover it) + if (state == VoidState.AWAITING_CHOICE && currentBargain != null) { + renderCostPreview(graphics); + } + + // Render answer buttons for all interactive states + if (state == VoidState.AWAITING_CHOICE || state == VoidState.HUB_MENU || + state == VoidState.BROWSE_BARGAINS || state == VoidState.VIEW_ACTIVE || + state == VoidState.DEFIANCE_CONFIRM) { + renderAnswerButtons(graphics, mouseX, mouseY); + } + + // Render erosion indicator (subtle) + renderErosionIndicator(graphics); + } + + private void renderParticles(GuiGraphics graphics, float partialTick) { + for (VoidParticle particle : particles) { + particle.render(graphics, fadeAlpha); + } + } + + private void renderVignette(GuiGraphics graphics) { + // Create a vignette effect using gradient bands (2px bands for smooth gradients) + int vignetteStrength = (int) (fadeAlpha * 180); + int bandSize = 2; + + // Top and bottom gradients + for (int i = 0; i < 60; i += bandSize) { + int alpha = (int) (vignetteStrength * (1f - (float) i / 60f)); + int color = (alpha << 24); + graphics.fill(0, i, width, i + bandSize, color); + graphics.fill(0, height - i - bandSize, width, height - i, color); + } + + // Left and right gradients + for (int i = 0; i < 80; i += bandSize) { + int alpha = (int) (vignetteStrength * (1f - (float) i / 80f) * 0.7f); + int color = (alpha << 24); + graphics.fill(i, 0, i + bandSize, height, color); + graphics.fill(width - i - bandSize, 0, width - i, height, color); + } + } + + private void renderSoulOrb(GuiGraphics graphics, float partialTick) { + int centerX = width / 2; + int centerY = height / 2 - 40; + + // Calculate orb color based on erosion + int[] rgb = getSoulColor(); + + // Breathing + pulsing animation - interpolate with partialTick for smooth 60fps animation + float smoothBreath = soulBreath + (0.03f * partialTick); + float smoothPulse = soulPulse + (0.08f * partialTick); + float breath = (float) Math.sin(smoothBreath) * 0.05f + 1f; + float pulse = (float) Math.sin(smoothPulse) * 0.08f + 1f; + int baseRadius = 35; + int radius = (int) (baseRadius * breath * pulse); + + int alpha = (int) (fadeAlpha * 255); + + // Render ethereal flame aura BEHIND the soul orb + int auraRadius = (int) (baseRadius * 1.8f); // Aura is larger than the orb + SoulAuraRenderer.render( + graphics.pose(), + centerX, centerY, + auraRadius, + erosion, + fadeAlpha * 0.8f, // Slightly reduced intensity + width, height); + + // Outer glow - use 4px steps for smoother appearance + for (int r = radius + 35; r > radius; r -= 4) { + float glowProgress = (float) (r - radius) / 35f; + int glowAlpha = (int) ((1f - glowProgress) * 40 * fadeAlpha); + int color = (glowAlpha << 24) | (rgb[0] << 16) | (rgb[1] << 8) | rgb[2]; + drawCircleFast(graphics, centerX, centerY, r, color); + } + + // Core - use 3px steps for smoother appearance + for (int r = radius; r > 0; r -= 3) { + float coreProgress = (float) r / radius; + int coreAlpha = (int) (alpha * (0.6f + 0.4f * coreProgress)); + int lr = Math.min(255, rgb[0] + (int) ((255 - rgb[0]) * (1f - coreProgress) * 0.3f)); + int lg = Math.min(255, rgb[1] + (int) ((255 - rgb[1]) * (1f - coreProgress) * 0.3f)); + int lb = Math.min(255, rgb[2] + (int) ((255 - rgb[2]) * (1f - coreProgress) * 0.3f)); + int color = (coreAlpha << 24) | (lr << 16) | (lg << 8) | lb; + drawCircleFast(graphics, centerX, centerY, r, color); + } + + // Inner bright highlight + int highlightRadius = radius / 4; + int hx = centerX - radius / 3; + int hy = centerY - radius / 3; + int hAlpha = (int) (alpha * 0.4f); + int hColor = (hAlpha << 24) | 0xFFFFFF; + drawCircleFast(graphics, hx, hy, highlightRadius, hColor); + + // Erosion cracks at high levels + if (erosion >= 100) { + renderCracks(graphics, centerX, centerY, radius); + } + } + + private void renderCracks(GuiGraphics graphics, int cx, int cy, int radius) { + int crackAlpha = (int) (fadeAlpha * Math.min(200, erosion / 5)); + int crackColor = (crackAlpha << 24) | 0x200010; + + // Draw some jagged crack lines - reduced frequency + Random crackRandom = new Random(42); // Consistent cracks + int numCracks = Math.min(5, erosion / 200 + 1); // Fewer cracks + + for (int i = 0; i < numCracks; i++) { + double angle = crackRandom.nextDouble() * Math.PI * 2; + int length = radius / 2 + crackRandom.nextInt(radius / 2); + + int x1 = cx; + int y1 = cy; + + // Larger step for fewer draw calls + for (int j = 0; j < length; j += 5) { + angle += (crackRandom.nextDouble() - 0.5) * 0.5; + int x2 = x1 + (int) (Math.cos(angle) * 5); + int y2 = y1 + (int) (Math.sin(angle) * 5); + + graphics.fill(x1, y1, x2 + 2, y2 + 2, crackColor); + x1 = x2; + y1 = y2; + } + } + } + + private void renderBargainMarks(GuiGraphics graphics, float partialTick) { + if (activeBargains.isEmpty()) return; + + int centerX = width / 2; + int centerY = height / 2 - 40; + int orbitRadius = 55; + + int markIndex = 0; + for (ResourceLocation bargainId : activeBargains) { + // Position marks in orbit around the soul - smooth with partialTick + double smoothTicks = totalTicks + partialTick; + double angle = (smoothTicks * 0.02) + (markIndex * Math.PI * 2 / activeBargains.size()); + int mx = centerX + (int) (Math.cos(angle) * orbitRadius); + int my = centerY + (int) (Math.sin(angle) * orbitRadius); + + // Each bargain type has a different mark color + int[] markColor = getBargainMarkColor(bargainId); + int alpha = (int) (fadeAlpha * 200); + int color = (alpha << 24) | (markColor[0] << 16) | (markColor[1] << 8) | markColor[2]; + + // Draw small orbiting mark as a circle + drawCircle(graphics, mx, my, 4, color); + + // Trail - 2 fading points for smooth effect + for (int t = 1; t <= 2; t++) { + double trailAngle = angle - (t * 0.18); + int tx = centerX + (int) (Math.cos(trailAngle) * orbitRadius); + int ty = centerY + (int) (Math.sin(trailAngle) * orbitRadius); + int trailAlpha = (int) (alpha * (1f - t * 0.35f) * 0.5f); + int trailColor = (trailAlpha << 24) | (markColor[0] << 16) | (markColor[1] << 8) | markColor[2]; + drawCircle(graphics, tx, ty, 3 - t, trailColor); + } + + markIndex++; + } + } + + private int[] getBargainMarkColor(ResourceLocation id) { + String path = id.getPath(); + return switch (path) { + // EARLY tier - cool/inviting colors + case "quake_movement" -> new int[] { 100, 200, 255 }; // Cyan - movement + case "stride" -> new int[] { 120, 220, 180 }; // Seafoam - step assist + case "darksight" -> new int[] { 160, 120, 255 }; // Violet - night vision + case "swiftness" -> new int[] { 255, 200, 100 }; // Amber - speed + + // EARLY_MID tier - warmer colors + case "home" -> new int[] { 255, 220, 100 }; // Gold - hearth + case "back" -> new int[] { 180, 100, 220 }; // Purple - death echo + case "vitality" -> new int[] { 255, 120, 120 }; // Coral - health + case "violence" -> new int[] { 220, 80, 80 }; // Crimson - strength + case "depths" -> new int[] { 80, 180, 220 }; // Ocean blue - water breathing + + // MID tier - more intense colors + case "reach" -> new int[] { 200, 160, 255 }; // Lavender - elongated grasp + case "soft_landing" -> new int[] { 180, 255, 180 }; // Mint - fall immunity + case "satiated" -> new int[] { 200, 180, 120 }; // Tan - no hunger + case "carapace" -> new int[] { 160, 160, 180 }; // Steel - armor + case "cinder" -> new int[] { 255, 140, 60 }; // Flame orange - fire immunity + + // LATE tier - darker/ominous + case "void_anchor" -> new int[] { 120, 60, 180 }; // Deep purple - void resistance + + default -> { + // Hash-based unique color as fallback + int hash = path.hashCode(); + int r = 100 + Math.abs(hash % 100); + int g = 100 + Math.abs((hash >> 8) % 100); + int b = 100 + Math.abs((hash >> 16) % 100); + yield new int[] { r, g, b }; + } + }; + } + + private void drawCircle(GuiGraphics graphics, int cx, int cy, int radius, int color) { + for (int y = -radius; y <= radius; y++) { + int halfWidth = (int) Math.sqrt(radius * radius - y * y); + graphics.fill(cx - halfWidth, cy + y, cx + halfWidth + 1, cy + y + 1, color); + } + } + + private void drawCircleFast(GuiGraphics graphics, int cx, int cy, int radius, int color) { + if (radius <= 0) return; + + // For small radii, use precise 1px drawing + if (radius <= 6) { + drawCircle(graphics, cx, cy, radius, color); + return; + } + + // Use 2px bands for good quality + int bandSize = 2; + + for (int y = -radius; y <= radius; y += bandSize) { + int halfWidth = (int) Math.sqrt(radius * radius - y * y); + int bandEnd = Math.min(y + bandSize, radius + 1); + graphics.fill(cx - halfWidth, cy + y, cx + halfWidth + 1, cy + bandEnd, color); + } + } + + private int[] getSoulColor() { + int tier = ReflectionConstants.getSoulColorTier(erosion); + + return switch (tier) { + case 0 -> new int[] { 220, 220, 235 }; // Pale white/silver + case 1 -> new int[] { 180, 200, 255 }; // Faint blue + case 2 -> new int[] { 140, 120, 220 }; // Deep blue/purple + case 3 -> new int[] { 180, 80, 160 }; // Violet/crimson + case 4 -> new int[] { 160, 50, 50 }; // Dark red + case 5 -> new int[] { 80, 30, 30 }; // Almost black, faint red + default -> new int[] { 20, 10, 30 }; // Void-like + }; + } + + private void renderDialogue(GuiGraphics graphics) { + if (displayedText.isEmpty() && state != VoidState.AWAITING_CHOICE) return; + + int textY = height / 2 + 30; + int alpha = (int) (fadeAlpha * 255); + int textColor = (alpha << 24) | 0xBBBBBB; + + // Word wrap the text + List lines = wrapText(displayedText, MAX_LINE_WIDTH); + + // Render each line centered + int lineHeight = font.lineHeight + 2; + for (int i = 0; i < lines.size(); i++) { + String line = lines.get(i); + int lineWidth = font.width(line); + int textX = (width - lineWidth) / 2; + int y = textY + (i * lineHeight); + + // Italic style for reflection's voice + graphics.drawString(font, "\u00A7o" + line, textX, y, textColor, false); + } + } + + private List wrapText(String text, int maxWidth) { + List lines = new ArrayList<>(); + if (text.isEmpty()) return lines; + + String[] words = text.split(" "); + StringBuilder currentLine = new StringBuilder(); + + for (String word : words) { + String testLine = currentLine.isEmpty() ? word : currentLine + " " + word; + if (font.width(testLine) <= maxWidth) { + if (!currentLine.isEmpty()) currentLine.append(" "); + currentLine.append(word); + } else { + if (!currentLine.isEmpty()) { + lines.add(currentLine.toString()); + currentLine = new StringBuilder(); + } + // Handle words longer than max width + if (font.width(word) > maxWidth) { + lines.add(word); + } else { + currentLine.append(word); + } + } + } + + if (!currentLine.isEmpty()) { + lines.add(currentLine.toString()); + } + + return lines; + } + + private void renderContinueHint(GuiGraphics graphics) { + // Pulsing "click to continue" hint + float pulse = (float) Math.sin(totalTicks * 0.15) * 0.3f + 0.7f; + int alpha = (int) (fadeAlpha * pulse * 150); + int color = (alpha << 24) | 0x888888; + + String hint = "[ Click or press Space to continue ]"; + int hintWidth = font.width(hint); + int x = (width - hintWidth) / 2; + int y = height / 2 + 80; + + graphics.drawString(font, hint, x, y, color, false); + } + + private void renderAnswerButtons(GuiGraphics graphics, int mouseX, int mouseY) { + hoveredButton = -1; + AnswerButton hoveredBtn = null; + + for (int i = 0; i < answerButtons.size(); i++) { + AnswerButton button = answerButtons.get(i); + boolean hovered = button.isMouseOver(mouseX, mouseY); + if (hovered) { + hoveredButton = i; + hoveredBtn = button; + } + button.render(graphics, font, fadeAlpha, hovered, totalTicks); + } + + // Render tooltip for hovered button (rendered last so it's on top) + if (hoveredBtn != null) { + renderAnswerTooltip(graphics, hoveredBtn, mouseX, mouseY); + } + } + + private void renderAnswerTooltip(GuiGraphics graphics, AnswerButton button, int mouseX, int mouseY) { + BargainAnswer answer = button.answer; + + // Skip tooltips for simple menu items with no details + if (answer.powerDescription().isEmpty() && answer.drawbacks().isEmpty()) { + return; + } + + // Collect tooltip lines + List tooltipLines = new ArrayList<>(); + + // Context-aware headers based on current state + boolean isDefianceContext = (state == VoidState.VIEW_ACTIVE); + + // Add power description with header + if (!answer.powerDescription().isEmpty()) { + if (isDefianceContext) { + tooltipLines.add(Component.literal("\u00A7a\u00A7lCURRENT POWER:\u00A7r")); + } else { + tooltipLines.add(Component.literal("\u00A7a\u00A7lPOWERS:\u00A7r")); + } + for (Component power : answer.powerDescription()) { + tooltipLines.add(Component.literal("\u00A7a+ \u00A7f" + power.getString())); + } + } + + // Add spacing between power and drawbacks + if (!answer.powerDescription().isEmpty() && !answer.drawbacks().isEmpty()) { + tooltipLines.add(Component.literal("")); + } + + // Add drawbacks with header + if (!answer.drawbacks().isEmpty()) { + if (isDefianceContext) { + tooltipLines.add(Component.literal("\u00A7c\u00A7lDEFIANCE COST:\u00A7r")); + } else { + tooltipLines.add(Component.literal("\u00A7c\u00A7lDRAWBACKS:\u00A7r")); + } + for (Component drawback : answer.drawbacks()) { + tooltipLines.add(Component.literal("\u00A7c- \u00A77" + drawback.getString())); + } + } + + // Calculate tooltip dimensions + int tooltipWidth = 0; + for (Component line : tooltipLines) { + tooltipWidth = Math.max(tooltipWidth, font.width(line)); + } + tooltipWidth += 16; // Padding + + int lineHeight = font.lineHeight + 2; + int tooltipHeight = tooltipLines.size() * lineHeight + 8; + + // Find the topmost button to position tooltip above ALL buttons + int topmostButtonY = button.y; + for (AnswerButton btn : answerButtons) { + if (btn.y < topmostButtonY) { + topmostButtonY = btn.y; + } + } + + // Position tooltip above ALL buttons with some margin + int tooltipX = (width - tooltipWidth) / 2; // Center horizontally on screen + int tooltipY = topmostButtonY - tooltipHeight - 15; // Above the topmost button + + // Keep tooltip on screen + if (tooltipX < 10) tooltipX = 10; + if (tooltipX + tooltipWidth > width - 10) tooltipX = width - tooltipWidth - 10; + if (tooltipY < 10) tooltipY = 10; + + // Render tooltip background (solid, no transparency for readability) + int bgColor = (0xFF << 24) | 0x101018; + int borderColor = (0xFF << 24) | 0x505080; + int innerBorderColor = (0xFF << 24) | 0x303050; + + // Outer border + graphics.fill(tooltipX - 6, tooltipY - 6, tooltipX + tooltipWidth + 6, tooltipY + tooltipHeight + 6, + borderColor); + // Inner border + graphics.fill(tooltipX - 5, tooltipY - 5, tooltipX + tooltipWidth + 5, tooltipY + tooltipHeight + 5, + innerBorderColor); + // Background + graphics.fill(tooltipX - 4, tooltipY - 4, tooltipX + tooltipWidth + 4, tooltipY + tooltipHeight + 4, bgColor); + + // Render text lines + int lineY = tooltipY; + for (Component line : tooltipLines) { + String text = line.getString(); + if (text.isEmpty()) { + lineY += lineHeight / 2; // Half spacing for empty lines + } else { + graphics.drawString(font, line, tooltipX, lineY, 0xFFFFFFFF, false); + lineY += lineHeight; + } + } + } + + private void renderCostPreview(GuiGraphics graphics) { + if (currentBargain == null) return; + + int alpha = (int) (fadeAlpha * 180); + + // Build cost display lines first to know how much space we need + List costLines = new ArrayList<>(); + List costColors = new ArrayList<>(); + + int shardCost = currentBargain.getShardCost(); + int weight = currentBargain.getWeight(); + int erosionCost = currentBargain.getErosionCost(); + + if (shardCost > 0) { + boolean canAfford = shardBalance >= shardCost; + costLines.add("\u2726 " + shardCost + " shards"); + costColors.add((alpha << 24) | (canAfford ? 0x55FFFF : 0xFF5555)); + } + + if (weight > 0) { + int remaining = totalCapacity - usedCapacity; + boolean canFit = remaining >= weight; + costLines.add("\u25C6 " + weight + " weight"); + costColors.add((alpha << 24) | (canFit ? 0xAA55FF : 0xFF5555)); + } + + if (erosionCost > 0) { + costLines.add("+" + erosionCost + " erosion"); + costColors.add((alpha << 24) | 0xAA6666); + } + + if (costLines.isEmpty()) { + costLines.add("Free"); + costColors.add((alpha << 24) | 0x55FF55); + } + + // Calculate total height needed for cost lines + int lineHeight = 12; + int totalCostHeight = costLines.size() * lineHeight; + + // Position: prefer below buttons, but clamp to stay on screen + int buttonsEndY = height / 2 + 60 + (answerButtons.size() * 35) + 10; + int idealY = buttonsEndY + 10; + + // Ensure we stay at least 10px from bottom of screen + int maxY = height - totalCostHeight - 10; + int y = Math.min(idealY, maxY); + + int centerX = width / 2; + + // Render all cost lines + for (int i = 0; i < costLines.size(); i++) { + String line = costLines.get(i); + int lineWidth = font.width(line); + graphics.drawString(font, line, centerX - lineWidth / 2, y + (i * lineHeight), costColors.get(i), false); + } + } + + private void renderErosionIndicator(GuiGraphics graphics) { + // Subtle erosion display in bottom left + int alpha = (int) (fadeAlpha * 100); + int color = (alpha << 24) | 0x555555; + + Component text = Component.translatable("reflection.cosmiccore.ui.soul_erosion_display", erosion); + graphics.drawString(font, text, 15, height - 25, color, false); + + // Small colored indicator + int[] soulColor = getSoulColor(); + int indicatorColor = (alpha << 24) | (soulColor[0] << 16) | (soulColor[1] << 8) | soulColor[2]; + graphics.fill(15, height - 35, 25, height - 28, indicatorColor); + + // Render shards and capacity in top right corner + renderEconomyDisplay(graphics); + } + + private void renderEconomyDisplay(GuiGraphics graphics) { + int alpha = (int) (fadeAlpha * 200); + if (alpha < 20) return; + + int rightMargin = width - 15; + int topY = 15; + + // Shard balance (aqua color) + int shardColor = (alpha << 24) | 0x55FFFF; + String shardText = "\u2726 " + shardBalance; // Unicode diamond + int shardWidth = font.width(shardText); + graphics.drawString(font, shardText, rightMargin - shardWidth, topY, shardColor, false); + + // Capacity display (purple color) below shards + int capacityColor = (alpha << 24) | 0xAA55FF; + String capacityText = usedCapacity + "/" + totalCapacity + " soul"; + int capacityWidth = font.width(capacityText); + graphics.drawString(font, capacityText, rightMargin - capacityWidth, topY + 12, capacityColor, false); + + // Capacity bar + int barWidth = 60; + int barHeight = 4; + int barX = rightMargin - barWidth; + int barY = topY + 24; + + // Background + int bgColor = (alpha << 24) | 0x222222; + graphics.fill(barX, barY, barX + barWidth, barY + barHeight, bgColor); + + // Filled portion + float fillPercent = totalCapacity > 0 ? (float) usedCapacity / totalCapacity : 0f; + int fillWidth = (int) (barWidth * fillPercent); + int fillColor = fillPercent > 0.9f ? ((alpha << 24) | 0xFF5555) : // Red when almost full + fillPercent > 0.7f ? ((alpha << 24) | 0xFFAA55) : // Orange when high + ((alpha << 24) | 0xAA55FF); // Purple normally + if (fillWidth > 0) { + graphics.fill(barX, barY, barX + fillWidth, barY + barHeight, fillColor); + } + } + + private void renderStateHeader(GuiGraphics graphics) { + Component header = switch (state) { + case BROWSE_BARGAINS -> ReflectionLang.uiAvailableBargains(); + case VIEW_ACTIVE -> ReflectionLang.uiYourBargains(); + case DEFIANCE_CONFIRM -> ReflectionLang.uiDefiance(); + default -> null; + }; + + if (header == null) return; + + int alpha = (int) (fadeAlpha * 200); + int color = (alpha << 24) | 0xAAAAAA; + + int headerWidth = font.width(header); + int x = (width - headerWidth) / 2; + int y = height / 2 + 40; // Just above the buttons area + + graphics.drawString(font, header, x, y, color, false); + + // Render scroll indicators for VIEW_ACTIVE state + if (state == VoidState.VIEW_ACTIVE && !viewActiveAllOptions.isEmpty()) { + int maxScroll = Math.max(0, viewActiveAllOptions.size() - viewActiveMaxVisible); + int scrollAlpha = (int) (fadeAlpha * 150); + + // Show "scroll up" indicator if not at top + if (bargainListScrollOffset > 0) { + Component upHint = ReflectionLang.uiScrollUp(); + int upWidth = font.width(upHint); + int upColor = (scrollAlpha << 24) | 0x888888; + graphics.drawString(font, upHint, (width - upWidth) / 2, height / 2 + 52, upColor, false); + } + + // Show "scroll down" indicator if not at bottom + if (bargainListScrollOffset < maxScroll) { + Component downHint = ReflectionLang.uiScrollDown(); + int downWidth = font.width(downHint); + int downColor = (scrollAlpha << 24) | 0x888888; + // Position below the last visible button + int lastButtonY = height / 2 + 60 + (viewActiveMaxVisible * 35); + graphics.drawString(font, downHint, (width - downWidth) / 2, lastButtonY + 5, downColor, false); + } + + // Show scroll position indicator + String posHint = (bargainListScrollOffset + 1) + "-" + + Math.min(bargainListScrollOffset + viewActiveMaxVisible, viewActiveAllOptions.size()) + + " " + ReflectionLang.ui("of").getString() + " " + viewActiveAllOptions.size(); + int posWidth = font.width(posHint); + int posColor = ((scrollAlpha / 2) << 24) | 0x666666; + graphics.drawString(font, posHint, (width - posWidth) / 2, y + 12, posColor, false); + } + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (button != 0) return super.mouseClicked(mouseX, mouseY, button); + + // Check answer buttons for all interactive states + if (state == VoidState.AWAITING_CHOICE || state == VoidState.HUB_MENU || + state == VoidState.BROWSE_BARGAINS || state == VoidState.VIEW_ACTIVE || + state == VoidState.DEFIANCE_CONFIRM) { + for (AnswerButton answerButton : answerButtons) { + if (answerButton.isMouseOver((int) mouseX, (int) mouseY)) { + onAnswerSelected(answerButton.answer); + return true; + } + } + } + + // Click to advance dialogue + if (state == VoidState.DIALOGUE) { + if (currentDialogueIndex < dialogueQueue.size()) { + String fullText = dialogueQueue.get(currentDialogueIndex); + + if (charIndex < fullText.length()) { + // Skip to end of current line + charIndex = fullText.length(); + displayedText = fullText; + } else { + // Advance to next line + currentDialogueIndex++; + charIndex = 0; + displayedText = ""; + } + return true; + } + } + + return super.mouseClicked(mouseX, mouseY, button); + } + + @Override + public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + // ESC to close (with fade) + if (keyCode == 256) { // ESCAPE + if (state != VoidState.FADE_OUT) { + transitionTo(VoidState.FADE_OUT); + } + return true; + } + + // Space/Enter to advance dialogue + if ((keyCode == 32 || keyCode == 257) && state == VoidState.DIALOGUE) { + mouseClicked(0, 0, 0); + return true; + } + + // Number keys for quick answer selection + if (state == VoidState.AWAITING_CHOICE && keyCode >= 49 && keyCode <= 57) { + int index = keyCode - 49; // 1 = 0, 2 = 1, etc. + if (index < answerButtons.size()) { + onAnswerSelected(answerButtons.get(index).answer); + return true; + } + } + + return super.keyPressed(keyCode, scanCode, modifiers); + } + + @Override + public boolean mouseScrolled(double mouseX, double mouseY, double delta) { + // Scroll bargain list in VIEW_ACTIVE state + if (state == VoidState.VIEW_ACTIVE && !viewActiveAllOptions.isEmpty()) { + int maxScroll = Math.max(0, viewActiveAllOptions.size() - viewActiveMaxVisible); + if (delta > 0) { + // Scroll up + bargainListScrollOffset = Math.max(0, bargainListScrollOffset - 1); + } else if (delta < 0) { + // Scroll down + bargainListScrollOffset = Math.min(maxScroll, bargainListScrollOffset + 1); + } + // Rebuild buttons with new scroll position + setupViewActiveBargains(); + return true; + } + return super.mouseScrolled(mouseX, mouseY, delta); + } + + @Override + public boolean isPauseScreen() { + return false; + } + + private enum VoidState { + FADE_IN, + DIALOGUE, + AWAITING_CHOICE, + HUB_MENU, // Hub menu with options + BROWSE_BARGAINS, // Browsing available bargains + VIEW_ACTIVE, // Viewing player's active bargains + DEFIANCE_CONFIRM,// Confirming defiance of a bargain + FADE_OUT + } + + private enum VoidMode { + REFLECTION, // General reflection (no bargain) + BARGAIN_OFFER, // Offering a specific bargain + THRESHOLD, // Erosion threshold encounter + HUB // Mirror hub - browse/manage bargains + } + + private static class VoidParticle { + + float x, y; + float vx, vy; + float size; + float alpha; + float maxAlpha; + int lifetime; + int age; + + VoidParticle(int screenWidth, int screenHeight, Random random) { + reset(screenWidth, screenHeight, random); + } + + void reset(int screenWidth, int screenHeight, Random random) { + x = random.nextFloat() * screenWidth; + y = random.nextFloat() * screenHeight; + vx = (random.nextFloat() - 0.5f) * 0.5f; + vy = (random.nextFloat() - 0.5f) * 0.3f - 0.2f; // Slight upward drift + size = 1 + random.nextFloat() * 2; + maxAlpha = 0.2f + random.nextFloat() * 0.3f; + alpha = 0; + lifetime = 100 + random.nextInt(200); + age = 0; + } + + void tick() { + x += vx; + y += vy; + age++; + + // Fade in and out + float progress = (float) age / lifetime; + if (progress < 0.2f) { + alpha = maxAlpha * (progress / 0.2f); + } else if (progress > 0.8f) { + alpha = maxAlpha * (1f - (progress - 0.8f) / 0.2f); + } else { + alpha = maxAlpha; + } + } + + boolean isDead() { + return age >= lifetime; + } + + void render(GuiGraphics graphics, float screenAlpha) { + int a = (int) (alpha * screenAlpha * 255); + if (a <= 0) return; + + int color = (a << 24) | 0x404050; + int s = (int) size; + graphics.fill((int) x, (int) y, (int) x + s, (int) y + s, color); + } + } + + private class AnswerButton { + + final int x, y, width, height; + final BargainAnswer answer; + final int index; + + AnswerButton(int x, int y, int width, int height, BargainAnswer answer, int index) { + this.x = x; + this.y = y; + this.width = width; + this.height = height; + this.answer = answer; + this.index = index; + } + + boolean isMouseOver(int mouseX, int mouseY) { + return mouseX >= x && mouseX < x + width && mouseY >= y && mouseY < y + height; + } + + void render(GuiGraphics graphics, net.minecraft.client.gui.Font font, float fadeAlpha, boolean hovered, + int ticks) { + int baseAlpha = (int) (fadeAlpha * (hovered ? 200 : 140)); + + // Background + int bgColor = hovered ? (baseAlpha << 24) | 0x303040 : (baseAlpha << 24) | 0x1a1a24; + graphics.fill(x, y, x + width, y + height, bgColor); + + // Border + int borderAlpha = (int) (fadeAlpha * (hovered ? 255 : 150)); + int borderColor = hovered ? (borderAlpha << 24) | 0x6080AA : (borderAlpha << 24) | 0x404060; + + // Top and bottom borders + graphics.fill(x, y, x + width, y + 1, borderColor); + graphics.fill(x, y + height - 1, x + width, y + height, borderColor); + // Left and right borders + graphics.fill(x, y, x + 1, y + height, borderColor); + graphics.fill(x + width - 1, y, x + width, y + height, borderColor); + + // Text + String text = answer.text().getString(); + int textAlpha = (int) (fadeAlpha * 255); + int textColor = hovered ? (textAlpha << 24) | 0xDDDDEE : (textAlpha << 24) | 0x999999; + + int textWidth = font.width(text); + int textX = x + (width - textWidth) / 2; + int textY = y + (height - font.lineHeight) / 2; + + graphics.drawString(font, text, textX, textY, textColor, false); + + // Keyboard hint + String hint = "[" + (index + 1) + "]"; + int hintAlpha = (int) (fadeAlpha * 100); + int hintColor = (hintAlpha << 24) | 0x666666; + graphics.drawString(font, hint, x + 8, textY, hintColor, false); + + // Hover glow effect + if (hovered) { + float glowPulse = (float) Math.sin(ticks * 0.2) * 0.3f + 0.7f; + int glowAlpha = (int) (fadeAlpha * glowPulse * 30); + int glowColor = (glowAlpha << 24) | 0x6080AA; + graphics.fill(x + 2, y + 2, x + width - 2, y + height - 2, glowColor); + } + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ui/VoidUIPackets.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ui/VoidUIPackets.java new file mode 100644 index 000000000..a68ee4906 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ui/VoidUIPackets.java @@ -0,0 +1,406 @@ +package com.ghostipedia.cosmiccore.common.reflection.ui; + +import com.ghostipedia.cosmiccore.common.network.CCoreNetwork; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCapability; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain.BargainAnswer; +import com.ghostipedia.cosmiccore.common.reflection.bargain.BargainRegistry; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.QuakeMovementBargain; +import com.ghostipedia.cosmiccore.common.reflection.network.SyncQuakeMovementPacket; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; +import net.minecraftforge.network.NetworkDirection; +import net.minecraftforge.network.NetworkEvent; + +import java.util.HashSet; +import java.util.Set; + +public class VoidUIPackets { + + public static void register() { + CCoreNetwork.register(OpenVoidScreenPacket.class, OpenVoidScreenPacket::new, NetworkDirection.PLAY_TO_CLIENT); + CCoreNetwork.register(BargainChoicePacket.class, BargainChoicePacket::new, NetworkDirection.PLAY_TO_SERVER); + CCoreNetwork.register(ThresholdEncounterPacket.class, ThresholdEncounterPacket::new, + NetworkDirection.PLAY_TO_CLIENT); + CCoreNetwork.register(OpenHubPacket.class, OpenHubPacket::new, NetworkDirection.PLAY_TO_CLIENT); + CCoreNetwork.register(DefianceChoicePacket.class, DefianceChoicePacket::new, NetworkDirection.PLAY_TO_SERVER); + } + + public static void sendOpenVoidScreen(ServerPlayer player, ResourceLocation bargainId) { + ReflectionCapability.get(player).ifPresent(reflection -> { + int erosion = reflection.getErosion(); + Set activeBargains = reflection.getActiveBargains(); + int shardBalance = reflection.getShardBalance(); + int usedCapacity = reflection.getUsedCapacity(); + int totalCapacity = reflection.getTotalCapacity(); + CCoreNetwork.sendToPlayer(player, new OpenVoidScreenPacket(bargainId, erosion, activeBargains, + shardBalance, usedCapacity, totalCapacity)); + }); + } + + public static void sendOpenVoidScreen(ServerPlayer player) { + ReflectionCapability.get(player).ifPresent(reflection -> { + int erosion = reflection.getErosion(); + Set activeBargains = reflection.getActiveBargains(); + int shardBalance = reflection.getShardBalance(); + int usedCapacity = reflection.getUsedCapacity(); + int totalCapacity = reflection.getTotalCapacity(); + CCoreNetwork.sendToPlayer(player, new OpenVoidScreenPacket(null, erosion, activeBargains, + shardBalance, usedCapacity, totalCapacity)); + }); + } + + public static void sendBargainChoice(ResourceLocation bargainId, String answerId) { + CCoreNetwork.sendToServer(new BargainChoicePacket(bargainId, answerId)); + } + + public static void sendThresholdEncounter(ServerPlayer player, int thresholdIndex) { + ReflectionCapability.get(player).ifPresent(reflection -> { + int erosion = reflection.getErosion(); + Set activeBargains = reflection.getActiveBargains(); + CCoreNetwork.sendToPlayer(player, new ThresholdEncounterPacket(thresholdIndex, erosion, activeBargains)); + }); + } + + public static void sendOpenHub(ServerPlayer player) { + ReflectionCapability.get(player).ifPresent(reflection -> { + int erosion = reflection.getErosion(); + Set activeBargains = reflection.getActiveBargains(); + Set defianceScars = reflection.getDefianceScars(); + int shardBalance = reflection.getShardBalance(); + int usedCapacity = reflection.getUsedCapacity(); + int totalCapacity = reflection.getTotalCapacity(); + CCoreNetwork.sendToPlayer(player, new OpenHubPacket(erosion, activeBargains, defianceScars, + shardBalance, usedCapacity, totalCapacity)); + }); + } + + public static void sendDefianceChoice(ResourceLocation bargainId) { + CCoreNetwork.sendToServer(new DefianceChoicePacket(bargainId)); + } + + public static class OpenVoidScreenPacket implements CCoreNetwork.INetPacket { + + private final ResourceLocation bargainId; + private final int erosion; + private final Set activeBargains; + private final int shardBalance; + private final int usedCapacity; + private final int totalCapacity; + + public OpenVoidScreenPacket(ResourceLocation bargainId, int erosion, Set activeBargains, + int shardBalance, int usedCapacity, int totalCapacity) { + this.bargainId = bargainId; + this.erosion = erosion; + this.activeBargains = activeBargains != null ? activeBargains : Set.of(); + this.shardBalance = shardBalance; + this.usedCapacity = usedCapacity; + this.totalCapacity = totalCapacity; + } + + public OpenVoidScreenPacket(FriendlyByteBuf buf) { + if (buf.readBoolean()) { + this.bargainId = buf.readResourceLocation(); + } else { + this.bargainId = null; + } + this.erosion = buf.readVarInt(); + + int count = buf.readVarInt(); + Set bargains = new HashSet<>(); + for (int i = 0; i < count; i++) { + bargains.add(buf.readResourceLocation()); + } + this.activeBargains = bargains; + + this.shardBalance = buf.readVarInt(); + this.usedCapacity = buf.readVarInt(); + this.totalCapacity = buf.readVarInt(); + } + + @Override + public void encode(FriendlyByteBuf buf) { + buf.writeBoolean(bargainId != null); + if (bargainId != null) { + buf.writeResourceLocation(bargainId); + } + buf.writeVarInt(erosion); + buf.writeVarInt(activeBargains.size()); + for (ResourceLocation id : activeBargains) { + buf.writeResourceLocation(id); + } + + buf.writeVarInt(shardBalance); + buf.writeVarInt(usedCapacity); + buf.writeVarInt(totalCapacity); + } + + @Override + public void execute(NetworkEvent.Context ctx) { + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { + if (bargainId != null) { + BargainRegistry.get(bargainId) + .ifPresent(bargain -> VoidScreen.openWithBargain(bargain, erosion, activeBargains, + shardBalance, usedCapacity, totalCapacity)); + } else { + VoidScreen.openForReflection(erosion, activeBargains, + shardBalance, usedCapacity, totalCapacity); + } + }); + } + } + + public static class BargainChoicePacket implements CCoreNetwork.INetPacket { + + private final ResourceLocation bargainId; + private final String answerId; + + public BargainChoicePacket(ResourceLocation bargainId, String answerId) { + this.bargainId = bargainId; + this.answerId = answerId; + } + + public BargainChoicePacket(FriendlyByteBuf buf) { + this.bargainId = buf.readResourceLocation(); + this.answerId = buf.readUtf(); + } + + @Override + public void encode(FriendlyByteBuf buf) { + buf.writeResourceLocation(bargainId); + buf.writeUtf(answerId); + } + + @Override + public void execute(NetworkEvent.Context ctx) { + ServerPlayer player = ctx.getSender(); + if (player == null) return; + + BargainRegistry.get(bargainId).ifPresent(bargain -> { + processBargainChoice(player, bargain, answerId); + }); + } + + private void processBargainChoice(ServerPlayer player, Bargain bargain, String answerId) { + // Find the answer + BargainAnswer foundAnswer = null; + for (BargainAnswer answer : bargain.getAnswers()) { + if (answer.id().equals(answerId)) { + foundAnswer = answer; + break; + } + } + + if (foundAnswer == null) return; + + // Make final for lambda + final BargainAnswer selectedAnswer = foundAnswer; + + ReflectionCapability.get(player).ifPresent(reflection -> { + boolean isAccept = answerId.equals("accept") || + (!answerId.equals("refuse") && selectedAnswer.grantsFullPower()); + + if (isAccept) { + if (!reflection.hasBargain(bargainId)) { + int shardCost = bargain.getShardCost(); + int weight = bargain.getWeight(); + + if (shardCost > 0 && reflection.getShardBalance() < shardCost) { + player.displayClientMessage( + net.minecraft.network.chat.Component + .literal("\u00A7cInsufficient shards. You need " + shardCost + " shards."), + false); + return; + } + + if (weight > 0 && !reflection.canFitBargain(weight)) { + player.displayClientMessage( + net.minecraft.network.chat.Component.literal( + "\u00A7cInsufficient soul capacity. Need " + weight + " weight, have " + + reflection.getRemainingCapacity() + " remaining."), + false); + return; + } + + if (shardCost > 0) { + reflection.spendShards(shardCost); + } + + int erosionCost = bargain.getErosionCost(); + if (erosionCost > 0) { + reflection.addErosion(erosionCost); + } + + reflection.acceptBargain(bargainId); + bargain.onAccept(player, selectedAnswer); + syncBargainState(player, bargain, true); + } + } + // Note: Refusing a bargain offer does NOT call onDefy. + // onDefy is only for breaking an existing bargain you've already accepted. + // Refusing simply declines the offer with no mechanical effect. + }); + } + + private void syncBargainState(ServerPlayer player, Bargain bargain, boolean active) { + if (bargain.getId().equals(QuakeMovementBargain.INSTANCE.getId())) { + CCoreNetwork.sendToPlayer(player, new SyncQuakeMovementPacket(active)); + } + } + } + + public static class ThresholdEncounterPacket implements CCoreNetwork.INetPacket { + + private final int thresholdIndex; + private final int erosion; + private final Set activeBargains; + + public ThresholdEncounterPacket(int thresholdIndex, int erosion, Set activeBargains) { + this.thresholdIndex = thresholdIndex; + this.erosion = erosion; + this.activeBargains = activeBargains != null ? activeBargains : Set.of(); + } + + public ThresholdEncounterPacket(FriendlyByteBuf buf) { + this.thresholdIndex = buf.readVarInt(); + this.erosion = buf.readVarInt(); + + int count = buf.readVarInt(); + Set bargains = new HashSet<>(); + for (int i = 0; i < count; i++) { + bargains.add(buf.readResourceLocation()); + } + this.activeBargains = bargains; + } + + @Override + public void encode(FriendlyByteBuf buf) { + buf.writeVarInt(thresholdIndex); + buf.writeVarInt(erosion); + + buf.writeVarInt(activeBargains.size()); + for (ResourceLocation id : activeBargains) { + buf.writeResourceLocation(id); + } + } + + @Override + public void execute(NetworkEvent.Context ctx) { + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { + VoidScreen.openForThreshold(thresholdIndex, erosion, activeBargains); + }); + } + } + + public static class OpenHubPacket implements CCoreNetwork.INetPacket { + + private final int erosion; + private final Set activeBargains; + private final Set defianceScars; + private final int shardBalance; + private final int usedCapacity; + private final int totalCapacity; + + public OpenHubPacket(int erosion, Set activeBargains, Set defianceScars, + int shardBalance, int usedCapacity, int totalCapacity) { + this.erosion = erosion; + this.activeBargains = activeBargains != null ? activeBargains : Set.of(); + this.defianceScars = defianceScars != null ? defianceScars : Set.of(); + this.shardBalance = shardBalance; + this.usedCapacity = usedCapacity; + this.totalCapacity = totalCapacity; + } + + public OpenHubPacket(FriendlyByteBuf buf) { + this.erosion = buf.readVarInt(); + + int activeCount = buf.readVarInt(); + Set active = new HashSet<>(); + for (int i = 0; i < activeCount; i++) { + active.add(buf.readResourceLocation()); + } + this.activeBargains = active; + + int scarCount = buf.readVarInt(); + Set scars = new HashSet<>(); + for (int i = 0; i < scarCount; i++) { + scars.add(buf.readResourceLocation()); + } + this.defianceScars = scars; + + this.shardBalance = buf.readVarInt(); + this.usedCapacity = buf.readVarInt(); + this.totalCapacity = buf.readVarInt(); + } + + @Override + public void encode(FriendlyByteBuf buf) { + buf.writeVarInt(erosion); + + buf.writeVarInt(activeBargains.size()); + for (ResourceLocation id : activeBargains) { + buf.writeResourceLocation(id); + } + + buf.writeVarInt(defianceScars.size()); + for (ResourceLocation id : defianceScars) { + buf.writeResourceLocation(id); + } + + buf.writeVarInt(shardBalance); + buf.writeVarInt(usedCapacity); + buf.writeVarInt(totalCapacity); + } + + @Override + public void execute(NetworkEvent.Context ctx) { + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { + VoidScreen.openForHub(erosion, activeBargains, defianceScars, + shardBalance, usedCapacity, totalCapacity); + }); + } + } + + public static class DefianceChoicePacket implements CCoreNetwork.INetPacket { + + private final ResourceLocation bargainId; + + public DefianceChoicePacket(ResourceLocation bargainId) { + this.bargainId = bargainId; + } + + public DefianceChoicePacket(FriendlyByteBuf buf) { + this.bargainId = buf.readResourceLocation(); + } + + @Override + public void encode(FriendlyByteBuf buf) { + buf.writeResourceLocation(bargainId); + } + + @Override + public void execute(NetworkEvent.Context ctx) { + ServerPlayer player = ctx.getSender(); + if (player == null) return; + + BargainRegistry.get(bargainId).ifPresent(bargain -> { + ReflectionCapability.get(player).ifPresent(reflection -> { + if (!reflection.hasBargain(bargainId)) return; + + int cost = BargainRegistry.calculateDefianceCost(player, bargain); + reflection.addErosion(cost); + reflection.defy(bargainId); + bargain.onDefy(player); + + if (bargainId.equals(QuakeMovementBargain.INSTANCE.getId())) { + CCoreNetwork.sendToPlayer(player, new SyncQuakeMovementPacket(false)); + } + }); + }); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/whisper/WhisperSystem.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/whisper/WhisperSystem.java new file mode 100644 index 000000000..64df85ee2 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/whisper/WhisperSystem.java @@ -0,0 +1,300 @@ +package com.ghostipedia.cosmiccore.common.reflection.whisper; + +import com.ghostipedia.cosmiccore.common.reflection.IReflection; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCapability; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionConstants; + +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.player.Player; + +import java.util.*; + +/** + * The Whisper System - ambient comments from the reflection. + * Event-based, contextual, scales with corruption. + */ +public final class WhisperSystem { + + private WhisperSystem() {} + + private static final Random RANDOM = new Random(); + + // Cooldown tracking to prevent spam + private static final Map lastWhisperTime = new HashMap<>(); + private static final long WHISPER_COOLDOWN = 30000L; // 30 seconds minimum between whispers + + // Style for whispers + private static final Style WHISPER_STYLE = Style.EMPTY.withItalic(true).withColor(0x9966CC); + + /** + * Called periodically to check for ambient whispers. + */ + public static void tick(ServerPlayer player) { + ReflectionCapability.get(player).ifPresent(reflection -> { + if (!reflection.hasAwakened()) return; + + // Check various conditions for contextual whispers + checkHealthWhisper(player, reflection); + checkIdleWhisper(player, reflection); + checkDimensionWhisper(player, reflection); + }); + } + + /** + * Trigger a whisper for a specific event. + */ + public static void triggerEvent(ServerPlayer player, WhisperEvent event) { + ReflectionCapability.get(player).ifPresent(reflection -> { + if (!reflection.hasAwakened()) return; + if (isOnCooldown(player)) return; + + List lines = getEventLines(event, reflection); + if (lines.isEmpty()) return; + + String line = lines.get(RANDOM.nextInt(lines.size())); + sendWhisper(player, line); + }); + } + + /** + * Send a whisper to the player. + */ + public static void sendWhisper(ServerPlayer player, String text) { + if (isOnCooldown(player)) return; + + Component message = Component.literal("* " + text + " *").withStyle(WHISPER_STYLE); + player.sendSystemMessage(message); + lastWhisperTime.put(player.getUUID(), System.currentTimeMillis()); + } + + /** + * Send a whisper with custom formatting. + */ + public static void sendWhisper(ServerPlayer player, Component text) { + if (isOnCooldown(player)) return; + + player.sendSystemMessage(text); + lastWhisperTime.put(player.getUUID(), System.currentTimeMillis()); + } + + private static boolean isOnCooldown(Player player) { + Long lastTime = lastWhisperTime.get(player.getUUID()); + if (lastTime == null) return false; + return (System.currentTimeMillis() - lastTime) < WHISPER_COOLDOWN; + } + + // ---- Condition Checks ---- + + private static void checkHealthWhisper(ServerPlayer player, IReflection reflection) { + if (player.getHealth() < player.getMaxHealth() * 0.25f) { + if (RANDOM.nextFloat() < 0.05f) { // 5% chance per tick check + triggerEvent(player, WhisperEvent.LOW_HEALTH); + } + } + } + + private static void checkIdleWhisper(ServerPlayer player, IReflection reflection) { + // Check if player has been standing still + if (player.getDeltaMovement().lengthSqr() < 0.001) { + if (RANDOM.nextFloat() < 0.01f) { // 1% chance per tick check + triggerEvent(player, WhisperEvent.IDLE); + } + } + } + + private static void checkDimensionWhisper(ServerPlayer player, IReflection reflection) { + // Random ambient whispers based on dimension + if (RANDOM.nextFloat() < 0.005f) { // 0.5% chance per tick check + triggerEvent(player, WhisperEvent.AMBIENT); + } + } + + // ---- Line Pools ---- + + private static List getEventLines(WhisperEvent event, IReflection reflection) { + int erosion = reflection.getErosion(); + int colorTier = ReflectionConstants.getSoulColorTier(erosion); + + return switch (event) { + case DEATH -> getDeathLines(reflection, colorTier); + case LOW_HEALTH -> getLowHealthLines(colorTier); + case LOW_OXYGEN -> getLowOxygenLines(colorTier); + case IDLE -> getIdleLines(colorTier); + case ENTERED_DIMENSION -> getDimensionLines(colorTier); + case POST_BARGAIN -> getPostBargainLines(colorTier); + case AMBIENT -> getAmbientLines(colorTier); + case COMBAT_KILL -> getCombatKillLines(colorTier); + }; + } + + private static List getDeathLines(IReflection reflection, int tier) { + int deathCount = reflection.getDeathCount(); + + List lines = new ArrayList<>(); + + // Low corruption + if (tier <= 1) { + lines.add("Welcome back."); + lines.add("That one was faster than usual."); + lines.add("I felt it too. I always do."); + lines.add("Does it still hurt? I can never tell."); + } + + // Mid corruption + if (tier >= 2 && tier <= 4) { + lines.add("Again. And again."); + lines.add("We're getting used to this, aren't we?"); + lines.add("That's " + deathCount + " now. I've been counting."); + lines.add("The dying is easy. It's the coming back that wears on us."); + } + + // High corruption + if (tier >= 5) { + lines.add("Another one."); + lines.add("Do you even notice anymore?"); + lines.add("We've done this " + deathCount + " times. It means nothing now."); + lines.add("Death is just... punctuation."); + } + + return lines; + } + + private static List getLowHealthLines(int tier) { + List lines = new ArrayList<>(); + + if (tier <= 2) { + lines.add("Careful. That looks like it hurts."); + lines.add("You're bleeding. Well, we're bleeding."); + lines.add("Should I be worried? Should we?"); + } + + if (tier >= 3) { + lines.add("Pain is just information."); + lines.add("We've felt worse."); + lines.add("This body is temporary anyway."); + } + + return lines; + } + + private static List getLowOxygenLines(int tier) { + List lines = new ArrayList<>(); + + if (tier <= 2) { + lines.add("Breathe. Oh wait."); + lines.add("The air is thin here. Or is it us?"); + lines.add("Mortals panic when this happens. What do we do?"); + } + + if (tier >= 3) { + lines.add("Still clinging to that breathing habit."); + lines.add("We don't need air. We just think we do."); + lines.add("Let go. It won't hurt for long."); + } + + return lines; + } + + private static List getIdleLines(int tier) { + List lines = new ArrayList<>(); + + if (tier <= 2) { + lines.add("Thinking? Or avoiding?"); + lines.add("I'm still here, Whenever you're ready."); + lines.add("Take your time, We have plenty."); + } + + if (tier >= 3) { + lines.add("You can't run from me by standing still."); + lines.add("I'm right here, I'm always right here."); + lines.add("The silence between us speaks volumes."); + } + + if (tier >= 5) { + lines.add("Are you listening? Or am I talking to myself?"); + lines.add("Sometimes I forget which one of us is which."); + lines.add("..."); + } + + return lines; + } + + private static List getDimensionLines(int tier) { + List lines = new ArrayList<>(); + + lines.add("Somewhere new. Somewhere dangerous. Good."); + lines.add("What do you think we'll find here?"); + lines.add("This place remembers things. Be careful what you show it."); + lines.add("The rules are different here. Can you feel it?"); + + return lines; + } + + private static List getPostBargainLines(int tier) { + List lines = new ArrayList<>(); + + lines.add("How does it feel?"); + lines.add("We're changing. Can you tell?"); + lines.add("No going back now. Isn't that freeing?"); + lines.add("Look at us. Look at what we're becoming."); + + return lines; + } + + private static List getAmbientLines(int tier) { + List lines = new ArrayList<>(); + + if (tier <= 1) { + lines.add("..."); + lines.add("I'm watching."); + lines.add("Interesting choice."); + } + + if (tier >= 2 && tier <= 4) { + lines.add("We're doing well. Aren't we?"); + lines.add("Keep going. I want to see what happens."); + lines.add("You're stronger than you think. We both are."); + } + + if (tier >= 5) { + lines.add("Beautiful, isn't it? What we've become?"); + lines.add("They wouldn't understand. Only we do."); + lines.add("Almost there. Almost..."); + } + + return lines; + } + + private static List getCombatKillLines(int tier) { + List lines = new ArrayList<>(); + + if (tier <= 2) { + lines.add("That was necessary. Wasn't it?"); + lines.add("They're gone. We're still here."); + } + + if (tier >= 3) { + lines.add("More."); + lines.add("Again."); + lines.add("Good."); + } + + return lines; + } + + /** + * Whisper event types. + */ + public enum WhisperEvent { + DEATH, + LOW_HEALTH, + LOW_OXYGEN, + IDLE, + ENTERED_DIMENSION, + POST_BARGAIN, + AMBIENT, + COMBAT_KILL + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/teleporter/LandingZoneHelper.java b/src/main/java/com/ghostipedia/cosmiccore/common/teleporter/LandingZoneHelper.java new file mode 100644 index 000000000..6514a4adf --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/teleporter/LandingZoneHelper.java @@ -0,0 +1,74 @@ +package com.ghostipedia.cosmiccore.common.teleporter; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; + +public class LandingZoneHelper { + + private static final int MIN_SEARCH_HEIGHT_BUFFER = 5; // Don't search below world limit + this buffer + private static final int CLEAR_AIR_HEIGHT = 3; // Clear this many blocks above platform for headroom + + public static class PlatformOptions { + + public final Block platformMaterial; + public final Block padBlock; + public final int platformRadius; + + // Pplatform options. + public PlatformOptions(Block platformMaterial, Block padBlock, int platformRadius) { + this.platformMaterial = platformMaterial; + this.padBlock = padBlock; + this.platformRadius = platformRadius; + } + } + + // Search downward from startY to find solid ground. + // Searches down to minBuildHeight + 5, then falls back to startY if no ground found. + public static BlockPos findSafeYLevel(ServerLevel level, int x, int z, int startY) { + for (int y = startY; y >= level.getMinBuildHeight() + MIN_SEARCH_HEIGHT_BUFFER; y--) { + BlockPos checkPos = new BlockPos(x, y, z); + if (level.getBlockState(checkPos.below()).isSolid()) { + // Found solid ground + return checkPos; + } + } + + return new BlockPos(x, startY, z); + } + + // Check if a pad block is intact at the given position. + public static boolean isPadIntact(ServerLevel level, BlockPos pos, Block expectedPad) { + return level.getBlockState(pos).is(expectedPad); + } + + // Build a landing platform with escape pad at center. + public static void buildPlatform(ServerLevel level, BlockPos center, PlatformOptions options) { + int radius = options.platformRadius; + + // Build platform 1 block below center (so players stand on it, pad is at center) + for (int x = -radius; x <= radius; x++) { + for (int z = -radius; z <= radius; z++) { + BlockPos platformPos = center.offset(x, -1, z); + level.setBlock(platformPos, options.platformMaterial.defaultBlockState(), 3); + } + } + + // Place pad at center + level.setBlock(center, options.padBlock.defaultBlockState(), 3); + + // Clear air above for headroom + for (int y = 0; y < CLEAR_AIR_HEIGHT; y++) { + for (int x = -radius; x <= radius; x++) { + for (int z = -radius; z <= radius; z++) { + BlockPos airPos = center.offset(x, y, z); + if (airPos.equals(center)) continue; // Don't clear the pad itself + if (level.getBlockState(airPos).isSolid()) { + level.setBlock(airPos, Blocks.AIR.defaultBlockState(), 3); + } + } + } + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/teleporter/SafeTeleporter.java b/src/main/java/com/ghostipedia/cosmiccore/common/teleporter/SafeTeleporter.java new file mode 100644 index 000000000..6100221a5 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/teleporter/SafeTeleporter.java @@ -0,0 +1,68 @@ +package com.ghostipedia.cosmiccore.common.teleporter; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.portal.PortalInfo; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.common.util.ITeleporter; + +import org.jetbrains.annotations.Nullable; + +import java.util.function.Function; + +// Saftey first kids (reusable ITeleporter that ensures safe arrival after dimension changes) +public class SafeTeleporter implements ITeleporter { + + private final BlockPos targetPos; + private final boolean applySafetyBuffs; + private final int buffDuration; // ticks + + // Create a SafeTeleporter with default settings (buffs enabled, 100 tick duration). + public SafeTeleporter(BlockPos targetPos) { + this(targetPos, true, 100); + } + + // Create a SafeTeleporter with custom settings. + public SafeTeleporter(BlockPos targetPos, boolean applySafetyBuffs, int buffDuration) { + this.targetPos = targetPos; + this.applySafetyBuffs = applySafetyBuffs; + this.buffDuration = buffDuration; + } + + @Override + @Nullable + public PortalInfo getPortalInfo(Entity entity, ServerLevel destWorld, + Function defaultPortalInfo) { + // Place entity at center of block, slightly above the pad + Vec3 pos = new Vec3( + targetPos.getX() + 0.5, + targetPos.getY() + 0.1, // Slightly above to prevent clipping + targetPos.getZ() + 0.5); + + // Zero velocity to prevent fall damage + Vec3 velocity = Vec3.ZERO; + + // Preserve rotation + return new PortalInfo(pos, velocity, entity.getYRot(), entity.getXRot()); + } + + @Override + public Entity placeEntity(Entity entity, ServerLevel currentWorld, ServerLevel destWorld, + float yaw, Function repositionEntity) { + Entity result = repositionEntity.apply(false); + + // Apply safety effects + applySafetyEffects(result); + + return result; + } + + private void applySafetyEffects(Entity entity) { + // Clear fire + entity.clearFire(); + + // Reset fall distance to prevent fall damage + entity.fallDistance = 0; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/teleporter/TeleportOrigin.java b/src/main/java/com/ghostipedia/cosmiccore/common/teleporter/TeleportOrigin.java new file mode 100644 index 000000000..67c92c035 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/teleporter/TeleportOrigin.java @@ -0,0 +1,133 @@ +package com.ghostipedia.cosmiccore.common.teleporter; + +import com.ghostipedia.cosmiccore.api.capability.ITeleportOrigin; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.Registries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; + +import org.jetbrains.annotations.Nullable; + +// Implementation of the teleport origin capability - Stores origin dimension, position, and rotation for teleport +// return trips. +public class TeleportOrigin implements ITeleportOrigin { + + @Nullable + private ResourceKey originDimension; + @Nullable + private Vec3 originPosition; + private float originYaw; + private float originPitch; + @Nullable + private BlockPos escapePadPosition; + + // spotless: off + @Override + public void setOriginDimension(ResourceKey dimension) { + this.originDimension = dimension; + } + + @Override + @Nullable + public ResourceKey getOriginDimension() { + return originDimension; + } + + @Override + public void setOriginPosition(Vec3 position) { + this.originPosition = position; + } + + @Override + @Nullable + public Vec3 getOriginPosition() { + return originPosition; + } + + @Override + public void setOriginRotation(float yaw, float pitch) { + this.originYaw = yaw; + this.originPitch = pitch; + } + + @Override + public float getOriginYaw() { + return originYaw; + } + + @Override + public float getOriginPitch() { + return originPitch; + } + + @Override + public boolean hasValidOrigin() { + return originDimension != null && originPosition != null; + } + + @Override + public void clearOriginData() { + originDimension = null; + originPosition = null; + originYaw = 0; + originPitch = 0; + escapePadPosition = null; + } + // spotless: on + + // Save capability data to NBT. + public CompoundTag save() { + CompoundTag tag = new CompoundTag(); + + if (originDimension != null) { + tag.putString("OriginDimension", originDimension.location().toString()); + } + + if (originPosition != null) { + tag.putDouble("OriginX", originPosition.x); + tag.putDouble("OriginY", originPosition.y); + tag.putDouble("OriginZ", originPosition.z); + } + + tag.putFloat("OriginYaw", originYaw); + tag.putFloat("OriginPitch", originPitch); + + if (escapePadPosition != null) { + tag.putLong("EscapePadPos", escapePadPosition.asLong()); + } + + return tag; + } + + // Load capability data from NBT. + public void load(CompoundTag tag) { + if (tag.contains("OriginDimension")) { + ResourceLocation dimLoc = new ResourceLocation(tag.getString("OriginDimension")); + this.originDimension = ResourceKey.create(Registries.DIMENSION, dimLoc); + } else { + this.originDimension = null; + } + + if (tag.contains("OriginX")) { + double x = tag.getDouble("OriginX"); + double y = tag.getDouble("OriginY"); + double z = tag.getDouble("OriginZ"); + this.originPosition = new Vec3(x, y, z); + } else { + this.originPosition = null; + } + + this.originYaw = tag.getFloat("OriginYaw"); + this.originPitch = tag.getFloat("OriginPitch"); + + if (tag.contains("EscapePadPos")) { + this.escapePadPosition = BlockPos.of(tag.getLong("EscapePadPos")); + } else { + this.escapePadPosition = null; + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/teleporter/TeleportOriginCap.java b/src/main/java/com/ghostipedia/cosmiccore/common/teleporter/TeleportOriginCap.java new file mode 100644 index 000000000..9d1eb3097 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/teleporter/TeleportOriginCap.java @@ -0,0 +1,76 @@ +package com.ghostipedia.cosmiccore.common.teleporter; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.capability.ITeleportOrigin; + +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.CapabilityManager; +import net.minecraftforge.common.capabilities.CapabilityToken; +import net.minecraftforge.common.capabilities.ICapabilityProvider; +import net.minecraftforge.common.capabilities.ICapabilitySerializable; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.event.AttachCapabilitiesEvent; +import net.minecraftforge.event.entity.player.PlayerEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +// Capability provider for teleport origin data. +// Attaches to all players to track their teleportation origin for return trips. +@Mod.EventBusSubscriber(modid = CosmicCore.MOD_ID, bus = Mod.EventBusSubscriber.Bus.FORGE) +public class TeleportOriginCap { + + public static final ResourceLocation KEY = new ResourceLocation("cosmiccore", "teleport_origin"); + public static final Capability CAP = CapabilityManager.get(new CapabilityToken<>() {}); + + public static class Provider implements ICapabilityProvider, ICapabilitySerializable { + + private final TeleportOrigin impl = new TeleportOrigin(); + private final LazyOptional lazyOpt = LazyOptional.of(() -> impl); + + @Override + public @NotNull LazyOptional getCapability(@NotNull Capability capability, + @Nullable Direction direction) { + return capability == CAP ? lazyOpt.cast() : LazyOptional.empty(); + } + + @Override + public CompoundTag serializeNBT() { + return impl.save(); + } + + @Override + public void deserializeNBT(CompoundTag tag) { + impl.load(tag); + } + } + + // Attach capability to all players. + @SubscribeEvent + public static void attachCap(AttachCapabilitiesEvent event) { + if (event.getObject() instanceof Player) { + event.addCapability(KEY, new Provider()); + } + } + + // Clone capability data on player respawn/dimension change. + @SubscribeEvent + public static void cloneCap(PlayerEvent.Clone event) { + event.getOriginal().reviveCaps(); + event.getOriginal().getCapability(CAP).ifPresent(old -> { + event.getEntity().getCapability(CAP).ifPresent(now -> { + if (now instanceof TeleportOrigin originNow && old instanceof TeleportOrigin originOld) { + originNow.load(originOld.save()); + } + }); + }); + event.getOriginal().invalidateCaps(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/teleporter/TeleportPadRegistry.java b/src/main/java/com/ghostipedia/cosmiccore/common/teleporter/TeleportPadRegistry.java new file mode 100644 index 000000000..91d8c7401 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/teleporter/TeleportPadRegistry.java @@ -0,0 +1,79 @@ +package com.ghostipedia.cosmiccore.common.teleporter; + +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.saveddata.SavedData; + +import org.jetbrains.annotations.NotNull; + +import java.util.HashSet; +import java.util.Set; + +// Tracks teleport pads that have been placed. Prevents duplicate platform spawning. +public class TeleportPadRegistry extends SavedData { + + private static final String DATA_NAME = "cosmiccore_teleport_pads"; + + private final Set pads = new HashSet<>(); + + public TeleportPadRegistry() { + super(); + } + + // Get the saved data instance for a specific dimension. + public static TeleportPadRegistry get(ServerLevel level) { + return level.getDataStorage().computeIfAbsent( + TeleportPadRegistry::load, + TeleportPadRegistry::new, + DATA_NAME); + } + + // Check if a pad exists at the given position. + public boolean hasPadAt(BlockPos pos) { + return pads.contains(pos); + } + + // Register a new pad at the given position. + public void registerPad(BlockPos pos) { + if (pads.add(pos)) { + setDirty(); + } + } + + // Remove a pad registration (like if it gets broken) + public void removePad(BlockPos pos) { + if (pads.remove(pos)) { + setDirty(); + } + } + + @Override + public @NotNull CompoundTag save(@NotNull CompoundTag tag) { + ListTag padsList = new ListTag(); + + for (BlockPos pos : pads) { + CompoundTag padTag = new CompoundTag(); + padTag.putLong("Pos", pos.asLong()); + padsList.add(padTag); + } + + tag.put("Pads", padsList); + return tag; + } + + public static TeleportPadRegistry load(CompoundTag tag) { + TeleportPadRegistry registry = new TeleportPadRegistry(); + + ListTag padsList = tag.getList("Pads", Tag.TAG_COMPOUND); + for (Tag padTagRaw : padsList) { + CompoundTag padTag = (CompoundTag) padTagRaw; + BlockPos pos = BlockPos.of(padTag.getLong("Pos")); + registry.pads.add(pos); + } + + return registry; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/ember/CosmicEmberEmitterBlock.java b/src/main/java/com/ghostipedia/cosmiccore/ember/CosmicEmberEmitterBlock.java new file mode 100644 index 000000000..52b15cd68 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/ember/CosmicEmberEmitterBlock.java @@ -0,0 +1,59 @@ +package com.ghostipedia.cosmiccore.ember; + +import com.ghostipedia.cosmiccore.common.data.CosmicBlockEntities; +import com.ghostipedia.cosmiccore.ember.blockentity.CosmicEmberEmitterBlockEntity; + +import com.gregtechceu.gtceu.utils.FormattingUtil; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; + +import com.rekindled.embers.block.EmberEmitterBlock; +import lombok.Getter; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class CosmicEmberEmitterBlock extends EmberEmitterBlock { + + @Getter + private int tier; + + public CosmicEmberEmitterBlock(Properties properties, int tier) { + super(properties); + this.tier = tier; + } + + @Override + public BlockEntityTicker getTicker(Level pLevel, BlockState pState, + BlockEntityType pBlockEntityType) { + return pLevel.isClientSide ? null : createTickerHelper(pBlockEntityType, + CosmicBlockEntities.COSMIC_EMBER_EMITTER_BE.get(tier).get(), CosmicEmberEmitterBlockEntity::serverTick); + } + + @Override + public BlockEntity newBlockEntity(BlockPos pPos, BlockState pState) { + return new CosmicEmberEmitterBlockEntity(CosmicBlockEntities.COSMIC_EMBER_EMITTER_BE.get(tier).get(), pPos, + pState, tier); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable BlockGetter level, List tooltip, + TooltipFlag flag) { + long capacity = (long) (250 * Math.pow(4, tier + 2)); + long transfer = (long) (250 * Math.pow(4, tier)); + tooltip.add(Component.translatable("cosmiccore.ember.capacity", + Component.literal(FormattingUtil.formatNumberReadable(capacity)).withStyle(ChatFormatting.GOLD))); + tooltip.add(Component.translatable("cosmiccore.ember.transfer", + Component.literal(FormattingUtil.formatNumberReadable(transfer)).withStyle(ChatFormatting.GOLD))); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/ember/CosmicEmberReceptorBlock.java b/src/main/java/com/ghostipedia/cosmiccore/ember/CosmicEmberReceptorBlock.java new file mode 100644 index 000000000..18e8afa72 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/ember/CosmicEmberReceptorBlock.java @@ -0,0 +1,61 @@ +package com.ghostipedia.cosmiccore.ember; + +import com.ghostipedia.cosmiccore.common.data.CosmicBlockEntities; +import com.ghostipedia.cosmiccore.ember.blockentity.CosmicEmberReceptorBlockEntity; + +import com.gregtechceu.gtceu.utils.FormattingUtil; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; + +import com.rekindled.embers.block.EmberReceiverBlock; +import lombok.Getter; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +import static com.ghostipedia.cosmiccore.common.data.CosmicBlockEntities.COSMIC_EMBER_RECEIVER_BE; + +public class CosmicEmberReceptorBlock extends EmberReceiverBlock { + + @Getter + private int tier; + + public CosmicEmberReceptorBlock(Properties properties, int tier) { + super(properties); + this.tier = tier; + } + + @Override + public BlockEntityTicker getTicker(Level pLevel, BlockState pState, + BlockEntityType pBlockEntityType) { + return pLevel.isClientSide ? null : createTickerHelper(pBlockEntityType, + COSMIC_EMBER_RECEIVER_BE.get(tier).get(), CosmicEmberReceptorBlockEntity::serverTick); + } + + @Override + public BlockEntity newBlockEntity(BlockPos pPos, BlockState pState) { + return new CosmicEmberReceptorBlockEntity(CosmicBlockEntities.COSMIC_EMBER_RECEIVER_BE.get(tier).get(), pPos, + pState, tier); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable BlockGetter level, List tooltip, + TooltipFlag flag) { + long transfer = (long) (250 * Math.pow(4, tier)); + long capacity = (long) (250 * Math.pow(4, tier + 2)); + tooltip.add(Component.translatable("cosmiccore.ember.capacity", + Component.literal(FormattingUtil.formatNumberReadable(capacity)).withStyle(ChatFormatting.GOLD))); + tooltip.add(Component.translatable("cosmiccore.ember.transfer", + Component.literal(FormattingUtil.formatNumberReadable(transfer)).withStyle(ChatFormatting.GOLD))); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/ember/ICosmicEmberStats.java b/src/main/java/com/ghostipedia/cosmiccore/ember/ICosmicEmberStats.java new file mode 100644 index 000000000..7db89631c --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/ember/ICosmicEmberStats.java @@ -0,0 +1,8 @@ +package com.ghostipedia.cosmiccore.ember; + +public interface ICosmicEmberStats { + + double transfer(); + + double pull(); +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/ember/blockentity/CosmicEmberEmitterBlockEntity.java b/src/main/java/com/ghostipedia/cosmiccore/ember/blockentity/CosmicEmberEmitterBlockEntity.java new file mode 100644 index 000000000..07100e596 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/ember/blockentity/CosmicEmberEmitterBlockEntity.java @@ -0,0 +1,106 @@ +package com.ghostipedia.cosmiccore.ember.blockentity; + +import com.ghostipedia.cosmiccore.ember.ICosmicEmberStats; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.phys.Vec3; + +import com.rekindled.embers.RegistryManager; +import com.rekindled.embers.api.capabilities.EmbersCapabilities; +import com.rekindled.embers.api.power.IEmberCapability; +import com.rekindled.embers.api.power.IEmberPacketReceiver; +import com.rekindled.embers.blockentity.EmberEmitterBlockEntity; +import com.rekindled.embers.datagen.EmbersSounds; +import com.rekindled.embers.entity.EmberPacketEntity; +import com.rekindled.embers.util.Misc; +import lombok.Getter; + +import java.util.HashSet; + +public class CosmicEmberEmitterBlockEntity extends EmberEmitterBlockEntity implements ICosmicEmberStats { + + @Getter + private int tier; + + @Override + public double transfer() { + return 250 * Math.pow(4, tier); + } + + @Override + public double pull() { + return 50 * Math.pow(4, tier); + } + + public CosmicEmberEmitterBlockEntity(BlockEntityType type, BlockPos pPos, BlockState pBlockState, int tier) { + super(type, pPos, pBlockState); + capability.setEmberCapacity(250 * Math.pow(4, tier + 2)); + this.tier = tier; + } + + public static CosmicEmberEmitterBlockEntity create(BlockEntityType type, BlockPos pPos, BlockState pBlockState, + int tier) { + return new CosmicEmberEmitterBlockEntity(type, pPos, pBlockState, tier); + } + + public static void serverTick(Level level, BlockPos pos, BlockState state, + CosmicEmberEmitterBlockEntity blockEntity) { + blockEntity.ticksExisted++; + Direction facing = state.getValue(BlockStateProperties.FACING); + BlockEntity attachedTile = level.getBlockEntity(pos.relative(facing, -1)); + if (blockEntity.ticksExisted % 5 == 0 && attachedTile != null) { + IEmberCapability cap = attachedTile.getCapability(EmbersCapabilities.EMBER_CAPABILITY, facing).orElse(null); + if (cap != null) { + if (cap.getEmber() > 0 && + blockEntity.capability.getEmber() < blockEntity.capability.getEmberCapacity()) { + double removed = cap.removeAmount(blockEntity.pull(), true); + blockEntity.capability.addAmount(removed, true); + } + } + } + if ((blockEntity.ticksExisted + blockEntity.offset) % 20 == 0 && blockEntity.canSendBurst() && + blockEntity.capability.getEmber() > PULL_RATE) { + BlockEntity targetTile = level.getBlockEntity(blockEntity.target); + if (targetTile instanceof IEmberPacketReceiver) { + if (((IEmberPacketReceiver) targetTile).hasRoomFor(blockEntity.transfer())) { + EmberPacketEntity packet = RegistryManager.EMBER_PACKET.get().create(blockEntity.level); + Vec3 velocity = getBurstVelocity(facing); + packet.initCustom(pos, blockEntity.target, velocity.x, velocity.y, velocity.z, + Math.min(blockEntity.transfer(), blockEntity.capability.getEmber())); + blockEntity.capability + .removeAmount(Math.min(blockEntity.transfer(), blockEntity.capability.getEmber()), true); + blockEntity.level.addFreshEntity(packet); + level.playSound(null, pos, EmbersSounds.EMBER_EMIT.get(), SoundSource.BLOCKS, 1.0f, 1.0f); + } + } + } + } + + @Override + public boolean canSendBurst() { + if (target != null && level.isLoaded(target) && !level.isClientSide) { + if (trajectoryChunks == null) { + trajectoryChunks = new HashSet(); + Misc.calculateTrajectoryChunks(trajectoryChunks, worldPosition, target, + getEmittingDirection(level.getBlockState(worldPosition).getValue(BlockStateProperties.FACING))); + } + if (level instanceof ServerLevel serverLevel) { + for (ChunkPos chunk : trajectoryChunks) { + if (!serverLevel.isNaturalSpawningAllowed(chunk)) + return false; + } + } + return true; + } + return false; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/ember/blockentity/CosmicEmberReceptorBlockEntity.java b/src/main/java/com/ghostipedia/cosmiccore/ember/blockentity/CosmicEmberReceptorBlockEntity.java new file mode 100644 index 000000000..9ad5cbb3a --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/ember/blockentity/CosmicEmberReceptorBlockEntity.java @@ -0,0 +1,59 @@ +package com.ghostipedia.cosmiccore.ember.blockentity; + +import com.ghostipedia.cosmiccore.ember.ICosmicEmberStats; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; + +import com.rekindled.embers.api.capabilities.EmbersCapabilities; +import com.rekindled.embers.api.power.IEmberCapability; +import com.rekindled.embers.blockentity.EmberReceiverBlockEntity; +import lombok.Getter; + +public class CosmicEmberReceptorBlockEntity extends EmberReceiverBlockEntity implements ICosmicEmberStats { + + @Getter + private int tier; + + @Override + public double transfer() { + return 250 * Math.pow(4, tier); + } + + // Unused + @Override + public double pull() { + return 0; + } + + public CosmicEmberReceptorBlockEntity(BlockEntityType type, BlockPos pPos, BlockState pBlockState, int tier) { + super(type, pPos, pBlockState); + capability.setEmberCapacity(250 * Math.pow(4, tier + 2)); + this.tier = tier; + } + + public static CosmicEmberReceptorBlockEntity create(BlockEntityType type, BlockPos pPos, BlockState pBlockState, + int tier) { + return new CosmicEmberReceptorBlockEntity(type, pPos, pBlockState, tier); + } + + public static void serverTick(Level level, BlockPos pos, BlockState state, + CosmicEmberReceptorBlockEntity blockEntity) { + blockEntity.ticksExisted++; + Direction facing = state.getValue(BlockStateProperties.FACING); + BlockEntity attachedTile = level.getBlockEntity(pos.relative(facing, -1)); + if (blockEntity.ticksExisted % 2 == 0 && attachedTile != null) { + IEmberCapability cap = attachedTile.getCapability(EmbersCapabilities.EMBER_CAPABILITY, facing).orElse(null); + if (cap != null && cap.getEmber() < cap.getEmberCapacity() && blockEntity.capability.getEmber() > 0) { + double added = cap.addAmount(Math.min(blockEntity.transfer(), blockEntity.capability.getEmber()), true); + blockEntity.capability.removeAmount(added, true); + } + + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/forge/ForgeCommonEventListener.java b/src/main/java/com/ghostipedia/cosmiccore/forge/ForgeCommonEventListener.java index d8c44a483..a0c34ac8e 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/forge/ForgeCommonEventListener.java +++ b/src/main/java/com/ghostipedia/cosmiccore/forge/ForgeCommonEventListener.java @@ -5,17 +5,22 @@ import com.ghostipedia.cosmiccore.common.commands.WirelessEnergyCommand; import com.ghostipedia.cosmiccore.common.data.CosmicItems; import com.ghostipedia.cosmiccore.common.data.CosmicMachines; +import com.ghostipedia.cosmiccore.common.item.armor.boots.ICosmicBoots; import com.ghostipedia.cosmiccore.common.item.behavior.EffectApplicationBehavior; import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.IPBF; import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.SteamAssembler; import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.SteamCaster; import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.SteamMixer; import com.ghostipedia.cosmiccore.common.machine.multiblock.part.SoulHatchPartMachine; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCommand; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCommands; import com.ghostipedia.cosmiccore.mixin.accessor.LivingEntityAccessor; import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.block.MetaMachineBlock; +import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; +import com.gregtechceu.gtceu.api.item.armor.ArmorComponentItem; import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; @@ -28,11 +33,14 @@ import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; import net.minecraftforge.event.RegisterCommandsEvent; import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.entity.living.LivingDamageEvent; import net.minecraftforge.event.entity.living.LivingDeathEvent; import net.minecraftforge.event.entity.living.LivingEquipmentChangeEvent; +import net.minecraftforge.event.entity.living.LivingEvent; +import net.minecraftforge.event.entity.living.LivingFallEvent; import net.minecraftforge.event.level.BlockEvent; import net.minecraftforge.eventbus.api.EventPriority; import net.minecraftforge.eventbus.api.SubscribeEvent; @@ -121,6 +129,66 @@ public static void onPlayerDeath(LivingDeathEvent event) { @SubscribeEvent public static void registerCommand(RegisterCommandsEvent event) { WirelessEnergyCommand.register(event.getDispatcher(), event.getBuildContext()); + ReflectionCommand.register(event.getDispatcher()); + ReflectionCommands.register(event.getDispatcher()); + } + + /** + * Apply jump boost from Cosmic Boots when player jumps. + * The jump power is a multiplier on the base jump velocity. + */ + @SubscribeEvent + public static void onLivingJump(LivingEvent.LivingJumpEvent event) { + if (!(event.getEntity() instanceof Player player)) return; + + ItemStack boots = player.getItemBySlot(EquipmentSlot.FEET); + if (boots.isEmpty()) return; + + // Check if wearing Cosmic Boots + if (!(boots.getItem() instanceof ArmorComponentItem armorItem)) return; + if (!(armorItem.getArmorLogic() instanceof ICosmicBoots cosmicBoots)) return; + + // Check if boots have power + var electric = GTCapabilityHelper.getElectricItem(boots); + if (electric == null || electric.getCharge() <= 0) return; + + // Get jump power multiplier (accounting for user's jump modifier setting) + double jumpPower = cosmicBoots.getEffectiveJumpPower(boots); + if (jumpPower <= 1.0) return; // No boost needed + + // Apply the jump boost by scaling the Y velocity + // Vanilla jump gives ~0.42 Y velocity + var motion = player.getDeltaMovement(); + double boostedY = motion.y * jumpPower; + player.setDeltaMovement(motion.x, boostedY, motion.z); + } + + /** + * Cancel fall damage for players wearing Cosmic Boots with fall negation enabled. + * This handles the actual damage cancellation that negatesFallDamage() promises. + */ + @SubscribeEvent(priority = EventPriority.HIGH) + public static void onLivingFall(LivingFallEvent event) { + if (!(event.getEntity() instanceof Player player)) return; + + ItemStack boots = player.getItemBySlot(EquipmentSlot.FEET); + if (boots.isEmpty()) return; + + // Check if wearing Cosmic Boots + if (!(boots.getItem() instanceof ArmorComponentItem armorItem)) return; + if (!(armorItem.getArmorLogic() instanceof ICosmicBoots cosmicBoots)) return; + + // Check if boots have power + var electric = GTCapabilityHelper.getElectricItem(boots); + if (electric == null || electric.getCharge() <= 0) return; + + // Check if fall negation is enabled for these boots + if (cosmicBoots.negatesFallDamage()) { + // Cancel the fall damage entirely + event.setCanceled(true); + // Reset fall distance so no damage accumulates + player.fallDistance = 0; + } } @SubscribeEvent diff --git a/src/main/java/com/ghostipedia/cosmiccore/gtbridge/CosmicCoreRecipes.java b/src/main/java/com/ghostipedia/cosmiccore/gtbridge/CosmicCoreRecipes.java index a9c30d4ff..fdbecb421 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/gtbridge/CosmicCoreRecipes.java +++ b/src/main/java/com/ghostipedia/cosmiccore/gtbridge/CosmicCoreRecipes.java @@ -1,8 +1,16 @@ package com.ghostipedia.cosmiccore.gtbridge; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.LarvaMachine; +import com.ghostipedia.cosmiccore.common.recipe.condition.LinkedPartnerCondition; +import com.ghostipedia.cosmiccore.common.recipe.condition.LinkedPartnerDimensionCondition; +import com.ghostipedia.cosmiccore.common.recipe.condition.LinkedPartnerDimensionFluidCondition; +import com.ghostipedia.cosmiccore.common.recipe.condition.LinkedPartnerDimensionItemCondition; + import com.gregtechceu.gtceu.api.GTValues; import net.minecraft.data.recipes.FinishedRecipe; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.material.Fluids; import java.util.function.Consumer; @@ -25,6 +33,72 @@ public static void init(Consumer provider) { .duration(40) .EUt(GTValues.VA[GTValues.HV]) .save(provider); + + LarvaMachine.generateTargettingChipRecipes(provider); + + // === Link Test Station Recipes === + // Basic recipe - no partner required (verifies machine works) + LINK_TEST_RECIPES.recipeBuilder("link_test_basic") + .inputItems(Items.IRON_INGOT) + .outputItems(Items.IRON_NUGGET, 9) + .duration(100) + .EUt(GTValues.VA[GTValues.LV]) + .save(provider); + + // Linked recipe - requires at least 1 linked partner + LINK_TEST_RECIPES.recipeBuilder("link_test_linked") + .inputItems(Items.GOLD_INGOT) + .outputItems(Items.DIAMOND) + .duration(200) + .EUt(GTValues.VA[GTValues.MV]) + .addCondition(new LinkedPartnerCondition(1)) + .save(provider); + + // Linked recipe - requires partner to be formed + LINK_TEST_RECIPES.recipeBuilder("link_test_formed_partner") + .inputItems(Items.EMERALD) + .outputItems(Items.NETHER_STAR) + .duration(400) + .EUt(GTValues.VA[GTValues.HV]) + .addCondition(new LinkedPartnerCondition(1, true, false)) + .save(provider); + + // Linked recipe - requires partner in Moon dimension + LINK_TEST_RECIPES.recipeBuilder("link_test_moon_partner") + .inputItems(Items.LAPIS_LAZULI, 4) + .outputItems(Items.ENDER_PEARL) + .duration(200) + .EUt(GTValues.VA[GTValues.MV]) + .addCondition(new LinkedPartnerDimensionCondition("ad_astra:moon")) + .save(provider); + + // Linked recipe - requires partner in Overworld (for testing from other dimensions) + LINK_TEST_RECIPES.recipeBuilder("link_test_overworld_partner") + .inputItems(Items.REDSTONE, 4) + .outputItems(Items.GLOWSTONE_DUST, 4) + .duration(200) + .EUt(GTValues.VA[GTValues.MV]) + .addCondition(new LinkedPartnerDimensionCondition("minecraft:overworld")) + .save(provider); + + // Linked recipe - requires partner in Overworld with diamonds in input + LINK_TEST_RECIPES.recipeBuilder("link_test_dimension_item") + .inputItems(Items.COAL, 8) + .outputItems(Items.DIAMOND) + .duration(400) + .EUt(GTValues.VA[GTValues.HV]) + .addCondition(new LinkedPartnerDimensionItemCondition("minecraft:overworld", Items.DIAMOND, 1)) + .save(provider); + + // Linked recipe - requires partner in Overworld with water in input + LINK_TEST_RECIPES.recipeBuilder("link_test_dimension_fluid") + .inputItems(Items.SPONGE) + .outputItems(Items.WET_SPONGE) + .duration(100) + .EUt(GTValues.VA[GTValues.LV]) + .addCondition(new LinkedPartnerDimensionFluidCondition("minecraft:overworld", Fluids.WATER, 1000)) + .save(provider); + /* * EMBER_TESTER_RECIPES.recipeBuilder("test") * .input(CosmicRecipeCapabilities.EMBER, 100d) diff --git a/src/main/java/com/ghostipedia/cosmiccore/gtbridge/CosmicRecipeTypes.java b/src/main/java/com/ghostipedia/cosmiccore/gtbridge/CosmicRecipeTypes.java index 0be306e3f..cd835bbfa 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/gtbridge/CosmicRecipeTypes.java +++ b/src/main/java/com/ghostipedia/cosmiccore/gtbridge/CosmicRecipeTypes.java @@ -1,6 +1,7 @@ package com.ghostipedia.cosmiccore.gtbridge; import com.ghostipedia.cosmiccore.api.CosmicGuiTextures; +import com.ghostipedia.cosmiccore.api.capability.recipe.EmberRecipeCapability; import com.ghostipedia.cosmiccore.api.capability.recipe.SoulRecipeCapability; import com.ghostipedia.cosmiccore.common.data.CosmicSounds; @@ -26,11 +27,20 @@ public class CosmicRecipeTypes { + public static final GTRecipeType COSMIC_DUMMY_SPAM_YEETER = GTRecipeTypes + .register("fuckassbeeball", ELECTRIC) + .setMaxIOSize(54, 54, 54, 54); + public static final GTRecipeType LAMINATOR = GTRecipeTypes .register("laminator", ELECTRIC) .setSound(CosmicSounds.LAMINATOR) .setMaxIOSize(3, 2, 2, 0) .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + public static final GTRecipeType DAWNFORGE_ECLIPSED = GTRecipeTypes + .register("eclipsed_dawnforge", ELECTRIC) + .setSound(CosmicSounds.LAMINATOR) + .setMaxIOSize(12, 1, 3, 1) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); public static final GTRecipeType VORAX = GTRecipeTypes .register("vorax", ELECTRIC) .setSound(CosmicSounds.VOARX) @@ -188,6 +198,49 @@ public class CosmicRecipeTypes { .setSound(CosmicSounds.LAMINATOR) .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + public static final GTRecipeType CALX_REACTOR = GTRecipeTypes + .register("calx_reactor", ELECTRIC) + .setMaxIOSize(2, 2, 1, 0) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + + public static final GTRecipeType ROASTER = GTRecipeTypes + .register("roaster", ELECTRIC) + .setMaxIOSize(2, 3, 1, 0) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + public static final GTRecipeType MANA_LEACHING_TUB = GTRecipeTypes + .register("mana_leaching_tub", ELECTRIC) + .setMaxIOSize(1, 1, 2, 2) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + public static final GTRecipeType THERMOMAG = GTRecipeTypes + .register("thermomagnitizer", ELECTRIC) + .setMaxIOSize(3, 2, 0, 0) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + public static final GTRecipeType VAC_BUBBLER = GTRecipeTypes + .register("vacuum_bubbler", ELECTRIC) + .setMaxIOSize(2, 3, 2, 3) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + public static final GTRecipeType LARGE_ROASTER = GTRecipeTypes + .register("large_roaster", ELECTRIC) + .setMaxSize(IO.IN, EmberRecipeCapability.CAP, 1) + .setMaxIOSize(4, 4, 4, 4) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + public static final GTRecipeType VILE_FISSION = GTRecipeTypes + .register("vile_fission", ELECTRIC) + .setMaxSize(IO.IN, EmberRecipeCapability.CAP, 1) + .setMaxIOSize(1, 1, 1, 1) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + + public static final GTRecipeType VOID_SALT_FISSION = GTRecipeTypes + .register("void_salt_fission", ELECTRIC) + .setMaxSize(IO.IN, EmberRecipeCapability.CAP, 1) + .setMaxIOSize(2, 3, 2, 2) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + + public static final GTRecipeType RADBOLT_RECONSTRUCTOR = GTRecipeTypes + .register("reconstructor", ELECTRIC) + .setMaxIOSize(3, 2, 1, 1) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + public static final GTRecipeType SPOOLING_MACHINE = GTRecipeTypes .register("spooling_machine", ELECTRIC) .setMaxIOSize(2, 2, 1, 0) @@ -233,10 +286,71 @@ public class CosmicRecipeTypes { } return ""; }); + public static final GTRecipeType DAWN_FORGE = GTRecipeTypes.register("dawn_forge", GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(8, 1, 2, 0) + .setMaxSize(IO.IN, EmberRecipeCapability.CAP, 1) + .setSound(DAWN_FORGE_SFX) + .setMaxTooltips(5) + .setProgressBar(CosmicGuiTextures.DAWN_FORGE, ProgressTexture.FillDirection.ALWAYS_FULL); + + public static final GTRecipeType CINDER_HEARTH = GTRecipeTypes + .register("cinder_hearth", GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(3, 0, 3, 3) + .setMaxSize(IO.OUT, EmberRecipeCapability.CAP, 1) + .setMaxSize(IO.IN, SoulRecipeCapability.CAP, 1) + .setSound(DAWN_FORGE_SFX) + .setMaxTooltips(7) + .setProgressBar(GuiTextures.PROGRESS_BAR_BOILER_HEAT, ProgressTexture.FillDirection.DOWN_TO_UP); + + public static final GTRecipeType ARCANE_CRUCIBLE = GTRecipeTypes + .register("arcane_crucible", GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(6, 4, 3, 3) + .setMaxSize(IO.IN, EmberRecipeCapability.CAP, 1) + .setMaxSize(IO.IN, SoulRecipeCapability.CAP, 1) + .setSound(DAWN_FORGE_SFX) + .setMaxTooltips(7) + .setProgressBar(GuiTextures.PROGRESS_BAR_MASS_FAB, LEFT_TO_RIGHT); + + public static final GTRecipeType PYROTHERMIC_REFINERY = GTRecipeTypes + .register("pyrothermic_refinery", GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(3, 3, 3, 3) + .setMaxSize(IO.IN, EmberRecipeCapability.CAP, 1) + .setMaxSize(IO.IN, SoulRecipeCapability.CAP, 1) + .setSound(GTSoundEntries.JET_ENGINE) + .setMaxTooltips(3) + .setProgressBar(GuiTextures.PROGRESS_BAR_MASS_FAB, LEFT_TO_RIGHT); + + public static final GTRecipeType MANA_ETCHING_FACTORY = GTRecipeTypes + .register("mana_etching", GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(3, 2, 3, 0) + .setMaxSize(IO.IN, EmberRecipeCapability.CAP, 1) + .setSound(DAWN_FORGE_SFX) + .setMaxTooltips(5) + .setProgressBar(GuiTextures.PROGRESS_BAR_CRYSTALLIZATION, LEFT_TO_RIGHT); + public static final GTRecipeType BIO_LAB = GTRecipeTypes.register("bio_lab", ELECTRIC) + .setMaxIOSize(6, 2, 3, 2) + .setSound(DAWN_FORGE_SFX) + .setMaxTooltips(5) + .setProgressBar(GuiTextures.PROGRESS_BAR_CRYSTALLIZATION, LEFT_TO_RIGHT); + + public static final GTRecipeType STAR_LADDER_RESEARCH = GTRecipeTypes + .register("star_ladder_research", GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(16, 16, 16, 16) + // .setSound(CosmicSounds.BLACK_HOLE_CRY) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + public static final GTRecipeType STELLAR_IRIS = GTRecipeTypes.register("stellar_iris", GTRecipeTypes.MULTIBLOCK) .setMaxIOSize(16, 16, 16, 16) // .setSound(CosmicSounds.BLACK_HOLE_CRY) .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + + // Stellar Iris Module Recipe Types + public static final GTRecipeType STELLAR_SMELTING = GTRecipeTypes + .register("ignition_complex", GTRecipeTypes.MULTIBLOCK) + .setSound(GAS_SUCC) + .setMaxIOSize(9, 9, 3, 3) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + public static final GTRecipeType CHROMATIC_DISTILLATION_PLANT = GTRecipeTypes .register("chormatic_distillation_plant", GTRecipeTypes.MULTIBLOCK) .setMaxIOSize(1, 1, 1, 16) @@ -282,6 +396,22 @@ public class CosmicRecipeTypes { .setMaxTooltips(6) .onRecipeBuild(ResearchManager::createDefaultResearchRecipe) .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW_MULTIPLE, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + + public static final GTRecipeType WASP_RECIPES = GTRecipeTypes + .register("wasp", GTRecipeTypes.MULTIBLOCK) + .addDataInfo(data -> LocalizationUtils.format("cosmiccore.recipe.asteroid_weight_greater_1")) + .setMaxIOSize(2, 15, 3, 5) + .setMaxTooltips(4) + .setProgressBar(GuiTextures.PROGRESS_BAR_SIFT, ProgressTexture.FillDirection.UP_TO_DOWN); + + // Dummy recipe. Maybe add recipes here? Either way it won't be used for recipe searching, that's taken care of by + // BeeRecipeLogic + public static final GTRecipeType BEES = GTRecipeTypes + .register("bees", GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(1, 9, 0, 0) + .setMaxTooltips(6) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW_MULTIPLE, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + /* * TODO: Multiblocks that might not need a RecipeType or might use it to do really weird things * RIFTGENERATOR @@ -322,6 +452,12 @@ public class CosmicRecipeTypes { .setHasResearchSlot(true) .setSound(GTSoundEntries.REPLICATOR) // TODO - Sounds .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW_MULTIPLE, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + + public static final GTRecipeType MULTITHREADED_PROCESSOR = GTRecipeTypes + .register("dream_basin", GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(9, 9, 9, 9) + .setSound(GTSoundEntries.ASSEMBLER) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW_MULTIPLE, ProgressTexture.FillDirection.LEFT_TO_RIGHT); /* * TODO - Allow This block to replace the Master Ritual stone, and then set the structure shape based on the ritual */ @@ -337,23 +473,31 @@ public class CosmicRecipeTypes { * This Thing is meant to allow the deconstruction of concepts into laws, and laws are meant to be dissolved with * their counterparts. Every Hebrew Letter needs a Pairing Counterlaw. */ - public static final GTRecipeType CONCEPT_INCINERATOR = GTRecipeTypes - .register("concept_incinerator", GTRecipeTypes.MULTIBLOCK) - .setMaxIOSize(4, 4, 4, 4) - .setHasResearchSlot(true) - .setSound(GTSoundEntries.CHEMICAL) // TODO - Sounds - .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW_MULTIPLE, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + // public static final GTRecipeType CONCEPT_INCINERATOR = GTRecipeTypes + // .register("concept_incinerator", GTRecipeTypes.MULTIBLOCK) + // .setMaxIOSize(4, 4, 4, 4) + // .setHasResearchSlot(true) + // .setSound(GTSoundEntries.CHEMICAL) // TODO - Sounds + // .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW_MULTIPLE, ProgressTexture.FillDirection.LEFT_TO_RIGHT); /* * TODO * Retcon Hashers allow the player to target potential sequence breaks in the already established environment * Every sequence break is recorded to a teams data and should be semi-random with mandatory breaks needed for * progression */ - public static final GTRecipeType RETCON_HASHER = GTRecipeTypes.register("retcon_hasher", GTRecipeTypes.MULTIBLOCK) - .setMaxIOSize(4, 4, 4, 4) - .setHasResearchSlot(true) - .setSound(GTSoundEntries.CHEMICAL) // TODO - Sounds - .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW_MULTIPLE, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + // public static final GTRecipeType RETCON_HASHER = GTRecipeTypes.register("retcon_hasher", + // GTRecipeTypes.MULTIBLOCK) + // .setMaxIOSize(4, 4, 4, 4) + // .setHasResearchSlot(true) + // .setSound(GTSoundEntries.CHEMICAL) // TODO - Sounds + // .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW_MULTIPLE, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + + // Link Test Station recipe type for testing cross-dimensional linking + public static final GTRecipeType LINK_TEST_RECIPES = GTRecipeTypes + .register("link_test", ELECTRIC) + .setMaxIOSize(2, 2, 0, 0) + .setSound(GTSoundEntries.ASSEMBLER) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); public static void init() { LASER_ENGRAVER_RECIPES.setMaxIOSize(2, 2, 1, 1); @@ -376,6 +520,17 @@ public static void init() { .save(provider); }); + // Eclipsed Forge is the big EU powered version of the Dawn Forge + DAWN_FORGE.onRecipeBuild((builder, provider) -> { + DAWNFORGE_ECLIPSED.copyFrom(builder) + .save(provider); + }); + // Large Roaster can do all the small Roaster can, but also allows Ember :) + ROASTER.onRecipeBuild((builder, provider) -> { + LARGE_ROASTER.copyFrom(builder) + .save(provider); + }); + BLAST_RECIPES.onRecipeBuild((builder, provider) -> { var orbitBuilderEBF = ORBITAL_FORGE_EBF.copyFrom(builder); // Orbital Forge ONLY copies Standard EBF recipes, if an EBF recipe contains a dimension condition, it is @@ -389,6 +544,12 @@ public static void init() { .save(provider); } }); + + // BLAST_RECIPES.onRecipeBuild((builder, provider) -> { + // STELLAR_SMELTING.copyFrom(builder) + // .save(provider); + // }); + ALLOY_BLAST_RECIPES.onRecipeBuild((builder, provider) -> { var orbitBuilderABS = ORBITAL_FORGE_ABS.copyFrom(builder); // Orbital Forge ONLY copies Standard ABS recipes, if an ABS recipe contains a dimension condition, it is diff --git a/src/main/java/com/ghostipedia/cosmiccore/integration/emi/CosmicFavorite.java b/src/main/java/com/ghostipedia/cosmiccore/integration/emi/CosmicFavorite.java new file mode 100644 index 000000000..c103c9dbb --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/integration/emi/CosmicFavorite.java @@ -0,0 +1,105 @@ +package com.ghostipedia.cosmiccore.integration.emi; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.chat.Component; +import net.minecraft.world.level.material.Fluid; + +import dev.emi.emi.EmiPort; +import dev.emi.emi.EmiRenderHelper; +import dev.emi.emi.api.stack.EmiIngredient; +import dev.emi.emi.runtime.EmiDrawContext; +import dev.emi.emi.runtime.EmiFavorite; + +public class CosmicFavorite extends EmiFavorite { + + private long amount; + + public CosmicFavorite(EmiIngredient stack, long amount) { + super(stack, null); + this.amount = Math.max(1, amount); + } + + public void adjustAmount(long delta) { + this.amount = Math.max(1, amount + delta); + } + + public long getScrollStep(boolean large) { + if (!large) return 1; + return isFluid() ? 1000 : 64; + } + + private boolean isFluid() { + if (getStack().getEmiStacks().isEmpty()) return false; + return getStack().getEmiStacks().get(0).getKey() instanceof Fluid; + } + + @Override + public long getAmount() { + return amount; + } + + @Override + public void render(GuiGraphics raw, int x, int y, float delta, int flags) { + EmiDrawContext context = EmiDrawContext.wrap(raw); + + // Render the stack without the default amount overlay + getStack().render(context.raw(), x, y, delta, flags & ~EmiIngredient.RENDER_AMOUNT); + + // Render our compact amount at half scale + renderCompactAmount(context, x, y, amount); + + // Render recipe favorite indicator if applicable + if ((flags & EmiIngredient.RENDER_INGREDIENT) != 0 && getRecipe() != null) { + EmiRenderHelper.renderRecipeFavorite(getStack(), context, x, y); + } + } + + private void renderCompactAmount(EmiDrawContext context, int x, int y, long amount) { + String text = formatCompact(amount); + Component component = EmiPort.literal(text); + Minecraft client = Minecraft.getInstance(); + int textWidth = client.font.width(component); + + context.push(); + context.matrices().translate(0, 0, 200); + + float scale = 0.5f; + context.matrices().translate(x + 16, y + 16, 0); + context.matrices().scale(scale, scale, 1); + + int tx = -textWidth; + int ty = -client.font.lineHeight; + + context.drawTextWithShadow(component, tx, ty, 0xFFFFFF); + context.pop(); + } + + private String formatCompact(long amount) { + if (isFluid()) { + return formatFluidAmount(amount); + } + return formatItemAmount(amount); + } + + private String formatFluidAmount(long mB) { + if (mB < 1000) return mB + "mB"; + double buckets = mB / 1000.0; + if (buckets >= 1_000_000_000) return String.format("%.1fBB", buckets / 1_000_000_000); + if (buckets >= 1_000_000) return String.format("%.1fMB", buckets / 1_000_000); + if (buckets >= 1000) return String.format("%.1fKB", buckets / 1000); + return String.format("%.1fB", buckets); + } + + private String formatItemAmount(long count) { + if (count >= 1_000_000_000) return String.format("%.1fB", count / 1_000_000_000.0); + if (count >= 1_000_000) return String.format("%.1fM", count / 1_000_000.0); + if (count >= 1000) return String.format("%.1fK", count / 1000.0); + return String.valueOf(count); + } + + @Override + public EmiIngredient copy() { + return new CosmicFavorite(getStack(), amount); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/integration/emi/RecipeScreenAccessor.java b/src/main/java/com/ghostipedia/cosmiccore/integration/emi/RecipeScreenAccessor.java new file mode 100644 index 000000000..3d38a46e0 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/integration/emi/RecipeScreenAccessor.java @@ -0,0 +1,11 @@ +package com.ghostipedia.cosmiccore.integration.emi; + +import dev.emi.emi.api.stack.EmiIngredient; + +/** + * Duck interface for accessing getHoveredStack on RecipeScreen via mixin. + */ +public interface RecipeScreenAccessor { + + EmiIngredient getHoveredStack(); +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/integration/jade/CCJadePlugin.java b/src/main/java/com/ghostipedia/cosmiccore/integration/jade/CCJadePlugin.java index c1b4f2465..ec10d8005 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/integration/jade/CCJadePlugin.java +++ b/src/main/java/com/ghostipedia/cosmiccore/integration/jade/CCJadePlugin.java @@ -3,6 +3,7 @@ import com.ghostipedia.cosmiccore.integration.jade.provider.DroneMaintenanceInterfaceProvider; import com.ghostipedia.cosmiccore.integration.jade.provider.DroneStationProvider; import com.ghostipedia.cosmiccore.integration.jade.provider.PCBParallelProvider; +import com.ghostipedia.cosmiccore.integration.jade.provider.StellarModuleProvider; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; @@ -20,6 +21,7 @@ public void register(IWailaCommonRegistration registration) { registration.registerBlockDataProvider(new DroneStationProvider(), BlockEntity.class); registration.registerBlockDataProvider(new DroneMaintenanceInterfaceProvider(), BlockEntity.class); registration.registerBlockDataProvider(new PCBParallelProvider(), BlockEntity.class); + registration.registerBlockDataProvider(new StellarModuleProvider(), BlockEntity.class); } @Override @@ -27,5 +29,6 @@ public void registerClient(IWailaClientRegistration registration) { registration.registerBlockComponent(new DroneStationProvider(), Block.class); registration.registerBlockComponent(new DroneMaintenanceInterfaceProvider(), Block.class); registration.registerBlockComponent(new PCBParallelProvider(), Block.class); + registration.registerBlockComponent(new StellarModuleProvider(), Block.class); } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/integration/jade/provider/DroneStationProvider.java b/src/main/java/com/ghostipedia/cosmiccore/integration/jade/provider/DroneStationProvider.java index 486d89b99..e4ccba497 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/integration/jade/provider/DroneStationProvider.java +++ b/src/main/java/com/ghostipedia/cosmiccore/integration/jade/provider/DroneStationProvider.java @@ -44,9 +44,9 @@ protected DroneStationMachine getCapability(Level level, BlockPos blockPos, @Nul protected void write(CompoundTag compoundTag, DroneStationMachine droneStation) { compoundTag.putLong("connections", droneStation.connections.size()); if (droneStation.currentTier == null) { - compoundTag.putString("currentTier", "None"); + compoundTag.putString("currentTier", "cosmiccore.multiblock.drone_station_machine.tier.5"); } else { - compoundTag.putString("currentTier", toTitleCase(droneStation.currentTier.name())); + compoundTag.putString("currentTier", toKey(droneStation.currentTier.ordinal())); } } @@ -60,6 +60,10 @@ private String toTitleCase(String input) { return first + rest; } + private String toKey(int input) { + return "cosmiccore.multiblock.drone_station_machine.tier." + input; + } + @Override protected void addTooltip(CompoundTag compoundTag, ITooltip iTooltip, Player player, BlockAccessor blockAccessor, BlockEntity blockEntity, IPluginConfig iPluginConfig) { @@ -77,7 +81,7 @@ protected void addTooltip(CompoundTag compoundTag, ITooltip iTooltip, Player pla if (compoundTag.contains("currentTier")) { iTooltip.add(Component .translatable("cosmiccore.multiblock.drone_station_machine.current_tier", - compoundTag.getString("currentTier")) + Component.translatable(compoundTag.getString("currentTier"))) .setStyle(Style.EMPTY.withColor(ChatFormatting.GREEN))); } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/integration/jade/provider/StellarModuleProvider.java b/src/main/java/com/ghostipedia/cosmiccore/integration/jade/provider/StellarModuleProvider.java new file mode 100644 index 000000000..c0d82dc71 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/integration/jade/provider/StellarModuleProvider.java @@ -0,0 +1,307 @@ +package com.ghostipedia.cosmiccore.integration.jade.provider; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.machine.feature.IStellarIrisProvider; +import com.ghostipedia.cosmiccore.api.machine.multiblock.StellarBaseModule; + +import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.RecipeHelper; +import com.gregtechceu.gtceu.integration.jade.GTElementHelper; +import com.gregtechceu.gtceu.integration.jade.provider.CapabilityBlockProvider; +import com.gregtechceu.gtceu.utils.FormattingUtil; +import com.gregtechceu.gtceu.utils.GTUtil; + +import net.minecraft.ChatFormatting; +import net.minecraft.Util; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.CommonComponents; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.ComponentUtils; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.Style; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraftforge.fluids.FluidStack; + +import org.jetbrains.annotations.Nullable; +import snownee.jade.api.BlockAccessor; +import snownee.jade.api.ITooltip; +import snownee.jade.api.config.IPluginConfig; +import snownee.jade.api.fluid.JadeFluidObject; +import snownee.jade.api.ui.BoxStyle; +import snownee.jade.api.ui.IElementHelper; +import snownee.jade.util.FluidTextHelper; + +public class StellarModuleProvider extends CapabilityBlockProvider { + + public StellarModuleProvider() { + super(CosmicCore.id("stellar_module")); + } + + @Nullable + @Override + protected StellarBaseModule getCapability(Level level, BlockPos blockPos, @Nullable Direction direction) { + if (MetaMachine.getMachine(level, blockPos) instanceof IMultiController controller) { + if (controller instanceof StellarBaseModule module) { + return module; + } + } + return null; + } + + @Override + protected void write(CompoundTag tag, StellarBaseModule module) { + IStellarIrisProvider iris = module.getStellarIris(); + boolean connected = iris != null && iris.isFormed(); + boolean canProcess = connected && iris.canProcess(); + + tag.putBoolean("connected", connected); + tag.putBoolean("canProcess", canProcess); + tag.putBoolean("wirelessAvailable", module.isWirelessEnergyAvailable()); + tag.putLong("energyPerTick", module.getEnergyConsumedPerTick()); + + if (iris != null) { + tag.putString("stage", iris.getStage().toString()); + if (canProcess) { + tag.putDouble("speedBonus", iris.getSpeedBonus()); + } + } + + RecipeLogic recipeLogic = module.getRecipeLogic(); + tag.putBoolean("active", recipeLogic.isActive()); + tag.putBoolean("workingEnabled", recipeLogic.isWorkingEnabled()); + tag.putInt("progress", recipeLogic.getProgress()); + tag.putInt("maxProgress", recipeLogic.getMaxProgress()); + + GTRecipe recipe = recipeLogic.getLastRecipe(); + if (recipeLogic.isWorking() && recipe != null) { + tag.putBoolean("working", true); + if (recipe.parallels > 1) { + tag.putInt("recipeParallels", recipe.parallels); + } + writeRecipeOutputs(tag, recipe); + } + } + + private void writeRecipeOutputs(CompoundTag tag, GTRecipe recipe) { + int recipeTier = RecipeHelper.getPreOCRecipeEuTier(recipe); + int chanceTier = recipeTier + recipe.ocLevel; + var function = recipe.getType().getChanceFunction(); + + // Item outputs + var itemContents = recipe.getOutputContents(ItemRecipeCapability.CAP); + ListTag itemTags = new ListTag(); + for (var item : itemContents) { + var stacks = ItemRecipeCapability.CAP.of(item.content).getItems(); + if (stacks.length == 0 || stacks[0].isEmpty()) continue; + var stack = stacks[0]; + var itemTag = new CompoundTag(); + GTUtil.saveItemStack(stack, itemTag); + if (item.chance < item.maxChance) { + int count = stack.getCount(); + double countD = (double) count * recipe.parallels * + function.getBoostedChance(item, recipeTier, chanceTier) / item.maxChance; + count = countD < 1 ? 1 : (int) Math.round(countD); + itemTag.putInt("Count", count); + } + itemTags.add(itemTag); + } + if (!itemTags.isEmpty()) { + tag.put("outputItems", itemTags); + } + + // Fluid outputs + var fluidContents = recipe.getOutputContents(FluidRecipeCapability.CAP); + ListTag fluidTags = new ListTag(); + for (var fluid : fluidContents) { + FluidStack[] stacks = FluidRecipeCapability.CAP.of(fluid.content).getStacks(); + if (stacks.length == 0 || stacks[0].isEmpty()) continue; + var stack = stacks[0]; + var fluidTag = new CompoundTag(); + stack.writeToNBT(fluidTag); + if (fluid.chance < fluid.maxChance) { + int amount = stacks[0].getAmount(); + double amountD = (double) amount * recipe.parallels * + function.getBoostedChance(fluid, recipeTier, chanceTier) / fluid.maxChance; + amount = amountD < 1 ? 1 : (int) Math.round(amountD); + fluidTag.putInt("Amount", amount); + } + fluidTags.add(fluidTag); + } + if (!fluidTags.isEmpty()) { + tag.put("outputFluids", fluidTags); + } + } + + @Override + protected void addTooltip(CompoundTag tag, ITooltip tooltip, Player player, BlockAccessor accessor, + BlockEntity blockEntity, IPluginConfig config) { + if (!tag.contains("connected")) { + return; + } + + boolean connected = tag.getBoolean("connected"); + boolean canProcess = tag.getBoolean("canProcess"); + boolean wirelessAvailable = tag.getBoolean("wirelessAvailable"); + + if (!connected) { + tooltip.add(Component.translatable("cosmiccore.jade.stellar_module.not_connected") + .setStyle(Style.EMPTY.withColor(ChatFormatting.RED))); + } else if (!canProcess) { + tooltip.add(Component.translatable("cosmiccore.jade.stellar_module.iris_not_ready") + .setStyle(Style.EMPTY.withColor(ChatFormatting.YELLOW))); + if (tag.contains("stage")) { + tooltip.add(Component.translatable("cosmiccore.jade.stellar_module.stage", + tag.getString("stage")) + .setStyle(Style.EMPTY.withColor(ChatFormatting.GRAY))); + } + } else { + tooltip.add(Component.translatable("cosmiccore.jade.stellar_module.connected") + .setStyle(Style.EMPTY.withColor(ChatFormatting.GREEN))); + if (tag.contains("stage")) { + tooltip.add(Component.translatable("cosmiccore.jade.stellar_module.stage", + tag.getString("stage")) + .setStyle(Style.EMPTY.withColor(ChatFormatting.AQUA))); + } + if (tag.contains("speedBonus")) { + tooltip.add(Component.translatable("cosmiccore.jade.stellar_module.speed_bonus", + String.format("%.1fx", tag.getDouble("speedBonus"))) + .setStyle(Style.EMPTY.withColor(ChatFormatting.GREEN))); + } + } + + if (!wirelessAvailable) { + tooltip.add(Component.translatable("cosmiccore.jade.stellar_module.no_wireless") + .setStyle(Style.EMPTY.withColor(ChatFormatting.RED))); + } else { + long euPerTick = tag.getLong("energyPerTick"); + if (euPerTick > 0) { + tooltip.add(Component.translatable("cosmiccore.jade.stellar_module.energy_usage", + formatEnergy(euPerTick)) + .setStyle(Style.EMPTY.withColor(ChatFormatting.YELLOW))); + } + } + + if (tag.getBoolean("active")) { + int progress = tag.getInt("progress"); + int maxProgress = tag.getInt("maxProgress"); + + if (maxProgress > 0) { + Component text; + if (maxProgress < 20) { + text = Component.translatable("gtceu.jade.progress_tick", progress, maxProgress); + } else { + text = Component.translatable("gtceu.jade.progress_sec", + Math.round(progress / 20.0F), Math.round(maxProgress / 20.0F)); + } + + int rainbowColor = getRainbowColor(); + IElementHelper helper = tooltip.getElementHelper(); + tooltip.add(helper.progress( + getProgress(progress, maxProgress), + text, + helper.progressStyle().color(rainbowColor).textColor(-1), + Util.make(BoxStyle.DEFAULT, style -> style.borderColor = 0xFF555555), + true)); + } + } + + if (tag.contains("recipeParallels")) { + int parallels = tag.getInt("recipeParallels"); + Component parallelsText = Component.literal(FormattingUtil.formatNumbers(parallels)) + .withStyle(ChatFormatting.DARK_PURPLE); + tooltip.add(Component.translatable("gtceu.multiblock.parallel.exact", parallelsText)); + } + + if (tag.getBoolean("working")) { + boolean hasOutputs = false; + + if (tag.contains("outputItems", Tag.TAG_LIST)) { + ListTag itemTags = tag.getList("outputItems", Tag.TAG_COMPOUND); + if (!itemTags.isEmpty()) { + if (!hasOutputs) { + tooltip.add(Component.translatable("gtceu.top.recipe_output")); + hasOutputs = true; + } + addItemOutputs(tooltip, itemTags); + } + } + + if (tag.contains("outputFluids", Tag.TAG_LIST)) { + ListTag fluidTags = tag.getList("outputFluids", Tag.TAG_COMPOUND); + if (!fluidTags.isEmpty()) { + if (!hasOutputs) { + tooltip.add(Component.translatable("gtceu.top.recipe_output")); + } + addFluidOutputs(tooltip, fluidTags); + } + } + } + } + + private void addItemOutputs(ITooltip tooltip, ListTag itemTags) { + IElementHelper helper = tooltip.getElementHelper(); + for (Tag tag : itemTags) { + if (tag instanceof CompoundTag itemTag) { + ItemStack stack = GTUtil.loadItemStack(itemTag); + if (!stack.isEmpty()) { + MutableComponent text = CommonComponents.space(); + text.append(String.valueOf(stack.getCount())); + stack.setCount(1); + text.append(Component.translatable("gtceu.gui.content.times_item", + getItemName(stack)).withStyle(ChatFormatting.WHITE)); + tooltip.add(helper.smallItem(stack)); + tooltip.append(text); + } + } + } + } + + private void addFluidOutputs(ITooltip tooltip, ListTag fluidTags) { + for (Tag tag : fluidTags) { + if (tag instanceof CompoundTag fluidTag) { + FluidStack stack = FluidStack.loadFluidStackFromNBT(fluidTag); + if (!stack.isEmpty()) { + MutableComponent text = CommonComponents.space(); + text.append(FluidTextHelper.getUnicodeMillibuckets(stack.getAmount(), true)); + text.append(CommonComponents.space()) + .append(getFluidName(stack)) + .withStyle(ChatFormatting.WHITE); + tooltip.add(GTElementHelper.smallFluid(JadeFluidObject.of(stack.getFluid(), stack.getAmount()))); + tooltip.append(text); + } + } + } + } + + private Component getItemName(ItemStack stack) { + return ComponentUtils.wrapInSquareBrackets(stack.getItem().getDescription()).withStyle(ChatFormatting.WHITE); + } + + private Component getFluidName(FluidStack stack) { + return ComponentUtils.wrapInSquareBrackets(stack.getDisplayName()).withStyle(ChatFormatting.WHITE); + } + + private String formatEnergy(long eu) { + if (eu >= 1_000_000_000) return String.format("%.1fG EU/t", eu / 1_000_000_000.0); + if (eu >= 1_000_000) return String.format("%.1fM EU/t", eu / 1_000_000.0); + if (eu >= 1000) return String.format("%.1fk EU/t", eu / 1000.0); + return String.format("%d EU/t", eu); + } + + private int getRainbowColor() { + float hue = (System.currentTimeMillis() % 3000) / 3000.0f; + return java.awt.Color.HSBtoRGB(hue, 0.8f, 1.0f) | 0xFF000000; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/integration/recipes/CosmicCoreEMIPlugin.java b/src/main/java/com/ghostipedia/cosmiccore/integration/recipes/CosmicCoreEMIPlugin.java new file mode 100644 index 000000000..928d206ef --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/integration/recipes/CosmicCoreEMIPlugin.java @@ -0,0 +1,80 @@ +package com.ghostipedia.cosmiccore.integration.recipes; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.CosmicItems; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.LARVA; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.LarvaMachine; +import com.ghostipedia.cosmiccore.integration.recipes.emi.AsteroidEmiRecipe; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; + +import dev.emi.emi.api.EmiEntrypoint; +import dev.emi.emi.api.EmiPlugin; +import dev.emi.emi.api.EmiRegistry; +import dev.emi.emi.api.recipe.EmiRecipeCategory; +import dev.emi.emi.api.stack.Comparison; +import dev.emi.emi.api.stack.EmiIngredient; +import dev.emi.emi.api.stack.EmiStack; +import thedarkcolour.gendustry.registry.GItems; + +import java.util.ArrayList; +import java.util.List; + +@EmiEntrypoint +public class CosmicCoreEMIPlugin implements EmiPlugin { + + public static final ResourceLocation ASTEROID_CATEGORY_ID = CosmicCore.id("asteroid_mining"); + public static final EmiRecipeCategory ASTEROID_CATEGORY = new EmiRecipeCategory(ASTEROID_CATEGORY_ID, + EmiStack.of(CosmicItems.TARGETING_CHIP)); + + @Override + public void register(EmiRegistry registry) { + registry.setDefaultComparison(GItems.GENE_SAMPLE.item(), Comparison.compareNbt()); + + registry.setDefaultComparison(CosmicItems.TARGETING_CHIP.asStack(), Comparison.compareNbt()); + + registry.addCategory(ASTEROID_CATEGORY); + registry.addWorkstation(ASTEROID_CATEGORY, EmiStack.of(LARVA.LARVA.getBlock())); + + addAsteroidRecipe(registry, "carbonic_asteroid", CosmicItems.TUNGSTENSTEEL_NANOLATTICE_SPOOL.asStack(), + List.of(EmiStack.of(CosmicItems.CARBON_ASTEROID.asStack())), CosmicItems.CARBON_ASTEROID.asStack()); + addAsteroidRecipe(registry, "ferric_asteroid", CosmicItems.TUNGSTENSTEEL_NANOLATTICE_SPOOL.asStack(), + List.of(EmiStack.of(CosmicItems.FERRIC_ASTEROID.asStack())), CosmicItems.FERRIC_ASTEROID.asStack()); + addAsteroidRecipe(registry, "rare_metal_asteroid", CosmicItems.TUNGSTENSTEEL_NANOLATTICE_SPOOL.asStack(), + List.of(EmiStack.of(CosmicItems.RARE_METAL_ASTEROID.asStack())), + CosmicItems.RARE_METAL_ASTEROID.asStack()); + addAsteroidRecipe(registry, "auric_asteroid", CosmicItems.TUNGSTENSTEEL_NANOLATTICE_SPOOL.asStack(), + List.of(EmiStack.of(CosmicItems.AURIC_ASTEROID.asStack())), CosmicItems.AURIC_ASTEROID.asStack()); + addAsteroidRecipe(registry, "brimstone_asteroid", CosmicItems.TUNGSTENSTEEL_NANOLATTICE_SPOOL.asStack(), + List.of(EmiStack.of(CosmicItems.BRIMSTONE_ASTEROID.asStack())), + CosmicItems.BRIMSTONE_ASTEROID.asStack()); + addAsteroidRecipe(registry, "lith_asteroid", CosmicItems.TUNGSTENSTEEL_NANOLATTICE_SPOOL.asStack(), + List.of(EmiStack.of(CosmicItems.LITH_ASTEROID.asStack())), CosmicItems.LITH_ASTEROID.asStack()); + addAsteroidRecipe(registry, "mafic_asteroid", CosmicItems.TUNGSTENSTEEL_NANOLATTICE_SPOOL.asStack(), + List.of(EmiStack.of(CosmicItems.MAFIC_ASTEROID.asStack())), CosmicItems.MAFIC_ASTEROID.asStack()); + addAsteroidRecipe(registry, "mossy_asteroid", CosmicItems.TUNGSTENSTEEL_NANOLATTICE_SPOOL.asStack(), + List.of(EmiStack.of(CosmicItems.MOSSY_ASTEROID.asStack())), CosmicItems.MOSSY_ASTEROID.asStack()); + addAsteroidRecipe(registry, "occult_asteroid", CosmicItems.TUNGSTENSTEEL_NANOLATTICE_SPOOL.asStack(), + List.of(EmiStack.of(CosmicItems.OCCULT_ASTEROID.asStack())), CosmicItems.OCCULT_ASTEROID.asStack()); + addAsteroidRecipe(registry, "oxide_asteroid", CosmicItems.TUNGSTENSTEEL_NANOLATTICE_SPOOL.asStack(), + List.of(EmiStack.of(CosmicItems.OXIDE_ASTEROID.asStack())), CosmicItems.OXIDE_ASTEROID.asStack()); + addAsteroidRecipe(registry, "sanguine_asteroid", CosmicItems.TUNGSTENSTEEL_NANOLATTICE_SPOOL.asStack(), + List.of(EmiStack.of(CosmicItems.SANGUINE_ASTEROID.asStack())), CosmicItems.SANGUINE_ASTEROID.asStack()); + addAsteroidRecipe(registry, "wasteland_asteroid", CosmicItems.TUNGSTENSTEEL_NANOLATTICE_SPOOL.asStack(), + List.of(EmiStack.of(CosmicItems.WASTELAND_ASTEROID.asStack())), + CosmicItems.WASTELAND_ASTEROID.asStack()); + } + + private void addAsteroidRecipe(EmiRegistry registry, String keySuffix, ItemStack spool, List outputs, + ItemStack icon) { + ItemStack chip = LarvaMachine.getAstroidDataChip(keySuffix, 1); + + List inputs = new ArrayList<>(); + inputs.add(EmiStack.of(chip)); + inputs.add(EmiStack.of(spool)); + + ResourceLocation recipeID = CosmicCore.id("emi/asteroid_processing/" + keySuffix); + registry.addRecipe(new AsteroidEmiRecipe(ASTEROID_CATEGORY, recipeID, inputs, outputs, EmiStack.of(icon))); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/integration/recipes/CosmicCoreJEIPlugin.java b/src/main/java/com/ghostipedia/cosmiccore/integration/recipes/CosmicCoreJEIPlugin.java new file mode 100644 index 000000000..5c9021309 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/integration/recipes/CosmicCoreJEIPlugin.java @@ -0,0 +1,42 @@ +package com.ghostipedia.cosmiccore.integration.recipes; + +import com.ghostipedia.cosmiccore.CosmicCore; + +import com.gregtechceu.gtceu.GTCEu; + +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.resources.ResourceLocation; + +import lombok.Getter; +import mezz.jei.api.IModPlugin; +import mezz.jei.api.JeiPlugin; +import mezz.jei.api.registration.ISubtypeRegistration; +import mezz.jei.api.runtime.IJeiRuntime; +import thedarkcolour.gendustry.registry.GItems; + +import javax.annotation.ParametersAreNonnullByDefault; + +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +@JeiPlugin +public class CosmicCoreJEIPlugin implements IModPlugin { + + @Getter + private static IJeiRuntime runtime = null; + + @Override + public ResourceLocation getPluginUid() { + return CosmicCore.id("jei_plugin"); + } + + @Override + public void onRuntimeAvailable(IJeiRuntime jeiRuntime) { + runtime = jeiRuntime; + } + + @Override + public void registerItemSubtypes(ISubtypeRegistration registration) { + if (GTCEu.Mods.isREILoaded() || GTCEu.Mods.isEMILoaded()) return; + registration.useNbtForSubtypes(GItems.GENE_SAMPLE.asItem()); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/integration/recipes/emi/AsteroidEmiRecipe.java b/src/main/java/com/ghostipedia/cosmiccore/integration/recipes/emi/AsteroidEmiRecipe.java new file mode 100644 index 000000000..8499727d5 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/integration/recipes/emi/AsteroidEmiRecipe.java @@ -0,0 +1,87 @@ +package com.ghostipedia.cosmiccore.integration.recipes.emi; + +import net.minecraft.resources.ResourceLocation; + +import dev.emi.emi.api.recipe.EmiRecipe; +import dev.emi.emi.api.recipe.EmiRecipeCategory; +import dev.emi.emi.api.render.EmiTexture; +import dev.emi.emi.api.stack.EmiIngredient; +import dev.emi.emi.api.stack.EmiStack; +import dev.emi.emi.api.widget.WidgetHolder; +import lombok.Getter; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class AsteroidEmiRecipe implements EmiRecipe { + + private static final int W = 150; + private static final int H = 30; + + private final EmiRecipeCategory category; + private final ResourceLocation id; + private final List inputs; + private final List outputs; + @Getter + private final EmiStack icon; + + public AsteroidEmiRecipe(EmiRecipeCategory category, ResourceLocation id, List inputs, + List outputs, EmiStack icon) { + this.category = category; + this.id = id; + this.inputs = inputs; + this.outputs = outputs; + this.icon = icon; + } + + @Override + public EmiRecipeCategory getCategory() { + return category; + } + + @Override + public @Nullable ResourceLocation getId() { + return id; + } + + @Override + public List getInputs() { + return inputs; + } + + @Override + public List getOutputs() { + return outputs; + } + + @Override + public int getDisplayWidth() { + return W; + } + + @Override + public int getDisplayHeight() { + return H; + } + + @Override + public boolean supportsRecipeTree() { + return false; + } + + @Override + public void addWidgets(WidgetHolder widgets) { + widgets.addTexture(EmiTexture.EMPTY_ARROW, (W / 2 - 6), (H / 2 - 3)); + widgets.addSlot(inputs.get(0), 10, H / 2 - 5).drawBack(true); + widgets.addSlot(inputs.get(1), 30, H / 2 - 5).drawBack(true); + + int ox = 100; + int oy = H / 2 - 5; + + for (int i = 0; i < outputs.size(); i++) { + widgets.addSlot(outputs.get(i), ox + (i * 20), oy).recipeContext(this); + } + + widgets.addText(icon.getItemStack().getHoverName(), 0, 0, 0xFFFFFF, true); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/AdAstraSpaceSuitItemMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/AdAstraSpaceSuitItemMixin.java index 15915ba67..87485e638 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/mixin/AdAstraSpaceSuitItemMixin.java +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/AdAstraSpaceSuitItemMixin.java @@ -5,11 +5,15 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; import earth.terrarium.adastra.common.items.armor.SpaceSuitItem; import org.spongepowered.asm.mixin.Debug; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Debug(export = true) @Mixin(value = SpaceSuitItem.class, remap = false) @@ -29,4 +33,14 @@ public static long getOxygenAmount(Entity entity) { return suit.getFluidContainer(stack).getFirstFluid().getFluidAmount(); } else return 0; } + + /** + * Prevent Ad Astra from consuming oxygen in inventoryTick. + * CosmicCore's OxygenLogic handles all oxygen consumption to avoid double-dipping. + */ + @Inject(method = "consumeOxygen", at = @At("HEAD"), cancellable = true) + private void cosmiccore$preventDoubleOxygenConsumption(ItemStack stack, long amount, CallbackInfo ci) { + // Cancel Ad Astra's oxygen consumption - OxygenLogic handles it + ci.cancel(); + } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/BlocksMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/BlocksMixin.java new file mode 100644 index 000000000..ed49f5194 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/BlocksMixin.java @@ -0,0 +1,28 @@ +package com.ghostipedia.cosmiccore.mixin; + +import net.minecraft.world.level.block.Blocks; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.*; + +/** + * @author SpicierSpace153 (kathryne) + * @reason change hardness so tinkers can aoe + */ + +@Unique +@Mixin(value = Blocks.class, remap = true) +public class BlocksMixin { + + @ModifyArg( + method = "", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;strength(F)Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;", + ordinal = 127), + index = 0) + private static float cosmiccore$modifyNetherrackHardness(float originalHardness) { + return 2.5f; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/CosmicCoreMixinPlugin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/CosmicCoreMixinPlugin.java new file mode 100644 index 000000000..a62b49ebf --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/CosmicCoreMixinPlugin.java @@ -0,0 +1,56 @@ +package com.ghostipedia.cosmiccore.mixin; + +import org.objectweb.asm.tree.ClassNode; +import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; +import org.spongepowered.asm.mixin.extensibility.IMixinInfo; + +import java.util.List; +import java.util.Set; + +/** + * Mixin plugin to conditionally load mixins based on mod presence. + * Prevents EMI mixins from loading when EMI is not present. + */ +public class CosmicCoreMixinPlugin implements IMixinConfigPlugin { + + private static final boolean EMI_LOADED; + + static { + // Check if EMI is present by looking for a resource file, not a class + // This avoids loading any class too early which would break mixins + EMI_LOADED = CosmicCoreMixinPlugin.class.getClassLoader() + .getResource("dev/emi/emi/api/EmiApi.class") != null; + } + + @Override + public void onLoad(String mixinPackage) {} + + @Override + public String getRefMapperConfig() { + return null; + } + + @Override + public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { + // Skip EMI mixins if EMI is not loaded + if (mixinClassName.contains(".emi.") && !EMI_LOADED) { + return false; + } + + return true; + } + + @Override + public void acceptTargets(Set myTargets, Set otherTargets) {} + + @Override + public List getMixins() { + return null; + } + + @Override + public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {} + + @Override + public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/DivingHelmetItemMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/DivingHelmetItemMixin.java index 2ebedfb16..41f5c3601 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/mixin/DivingHelmetItemMixin.java +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/DivingHelmetItemMixin.java @@ -3,7 +3,7 @@ import com.ghostipedia.cosmiccore.common.breath.OxygenHelper; import net.minecraft.world.entity.LivingEntity; -import net.minecraftforge.fluids.FluidType; +import net.minecraftforge.event.entity.living.LivingBreatheEvent; import com.simibubi.create.content.equipment.armor.DivingHelmetItem; import org.spongepowered.asm.mixin.Mixin; @@ -11,18 +11,21 @@ import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(value = DivingHelmetItem.class, remap = false) - public class DivingHelmetItemMixin { /** - * Activate helmet "if in water or lava" -> "if in water or bad air or lava" + * Activate helmet "if can't breathe or in lava" -> "if can't breathe or bad air or in lava" + * Redirects the event.canBreathe() check to also consider bad air quality. */ - @Redirect(method = "breatheUnderwater", at = @At(value = "INVOKE", - target = "Lnet/minecraft/world/entity/LivingEntity;canDrownInFluidType(Lnet/minecraftforge/fluids/FluidType;)Z")) - private static boolean cosmicCore$redirectCanDrownInFluidType(LivingEntity entity, FluidType fluidtype) { - return entity.isInFluidType() || - (fluidtype == (entity.getEyeInFluidType()) && OxygenHelper.airQualityActivatesHelmet(entity)); + target = "Lnet/minecraftforge/event/entity/living/LivingBreatheEvent;canBreathe()Z")) + private static boolean cosmicCore$redirectCanBreathe(LivingBreatheEvent event) { + LivingEntity entity = event.getEntity(); + // Return false (can't breathe) if air quality is bad, so helmet activates + if (OxygenHelper.airQualityActivatesHelmet(entity)) { + return false; + } + return event.canBreathe(); } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/GendustryJEIPluginMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/GendustryJEIPluginMixin.java new file mode 100644 index 000000000..79a5de397 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/GendustryJEIPluginMixin.java @@ -0,0 +1,20 @@ +package com.ghostipedia.cosmiccore.mixin; + +import mezz.jei.api.registration.ISubtypeRegistration; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import thedarkcolour.gendustry.compat.jei.GendustryJeiPlugin; +import thedarkcolour.gendustry.registry.GItems; + +@Mixin(value = GendustryJeiPlugin.class, remap = false) +public class GendustryJEIPluginMixin { + + /** + * @author - Ghostipedia + * @reason - TMRV Visual Compat for CosmicCore and Frontiers, the subtypeInterpreter doesn't work. + */ + @Overwrite + public void registerItemSubtypes(ISubtypeRegistration registration) { + registration.useNbtForSubtypes(GItems.GENE_SAMPLE.asItem()); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/IndustrialApiaryBeeModifierMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/IndustrialApiaryBeeModifierMixin.java new file mode 100644 index 000000000..7d9b5f94a --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/IndustrialApiaryBeeModifierMixin.java @@ -0,0 +1,183 @@ +package com.ghostipedia.cosmiccore.mixin; + +import com.ghostipedia.cosmiccore.common.data.CosmicGendustryUpgradeType; + +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; + +import forestry.core.inventory.IInventoryAdapter; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; +import thedarkcolour.gendustry.item.EliteGendustryUpgradeType; +import thedarkcolour.gendustry.item.GendustryUpgradeItem; +import thedarkcolour.gendustry.item.GendustryUpgradeType; +import thedarkcolour.gendustry.item.IGendustryUpgradeType; + +@Mixin(targets = "thedarkcolour.gendustry.blockentity.IndustrialApiaryBeeModifier", remap = false) +class IndustrialApiaryBeeModifierMixin { + + @Shadow + float territory; + @Shadow + float mutation; + @Shadow + float lifespan; + @Shadow + float productivity; + @Shadow + float pollination; + @Shadow + int throttle; + @Shadow + int fertility; + @Shadow + int temperature; + @Shadow + int humidity; + @Shadow + boolean automated; + @Shadow + boolean stabilized; + @Shadow + boolean weatherproof; + @Shadow + boolean lighting; + @Shadow + boolean sky; + @Shadow + boolean nether; + @Shadow + boolean scrubber; + @Shadow + boolean sieve; + + @Shadow + private void reset() { + this.territory = 1f; + this.mutation = 1f; + this.lifespan = 1f; + this.productivity = 1f; + this.pollination = 1f; + this.throttle = 0; + this.fertility = 0; + this.temperature = 0; + this.humidity = 0; + this.automated = false; + this.stabilized = false; + this.weatherproof = false; + this.lighting = false; + this.sky = false; + this.nether = false; + this.scrubber = false; + this.sieve = false; + } + + /** + * @author - Ghostipedia + * @reason - I need More Upgrades and this is hardcoded and socalizing with people scares me when i need things. + */ + @Overwrite + public int recalculate(IInventoryAdapter inventory) { + this.reset(); + int energyCost = 0; + + for (int i = 0; i < 4; ++i) { + ItemStack stack = inventory.getItem(2 + i); + Item item = stack.getItem(); + int count = stack.getCount(); + if (item instanceof GendustryUpgradeItem upgrade) { + IGendustryUpgradeType upgradeType = upgrade.getType(); + energyCost += upgradeType.energyCost() * count; + if (upgradeType instanceof GendustryUpgradeType) { + GendustryUpgradeType type = (GendustryUpgradeType) upgradeType; + switch (type) { + case AUTOMATION: + this.automated = true; + break; + case HEATER: + this.temperature += count; + break; + case COOLER: + this.temperature -= count; + break; + case HUMIDIFIER: + this.humidity += count; + break; + case DRYER: + this.humidity -= count; + break; + case POLLINATION: + this.pollination += 0.25F * (float) count; + break; + case SCRUBBER: + this.scrubber = true; + break; + case NETHER: + this.nether = true; + break; + case LIFESPAN: + this.lifespan += 2.0F * (float) count; + break; + case LIGHTING: + this.lighting = true; + break; + case PRODUCTIVITY: + this.productivity += 0.25F * (float) count; + break; + case WEATHERPROOF: + this.weatherproof = true; + break; + case SIEVE: + this.sieve = true; + break; + case SKY: + this.sky = true; + break; + case STABILIZER: + this.stabilized = true; + break; + case TERRITORY: + this.territory += 0.25F * (float) count; + } + } else if (upgradeType instanceof EliteGendustryUpgradeType) { + EliteGendustryUpgradeType type = (EliteGendustryUpgradeType) upgradeType; + switch (type) { + case MUTATION: + this.mutation += 0.25F; + break; + case ACTIVITY_SIMULATOR: + this.lighting = true; + this.sky = true; + this.weatherproof = true; + break; + case PRODUCTIVITY: + this.productivity += 0.25F * (float) count; + this.throttle += 15 * count; + break; + case TERRITORY: + this.territory += 0.25F * (float) count; + break; + case YOUTH: + this.mutation -= 0.2F * (float) count; + break; + case FERTILITY: + this.fertility += count; + } + } else if (upgradeType instanceof CosmicGendustryUpgradeType) { + CosmicGendustryUpgradeType type = (CosmicGendustryUpgradeType) upgradeType; + switch (type) { + case WAILING: + this.mutation = 1000F; + break; + case DECAYING: + this.lifespan = 1000f; + this.throttle = 10000; + } + } + } + } + + return energyCost; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/StarKillerMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/StarKillerMixin.java new file mode 100644 index 000000000..684b27f2e --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/StarKillerMixin.java @@ -0,0 +1,59 @@ +package com.ghostipedia.cosmiccore.mixin; + +import com.ghostipedia.cosmiccore.common.data.CosmicItems; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; + +import com.mojang.blaze3d.systems.RenderSystem; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(LevelRenderer.class) +public class StarKillerMixin { + + @Shadow + @Final + private Minecraft minecraft; + @Shadow + @Final + private static ResourceLocation SUN_LOCATION; + + private static final ResourceLocation COSMIC_SUN = new ResourceLocation("cosmiccore", + "textures/environment/blackhole.png"); + + // Redirect the exact moment vanilla binds a sky texture; swap only when it's the sun + @Redirect( + method = "renderSky", + at = @At( + value = "INVOKE", + target = "Lcom/mojang/blaze3d/systems/RenderSystem;setShaderTexture(ILnet/minecraft/resources/ResourceLocation;)V")) + private void cosmiccore$swapSunTexture(int unit, ResourceLocation original) { + // Only replace the SUN texture, leave MOON/stars/etc. alone + if (original.equals(SUN_LOCATION) && shouldUseCosmicSun()) { + RenderSystem.setShaderTexture(unit, COSMIC_SUN); + RenderSystem.setShaderColor(1f, 1f, 1f, 1f); + + RenderSystem.defaultBlendFunc(); + } else { + RenderSystem.setShaderTexture(unit, original); + } + } + + private boolean shouldUseCosmicSun() { + Player p = minecraft.player; + if (p == null) return false; + + ItemStack main = p.getMainHandItem(); + ItemStack off = p.getOffhandItem(); + var special = CosmicItems.ABERRANT_ESSENCE.get(); + + return main.is(special) || off.is(special); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/accessor/MBPatternAccessor.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/accessor/MBPatternAccessor.java new file mode 100644 index 000000000..4a9f5a16b --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/accessor/MBPatternAccessor.java @@ -0,0 +1,21 @@ +package com.ghostipedia.cosmiccore.mixin.accessor; + +import com.gregtechceu.gtceu.api.gui.widget.PatternPreviewWidget; +import com.gregtechceu.gtceu.api.pattern.TraceabilityPredicate; + +import net.minecraft.core.BlockPos; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.Map; + +/** + * Accessor mixin to access package-private fields in MBPattern inner class. + */ +@Mixin(value = PatternPreviewWidget.MBPattern.class, remap = false) +public interface MBPatternAccessor { + + @Accessor("predicateMap") + Map cosmiccore$getPredicateMap(); +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/ae2/AE2StyleManagerMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/ae2/AE2StyleManagerMixin.java deleted file mode 100644 index 98041e1a5..000000000 --- a/src/main/java/com/ghostipedia/cosmiccore/mixin/ae2/AE2StyleManagerMixin.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.ghostipedia.cosmiccore.mixin.ae2; - -import appeng.client.gui.style.StyleManager; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.ModifyVariable; - -@Mixin(value = StyleManager.class, remap = false) -public class AE2StyleManagerMixin { - - @ModifyVariable(method = "loadStyleDoc", at = @At("HEAD"), argsOnly = true) - private static String loadStyleDocHooks(String path) { - if (path.contains("wireless_pattern_encoding_terminal.json")) { - return "/screens/wtlib/modify_wireless_pattern_encoding_terminal.json"; - } else if (path.contains("pattern_encoding_terminal.json")) { - return "/screens/terminals/modify_pattern_encoding_terminal.json"; - } - return path; - } -} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/ae2/PatternEncodingTermMenuMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/ae2/PatternEncodingTermMenuMixin.java deleted file mode 100644 index 2c85256f8..000000000 --- a/src/main/java/com/ghostipedia/cosmiccore/mixin/ae2/PatternEncodingTermMenuMixin.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.ghostipedia.cosmiccore.mixin.ae2; - -import com.ghostipedia.cosmiccore.client.gui.IPatternEncodingTerminalMenu; - -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.inventory.MenuType; - -import appeng.api.stacks.GenericStack; -import appeng.api.storage.ITerminalHost; -import appeng.helpers.IMenuCraftingPacket; -import appeng.helpers.IPatternTerminalMenuHost; -import appeng.menu.me.common.MEStorageMenu; -import appeng.menu.me.items.PatternEncodingTermMenu; -import appeng.util.ConfigInventory; -import org.spongepowered.asm.mixin.*; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Debug( - export = true) -@Mixin(value = PatternEncodingTermMenu.class, remap = false) -public abstract class PatternEncodingTermMenuMixin extends MEStorageMenu - implements IMenuCraftingPacket, IPatternEncodingTerminalMenu { - - @Shadow(remap = false) - @Final - private ConfigInventory encodedInputsInv; - - @Shadow(remap = false) - @Final - private ConfigInventory encodedOutputsInv; - - public PatternEncodingTermMenuMixin(MenuType menuType, int id, Inventory ip, ITerminalHost host) { - super(menuType, id, ip, host); - } - - @Inject(method = "(Lnet/minecraft/world/inventory/MenuType;ILnet/minecraft/world/entity/player/Inventory;Lappeng/helpers/IPatternTerminalMenuHost;Z)V", - at = @At("TAIL"), - remap = false) - private void initHooks(MenuType menuType, int id, Inventory ip, IPatternTerminalMenuHost host, - boolean bindInventory, CallbackInfo ci) { - registerClientAction("modifyPattern", Integer.class, - this::cosCore$ModifyPattern); - } - - @Override - public void cosCore$ModifyPattern(Integer data) { - if (isClientSide()) { - sendClientAction("modifyPattern", data); - } else { - // modify - var output = cosCore$isValid(encodedOutputsInv, data); - if (output == null) { - return; - } - var input = cosCore$isValid(encodedInputsInv, data); - if (input == null) { - return; - } - for (int slot = 0; slot < output.length; ++slot) { - if (output[slot] != null) { - encodedOutputsInv.setStack(slot, output[slot]); - } - } - for (int slot = 0; slot < input.length; ++slot) { - if (input[slot] != null) { - encodedInputsInv.setStack(slot, input[slot]); - } - } - } - } - - @Unique - private static GenericStack[] cosCore$isValid(ConfigInventory inv, int data) { - boolean flag = data > 0; - if (!flag) { - data = -data; - } - GenericStack[] result = new GenericStack[inv.size()]; - for (int slot = 0; slot < inv.size(); ++slot) { - GenericStack stack = inv.getStack(slot); - if (stack != null) { - if (flag) { - if (data * stack.amount() > Integer.MAX_VALUE) { - return null; - } else { - result[slot] = new GenericStack(stack.what(), data * stack.amount()); - } - } else { - if (stack.amount() % data != 0) { - return null; - } else { - // 除尽 - result[slot] = new GenericStack(stack.what(), stack.amount() / data); - } - } - } - } - return result; - } -} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/ae2/PatternProviderLogicMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/ae2/PatternProviderLogicMixin.java deleted file mode 100644 index 0d88dc470..000000000 --- a/src/main/java/com/ghostipedia/cosmiccore/mixin/ae2/PatternProviderLogicMixin.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.ghostipedia.cosmiccore.mixin.ae2; - -import com.ghostipedia.cosmiccore.api.misc.ae2.BlockingMode; -import com.ghostipedia.cosmiccore.api.misc.ae2.CosmicBlockingSettings; -import com.ghostipedia.cosmiccore.api.misc.ae2.IPatternProviderLogic; -import com.ghostipedia.cosmiccore.api.misc.ae2.PatternProviderTargetCache; - -import net.minecraft.core.Direction; -import net.minecraft.server.level.ServerLevel; - -import appeng.api.networking.IManagedGridNode; -import appeng.api.networking.security.IActionSource; -import appeng.helpers.patternprovider.PatternProviderLogic; -import appeng.helpers.patternprovider.PatternProviderLogicHost; -import appeng.helpers.patternprovider.PatternProviderTarget; -import appeng.util.ConfigManager; -import org.jetbrains.annotations.Nullable; -import org.spongepowered.asm.mixin.*; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(value = PatternProviderLogic.class, priority = 10000) -public class PatternProviderLogicMixin implements IPatternProviderLogic { - - @Unique - private final PatternProviderTargetCache[] cosmicCore$targetCaches = new PatternProviderTargetCache[6]; - - @Shadow(remap = false) - @Final - private ConfigManager configManager; - - @Shadow(remap = false) - @Final - private PatternProviderLogicHost host; - - @Shadow(remap = false) - @Final - private IActionSource actionSource; - - @Inject(method = "(Lappeng/api/networking/IManagedGridNode;Lappeng/helpers/patternprovider/PatternProviderLogicHost;I)V", - at = @At("TAIL"), - remap = false) - private void PatternProviderLogic(IManagedGridNode mainNode, PatternProviderLogicHost host, - int patternInventorySize, CallbackInfo ci) { - configManager.registerSetting(CosmicBlockingSettings.BLOCKING_MODE, BlockingMode.ALL); - } - - @Override - public BlockingMode cosmicCore$getBlockingMode() { - return configManager.getSetting(CosmicBlockingSettings.BLOCKING_MODE); - } - - /** - * @author . - * @reason . - */ - @Overwrite(remap = false) - @Nullable - private PatternProviderTarget findAdapter(Direction side) { - if (cosmicCore$targetCaches[side.get3DDataValue()] == null) { - var thisBe = host.getBlockEntity(); - cosmicCore$targetCaches[side.get3DDataValue()] = new PatternProviderTargetCache(this, - (ServerLevel) thisBe.getLevel(), thisBe.getBlockPos().relative(side), side.getOpposite(), - actionSource); - } - @Nullable - PatternProviderTarget ret = cosmicCore$targetCaches[side.get3DDataValue()].find(); - return ret; - } -} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/ae2/PatternProviderMenuMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/ae2/PatternProviderMenuMixin.java deleted file mode 100644 index 41b3c9826..000000000 --- a/src/main/java/com/ghostipedia/cosmiccore/mixin/ae2/PatternProviderMenuMixin.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.ghostipedia.cosmiccore.mixin.ae2; - -import com.ghostipedia.cosmiccore.api.misc.ae2.BlockingMode; -import com.ghostipedia.cosmiccore.api.misc.ae2.CosmicBlockingSettings; -import com.ghostipedia.cosmiccore.api.misc.ae2.IPatternProviderMenu; - -import appeng.helpers.patternprovider.PatternProviderLogic; -import appeng.menu.guisync.GuiSync; -import appeng.menu.implementations.PatternProviderMenu; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(value = PatternProviderMenu.class) -public class PatternProviderMenuMixin implements IPatternProviderMenu { - - @Shadow(remap = false) - @Final - protected PatternProviderLogic logic; - - @Unique - @GuiSync(8) - private BlockingMode cosmicCore$UpgradedBlockingMode = BlockingMode.ALL; - - @Inject(method = "broadcastChanges", - at = @At(value = "INVOKE", - target = "Lappeng/helpers/patternprovider/PatternProviderLogic;getUnlockStack()Lappeng/api/stacks/GenericStack;", - remap = false)) - private void broadcastChanges(CallbackInfo ci) { - cosmicCore$UpgradedBlockingMode = logic.getConfigManager().getSetting(CosmicBlockingSettings.BLOCKING_MODE); - } - - @Override - public BlockingMode cosmicCore$getBlockingMode() { - return cosmicCore$UpgradedBlockingMode; - } -} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/ae2/PatternProviderScreenMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/ae2/PatternProviderScreenMixin.java deleted file mode 100644 index 8b12ae21f..000000000 --- a/src/main/java/com/ghostipedia/cosmiccore/mixin/ae2/PatternProviderScreenMixin.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.ghostipedia.cosmiccore.mixin.ae2; - -import com.ghostipedia.cosmiccore.api.misc.ae2.BlockingMode; -import com.ghostipedia.cosmiccore.api.misc.ae2.CosmicBlockingSettings; -import com.ghostipedia.cosmiccore.api.misc.ae2.IPatternProviderMenu; - -import net.minecraft.network.chat.Component; -import net.minecraft.world.entity.player.Inventory; - -import appeng.client.gui.AEBaseScreen; -import appeng.client.gui.implementations.PatternProviderScreen; -import appeng.client.gui.style.ScreenStyle; -import appeng.client.gui.widgets.ServerSettingToggleButton; -import appeng.client.gui.widgets.SettingToggleButton; -import appeng.menu.implementations.PatternProviderMenu; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(PatternProviderScreen.class) -public class PatternProviderScreenMixin extends AEBaseScreen { - - @Unique - private SettingToggleButton cosmicCore$UpgradedBlockingModebutton; - - protected PatternProviderScreenMixin(C menu, Inventory playerInventory, Component title, ScreenStyle style) { - super(menu, playerInventory, title, style); - } - - @Inject(method = "", at = @At("TAIL"), remap = false) - private void init(PatternProviderMenu menu, Inventory playerInventory, Component title, ScreenStyle style, - CallbackInfo ci) { - this.cosmicCore$UpgradedBlockingModebutton = new ServerSettingToggleButton<>( - CosmicBlockingSettings.BLOCKING_MODE, BlockingMode.ALL); - this.addToLeftToolbar(this.cosmicCore$UpgradedBlockingModebutton); - } - - @Inject(method = "updateBeforeRender", at = @At("TAIL"), remap = false) - private void updateBeforeRender(CallbackInfo ci) { - this.cosmicCore$UpgradedBlockingModebutton.set(((IPatternProviderMenu) menu).cosmicCore$getBlockingMode()); - } -} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/ae2/ProcessingEncodingPanelMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/ae2/ProcessingEncodingPanelMixin.java deleted file mode 100644 index 684994166..000000000 --- a/src/main/java/com/ghostipedia/cosmiccore/mixin/ae2/ProcessingEncodingPanelMixin.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.ghostipedia.cosmiccore.mixin.ae2; - -// CREDITS ; EasterFG & GTOCore for huge help on this mixin reference - -import com.ghostipedia.cosmiccore.client.gui.IPatternEncodingTerminalMenu; -import com.ghostipedia.cosmiccore.client.gui.ModifyIcon; -import com.ghostipedia.cosmiccore.client.gui.ModifyIconButton; - -import net.minecraft.network.chat.Component; - -import appeng.client.gui.WidgetContainer; -import appeng.client.gui.me.items.EncodingModePanel; -import appeng.client.gui.me.items.PatternEncodingTermScreen; -import appeng.client.gui.me.items.ProcessingEncodingPanel; -import org.spongepowered.asm.mixin.Debug; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Debug( - export = true) -@Mixin(value = ProcessingEncodingPanel.class, remap = false) -public abstract class ProcessingEncodingPanelMixin extends EncodingModePanel { - - @Unique - private ModifyIconButton cosCore$multTwo; - @Unique - private ModifyIconButton cosCore$multThree; - @Unique - private ModifyIconButton cosCore$multEight; - @Unique - private ModifyIconButton cosCore$divTwo; - @Unique - private ModifyIconButton cosCore$divThree; - @Unique - private ModifyIconButton cosCore$divEight; - - protected ProcessingEncodingPanelMixin(PatternEncodingTermScreen screen, WidgetContainer widgets) { - super(screen, widgets); - } - - @Inject(method = "", at = @At("TAIL"), remap = false) - private void init(PatternEncodingTermScreen screen, WidgetContainer widgets, CallbackInfo ci) { - System.out.println("HELP ME"); - cosCore$multTwo = new ModifyIconButton(b -> ((IPatternEncodingTerminalMenu) menu).cosCore$ModifyPattern(2), - ModifyIcon.MULTIPLY_2, - Component.translatable("coscore.pattern.multiply", 2), - Component.translatable("coscore.pattern.tooltip.multiply", 2)); - System.out.println("HELP ME2"); - cosCore$multThree = new ModifyIconButton(b -> ((IPatternEncodingTerminalMenu) menu).cosCore$ModifyPattern(3), - ModifyIcon.MULTIPLY_3, - Component.translatable("coscore.pattern.multiply", 3), - Component.translatable("coscore.pattern.tooltip.multiply", 3)); - System.out.println("HELP ME3"); - cosCore$multEight = new ModifyIconButton(b -> ((IPatternEncodingTerminalMenu) menu).cosCore$ModifyPattern(8), - ModifyIcon.MULTIPLY_8, - Component.translatable("coscore.pattern.multiply", 8), - Component.translatable("coscore.pattern.tooltip.multiply", 8)); - System.out.println("HELP ME4"); - cosCore$divTwo = new ModifyIconButton(b -> ((IPatternEncodingTerminalMenu) menu).cosCore$ModifyPattern(-2), - ModifyIcon.DIVISION_2, - Component.translatable("coscore.pattern.div", 2), - Component.translatable("coscore.pattern.tooltip.div", 2)); - System.out.println("HELP ME5"); - cosCore$divThree = new ModifyIconButton(b -> ((IPatternEncodingTerminalMenu) menu).cosCore$ModifyPattern(-3), - ModifyIcon.DIVISION_3, - Component.translatable("coscore.pattern.div", 3), - Component.translatable("coscore.pattern.tooltip.div", 3)); - System.out.println("HELP ME6"); - cosCore$divEight = new ModifyIconButton(b -> ((IPatternEncodingTerminalMenu) menu).cosCore$ModifyPattern(-8), - ModifyIcon.DIVISION_8, - Component.translatable("coscore.pattern.div", 8), - Component.translatable("coscore.pattern.tooltip.div", 8)); - - widgets.add("mult2", cosCore$multTwo); - widgets.add("mult3", cosCore$multThree); - widgets.add("mult8", cosCore$multEight); - widgets.add("div2", cosCore$divTwo); - widgets.add("div3", cosCore$divThree); - widgets.add("div8", cosCore$divEight); - } - - @Inject(method = "setVisible", at = @At("TAIL"), remap = false) - private void setVisibleHooks(boolean visible, CallbackInfo ci) { - cosCore$multTwo.setVisibility(visible); - cosCore$multThree.setVisibility(visible); - cosCore$multEight.setVisibility(visible); - cosCore$divTwo.setVisibility(visible); - cosCore$divThree.setVisibility(visible); - cosCore$divEight.setVisibility(visible); - } -} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/ae2/SettingToggleButtonMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/ae2/SettingToggleButtonMixin.java deleted file mode 100644 index cef71d29f..000000000 --- a/src/main/java/com/ghostipedia/cosmiccore/mixin/ae2/SettingToggleButtonMixin.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.ghostipedia.cosmiccore.mixin.ae2; - -import com.ghostipedia.cosmiccore.api.misc.ae2.BlockingMode; -import com.ghostipedia.cosmiccore.api.misc.ae2.CosmicBlockingSettings; - -import net.minecraft.network.chat.Component; - -import appeng.api.config.CondenserOutput; -import appeng.api.config.Setting; -import appeng.api.config.Settings; -import appeng.client.gui.Icon; -import appeng.client.gui.widgets.SettingToggleButton; -import appeng.core.localization.ButtonToolTips; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -@Mixin(SettingToggleButton.class) -public class SettingToggleButtonMixin { - - @Shadow(remap = false) - private static > void registerApp(Icon icon, Setting setting, T val, ButtonToolTips title, - ButtonToolTips hint) {} - - @Shadow(remap = false) - private static > void registerApp(Icon icon, Setting setting, T val, ButtonToolTips title, - Component... tooltipLines) {} - - @Redirect(method = "(Lappeng/api/config/Setting;Ljava/lang/Enum;Ljava/util/function/Predicate;Lappeng/client/gui/widgets/SettingToggleButton$IHandler;)V", - at = @At(value = "INVOKE", - target = "Lappeng/client/gui/widgets/SettingToggleButton;registerApp(Lappeng/client/gui/Icon;Lappeng/api/config/Setting;Ljava/lang/Enum;Lappeng/core/localization/ButtonToolTips;Lappeng/core/localization/ButtonToolTips;)V", - ordinal = 0), - remap = false) - private > void register(Icon icon, Setting setting, T val, ButtonToolTips title, - ButtonToolTips hint) { - registerApp(Icon.CONDENSER_OUTPUT_TRASH, Settings.CONDENSER_OUTPUT, CondenserOutput.TRASH, - ButtonToolTips.CondenserOutput, - ButtonToolTips.Trash); - // Naming and Functions were wrong, - // - registerApp(Icon.BLOCKING_MODE_YES, CosmicBlockingSettings.BLOCKING_MODE, BlockingMode.ALL, - ButtonToolTips.InterfaceBlockingMode, - Component.translatable("cosmiccore.pattern_block_mode.block_all")); // Will block pushing patterns if - // there is anything contained in - // just the target inv - registerApp(Icon.BLOCKING_MODE_NO, CosmicBlockingSettings.BLOCKING_MODE, BlockingMode.CONTAINS_SIMILAR, - ButtonToolTips.InterfaceBlockingMode, - Component.translatable("cosmiccore.pattern_block_mode.default_blocking_behavior")); // Default blocking - // behavior, ignores - // catalysts/non-pattern - // items/fluids - registerApp(Icon.BLOCKING_MODE_NO, CosmicBlockingSettings.BLOCKING_MODE, BlockingMode.CONTAINS, - ButtonToolTips.InterfaceBlockingMode, - Component.translatable("cosmiccore.pattern_block_mode.allow_similar_patterns_only")); // If the provider - // attempts to - // push a recipe - // that MATCHES - // the inventory - // contents, allow - // it. But do not - // allow pushing - // of other - // patterns. - } -} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/ae2/SettingsMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/ae2/SettingsMixin.java deleted file mode 100644 index d13477492..000000000 --- a/src/main/java/com/ghostipedia/cosmiccore/mixin/ae2/SettingsMixin.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.ghostipedia.cosmiccore.mixin.ae2; - -import com.ghostipedia.cosmiccore.api.misc.ae2.BlockingMode; -import com.ghostipedia.cosmiccore.api.misc.ae2.CosmicBlockingSettings; - -import appeng.api.config.Setting; -import appeng.api.config.Settings; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(Settings.class) -public class SettingsMixin { - - @SafeVarargs - @Shadow(remap = false) - private static > Setting register(String name, T firstOption, T... moreOptions) { - return null; - } - - @Inject(method = "", at = @At("TAIL"), remap = false) - private static void init(CallbackInfo ci) { - CosmicBlockingSettings.BLOCKING_MODE = register("blocking_type", BlockingMode.ALL, BlockingMode.CONTAINS, - BlockingMode.CONTAINS_SIMILAR); - } -} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/client/CosmicCoreRemainingAirOverlayMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/client/CosmicCoreRemainingAirOverlayMixin.java index 1f106838e..daca54a7c 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/mixin/client/CosmicCoreRemainingAirOverlayMixin.java +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/client/CosmicCoreRemainingAirOverlayMixin.java @@ -3,21 +3,30 @@ import com.ghostipedia.cosmiccore.common.breath.OxygenHelper; import net.minecraft.client.player.LocalPlayer; -import net.minecraft.tags.FluidTags; -import net.minecraft.tags.TagKey; +import net.minecraftforge.fluids.FluidType; import com.simibubi.create.content.equipment.armor.RemainingAirOverlay; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; -@Mixin(value = RemainingAirOverlay.class) +@Mixin(value = RemainingAirOverlay.class, remap = false) public class CosmicCoreRemainingAirOverlayMixin { + /** + * Make the air overlay show when air quality is bad, even if not in fluid. + * Redirects the fluidType.isAir() check to return false when bad air activates helmet. + */ @Redirect(method = "render", at = @At(value = "INVOKE", - target = "Lnet/minecraft/client/player/LocalPlayer;isEyeInFluid(Lnet/minecraft/tags/TagKey;)Z")) - private boolean render(LocalPlayer instance, TagKey tagKey) { - return instance.isEyeInFluid(FluidTags.WATER) || OxygenHelper.airQualityActivatesHelmet(instance); + target = "Lnet/minecraftforge/fluids/FluidType;isAir()Z"), + remap = false) + private boolean cosmicCore$redirectIsAir(FluidType fluidType) { + LocalPlayer player = net.minecraft.client.Minecraft.getInstance().player; + // If air quality is bad, pretend we're NOT in air so overlay shows + if (player != null && OxygenHelper.airQualityActivatesHelmet(player)) { + return false; + } + return fluidType.isAir(); } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/client/PatternPreviewWidgetMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/client/PatternPreviewWidgetMixin.java new file mode 100644 index 000000000..4b59ff006 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/client/PatternPreviewWidgetMixin.java @@ -0,0 +1,53 @@ +package com.ghostipedia.cosmiccore.mixin.client; + +import com.ghostipedia.cosmiccore.mixin.accessor.MBPatternAccessor; + +import com.gregtechceu.gtceu.api.gui.widget.PatternPreviewWidget; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +/** + * Mixin to fix NPE crash when clicking on blocks in EMI multiblock preview + * when the pattern uses predicates that accept air (for tiered multiblocks). + * + * The crash occurs because patterns[index].predicateMap is null when the + * pattern's checkPatternAt() fails during preview generation (which happens + * when tier-detecting predicates accept air instead of actual blocks). + */ +@Mixin(value = PatternPreviewWidget.class, remap = false) +public abstract class PatternPreviewWidgetMixin { + + @Shadow + @Final + public PatternPreviewWidget.MBPattern[] patterns; + + @Shadow + private int index; + + /** + * Inject at the head of onPosSelected to bail out early if predicateMap is null. + * This prevents the NPE crash while still allowing the preview to render. + */ + @Inject(method = "onPosSelected", at = @At("HEAD"), cancellable = true) + private void cosmiccore$preventNullPredicateMapCrash(BlockPos pos, Direction facing, CallbackInfo ci) { + if (patterns != null && index >= 0 && index < patterns.length) { + PatternPreviewWidget.MBPattern pattern = patterns[index]; + if (pattern != null) { + // Use accessor to check if predicateMap is null + var predicateMap = ((MBPatternAccessor) (Object) pattern).cosmiccore$getPredicateMap(); + if (predicateMap == null) { + // predicateMap is null, bail out to prevent NPE + ci.cancel(); + } + } + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/embers/EmberDialBlockMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/embers/EmberDialBlockMixin.java new file mode 100644 index 000000000..138fa7671 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/embers/EmberDialBlockMixin.java @@ -0,0 +1,35 @@ +package com.ghostipedia.cosmiccore.mixin.embers; + +import com.gregtechceu.gtceu.utils.FormattingUtil; + +import net.minecraft.core.Direction; +import net.minecraft.network.chat.Component; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import com.llamalad7.mixinextras.sugar.Local; +import com.rekindled.embers.block.EmberDialBlock; +import com.rekindled.embers.blockentity.EmberDialBlockEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.ArrayList; + +@Mixin(value = EmberDialBlock.class, remap = false) +public class EmberDialBlockMixin { + + @OnlyIn(Dist.CLIENT) + @Inject(method = "getBEData", + at = @At(value = "INVOKE", + target = "Lcom/rekindled/embers/block/EmberDialBlock;formatEmber(DD)Lnet/minecraft/network/chat/MutableComponent;"), + cancellable = true) + public void formatEmber(Direction facing, ArrayList text, BlockEntity blockEntity, int maxLines, + CallbackInfo ci, @Local EmberDialBlockEntity dial) { + text.add(Component.translatable("embers.tooltip.emberdial.ember", FormattingUtil.formatNumbers(dial.ember), + FormattingUtil.formatNumbers(dial.capacity))); + ci.cancel(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/emi/EmiApiMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/emi/EmiApiMixin.java index 2d30b379a..659f3e650 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/mixin/emi/EmiApiMixin.java +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/emi/EmiApiMixin.java @@ -17,7 +17,6 @@ import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyVariable; - // Credits ; GTOCore - Thank you for this amazing mixin! @Mixin(value = EmiApi.class, remap = false) diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/emi/EmiFavoritesMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/emi/EmiFavoritesMixin.java new file mode 100644 index 000000000..ebb21ef60 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/emi/EmiFavoritesMixin.java @@ -0,0 +1,58 @@ +package com.ghostipedia.cosmiccore.mixin.emi; + +import com.ghostipedia.cosmiccore.integration.emi.CosmicFavorite; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import dev.emi.emi.runtime.EmiFavorite; +import dev.emi.emi.runtime.EmiFavorites; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.List; + +/** + * Persists CosmicFavorite amounts through EMI's save/load cycle. + */ +@Mixin(value = EmiFavorites.class, remap = false) +public class EmiFavoritesMixin { + + @Shadow + public static List favorites; + + @Inject(method = "save", at = @At("RETURN")) + private static void cosmiccore$saveAmounts(CallbackInfoReturnable cir) { + JsonArray arr = cir.getReturnValue(); + if (arr == null) return; + + for (int i = 0; i < favorites.size() && i < arr.size(); i++) { + if (favorites.get(i) instanceof CosmicFavorite cosmic) { + JsonElement el = arr.get(i); + if (el.isJsonObject()) { + el.getAsJsonObject().addProperty("cosmicAmount", cosmic.getAmount()); + } + } + } + } + + @Inject(method = "load", at = @At("RETURN")) + private static void cosmiccore$loadAmounts(JsonArray arr, CallbackInfo ci) { + if (arr == null) return; + + for (int i = 0; i < arr.size() && i < favorites.size(); i++) { + JsonElement el = arr.get(i); + if (!el.isJsonObject()) continue; + + JsonObject obj = el.getAsJsonObject(); + if (!obj.has("cosmicAmount")) continue; + + long amount = obj.get("cosmicAmount").getAsLong(); + favorites.set(i, new CosmicFavorite(favorites.get(i).getStack(), amount)); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/emi/EmiScreenManagerMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/emi/EmiScreenManagerMixin.java new file mode 100644 index 000000000..1656179b4 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/emi/EmiScreenManagerMixin.java @@ -0,0 +1,103 @@ +package com.ghostipedia.cosmiccore.mixin.emi; + +import com.ghostipedia.cosmiccore.integration.emi.CosmicFavorite; +import com.ghostipedia.cosmiccore.integration.emi.RecipeScreenAccessor; + +import net.minecraft.client.Minecraft; + +import dev.emi.emi.api.stack.EmiIngredient; +import dev.emi.emi.api.stack.EmiStack; +import dev.emi.emi.api.stack.EmiStackInteraction; +import dev.emi.emi.config.EmiConfig; +import dev.emi.emi.config.SidebarType; +import dev.emi.emi.input.EmiInput; +import dev.emi.emi.registry.EmiStackProviders; +import dev.emi.emi.runtime.EmiFavorites; +import dev.emi.emi.screen.EmiScreenManager; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +/** + * Adds CTRL+A to pin stacks with their amount, and CTRL+scroll to adjust pinned amounts. + */ +@Mixin(value = EmiScreenManager.class, remap = false) +public abstract class EmiScreenManagerMixin { + + @Shadow + private static int lastMouseX; + @Shadow + private static int lastMouseY; + + @Shadow + public static EmiStackInteraction getHoveredStack(int mouseX, int mouseY, boolean notClick) { + throw new AssertionError(); + } + + @Shadow + public static void repopulatePanels(SidebarType type) { + throw new AssertionError(); + } + + // CTRL+A: pin with amount + @Inject(method = "keyPressed", at = @At("HEAD"), cancellable = true) + private static void cosmiccore$ctrlAPin(int keyCode, int scanCode, int modifiers, + CallbackInfoReturnable cir) { + boolean ctrl = EmiInput.isControlDown(); + boolean shift = EmiInput.isShiftDown(); + boolean isFavKey = cosmiccore$isFavoriteKey(keyCode); + + if (!ctrl || shift) return; + if (!isFavKey) return; + + // Try sidebar first, then recipe screen, then stack providers + EmiIngredient hoveredIngredient = EmiStack.EMPTY; + + EmiStackInteraction sidebarHovered = getHoveredStack(lastMouseX, lastMouseY, true); + if (!sidebarHovered.getStack().isEmpty()) { + hoveredIngredient = sidebarHovered.getStack(); + } else { + var screen = Minecraft.getInstance().screen; + if (screen instanceof RecipeScreenAccessor recipeScreen) { + hoveredIngredient = recipeScreen.getHoveredStack(); + } + if (hoveredIngredient.isEmpty() && screen != null) { + hoveredIngredient = EmiStackProviders.getStackAt(screen, lastMouseX, lastMouseY, true).getStack(); + } + } + + if (hoveredIngredient.isEmpty()) return; + + long amount = hoveredIngredient.getEmiStacks().isEmpty() ? 1 : + hoveredIngredient.getEmiStacks().get(0).getAmount(); + if (amount <= 0) amount = 1; + + EmiFavorites.addFavorite(new CosmicFavorite(hoveredIngredient, amount), null); + repopulatePanels(SidebarType.FAVORITES); + cir.setReturnValue(true); + } + + @Inject(method = "mouseScrolled", at = @At("HEAD"), cancellable = true) + private static void cosmiccore$ctrlScrollAdjust(double mouseX, double mouseY, double scrollDelta, + CallbackInfoReturnable cir) { + if (!EmiInput.isControlDown()) return; + + EmiStackInteraction hovered = getHoveredStack((int) mouseX, (int) mouseY, true); + if (!(hovered.getStack() instanceof CosmicFavorite fav)) return; + + long step = fav.getScrollStep(EmiInput.isShiftDown()); + fav.adjustAmount((long) scrollDelta * step); + + repopulatePanels(SidebarType.FAVORITES); + cir.setReturnValue(true); + } + + @Unique + private static boolean cosmiccore$isFavoriteKey(int keyCode) { + return EmiConfig.favorite.boundKeys.stream() + .anyMatch(k -> k.key().getValue() == keyCode); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/emi/RecipeScreenMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/emi/RecipeScreenMixin.java index 14ea963e6..af38da3eb 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/mixin/emi/RecipeScreenMixin.java +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/emi/RecipeScreenMixin.java @@ -1,10 +1,16 @@ package com.ghostipedia.cosmiccore.mixin.emi; +import com.ghostipedia.cosmiccore.integration.emi.RecipeScreenAccessor; + import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; import dev.emi.emi.api.EmiApi; +import dev.emi.emi.api.stack.EmiIngredient; +import dev.emi.emi.api.stack.EmiStack; import dev.emi.emi.api.widget.Bounds; +import dev.emi.emi.api.widget.SlotWidget; +import dev.emi.emi.api.widget.Widget; import dev.emi.emi.config.EmiConfig; import dev.emi.emi.config.SidebarSide; import dev.emi.emi.screen.RecipeScreen; @@ -19,8 +25,8 @@ import java.util.List; -@Mixin(RecipeScreen.class) -public abstract class RecipeScreenMixin extends Screen { +@Mixin(value = RecipeScreen.class, remap = false) +public abstract class RecipeScreenMixin extends Screen implements RecipeScreenAccessor { @Shadow(remap = false) int x; @@ -47,10 +53,6 @@ protected RecipeScreenMixin(Component title) { @Shadow(remap = false) private int tab; - @Override - @Shadow(remap = false) - public abstract void onClose(); - @Shadow(remap = false) private List currentPage; @@ -59,7 +61,8 @@ protected RecipeScreenMixin(Component title) { target = "Ldev/emi/emi/EmiRenderHelper;drawNinePatch(Ldev/emi/emi/runtime/EmiDrawContext;Lnet/minecraft/resources/ResourceLocation;IIIIIIII)V", ordinal = 4, remap = false), - index = 2) + index = 2, + require = 0) private int modifyx(int x) { return x + 18 - 18 * cosmicCore$getList(cosmicCore$getWorkstationAmount()); } @@ -69,7 +72,8 @@ private int modifyx(int x) { target = "Ldev/emi/emi/EmiRenderHelper;drawNinePatch(Ldev/emi/emi/runtime/EmiDrawContext;Lnet/minecraft/resources/ResourceLocation;IIIIIIII)V", ordinal = 4, remap = false), - index = 4) + index = 4, + require = 0) private int modifyw(int x) { return x - 18 + 18 * cosmicCore$getList(cosmicCore$getWorkstationAmount()); } @@ -79,7 +83,8 @@ private int modifyw(int x) { target = "Ldev/emi/emi/EmiRenderHelper;drawNinePatch(Ldev/emi/emi/runtime/EmiDrawContext;Lnet/minecraft/resources/ResourceLocation;IIIIIIII)V", ordinal = 4, remap = false), - index = 5) + index = 5, + require = 0) private int modifyh(int x) { return 10 + Math.min(cosmicCore$getWorkstationAmount(), cosmicCore$maxWorkstations()) * 18 + getResolveOffset(); } @@ -135,4 +140,29 @@ public int getMaxWorkstations() { default -> 0; }; } + + /** + * Gets the hovered stack from the recipe screen for CTRL+A pinning. + * Iterates through current page widgets to find SlotWidgets under the mouse. + */ + @Unique + public EmiIngredient getHoveredStack() { + if (currentPage == null) return EmiStack.EMPTY; + + double mouseX = minecraft.mouseHandler.xpos() * (double) width / (double) minecraft.getWindow().getWidth(); + double mouseY = minecraft.mouseHandler.ypos() * (double) height / (double) minecraft.getWindow().getHeight(); + + for (WidgetGroup group : currentPage) { + for (Widget widget : group.widgets) { + if (widget instanceof SlotWidget slot) { + Bounds bounds = slot.getBounds(); + if (mouseX >= bounds.x() && mouseX < bounds.x() + bounds.width() && mouseY >= bounds.y() && + mouseY < bounds.y() + bounds.height()) { + return slot.getStack(); + } + } + } + } + return EmiStack.EMPTY; + } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/frontiers/MinecraftRemoveOxygenMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/frontiers/MinecraftRemoveOxygenMixin.java new file mode 100644 index 000000000..1b0007d0b --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/frontiers/MinecraftRemoveOxygenMixin.java @@ -0,0 +1,33 @@ +package com.ghostipedia.cosmiccore.mixin.frontiers; + +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +/** + * Disables vanilla Minecraft's air/drowning system for players. + * CosmicCore's oxygen system handles all breathing mechanics instead. + */ +@Mixin(LivingEntity.class) +public class MinecraftRemoveOxygenMixin { + + @Inject(method = "decreaseAirSupply", at = @At("HEAD"), cancellable = true) + private void cosmiccore$noPlayerAirDecrease(int currentAir, CallbackInfoReturnable cir) { + LivingEntity self = (LivingEntity) (Object) this; + if (self instanceof Player) { + cir.setReturnValue(self.getMaxAirSupply()); // stays full + } + } + + @Inject(method = "increaseAirSupply", at = @At("HEAD"), cancellable = true) + private void cosmiccore$noPlayerAirIncrease(int currentAir, CallbackInfoReturnable cir) { + LivingEntity self = (LivingEntity) (Object) this; + if (self instanceof Player) { + cir.setReturnValue(self.getMaxAirSupply()); // stays full + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/ElectricContainerBlockProviderMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/ElectricContainerBlockProviderMixin.java new file mode 100644 index 000000000..a32c4a9e9 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/ElectricContainerBlockProviderMixin.java @@ -0,0 +1,27 @@ +package com.ghostipedia.cosmiccore.mixin.gtceu; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.StellarBaseModule; + +import com.gregtechceu.gtceu.api.capability.IEnergyInfoProvider; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; +import com.gregtechceu.gtceu.integration.jade.provider.ElectricContainerBlockProvider; + +import net.minecraft.nbt.CompoundTag; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(value = ElectricContainerBlockProvider.class, remap = false) +public class ElectricContainerBlockProviderMixin { + + @Inject(method = "write", at = @At("HEAD"), cancellable = true) + private void cosmicCore$skipStellarModule(CompoundTag data, IEnergyInfoProvider capability, CallbackInfo ci) { + if (capability instanceof NotifiableEnergyContainer container) { + if (container.getMachine() instanceof StellarBaseModule) { + ci.cancel(); + } + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/MetaMachineBlockEntityMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/MetaMachineBlockEntityMixin.java index caa53207a..e7ef7fb33 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/MetaMachineBlockEntityMixin.java +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/MetaMachineBlockEntityMixin.java @@ -23,7 +23,6 @@ public class MetaMachineBlockEntityMixin { - // Specifically target the getCapability(Machine, Capability, Direction) method @Inject(method = "getCapability(Lcom/gregtechceu/gtceu/api/machine/MetaMachine;Lnet/minecraftforge/common/capabilities/Capability;Lnet/minecraft/core/Direction;)Lnet/minecraftforge/common/util/LazyOptional;", at = @At("TAIL"), cancellable = true) @@ -31,14 +30,9 @@ private static void injectCapability(MetaMachine machine, @NotNull Capability cap, @Nullable Direction side, CallbackInfoReturnable> cir) { - if (cap == EmbersCapabilities.EMBER_CAPABILITY) { - if (machine instanceof EmberHatchPartMachine emberHatch) { - cir.setReturnValue(EmbersCapabilities.EMBER_CAPABILITY.orEmpty(cap, - LazyOptional.of(() -> emberHatch.emberContainer.capability))); - return; - } - + if (cap == EmbersCapabilities.EMBER_CAPABILITY && machine instanceof EmberHatchPartMachine emberHatch) { + cir.setReturnValue(EmbersCapabilities.EMBER_CAPABILITY.orEmpty(cap, + LazyOptional.of(() -> emberHatch.emberContainer.capability))); } - cir.setReturnValue(LazyOptional.empty()); } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/MetaMachineBlockMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/MetaMachineBlockMixin.java new file mode 100644 index 000000000..ce79670dc --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/MetaMachineBlockMixin.java @@ -0,0 +1,69 @@ +package com.ghostipedia.cosmiccore.mixin.gtceu; + +import com.ghostipedia.cosmiccore.api.misc.IMetaMachineMixin; +import com.ghostipedia.cosmiccore.common.item.tcon.TiconUtils; +import com.ghostipedia.cosmiccore.common.item.tcon.base.ChargableModifiableItem; + +import com.gregtechceu.gtceu.api.block.MetaMachineBlock; +import com.gregtechceu.gtceu.api.item.tool.ToolHelper; +import com.gregtechceu.gtceu.api.machine.MetaMachine; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; + +import com.llamalad7.mixinextras.sugar.Local; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import slimeknights.tconstruct.library.tools.helper.ToolDamageUtil; +import slimeknights.tconstruct.library.tools.item.ModifiableItem; + +@Mixin(value = MetaMachineBlock.class, remap = false) +public class MetaMachineBlockMixin { + + @Inject(method = "use", + at = @At(value = "INVOKE", + target = "Lcom/gregtechceu/gtceu/api/item/tool/ToolHelper;getToolTypes(Lnet/minecraft/world/item/ItemStack;)Ljava/util/Set;"), + cancellable = true) + public void cosmicCore$use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, + BlockHitResult hit, + CallbackInfoReturnable cir, @Local MetaMachine machine, + @Local ItemStack itemStack) { + if (itemStack.getItem() instanceof ModifiableItem ticonTool) { + var result = ((IMetaMachineMixin) machine).ccore$onToolClick(ticonTool, + new UseOnContext(player, hand, hit)); + if (result.getSecond() == InteractionResult.CONSUME && player instanceof ServerPlayer serverPlayer) { + ToolHelper.playToolSound(TiconUtils.getGTToolType(result.getFirst()), serverPlayer); + + if (!serverPlayer.isCreative()) { + if (ticonTool instanceof ChargableModifiableItem electricItem) { + + long energyCost = electricItem.ENERGY_COST; + long available = electricItem.getCharge(itemStack); + if (available >= energyCost) { + electricItem.discharge(itemStack, energyCost, false); + + } else { + ToolDamageUtil.handleDamageItem(itemStack, 1, player, p -> {}); + } + } + + } + } + + if (result.getSecond() != InteractionResult.PASS) { + cir.setReturnValue(result.getSecond()); + cir.cancel(); + } + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/MetaMachineMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/MetaMachineMixin.java new file mode 100644 index 000000000..481f58279 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/MetaMachineMixin.java @@ -0,0 +1,103 @@ +package com.ghostipedia.cosmiccore.mixin.gtceu; + +import com.ghostipedia.cosmiccore.api.misc.IMetaMachineMixin; +import com.ghostipedia.cosmiccore.common.item.tcon.CosmicToolDefinitions; +import com.ghostipedia.cosmiccore.common.item.tcon.TiconUtils; +import com.ghostipedia.cosmiccore.common.item.tcon.base.ChargableModifiableItem; +import com.ghostipedia.cosmiccore.common.item.tcon.modifiers.WrenchModeSwitchModifier; + +import com.gregtechceu.gtceu.api.capability.ICoverable; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputFluid; +import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; + +import net.minecraft.core.Direction; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.phys.BlockHitResult; + +import com.mojang.datafixers.util.Pair; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import slimeknights.tconstruct.library.tools.definition.ToolDefinition; +import slimeknights.tconstruct.library.tools.item.ModifiableItem; +import slimeknights.tconstruct.library.tools.nbt.ToolStack; + +@Mixin(MetaMachine.class) +public class MetaMachineMixin implements IMetaMachineMixin { + + public Pair ccore$onToolClick(ModifiableItem ticonItem, UseOnContext context) { + var hitResult = new BlockHitResult(context.getClickLocation(), context.getClickedFace(), + context.getClickedPos(), false); + Direction gridSide = ICoverable.determineGridSideHit(hitResult); + if (gridSide == null) gridSide = hitResult.getDirection(); + if (context.getPlayer() == null) Pair.of(null, InteractionResult.PASS); + + if (ticonItem.getToolDefinition() == CosmicToolDefinitions.WRENCHES) { + if (ticonItem instanceof ChargableModifiableItem electricItem) { + ItemStack stack = context.getItemInHand(); + long energyCost = electricItem.ENERGY_COST; + long available = electricItem.getCharge(stack); + if (available >= energyCost) { + electricItem.discharge(stack, energyCost, false); + return Pair.of(ticonItem.getToolDefinition(), + onWrenchClick(context.getPlayer(), context.getHand(), gridSide, hitResult)); + } else { + return Pair.of(ticonItem.getToolDefinition(), InteractionResult.PASS); + } + } + return Pair.of(ticonItem.getToolDefinition(), + onWrenchClick(context.getPlayer(), context.getHand(), gridSide, hitResult)); + } + return Pair.of(null, InteractionResult.PASS); + } + + @Unique + private InteractionResult onWrenchClick(Player playerIn, InteractionHand hand, Direction gridSide, + BlockHitResult hitResult) { + ItemStack stack = playerIn.getItemInHand(hand); + var tool = ToolStack.from(stack); + var modList = TiconUtils.getModifierList(tool); + + if (gridSide == ((MetaMachine) (Object) this).getFrontFacing() && + ((MetaMachine) (Object) this).allowExtendedFacing()) { + ((MetaMachine) (Object) this).setUpwardsFacing( + playerIn.isShiftKeyDown() ? ((MetaMachine) (Object) this).getUpwardsFacing().getCounterClockWise() : + ((MetaMachine) (Object) this).getUpwardsFacing().getClockWise()); + return InteractionResult.sidedSuccess(((MetaMachine) (Object) this).isRemote()); + } + if (playerIn.isShiftKeyDown()) { + if (gridSide == ((MetaMachine) (Object) this).getFrontFacing() || + !((MetaMachine) (Object) this).isFacingValid(gridSide)) { + return InteractionResult.FAIL; + } + ((MetaMachine) (Object) this).setFrontFacing(gridSide); + } else { + for (var mod : modList) { + if (mod.getModifier() instanceof WrenchModeSwitchModifier wmsm) { + var type = wmsm.getType(tool); + + if (type.isItem()) { + if (((MetaMachine) (Object) this) instanceof IAutoOutputItem autoOutputItem && + (!((MetaMachine) (Object) this).hasFrontFacing() || + gridSide != ((MetaMachine) (Object) this).getFrontFacing())) { + autoOutputItem.setOutputFacingItems(gridSide); + } + } + if (type.isFluid()) { + if (((MetaMachine) (Object) this) instanceof IAutoOutputFluid autoOutputFluid && + (!((MetaMachine) (Object) this).hasFrontFacing() || + gridSide != ((MetaMachine) (Object) this).getFrontFacing())) { + autoOutputFluid.setOutputFacingFluids(gridSide); + } + } + + } + } + } + return InteractionResult.sidedSuccess(((MetaMachine) (Object) this).isRemote()); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/ParallelProviderMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/ParallelProviderMixin.java index 7ac36b32a..cecabf7ec 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/ParallelProviderMixin.java +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/ParallelProviderMixin.java @@ -1,5 +1,6 @@ package com.ghostipedia.cosmiccore.mixin.gtceu; +import com.ghostipedia.cosmiccore.api.machine.multiblock.StellarBaseModule; import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.PCBFoundryMachine; import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; @@ -22,6 +23,15 @@ @Mixin(value = ParallelProvider.class, remap = false) public abstract class ParallelProviderMixin { + @Inject(method = "appendServerData", at = @At("HEAD"), cancellable = true) + public void cosmicCore$skipStellarModule(CompoundTag compoundTag, BlockAccessor blockAccessor, CallbackInfo ci) { + if (blockAccessor.getBlockEntity() instanceof MetaMachineBlockEntity blockEntity) { + if (blockEntity.getMetaMachine() instanceof StellarBaseModule) { + ci.cancel(); + } + } + } + @Inject(method = "appendServerData", at = @At(value = "INVOKE", target = "Lnet/minecraft/nbt/CompoundTag;putInt(Ljava/lang/String;I)V", diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/PipeBlockEntityMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/PipeBlockEntityMixin.java new file mode 100644 index 000000000..5f5cb7ecd --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/PipeBlockEntityMixin.java @@ -0,0 +1,67 @@ +package com.ghostipedia.cosmiccore.mixin.gtceu; + +import com.ghostipedia.cosmiccore.api.misc.IPipeBlockEntityMixin; +import com.ghostipedia.cosmiccore.common.item.tcon.CosmicToolDefinitions; +import com.ghostipedia.cosmiccore.common.item.tcon.TiconUtils; + +import com.gregtechceu.gtceu.api.blockentity.PipeBlockEntity; +import com.gregtechceu.gtceu.api.capability.ICoverable; +import com.gregtechceu.gtceu.api.cover.CoverBehavior; +import com.gregtechceu.gtceu.api.pipenet.PipeCoverContainer; + +import net.minecraft.core.Direction; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.phys.BlockHitResult; + +import com.mojang.datafixers.util.Pair; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import slimeknights.tconstruct.library.tools.definition.ToolDefinition; +import slimeknights.tconstruct.library.tools.item.ModifiableItem; + +@Mixin(value = PipeBlockEntity.class, remap = false) +public class PipeBlockEntityMixin implements IPipeBlockEntityMixin { + + @Shadow + public PipeCoverContainer coverContainer; + + @Override + public Pair ccore$onToolClick(ModifiableItem ticonItem, UseOnContext context) { + if (((PipeBlockEntity) (Object) this) == null || context.getPlayer() == null) { + return Pair.of(null, InteractionResult.FAIL); + } + + var playerIn = context.getPlayer(); + var hitResult = new BlockHitResult(context.getClickLocation(), context.getClickedFace(), + context.getClickedPos(), false); + Direction gridSide = ICoverable.determineGridSideHit(hitResult); + CoverBehavior coverBehavior = gridSide == null ? null : coverContainer.getCoverAtSide(gridSide); + var gtToolType = TiconUtils.getGTToolType(ticonItem.getToolDefinition()); + if (((PipeBlockEntity) (Object) this).getPipeTuneTool() == gtToolType) { + return Pair.of(ticonItem.getToolDefinition(), onTuneClick(playerIn, context.getHand(), hitResult)); + } else if (ticonItem.getToolDefinition() == CosmicToolDefinitions.SCREWDRIVERS) { + if (coverBehavior != null) { + return Pair.of(CosmicToolDefinitions.SCREWDRIVERS, + coverBehavior.onScrewdriverClick(playerIn, context.getHand(), hitResult)); + } + } + return Pair.of(null, InteractionResult.sidedSuccess(playerIn.level().isClientSide)); + } + + public InteractionResult onTuneClick(Player player, InteractionHand hand, BlockHitResult hitResult) { + Direction gridSide = ICoverable.determineGridSideHit(hitResult); + if (gridSide == null) gridSide = hitResult.getDirection(); + if (player.isShiftKeyDown() && ((PipeBlockEntity) (Object) this).canHaveBlockedFaces()) { + boolean isBlocked = ((PipeBlockEntity) (Object) this).isBlocked(gridSide); + ((PipeBlockEntity) (Object) this).setBlocked(gridSide, !isBlocked); + } else { + boolean isOpen = ((PipeBlockEntity) (Object) this).isConnected(gridSide); + ((PipeBlockEntity) (Object) this).setConnection(gridSide, !isOpen, false); + } + + return InteractionResult.sidedSuccess(player.level().isClientSide); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/PipeBlockMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/PipeBlockMixin.java new file mode 100644 index 000000000..7db3e693c --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/PipeBlockMixin.java @@ -0,0 +1,67 @@ +package com.ghostipedia.cosmiccore.mixin.gtceu; + +import com.ghostipedia.cosmiccore.api.misc.IPipeBlockEntityMixin; +import com.ghostipedia.cosmiccore.common.item.tcon.TiconUtils; +import com.ghostipedia.cosmiccore.common.item.tcon.base.ChargableModifiableItem; + +import com.gregtechceu.gtceu.api.block.PipeBlock; +import com.gregtechceu.gtceu.api.blockentity.PipeBlockEntity; +import com.gregtechceu.gtceu.api.item.tool.ToolHelper; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; + +import com.llamalad7.mixinextras.sugar.Local; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import slimeknights.tconstruct.library.tools.helper.ToolDamageUtil; +import slimeknights.tconstruct.library.tools.item.ModifiableItem; + +@Mixin(value = PipeBlock.class, remap = true) +public class PipeBlockMixin { + + @Inject(method = "use", + at = @At(value = "INVOKE", + target = "Lcom/gregtechceu/gtceu/api/item/tool/ToolHelper;getToolTypes(Lnet/minecraft/world/item/ItemStack;)Ljava/util/Set;"), + cancellable = true) + public void cosmicCore$use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, + BlockHitResult hit, CallbackInfoReturnable cir, + @Local ItemStack itemStack, @Local PipeBlockEntity pipeBlockEntity) { + if (itemStack.getItem() instanceof ModifiableItem ticonTool) { + var result = ((IPipeBlockEntityMixin) pipeBlockEntity).ccore$onToolClick(ticonTool, + new UseOnContext(player, hand, hit)); + if (result.getSecond() == InteractionResult.CONSUME && player instanceof ServerPlayer serverPlayer) { + ToolHelper.playToolSound(TiconUtils.getGTToolType(result.getFirst()), serverPlayer); + + if (!serverPlayer.isCreative()) { + if (ticonTool instanceof ChargableModifiableItem electricItem) { + long energyCost = electricItem.ENERGY_COST; + long available = electricItem.getCharge(itemStack); + if (available >= energyCost) { + electricItem.discharge(itemStack, energyCost, false); + } else { + ToolDamageUtil.handleDamageItem(itemStack, 1, player, p -> {}); + + } + } else { + ToolDamageUtil.handleDamageItem(itemStack, 1, player, p -> {}); + } + } + } + + if (result.getSecond() != InteractionResult.PASS) { + cir.setReturnValue(result.getSecond()); + } + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/RecipeLogicProviderMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/RecipeLogicProviderMixin.java new file mode 100644 index 000000000..070b92819 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/RecipeLogicProviderMixin.java @@ -0,0 +1,25 @@ +package com.ghostipedia.cosmiccore.mixin.gtceu; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.StellarBaseModule; + +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.integration.jade.provider.RecipeLogicProvider; + +import net.minecraft.nbt.CompoundTag; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(value = RecipeLogicProvider.class, remap = false) +public class RecipeLogicProviderMixin { + + @Inject(method = "write", at = @At("HEAD"), cancellable = true) + private void cosmicCore$skipStellarModuleWrite(CompoundTag data, RecipeLogic capability, CallbackInfo ci) { + if (capability.getMachine() instanceof StellarBaseModule) { + data.putBoolean("Working", capability.isWorking()); + ci.cancel(); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/RecipeOutputProviderMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/RecipeOutputProviderMixin.java new file mode 100644 index 000000000..d3e0eb2f9 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/RecipeOutputProviderMixin.java @@ -0,0 +1,24 @@ +package com.ghostipedia.cosmiccore.mixin.gtceu; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.StellarBaseModule; + +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.integration.jade.provider.RecipeOutputProvider; + +import net.minecraft.nbt.CompoundTag; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(value = RecipeOutputProvider.class, remap = false) +public class RecipeOutputProviderMixin { + + @Inject(method = "write", at = @At("HEAD"), cancellable = true) + private void cosmicCore$skipStellarModule(CompoundTag data, RecipeLogic capability, CallbackInfo ci) { + if (capability.getMachine() instanceof StellarBaseModule) { + ci.cancel(); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/WorkableBlockProviderMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/WorkableBlockProviderMixin.java new file mode 100644 index 000000000..f5c197e17 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/WorkableBlockProviderMixin.java @@ -0,0 +1,24 @@ +package com.ghostipedia.cosmiccore.mixin.gtceu; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.StellarBaseModule; + +import com.gregtechceu.gtceu.api.capability.IWorkable; +import com.gregtechceu.gtceu.integration.jade.provider.WorkableBlockProvider; + +import net.minecraft.nbt.CompoundTag; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(value = WorkableBlockProvider.class, remap = false) +public class WorkableBlockProviderMixin { + + @Inject(method = "write", at = @At("HEAD"), cancellable = true) + private void cosmicCore$skipStellarModule(CompoundTag data, IWorkable capability, CallbackInfo ci) { + if (capability instanceof StellarBaseModule) { + ci.cancel(); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/tinkers/ModifiableItemMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/tinkers/ModifiableItemMixin.java new file mode 100644 index 000000000..e6ad6daa5 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/tinkers/ModifiableItemMixin.java @@ -0,0 +1,38 @@ +package com.ghostipedia.cosmiccore.mixin.tinkers; + +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Tier; +import net.minecraft.world.item.TieredItem; +import net.minecraftforge.common.ForgeHooks; + +import org.spongepowered.asm.mixin.Debug; +import org.spongepowered.asm.mixin.Mixin; +import slimeknights.tconstruct.library.tools.helper.ToolDamageUtil; +import slimeknights.tconstruct.library.tools.item.ModifiableItem; +import slimeknights.tconstruct.library.tools.nbt.ToolStack; + +@Debug( + export = true) +@Mixin(value = ModifiableItem.class, remap = false) +public class ModifiableItemMixin extends TieredItem { + + public ModifiableItemMixin(Tier tier, Properties properties) { + super(tier, properties); + } + + @Override + public boolean hasCraftingRemainingItem(ItemStack stack) { + return !ToolStack.from(stack).isBroken(); + } + + @Override + public ItemStack getCraftingRemainingItem(ItemStack itemStack) { + ItemStack stack = itemStack.copy(); + Player player = ForgeHooks.getCraftingPlayer(); + + ToolDamageUtil.handleDamageItem(stack, 1, player, p -> {}); + + return stack; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/tinkers/ToolHarvestLogicMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/tinkers/ToolHarvestLogicMixin.java new file mode 100644 index 000000000..d7ec1f3fc --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/tinkers/ToolHarvestLogicMixin.java @@ -0,0 +1,49 @@ +package com.ghostipedia.cosmiccore.mixin.tinkers; + +import com.ghostipedia.cosmiccore.common.item.tcon.base.ChargableModifiableItem; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.capability.forge.GTCapability; + +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import org.spongepowered.asm.mixin.Debug; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import slimeknights.tconstruct.library.tools.helper.ToolHarvestLogic; +import slimeknights.tconstruct.library.tools.nbt.IToolStackView; +import slimeknights.tconstruct.library.tools.nbt.ToolStack; + +@Debug(export = true) +@Mixin(ToolHarvestLogic.class) +class ToolHarvestLogicMixin { + + @WrapOperation( + remap = false, + method = "breakBlock", + at = @At( + value = "INVOKE", + target = "Lslimeknights/tconstruct/library/tools/helper/ToolDamageUtil;damageAnimated(Lslimeknights/tconstruct/library/tools/nbt/IToolStackView;ILnet/minecraft/world/entity/LivingEntity;)Z")) + private static boolean cosmiccore$RedirectDurability(IToolStackView tool, int amount, LivingEntity entity, + Operation original) { + if (tool instanceof ToolStack toolStack) { + ItemStack stack = toolStack.createStack(); + if (stack.getItem() instanceof ChargableModifiableItem) { + return stack.getCapability(GTCapability.CAPABILITY_ELECTRIC_ITEM) + .map(cap -> { + long energyCost = (long) amount * GTValues.VA[GTValues.LV]; + long extracted = cap.discharge(energyCost, GTValues.LV, false, false, false); + if (extracted >= energyCost) { + return true; // skip durability + } + return original.call(tool, amount, entity); + }) + .orElseGet(() -> original.call(tool, amount, entity)); + } + } + return original.call(tool, amount, entity); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/utils/NumberUtils.java b/src/main/java/com/ghostipedia/cosmiccore/utils/NumberUtils.java index 64717cf4f..62f8110c2 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/utils/NumberUtils.java +++ b/src/main/java/com/ghostipedia/cosmiccore/utils/NumberUtils.java @@ -28,4 +28,23 @@ public static String formatLong(long number) { return DF.format((double) number / 1_000_000_000_000_000.0) + "P"; } } + + public static String formatThousandsSeparators(double number) { + int num_int = (int) number; + double decimal = number - (int) number; + StringBuilder res = new StringBuilder(); + if (0d != decimal) { + if (0d != (int) ((100 * decimal) % 10)) { + res.insert(0, String.format("%.2f", decimal)).deleteCharAt(0); + } else { + res.insert(0, String.format("%.1f", decimal)).deleteCharAt(0); + } + } + while (num_int > 999) { + res.insert(0, "," + String.format("%03d", num_int % 1000)); + num_int /= 1000; + } + res.insert(0, num_int); + return res.toString(); + } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/utils/StringUtil.java b/src/main/java/com/ghostipedia/cosmiccore/utils/StringUtil.java index 7f8365606..071bc57cf 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/utils/StringUtil.java +++ b/src/main/java/com/ghostipedia/cosmiccore/utils/StringUtil.java @@ -36,4 +36,21 @@ public static String iceCold(String input) { return formatting(input, new ChatFormatting[] { BLUE, BLUE, BLUE, BLUE, WHITE, BLUE, WHITE, WHITE, BLUE, WHITE, WHITE, BLUE, AQUA, WHITE }, 360); } + + /** + * Converts snake_case to Title Case (e.g., "hungering_void" -> "Hungering Void") + */ + public static String toTitleCase(String snakeCase) { + if (snakeCase == null || snakeCase.isEmpty()) return snakeCase; + + StringBuilder result = new StringBuilder(); + for (String word : snakeCase.split("_")) { + if (!word.isEmpty()) { + if (result.length() > 0) result.append(" "); + result.append(Character.toUpperCase(word.charAt(0))); + if (word.length() > 1) result.append(word.substring(1)); + } + } + return result.toString(); + } } diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 91a18a70c..2081a7b08 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -2,3 +2,4 @@ public-f net.minecraft.network.chat.TextColor public net.minecraft.network.chat.TextColor (ILjava/lang/String;)V public-f net.minecraft.network.chat.TextColor f_131256_ # NAMED_COLORS +public thedarkcolour.gendustry.blockentity.IndustrialApiaryBeeModifier diff --git a/src/main/resources/META-INF/services/forestry.api.plugin.IForestryPlugin b/src/main/resources/META-INF/services/forestry.api.plugin.IForestryPlugin new file mode 100644 index 000000000..80ee41073 --- /dev/null +++ b/src/main/resources/META-INF/services/forestry.api.plugin.IForestryPlugin @@ -0,0 +1 @@ +com.ghostipedia.cosmiccore.client.CosmicBeesPlugin \ No newline at end of file diff --git a/src/main/resources/assets/ae2/screens/schema.json b/src/main/resources/assets/ae2/screens/schema.json deleted file mode 100644 index c801a6a94..000000000 --- a/src/main/resources/assets/ae2/screens/schema.json +++ /dev/null @@ -1,552 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema", - "$id": "https://appliedenergistics.github.io/screen_style", - "type": "object", - "title": "AE2 Screen Style", - "description": "Provides styling information for an AE2 UI screen", - "required": [], - "definitions": { - "position": { - "$comment": "Used to position an element in relationship to the size of the current dialog", - "$id": "Position", - "type": "object", - "properties": { - "left": { - "type": "number", - "description": "Positions the content to the right (positive) or left (negative) of the left screen edge." - }, - "top": { - "type": "number", - "description": "Positions the content to the bottom (positive) or top (negative) of the top screen edge." - }, - "right": { - "type": "number", - "description": "Positions the content to the left (positive) or right (negative) of the right screen edge." - }, - "bottom": { - "type": "number", - "description": "Positions the content to the top (positive) or bottom (negative) of the bottom screen edge." - } - } - }, - "color": { - "$comment": "Definition of a color using a fake HTML notation", - "type": "string", - "pattern": "^#([0-9a-fA-F]{2}){3,4}$" - }, - "text": { - "$comment": "JSON schema definition of Minecraft text https://minecraft.wiki/w/Raw_JSON_text_format", - "type": "object", - "properties": { - "extra": { - "description": "Text that is displayed after this text, but that inherits this texts properties.", - "type": "array", - "items": { - "$ref": "#/definitions/text" - } - }, - "color": { - "type": "string", - "pattern": "^#([0-9a-fA-F]{6})$" - }, - "font": { - "type": "string", - "default": "minecraft:default", - "description": "Font in assets//font" - }, - "bold": { - "type": "boolean", - "default": false - }, - "italic": { - "type": "boolean", - "default": false - }, - "underlined": { - "type": "boolean", - "default": false - }, - "strikethrough": { - "type": "boolean", - "default": false - }, - "obfuscated": { - "type": "boolean", - "default": false - }, - "insertion": { - "type": "string", - "description": "When shift-clicked while the chat is open, the text of this property will be inserted." - }, - "clickEvent": { - "type": "object", - "properties": { - "action": { - "type": "string", - "enum": [ - "open_url", - "open_file", - "run_command", - "suggest_command", - "change_page", - "copy_to_clipboard" - ] - }, - "value": { - "type": "string" - } - }, - "required": ["action", "value"] - }, - "hoverEvent": { - "type": "object", - "oneOf": [ - { - "properties": { - "action": { - "const": "show_text" - }, - "contents": { - "$ref": "#/definitions/text" - } - } - }, - { - "properties": { - "action": { - "const": "show_item" - }, - "contents": { - "type": "object", - "properties": { - "id": { - "type": "string", - "default": "minecraft:air", - "description": "The item to show" - }, - "count": { - "type": "integer", - "default": 1, - "description": "The item stack size" - }, - "tag": { - "type": "string", - "description": "NBT of the item, serialized as string. See https://minecraft.wiki/w/Player.dat_format#Item_structure" - } - }, - "required": ["id"] - } - } - }, - { - "properties": { - "action": { - "const": "show_entity" - }, - "contents": { - "type": "object", - "properties": { - "name": { - "$ref": "#/definitions/text" - }, - "type": { - "type": "string", - "default": "minecraft:pig", - "description": "The entity type id to show" - }, - "id": { - "type": "string", - "description": "UUID of the entity to show" - } - } - } - } - } - ] - } - }, - "oneOf": [ - { - "properties": { - "text": { - "description": "Display simple text", - "type": "string" - } - }, - "required": ["text"] - }, - { - "properties": { - "translate": { - "description": "The ID of a translation key", - "type": "string" - }, - "with": { - "type": "array", - "items": { - "$ref": "#/definitions/text" - } - } - }, - "required": ["translate"] - }, - { - "properties": { - "keybind": { - "type": "string", - "description": "A keybind identifier" - } - }, - "required": ["keybind"] - } - ] - }, - "rect": { - "oneOf": [ - { - "type": "array", - "items": [ - { - "type": "integer", - "description": "x" - }, - { - "type": "integer", - "description": "y" - }, - { - "type": "integer", - "description": "width" - }, - { - "type": "integer", - "description": "height" - } - ], - "additionalItems": false - }, - { - "type": "object", - "properties": { - "x": { - "type": "integer" - }, - "y": { - "type": "integer" - }, - "width": { - "type": "integer" - }, - "height": { - "type": "integer" - } - }, - "additionalProperties": false - } - ] - }, - "blitter": { - "type": "object", - "properties": { - "texture": { - "type": "string" - }, - "textureWidth": { - "type": "integer", - "default": 256 - }, - "textureHeight": { - "type": "integer", - "default": 256 - }, - "srcRect": { - "$ref": "#/definitions/rect" - } - }, - "required": ["texture"] - }, - "generatedBackground": { - "type": "object", - "properties": { - "width": { - "type": "integer" - }, - "height": { - "type": "integer" - } - }, - "required": ["width", "height"] - } - }, - "properties": { - "includes": { - "description": "Relative path to other files to include before processing this one.", - "type": "array", - "items": { - "type": "string" - } - }, - "palette": { - "$comment": "See PaletteColor enum", - "type": "object", - "description": "Defines colors used through the UI screen", - "properties": { - "DEFAULT_TEXT_COLOR": { - "$ref": "#/definitions/color" - }, - "MUTED_TEXT_COLOR": { - "$ref": "#/definitions/color" - }, - "SELECTION_COLOR": { - "$ref": "#/definitions/color" - }, - "TEXTFIELD_PLACEHOLDER": { - "$ref": "#/definitions/color" - }, - "TEXTFIELD_SELECTION": { - "$ref": "#/definitions/color" - }, - "TEXTFIELD_ERROR": { - "$ref": "#/definitions/color" - }, - "TEXTFIELD_TEXT": { - "$ref": "#/definitions/color" - }, - "ERROR": { - "$ref": "#/definitions/color" - } - } - }, - "background": { - "$ref": "#/definitions/blitter" - }, - "generatedBackground": { - "$ref": "#/definitions/generatedBackground" - }, - "slots": { - "type": "object", - "description": "Defines positions for slots and their grid alignment", - "additionalProperties": { - "type": "object", - "allOf": [ - { - "properties": { - "grid": { - "$comment": "Configures the slots with this semantic in a grid", - "enum": [ - "IO_BUS_CONFIG", - "BREAK_AFTER_9COLS", - "BREAK_AFTER_2COLS", - "BREAK_AFTER_3COLS", - "HORIZONTAL", - "VERTICAL" - ] - } - } - }, - { - "$ref": "#/definitions/position" - } - ] - }, - "propertyNames": { - "$comment": "List SlotSemantic names here", - "enum": [ - "NONE", - "STORAGE", - "PLAYER_INVENTORY", - "PLAYER_HOTBAR", - "TOOLBOX", - "CONFIG", - "UPGRADE", - "STORAGE_CELL", - "INSCRIBER_PLATE_TOP", - "INSCRIBER_PLATE_BOTTOM", - "MACHINE_INPUT", - "MACHINE_PROCESSING", - "MACHINE_OUTPUT", - "MACHINE_CRAFTING_GRID", - "BLANK_PATTERN", - "ENCODED_PATTERN", - "VIEW_CELL", - "CRAFTING_GRID", - "CRAFTING_RESULT", - "PROCESSING_INPUTS", - "PROCESSING_OUTPUTS", - "SMITHING_TABLE_TEMPLATE", - "SMITHING_TABLE_BASE", - "SMITHING_TABLE_ADDITION", - "SMITHING_TABLE_RESULT", - "STONECUTTING_INPUT", - "MISSING_INGREDIENT" - ] - } - }, - "text": { - "description": "Defines text that will be shown on the UI, the property name is used to reference text from code", - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "text": { - "$ref": "#/definitions/text" - }, - "color": { - "$comment": "See enum PaletteColor", - "enum": [ - "DEFAULT_TEXT_COLOR", - "MUTED_TEXT_COLOR", - "SELECTION_COLOR", - "ERROR" - ], - "default": "DEFAULT_TEXT_COLOR" - }, - "position": { - "$ref": "#/definitions/position" - }, - "scale": { - "type": "number", - "default": 1, - "minimum": 0.1, - "maximum": 4, - "$comment": "Can be used to display smaller text, 0.5 works well, usually" - }, - "align": { - "type": "string", - "default": "LEFT", - "enum": ["LEFT", "CENTER", "RIGHT"] - }, - "maxWidth": { - "type": "number", - "minimum": 0, - "default": 0, - "description": "If greater than 0, the text will be word-wrapped when it reaches the given width in pixels." - } - } - } - }, - "tooltips": { - "description": "Defines areas that will show a tooltip on the screen. These areas are evaluated after everything else that could show a tooltip.", - "type": "object", - "additionalProperties": { - "allOf": [ - { - "type": "object", - "properties": { - "tooltip": { - "type": "array", - "items": { - "$ref": "#/definitions/text" - } - }, - "width": { - "type": "integer" - }, - "height": { - "type": "integer" - } - }, - "required": ["tooltip", "width", "height"] - }, - { - "$ref": "#/definitions/position" - } - ] - } - }, - "images": { - "description": "Additional screen-specific images", - "additionalProperties": { - "$ref": "#/definitions/blitter" - } - }, - "helpTopic": { - "description": "Overrides the default help topic for this screen. This will be resolved as a link to a page in the guidebook and may contain an optional fragment (#some-heading) to directly link to a heading or anchor in the page.", - "type": "string" - }, - "terminalStyle": { - "description": "If this screen is a terminal, this defines required properties to display it properly", - "type": "object", - "additionalProperties": false, - "properties": { - "header": { - "description": "The top of the terminal background right up to the first row of content.", - "$ref": "#/definitions/blitter" - }, - "firstRow": { - "description": "The area to draw for the first row in the terminal. Usually this includes the top of the scrollbar.", - "$ref": "#/definitions/blitter" - }, - "row": { - "description": "The area to repeat for every row in the terminal. Should be 16px for the item + 2px for the border in size.", - "$ref": "#/definitions/blitter" - }, - "lastRow": { - "description": "The area to draw for the last row in the terminal. Usually this includes the top of the scrollbar.", - "$ref": "#/definitions/blitter" - }, - "bottom": { - "description": "The area to draw at the bottom of the terminal (i.e. includes the player inventory).", - "$ref": "#/definitions/blitter" - }, - "maxRows": { - "description": "If specified, limits the terminal to at most this many rows rather than using up available space.", - "type": "integer", - "minimum": 3 - }, - "slotsPerRow": { - "description": "The number of slots per row on the background image.", - "type": "integer", - "minimum": 1 - }, - "sortable": { - "description": "Defines if this terminal has a sort by button.", - "type": "boolean", - "default": true - }, - "supportsAutoCrafting": { - "description": "Defines if this terminal supports auto-crafting. If not, the button to show only craftable items is hidden.", - "type": "boolean", - "default": false - }, - "stackSizeStyle": { - "description": "The type of stack size rendering to use.", - "type": "string", - "default": "ITEMS", - "enum": ["ITEMS", "FLUIDS"] - }, - "showTooltipsWithItemInHand": { - "type": "boolean", - "default": false, - "description": "Should the terminal show item tooltips for the network inventory even if the player has an item in their hand? Useful for showing fluid tooltips when the player has a bucket in hand." - } - } - }, - "widgets": { - "description": "Defines properties of various widgets that are positioned on the screen. The properties are widget-dependant. Which widget is placed is decided in code.", - "type": "object", - "additionalProperties": { - "type": "object", - "allOf": [ - { - "$ref": "#/definitions/position" - }, - { - "properties": { - "width": { - "type": "integer" - }, - "height": { - "type": "integer" - }, - "hideEdge": { - "description": "Used to hide the border around TabButtons", - "type": "boolean" - } - } - } - ] - } - } - } -} diff --git a/src/main/resources/assets/ae2/screens/terminals/encoding/modify_processing.json b/src/main/resources/assets/ae2/screens/terminals/encoding/modify_processing.json deleted file mode 100644 index 5afd88c15..000000000 --- a/src/main/resources/assets/ae2/screens/terminals/encoding/modify_processing.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "$schema": "../../schema.json", - "widgets": { - "processingCycleOutput": { - "left": 127, - "bottom": 163 - }, - "mult2": { - "left": 127, - "bottom": 152 - }, - "mult3": { - "left": 127, - "bottom": 141 - }, - "mult8": { - "left": 127, - "bottom": 130 - }, - "div2": { - "left": 100, - "bottom": 152 - }, - "div3": { - "left": 100, - "bottom": 141 - }, - "div8": { - "left": 100, - "bottom": 130 - } - } -} diff --git a/src/main/resources/assets/ae2/screens/terminals/modify_pattern_encoding_terminal.json b/src/main/resources/assets/ae2/screens/terminals/modify_pattern_encoding_terminal.json deleted file mode 100644 index b22134eaf..000000000 --- a/src/main/resources/assets/ae2/screens/terminals/modify_pattern_encoding_terminal.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "$schema": "../schema.json", - "includes": [ - "pattern_encoding_terminal.json", - "encoding/modify_processing.json" - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/ae2/screens/wtlib/modify_wireless_pattern_encoding_terminal.json b/src/main/resources/assets/ae2/screens/wtlib/modify_wireless_pattern_encoding_terminal.json deleted file mode 100644 index 4e5320305..000000000 --- a/src/main/resources/assets/ae2/screens/wtlib/modify_wireless_pattern_encoding_terminal.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "$schema": "../schema.json", - "includes": [ - "../terminals/modify_pattern_encoding_terminal.json", - "universal_terminal_with_viewcells.json" - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/ev_ember_emitter.json b/src/main/resources/assets/cosmiccore/models/block/ev_ember_emitter.json new file mode 100644 index 000000000..9f6936f2e --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/ev_ember_emitter.json @@ -0,0 +1,126 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_plating_ev", + "1": "cosmiccore:block/puff_tex_ev", + "particle": "cosmiccore:block/puff_tex_ev" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 8, 11], + "faces": { + "north": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [6, 0, 12, 6], "texture": "#0"}, + "down": {"uv": [0, 6, 6, 12], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [4, 7, 4], + "to": [12, 9, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 9, 5], + "to": [11, 11, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [6, 11, 6], + "to": [10, 15, 10], + "faces": { + "north": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "east": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "south": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "west": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [7, 12, 5], + "to": [9, 14, 11], + "faces": { + "north": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "east": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "south": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "west": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "up": {"uv": [4, 0, 6, 6], "texture": "#1"}, + "down": {"uv": [4, 0, 6, 6], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 12, 7], + "to": [11, 14, 9], + "faces": { + "north": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "east": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "south": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "west": {"uv": [10, 14, 12, 16], "texture": "#1"}, + "up": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "down": {"uv": [10, 14, 16, 16], "texture": "#1"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 45, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/ev_ember_receptor.json b/src/main/resources/assets/cosmiccore/models/block/ev_ember_receptor.json new file mode 100644 index 000000000..1fac3bcd2 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/ev_ember_receptor.json @@ -0,0 +1,130 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_tex_ev", + "particle": "cosmiccore:block/puff_tex_ev" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 4, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 2, 7], + "to": [6, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [10, 2, 7], + "to": [12, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 10], + "to": [9, 8, 12], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 4], + "to": [9, 8, 6], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [6, 3, 6], + "to": [10, 5, 10], + "faces": { + "north": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "east": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "south": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "west": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#0"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 0.8, 0], + "scale": [0.8, 0.8, 0.8] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/hv_ember_emitter.json b/src/main/resources/assets/cosmiccore/models/block/hv_ember_emitter.json new file mode 100644 index 000000000..4c42b1626 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/hv_ember_emitter.json @@ -0,0 +1,126 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_plating_hv", + "1": "cosmiccore:block/puff_tex_hv", + "particle": "cosmiccore:block/puff_tex_hv" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 8, 11], + "faces": { + "north": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [6, 0, 12, 6], "texture": "#0"}, + "down": {"uv": [0, 6, 6, 12], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [4, 7, 4], + "to": [12, 9, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 9, 5], + "to": [11, 11, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [6, 11, 6], + "to": [10, 15, 10], + "faces": { + "north": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "east": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "south": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "west": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [7, 12, 5], + "to": [9, 14, 11], + "faces": { + "north": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "east": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "south": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "west": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "up": {"uv": [4, 0, 6, 6], "texture": "#1"}, + "down": {"uv": [4, 0, 6, 6], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 12, 7], + "to": [11, 14, 9], + "faces": { + "north": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "east": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "south": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "west": {"uv": [10, 14, 12, 16], "texture": "#1"}, + "up": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "down": {"uv": [10, 14, 16, 16], "texture": "#1"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 45, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/hv_ember_receptor.json b/src/main/resources/assets/cosmiccore/models/block/hv_ember_receptor.json new file mode 100644 index 000000000..561f19c92 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/hv_ember_receptor.json @@ -0,0 +1,130 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_tex_hv", + "particle": "cosmiccore:block/puff_tex_hv" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 4, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 2, 7], + "to": [6, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [10, 2, 7], + "to": [12, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 10], + "to": [9, 8, 12], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 4], + "to": [9, 8, 6], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [6, 3, 6], + "to": [10, 5, 10], + "faces": { + "north": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "east": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "south": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "west": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#0"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 0.8, 0], + "scale": [0.8, 0.8, 0.8] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/iv_ember_emitter.json b/src/main/resources/assets/cosmiccore/models/block/iv_ember_emitter.json new file mode 100644 index 000000000..12fd902f5 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/iv_ember_emitter.json @@ -0,0 +1,126 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_plating_iv", + "1": "cosmiccore:block/puff_tex_iv", + "particle": "cosmiccore:block/puff_tex_iv" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 8, 11], + "faces": { + "north": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [6, 0, 12, 6], "texture": "#0"}, + "down": {"uv": [0, 6, 6, 12], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [4, 7, 4], + "to": [12, 9, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 9, 5], + "to": [11, 11, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [6, 11, 6], + "to": [10, 15, 10], + "faces": { + "north": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "east": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "south": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "west": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [7, 12, 5], + "to": [9, 14, 11], + "faces": { + "north": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "east": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "south": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "west": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "up": {"uv": [4, 0, 6, 6], "texture": "#1"}, + "down": {"uv": [4, 0, 6, 6], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 12, 7], + "to": [11, 14, 9], + "faces": { + "north": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "east": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "south": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "west": {"uv": [10, 14, 12, 16], "texture": "#1"}, + "up": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "down": {"uv": [10, 14, 16, 16], "texture": "#1"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 45, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/iv_ember_receptor.json b/src/main/resources/assets/cosmiccore/models/block/iv_ember_receptor.json new file mode 100644 index 000000000..c850177d9 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/iv_ember_receptor.json @@ -0,0 +1,130 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_tex_iv", + "particle": "cosmiccore:block/puff_tex_iv" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 4, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 2, 7], + "to": [6, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [10, 2, 7], + "to": [12, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 10], + "to": [9, 8, 12], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 4], + "to": [9, 8, 6], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [6, 3, 6], + "to": [10, 5, 10], + "faces": { + "north": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "east": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "south": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "west": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#0"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 0.8, 0], + "scale": [0.8, 0.8, 0.8] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/luv_ember_emitter.json b/src/main/resources/assets/cosmiccore/models/block/luv_ember_emitter.json new file mode 100644 index 000000000..98620377b --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/luv_ember_emitter.json @@ -0,0 +1,126 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_plating_luv", + "1": "cosmiccore:block/puff_tex_luv", + "particle": "cosmiccore:block/puff_tex_luv" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 8, 11], + "faces": { + "north": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [6, 0, 12, 6], "texture": "#0"}, + "down": {"uv": [0, 6, 6, 12], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [4, 7, 4], + "to": [12, 9, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 9, 5], + "to": [11, 11, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [6, 11, 6], + "to": [10, 15, 10], + "faces": { + "north": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "east": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "south": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "west": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [7, 12, 5], + "to": [9, 14, 11], + "faces": { + "north": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "east": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "south": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "west": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "up": {"uv": [4, 0, 6, 6], "texture": "#1"}, + "down": {"uv": [4, 0, 6, 6], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 12, 7], + "to": [11, 14, 9], + "faces": { + "north": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "east": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "south": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "west": {"uv": [10, 14, 12, 16], "texture": "#1"}, + "up": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "down": {"uv": [10, 14, 16, 16], "texture": "#1"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 45, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/luv_ember_receptor.json b/src/main/resources/assets/cosmiccore/models/block/luv_ember_receptor.json new file mode 100644 index 000000000..f02bd8e72 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/luv_ember_receptor.json @@ -0,0 +1,130 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_tex_luv", + "particle": "cosmiccore:block/puff_tex_luv" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 4, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 2, 7], + "to": [6, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [10, 2, 7], + "to": [12, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 10], + "to": [9, 8, 12], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 4], + "to": [9, 8, 6], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [6, 3, 6], + "to": [10, 5, 10], + "faces": { + "north": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "east": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "south": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "west": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#0"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 0.8, 0], + "scale": [0.8, 0.8, 0.8] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/lv_ember_emitter.json b/src/main/resources/assets/cosmiccore/models/block/lv_ember_emitter.json new file mode 100644 index 000000000..95ad7ea71 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/lv_ember_emitter.json @@ -0,0 +1,126 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_plating_lv", + "1": "cosmiccore:block/puff_tex_lv", + "particle": "cosmiccore:block/puff_tex_lv" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 8, 11], + "faces": { + "north": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [6, 0, 12, 6], "texture": "#0"}, + "down": {"uv": [0, 6, 6, 12], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [4, 7, 4], + "to": [12, 9, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 9, 5], + "to": [11, 11, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [6, 11, 6], + "to": [10, 15, 10], + "faces": { + "north": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "east": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "south": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "west": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [7, 12, 5], + "to": [9, 14, 11], + "faces": { + "north": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "east": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "south": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "west": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "up": {"uv": [4, 0, 6, 6], "texture": "#1"}, + "down": {"uv": [4, 0, 6, 6], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 12, 7], + "to": [11, 14, 9], + "faces": { + "north": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "east": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "south": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "west": {"uv": [10, 14, 12, 16], "texture": "#1"}, + "up": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "down": {"uv": [10, 14, 16, 16], "texture": "#1"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 45, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/lv_ember_receptor.json b/src/main/resources/assets/cosmiccore/models/block/lv_ember_receptor.json new file mode 100644 index 000000000..29dd27765 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/lv_ember_receptor.json @@ -0,0 +1,130 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_tex_lv", + "particle": "cosmiccore:block/puff_tex_lv" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 4, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 2, 7], + "to": [6, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [10, 2, 7], + "to": [12, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 10], + "to": [9, 8, 12], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 4], + "to": [9, 8, 6], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [6, 3, 6], + "to": [10, 5, 10], + "faces": { + "north": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "east": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "south": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "west": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#0"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 0.8, 0], + "scale": [0.8, 0.8, 0.8] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/machine/part/energy_output_hatch_16a.json b/src/main/resources/assets/cosmiccore/models/block/machine/part/energy_output_hatch_16a.json new file mode 100644 index 000000000..2955f4fa7 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/machine/part/energy_output_hatch_16a.json @@ -0,0 +1,45 @@ +{ + "parent": "gtceu:block/overlay/2_layer/tinted/front", + "textures": { + "overlay_tint": "gtceu:block/overlay/machine/overlay_energy_16a_tinted", + "overlay_in": "gtceu:block/overlay/machine/overlay_energy_16a_in", + "overlay_out_emissive": "gtceu:block/overlay/machine/overlay_energy_16a_out_emissive" + }, + "elements": [ + { + "from": [ 0, 0, 0 ], + "to": [ 16, 16, 16 ], + "faces": { + "down": { "texture": "#bottom", "cullface": "down", "tintindex": 1 }, + "up": { "texture": "#top", "cullface": "up", "tintindex": 1 }, + "north": { "texture": "#side", "cullface": "north", "tintindex": 1 }, + "south": { "texture": "#side", "cullface": "south", "tintindex": 1 }, + "west": { "texture": "#side", "cullface": "west", "tintindex": 1 }, + "east": { "texture": "#side", "cullface": "east", "tintindex": 1 } + } + }, + { + "from": [ -0.01, -0.01, -0.01 ], + "to": [ 16.01, 16.01, 16.01 ], + "faces": { + "north": { "uv": [0, 0, 16, 16], "texture": "#overlay_tint", "cullface": "north", "tintindex": 2 } + } + }, + { + "from": [ -0.02, -0.02, -0.02 ], + "to": [ 16.02, 16.02, 16.02 ], + "faces": { + "north": { "uv": [0, 0, 16, 16], "texture": "#overlay_in", "cullface": "north" } + } + }, + { + "from": [ -0.02, -0.02, -0.02 ], + "to": [ 16.02, 16.02, 16.02 ], + "forge_data": { "block_light": 15, "sky_light": 15 }, + "shade": false, + "faces": { + "north": { "uv": [0, 0, 16, 16], "texture": "#overlay_out_emissive", "cullface": "north" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/machine/part/energy_output_hatch_4a.json b/src/main/resources/assets/cosmiccore/models/block/machine/part/energy_output_hatch_4a.json new file mode 100644 index 000000000..7f84a0143 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/machine/part/energy_output_hatch_4a.json @@ -0,0 +1,45 @@ +{ + "parent": "gtceu:block/overlay/2_layer/tinted/front", + "textures": { + "overlay_tint": "gtceu:block/overlay/machine/overlay_energy_4a_tinted", + "overlay_in": "gtceu:block/overlay/machine/overlay_energy_4a_in", + "overlay_out_emissive": "gtceu:block/overlay/machine/overlay_energy_4a_out_emissive" + }, + "elements": [ + { + "from": [ 0, 0, 0 ], + "to": [ 16, 16, 16 ], + "faces": { + "down": { "texture": "#bottom", "cullface": "down", "tintindex": 1 }, + "up": { "texture": "#top", "cullface": "up", "tintindex": 1 }, + "north": { "texture": "#side", "cullface": "north", "tintindex": 1 }, + "south": { "texture": "#side", "cullface": "south", "tintindex": 1 }, + "west": { "texture": "#side", "cullface": "west", "tintindex": 1 }, + "east": { "texture": "#side", "cullface": "east", "tintindex": 1 } + } + }, + { + "from": [ -0.01, -0.01, -0.01 ], + "to": [ 16.01, 16.01, 16.01 ], + "faces": { + "north": { "uv": [0, 0, 16, 16], "texture": "#overlay_tint", "cullface": "north", "tintindex": 2 } + } + }, + { + "from": [ -0.02, -0.02, -0.02 ], + "to": [ 16.02, 16.02, 16.02 ], + "faces": { + "north": { "uv": [0, 0, 16, 16], "texture": "#overlay_in", "cullface": "north" } + } + }, + { + "from": [ -0.02, -0.02, -0.02 ], + "to": [ 16.02, 16.02, 16.02 ], + "forge_data": { "block_light": 15, "sky_light": 15 }, + "shade": false, + "faces": { + "north": { "uv": [0, 0, 16, 16], "texture": "#overlay_out_emissive", "cullface": "north" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/machine/part/fluid_me_assemblyline.json b/src/main/resources/assets/cosmiccore/models/block/machine/part/fluid_me_assemblyline.json new file mode 100644 index 000000000..426e01d4c --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/machine/part/fluid_me_assemblyline.json @@ -0,0 +1,7 @@ +{ + "parent": "gtceu:block/overlay/2_layer/front_emissive", + "textures": { + "overlay": "cosmiccore:block/overlay/me_assemblyline_overlay_base", + "overlay_emissive": "cosmiccore:block/overlay/me_assemblyline_overlay_fluid_emissive" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/machine/part/item_me_assemblyline.json b/src/main/resources/assets/cosmiccore/models/block/machine/part/item_me_assemblyline.json new file mode 100644 index 000000000..728f67803 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/machine/part/item_me_assemblyline.json @@ -0,0 +1,7 @@ +{ + "parent": "gtceu:block/overlay/2_layer/front_emissive", + "textures": { + "overlay": "cosmiccore:block/overlay/me_assemblyline_overlay_base", + "overlay_emissive": "cosmiccore:block/overlay/me_assemblyline_overlay_item_emissive" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/machine/part/module_hatch.json b/src/main/resources/assets/cosmiccore/models/block/machine/part/module_hatch.json new file mode 100644 index 000000000..414f7a7aa --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/machine/part/module_hatch.json @@ -0,0 +1,7 @@ +{ + "parent": "gtceu:block/overlay/2_layer/front_emissive", + "textures": { + "overlay": "cosmiccore:block/overlay/module_hatch", + "overlay_emissive": "cosmiccore:block/overlay/module_hatch_emissive" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/max_ember_emitter.json b/src/main/resources/assets/cosmiccore/models/block/max_ember_emitter.json new file mode 100644 index 000000000..4e0ee3759 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/max_ember_emitter.json @@ -0,0 +1,126 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_plating_max", + "1": "cosmiccore:block/puff_tex_max", + "particle": "cosmiccore:block/puff_tex_max" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 8, 11], + "faces": { + "north": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [6, 0, 12, 6], "texture": "#0"}, + "down": {"uv": [0, 6, 6, 12], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [4, 7, 4], + "to": [12, 9, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 9, 5], + "to": [11, 11, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [6, 11, 6], + "to": [10, 15, 10], + "faces": { + "north": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "east": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "south": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "west": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [7, 12, 5], + "to": [9, 14, 11], + "faces": { + "north": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "east": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "south": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "west": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "up": {"uv": [4, 0, 6, 6], "texture": "#1"}, + "down": {"uv": [4, 0, 6, 6], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 12, 7], + "to": [11, 14, 9], + "faces": { + "north": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "east": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "south": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "west": {"uv": [10, 14, 12, 16], "texture": "#1"}, + "up": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "down": {"uv": [10, 14, 16, 16], "texture": "#1"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 45, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/max_ember_receptor.json b/src/main/resources/assets/cosmiccore/models/block/max_ember_receptor.json new file mode 100644 index 000000000..df7d6addc --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/max_ember_receptor.json @@ -0,0 +1,130 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_tex_max", + "particle": "cosmiccore:block/puff_tex_max" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 4, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 2, 7], + "to": [6, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [10, 2, 7], + "to": [12, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 10], + "to": [9, 8, 12], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 4], + "to": [9, 8, 6], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [6, 3, 6], + "to": [10, 5, 10], + "faces": { + "north": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "east": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "south": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "west": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#0"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 0.8, 0], + "scale": [0.8, 0.8, 0.8] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/mv_ember_emitter.json b/src/main/resources/assets/cosmiccore/models/block/mv_ember_emitter.json new file mode 100644 index 000000000..7c34ea09a --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/mv_ember_emitter.json @@ -0,0 +1,126 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_plating_mv", + "1": "cosmiccore:block/puff_tex_mv", + "particle": "cosmiccore:block/puff_tex_mv" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 8, 11], + "faces": { + "north": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [6, 0, 12, 6], "texture": "#0"}, + "down": {"uv": [0, 6, 6, 12], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [4, 7, 4], + "to": [12, 9, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 9, 5], + "to": [11, 11, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [6, 11, 6], + "to": [10, 15, 10], + "faces": { + "north": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "east": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "south": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "west": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [7, 12, 5], + "to": [9, 14, 11], + "faces": { + "north": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "east": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "south": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "west": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "up": {"uv": [4, 0, 6, 6], "texture": "#1"}, + "down": {"uv": [4, 0, 6, 6], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 12, 7], + "to": [11, 14, 9], + "faces": { + "north": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "east": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "south": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "west": {"uv": [10, 14, 12, 16], "texture": "#1"}, + "up": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "down": {"uv": [10, 14, 16, 16], "texture": "#1"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 45, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/mv_ember_receptor.json b/src/main/resources/assets/cosmiccore/models/block/mv_ember_receptor.json new file mode 100644 index 000000000..97fb6905f --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/mv_ember_receptor.json @@ -0,0 +1,130 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_tex_mv", + "particle": "cosmiccore:block/puff_tex_mv" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 4, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 2, 7], + "to": [6, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [10, 2, 7], + "to": [12, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 10], + "to": [9, 8, 12], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 4], + "to": [9, 8, 6], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [6, 3, 6], + "to": [10, 5, 10], + "faces": { + "north": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "east": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "south": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "west": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#0"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 0.8, 0], + "scale": [0.8, 0.8, 0.8] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/opv_ember_emitter.json b/src/main/resources/assets/cosmiccore/models/block/opv_ember_emitter.json new file mode 100644 index 000000000..75388f796 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/opv_ember_emitter.json @@ -0,0 +1,126 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_plating_opv", + "1": "cosmiccore:block/puff_tex_opv", + "particle": "cosmiccore:block/puff_tex_opv" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 8, 11], + "faces": { + "north": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [6, 0, 12, 6], "texture": "#0"}, + "down": {"uv": [0, 6, 6, 12], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [4, 7, 4], + "to": [12, 9, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 9, 5], + "to": [11, 11, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [6, 11, 6], + "to": [10, 15, 10], + "faces": { + "north": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "east": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "south": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "west": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [7, 12, 5], + "to": [9, 14, 11], + "faces": { + "north": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "east": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "south": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "west": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "up": {"uv": [4, 0, 6, 6], "texture": "#1"}, + "down": {"uv": [4, 0, 6, 6], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 12, 7], + "to": [11, 14, 9], + "faces": { + "north": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "east": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "south": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "west": {"uv": [10, 14, 12, 16], "texture": "#1"}, + "up": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "down": {"uv": [10, 14, 16, 16], "texture": "#1"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 45, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/opv_ember_receptor.json b/src/main/resources/assets/cosmiccore/models/block/opv_ember_receptor.json new file mode 100644 index 000000000..63cb4b267 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/opv_ember_receptor.json @@ -0,0 +1,130 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_tex_opv", + "particle": "cosmiccore:block/puff_tex_opv" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 4, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 2, 7], + "to": [6, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [10, 2, 7], + "to": [12, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 10], + "to": [9, 8, 12], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 4], + "to": [9, 8, 6], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [6, 3, 6], + "to": [10, 5, 10], + "faces": { + "north": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "east": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "south": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "west": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#0"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 0.8, 0], + "scale": [0.8, 0.8, 0.8] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/steam_ember_emitter.json b/src/main/resources/assets/cosmiccore/models/block/steam_ember_emitter.json new file mode 100644 index 000000000..c6b9f7eaa --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/steam_ember_emitter.json @@ -0,0 +1,126 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_plating_steam", + "1": "cosmiccore:block/puff_tex_steam", + "particle": "cosmiccore:block/puff_tex_steam" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 8, 11], + "faces": { + "north": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [6, 0, 12, 6], "texture": "#0"}, + "down": {"uv": [0, 6, 6, 12], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [4, 7, 4], + "to": [12, 9, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 9, 5], + "to": [11, 11, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [6, 11, 6], + "to": [10, 15, 10], + "faces": { + "north": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "east": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "south": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "west": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [7, 12, 5], + "to": [9, 14, 11], + "faces": { + "north": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "east": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "south": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "west": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "up": {"uv": [4, 0, 6, 6], "texture": "#1"}, + "down": {"uv": [4, 0, 6, 6], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 12, 7], + "to": [11, 14, 9], + "faces": { + "north": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "east": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "south": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "west": {"uv": [10, 14, 12, 16], "texture": "#1"}, + "up": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "down": {"uv": [10, 14, 16, 16], "texture": "#1"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 45, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/steam_ember_receptor.json b/src/main/resources/assets/cosmiccore/models/block/steam_ember_receptor.json new file mode 100644 index 000000000..3fa71a337 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/steam_ember_receptor.json @@ -0,0 +1,130 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_tex_steam", + "particle": "cosmiccore:block/puff_tex_steam" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 4, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 2, 7], + "to": [6, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [10, 2, 7], + "to": [12, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 10], + "to": [9, 8, 12], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 4], + "to": [9, 8, 6], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [6, 3, 6], + "to": [10, 5, 10], + "faces": { + "north": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "east": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "south": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "west": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#0"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 0.8, 0], + "scale": [0.8, 0.8, 0.8] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/uev_ember_emitter.json b/src/main/resources/assets/cosmiccore/models/block/uev_ember_emitter.json new file mode 100644 index 000000000..656cbf5f9 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/uev_ember_emitter.json @@ -0,0 +1,126 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_plating_uev", + "1": "cosmiccore:block/puff_tex_uev", + "particle": "cosmiccore:block/puff_tex_uev" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 8, 11], + "faces": { + "north": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [6, 0, 12, 6], "texture": "#0"}, + "down": {"uv": [0, 6, 6, 12], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [4, 7, 4], + "to": [12, 9, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 9, 5], + "to": [11, 11, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [6, 11, 6], + "to": [10, 15, 10], + "faces": { + "north": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "east": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "south": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "west": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [7, 12, 5], + "to": [9, 14, 11], + "faces": { + "north": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "east": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "south": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "west": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "up": {"uv": [4, 0, 6, 6], "texture": "#1"}, + "down": {"uv": [4, 0, 6, 6], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 12, 7], + "to": [11, 14, 9], + "faces": { + "north": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "east": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "south": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "west": {"uv": [10, 14, 12, 16], "texture": "#1"}, + "up": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "down": {"uv": [10, 14, 16, 16], "texture": "#1"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 45, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/uev_ember_receptor.json b/src/main/resources/assets/cosmiccore/models/block/uev_ember_receptor.json new file mode 100644 index 000000000..7effa37be --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/uev_ember_receptor.json @@ -0,0 +1,130 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_tex_uev", + "particle": "cosmiccore:block/puff_tex_uev" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 4, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 2, 7], + "to": [6, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [10, 2, 7], + "to": [12, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 10], + "to": [9, 8, 12], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 4], + "to": [9, 8, 6], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [6, 3, 6], + "to": [10, 5, 10], + "faces": { + "north": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "east": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "south": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "west": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#0"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 0.8, 0], + "scale": [0.8, 0.8, 0.8] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/uhv_ember_emitter.json b/src/main/resources/assets/cosmiccore/models/block/uhv_ember_emitter.json new file mode 100644 index 000000000..b8ba47139 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/uhv_ember_emitter.json @@ -0,0 +1,126 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_plating_uhv", + "1": "cosmiccore:block/puff_tex_uhv", + "particle": "cosmiccore:block/puff_tex_uhv" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 8, 11], + "faces": { + "north": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [6, 0, 12, 6], "texture": "#0"}, + "down": {"uv": [0, 6, 6, 12], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [4, 7, 4], + "to": [12, 9, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 9, 5], + "to": [11, 11, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [6, 11, 6], + "to": [10, 15, 10], + "faces": { + "north": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "east": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "south": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "west": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [7, 12, 5], + "to": [9, 14, 11], + "faces": { + "north": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "east": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "south": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "west": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "up": {"uv": [4, 0, 6, 6], "texture": "#1"}, + "down": {"uv": [4, 0, 6, 6], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 12, 7], + "to": [11, 14, 9], + "faces": { + "north": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "east": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "south": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "west": {"uv": [10, 14, 12, 16], "texture": "#1"}, + "up": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "down": {"uv": [10, 14, 16, 16], "texture": "#1"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 45, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/uhv_ember_receptor.json b/src/main/resources/assets/cosmiccore/models/block/uhv_ember_receptor.json new file mode 100644 index 000000000..5d53a5d1f --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/uhv_ember_receptor.json @@ -0,0 +1,130 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_tex_uhv", + "particle": "cosmiccore:block/puff_tex_uhv" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 4, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 2, 7], + "to": [6, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [10, 2, 7], + "to": [12, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 10], + "to": [9, 8, 12], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 4], + "to": [9, 8, 6], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [6, 3, 6], + "to": [10, 5, 10], + "faces": { + "north": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "east": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "south": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "west": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#0"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 0.8, 0], + "scale": [0.8, 0.8, 0.8] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/uiv_ember_emitter.json b/src/main/resources/assets/cosmiccore/models/block/uiv_ember_emitter.json new file mode 100644 index 000000000..4caf2962c --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/uiv_ember_emitter.json @@ -0,0 +1,126 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_plating_uiv", + "1": "cosmiccore:block/puff_tex_uiv", + "particle": "cosmiccore:block/puff_tex_uiv" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 8, 11], + "faces": { + "north": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [6, 0, 12, 6], "texture": "#0"}, + "down": {"uv": [0, 6, 6, 12], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [4, 7, 4], + "to": [12, 9, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 9, 5], + "to": [11, 11, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [6, 11, 6], + "to": [10, 15, 10], + "faces": { + "north": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "east": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "south": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "west": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [7, 12, 5], + "to": [9, 14, 11], + "faces": { + "north": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "east": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "south": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "west": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "up": {"uv": [4, 0, 6, 6], "texture": "#1"}, + "down": {"uv": [4, 0, 6, 6], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 12, 7], + "to": [11, 14, 9], + "faces": { + "north": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "east": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "south": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "west": {"uv": [10, 14, 12, 16], "texture": "#1"}, + "up": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "down": {"uv": [10, 14, 16, 16], "texture": "#1"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 45, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/uiv_ember_receptor.json b/src/main/resources/assets/cosmiccore/models/block/uiv_ember_receptor.json new file mode 100644 index 000000000..f4670525b --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/uiv_ember_receptor.json @@ -0,0 +1,130 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_tex_uiv", + "particle": "cosmiccore:block/puff_tex_uiv" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 4, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 2, 7], + "to": [6, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [10, 2, 7], + "to": [12, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 10], + "to": [9, 8, 12], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 4], + "to": [9, 8, 6], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [6, 3, 6], + "to": [10, 5, 10], + "faces": { + "north": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "east": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "south": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "west": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#0"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 0.8, 0], + "scale": [0.8, 0.8, 0.8] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/uv_ember_emitter.json b/src/main/resources/assets/cosmiccore/models/block/uv_ember_emitter.json new file mode 100644 index 000000000..83d34f76f --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/uv_ember_emitter.json @@ -0,0 +1,126 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_plating_uv", + "1": "cosmiccore:block/puff_tex_uv", + "particle": "cosmiccore:block/puff_tex_uv" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 8, 11], + "faces": { + "north": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [6, 0, 12, 6], "texture": "#0"}, + "down": {"uv": [0, 6, 6, 12], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [4, 7, 4], + "to": [12, 9, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 9, 5], + "to": [11, 11, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [6, 11, 6], + "to": [10, 15, 10], + "faces": { + "north": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "east": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "south": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "west": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [7, 12, 5], + "to": [9, 14, 11], + "faces": { + "north": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "east": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "south": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "west": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "up": {"uv": [4, 0, 6, 6], "texture": "#1"}, + "down": {"uv": [4, 0, 6, 6], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 12, 7], + "to": [11, 14, 9], + "faces": { + "north": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "east": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "south": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "west": {"uv": [10, 14, 12, 16], "texture": "#1"}, + "up": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "down": {"uv": [10, 14, 16, 16], "texture": "#1"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 45, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/uv_ember_receptor.json b/src/main/resources/assets/cosmiccore/models/block/uv_ember_receptor.json new file mode 100644 index 000000000..660cb4d88 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/uv_ember_receptor.json @@ -0,0 +1,130 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_tex_uv", + "particle": "cosmiccore:block/puff_tex_uv" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 4, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 2, 7], + "to": [6, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [10, 2, 7], + "to": [12, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 10], + "to": [9, 8, 12], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 4], + "to": [9, 8, 6], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [6, 3, 6], + "to": [10, 5, 10], + "faces": { + "north": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "east": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "south": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "west": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#0"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 0.8, 0], + "scale": [0.8, 0.8, 0.8] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/uxv_ember_emitter.json b/src/main/resources/assets/cosmiccore/models/block/uxv_ember_emitter.json new file mode 100644 index 000000000..aec3c0d8b --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/uxv_ember_emitter.json @@ -0,0 +1,126 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_plating_uxv", + "1": "cosmiccore:block/puff_tex_uxv", + "particle": "cosmiccore:block/puff_tex_uxv" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 8, 11], + "faces": { + "north": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [6, 0, 12, 6], "texture": "#0"}, + "down": {"uv": [0, 6, 6, 12], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [4, 7, 4], + "to": [12, 9, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 9, 5], + "to": [11, 11, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [6, 11, 6], + "to": [10, 15, 10], + "faces": { + "north": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "east": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "south": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "west": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [7, 12, 5], + "to": [9, 14, 11], + "faces": { + "north": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "east": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "south": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "west": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "up": {"uv": [4, 0, 6, 6], "texture": "#1"}, + "down": {"uv": [4, 0, 6, 6], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 12, 7], + "to": [11, 14, 9], + "faces": { + "north": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "east": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "south": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "west": {"uv": [10, 14, 12, 16], "texture": "#1"}, + "up": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "down": {"uv": [10, 14, 16, 16], "texture": "#1"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 45, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/uxv_ember_receptor.json b/src/main/resources/assets/cosmiccore/models/block/uxv_ember_receptor.json new file mode 100644 index 000000000..7847fe481 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/uxv_ember_receptor.json @@ -0,0 +1,130 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_tex_uxv", + "particle": "cosmiccore:block/puff_tex_uxv" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 4, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 2, 7], + "to": [6, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [10, 2, 7], + "to": [12, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 10], + "to": [9, 8, 12], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 4], + "to": [9, 8, 6], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [6, 3, 6], + "to": [10, 5, 10], + "faces": { + "north": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "east": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "south": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "west": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#0"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 0.8, 0], + "scale": [0.8, 0.8, 0.8] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/zpm_ember_emitter.json b/src/main/resources/assets/cosmiccore/models/block/zpm_ember_emitter.json new file mode 100644 index 000000000..2ec9d5982 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/zpm_ember_emitter.json @@ -0,0 +1,126 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_plating_zpm", + "1": "cosmiccore:block/puff_tex_zpm", + "particle": "cosmiccore:block/puff_tex_zpm" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 8, 11], + "faces": { + "north": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [6, 0, 12, 6], "texture": "#0"}, + "down": {"uv": [0, 6, 6, 12], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [4, 7, 4], + "to": [12, 9, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 9, 5], + "to": [11, 11, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [6, 11, 6], + "to": [10, 15, 10], + "faces": { + "north": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "east": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "south": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "west": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [7, 12, 5], + "to": [9, 14, 11], + "faces": { + "north": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "east": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "south": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "west": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "up": {"uv": [4, 0, 6, 6], "texture": "#1"}, + "down": {"uv": [4, 0, 6, 6], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 12, 7], + "to": [11, 14, 9], + "faces": { + "north": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "east": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "south": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "west": {"uv": [10, 14, 12, 16], "texture": "#1"}, + "up": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "down": {"uv": [10, 14, 16, 16], "texture": "#1"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 45, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/zpm_ember_receptor.json b/src/main/resources/assets/cosmiccore/models/block/zpm_ember_receptor.json new file mode 100644 index 000000000..98ef17c36 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/zpm_ember_receptor.json @@ -0,0 +1,130 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_tex_zpm", + "particle": "cosmiccore:block/puff_tex_zpm" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 4, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 2, 7], + "to": [6, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [10, 2, 7], + "to": [12, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 10], + "to": [9, 8, 12], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 4], + "to": [9, 8, 6], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [6, 3, 6], + "to": [10, 5, 10], + "faces": { + "north": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "east": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "south": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "west": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#0"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 0.8, 0], + "scale": [0.8, 0.8, 0.8] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee/bee_drone_fuzzy.json b/src/main/resources/assets/cosmiccore/models/item/bee/bee_drone_fuzzy.json new file mode 100644 index 000000000..38ce6f010 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee/bee_drone_fuzzy.json @@ -0,0 +1,9 @@ +{ + "parent": "forestry:item/mirror_hands", + "textures": { + "layer0": "cosmiccore:item/bee/drone.outline", + "layer1": "cosmiccore:item/bee/body1", + "layer2": "cosmiccore:item/bee/stripes", + "layer3": "cosmiccore:item/bee/drone.body2" + } +} diff --git a/src/main/resources/assets/cosmiccore/models/item/bee/bee_drone_fuzzy_princess.json b/src/main/resources/assets/cosmiccore/models/item/bee/bee_drone_fuzzy_princess.json new file mode 100644 index 000000000..99d0da8b3 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee/bee_drone_fuzzy_princess.json @@ -0,0 +1,9 @@ +{ + "parent": "forestry:item/mirror_hands", + "textures": { + "layer0": "cosmiccore:item/bee/princess.outline", + "layer1": "cosmiccore:item/bee/body1", + "layer2": "cosmiccore:item/bee/stripes", + "layer3": "cosmiccore:item/bee/princess.body2" + } +} diff --git a/src/main/resources/assets/cosmiccore/models/item/bee/bee_drone_fuzzy_queen.json b/src/main/resources/assets/cosmiccore/models/item/bee/bee_drone_fuzzy_queen.json new file mode 100644 index 000000000..cbadf3618 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee/bee_drone_fuzzy_queen.json @@ -0,0 +1,9 @@ +{ + "parent": "forestry:item/mirror_hands", + "textures": { + "layer0": "cosmiccore:item/bee/queen.outline", + "layer1": "cosmiccore:item/bee/body1", + "layer2": "cosmiccore:item/bee/stripes", + "layer3": "cosmiccore:item/bee/queen.body2" + } +} diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_abrasive.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_abrasive.json new file mode 100644 index 000000000..47b38f1bc --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_abrasive.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/abrasive" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_absent.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_absent.json new file mode 100644 index 000000000..a0b25b5f2 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_absent.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/absent" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_ambrosic.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_ambrosic.json new file mode 100644 index 000000000..d4369f787 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_ambrosic.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/ambrosic" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_architect.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_architect.json new file mode 100644 index 000000000..9936183c5 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_architect.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/architect" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_ashen.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_ashen.json new file mode 100644 index 000000000..437d18189 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_ashen.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/ashen" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_biohazard.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_biohazard.json new file mode 100644 index 000000000..19e0b895e --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_biohazard.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/biohazard" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_citrus_polymer.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_citrus_polymer.json new file mode 100644 index 000000000..5a683baca --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_citrus_polymer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/citrus_polymer" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_cobbled.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_cobbled.json new file mode 100644 index 000000000..f152611f4 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_cobbled.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/cobbled" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_constructive.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_constructive.json new file mode 100644 index 000000000..efb8e7bd4 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_constructive.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/constructive" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_cosmos.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_cosmos.json new file mode 100644 index 000000000..6b8af81b6 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_cosmos.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/cosmos" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_energized.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_energized.json new file mode 100644 index 000000000..a8b7bf990 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_energized.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/energized" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_exhaustive.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_exhaustive.json new file mode 100644 index 000000000..19002e41f --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_exhaustive.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/exhaustive" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_fate.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_fate.json new file mode 100644 index 000000000..06332d73b --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_fate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/fate" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_fracking.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_fracking.json new file mode 100644 index 000000000..2a8015b1b --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_fracking.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/fracking" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_grand_garden.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_grand_garden.json new file mode 100644 index 000000000..ca3cd3de5 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_grand_garden.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/grand_garden" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_hadal.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_hadal.json new file mode 100644 index 000000000..6d6fa86e3 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_hadal.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/hadal" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_hellsmith.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_hellsmith.json new file mode 100644 index 000000000..bec526c5d --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_hellsmith.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/hellsmith" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_hydraulic.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_hydraulic.json new file mode 100644 index 000000000..51d88c695 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_hydraulic.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/hydraulic" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_illusive.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_illusive.json new file mode 100644 index 000000000..736ccfda0 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_illusive.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/illusive" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_inquisitive.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_inquisitive.json new file mode 100644 index 000000000..d475a0b53 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_inquisitive.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/inquisitive" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_lofty_argon.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_lofty_argon.json new file mode 100644 index 000000000..8116ddbb8 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_lofty_argon.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/lofty_argon" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_lofty_hydrogen.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_lofty_hydrogen.json new file mode 100644 index 000000000..24934a9ee --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_lofty_hydrogen.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/lofty_hydrogen" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_lofty_nitrogen.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_lofty_nitrogen.json new file mode 100644 index 000000000..aba5b9d34 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_lofty_nitrogen.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/lofty_nitrogen" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_lofty_oxygen.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_lofty_oxygen.json new file mode 100644 index 000000000..b838a4d60 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_lofty_oxygen.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/lofty_oxygen" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_lunar.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_lunar.json new file mode 100644 index 000000000..55f93daa6 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_lunar.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/lunar" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_pale.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_pale.json new file mode 100644 index 000000000..d20dabe38 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_pale.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/pale" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_prismatic.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_prismatic.json new file mode 100644 index 000000000..230be7a78 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_prismatic.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/prismatic" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_pyrolytic.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_pyrolytic.json new file mode 100644 index 000000000..e7efa875f --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_pyrolytic.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/pyrolytic" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_radoxia.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_radoxia.json new file mode 100644 index 000000000..fd816ac8a --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_radoxia.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/radoxia" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_rocky.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_rocky.json new file mode 100644 index 000000000..65f40d722 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_rocky.json @@ -0,0 +1,3 @@ +{ + "parent": "forestry:item/bee_combs" +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_rose_polymer.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_rose_polymer.json new file mode 100644 index 000000000..586900bd6 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_rose_polymer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/rose_polymer" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_runic.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_runic.json new file mode 100644 index 000000000..acf63731b --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_runic.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/runic" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_shaman.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_shaman.json new file mode 100644 index 000000000..754301d68 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_shaman.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/shaman" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_slick.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_slick.json new file mode 100644 index 000000000..905d4c4a0 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_slick.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/slick" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_solar.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_solar.json new file mode 100644 index 000000000..2932dce52 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_solar.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/solar" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_soul.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_soul.json new file mode 100644 index 000000000..3cc9df8ce --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_soul.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/soul" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_virtue.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_virtue.json new file mode 100644 index 000000000..968bfe217 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_virtue.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/virtue" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_waxy_polymer.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_waxy_polymer.json new file mode 100644 index 000000000..45d1f9081 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_waxy_polymer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/waxy_polymer" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/decaying_cosmic_upgrade.json b/src/main/resources/assets/cosmiccore/models/item/decaying_cosmic_upgrade.json new file mode 100644 index 000000000..060a30c09 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/decaying_cosmic_upgrade.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/decaying" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/screwdriver.json b/src/main/resources/assets/cosmiccore/models/item/screwdriver.json new file mode 100644 index 000000000..a0b5d0034 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/screwdriver.json @@ -0,0 +1,20 @@ +{ + "loader": "tconstruct:tool", + "parent": "forge:item/default-tool", + "textures": { + "broken": "cosmiccore:item/tool/screwdriver/broken", + "head": "cosmiccore:item/tool/screwdriver/head_tool", + "handle": "cosmiccore:item/tool/screwdriver/handle" + }, + "modifier_roots": [ "tconstruct:item/tool/pickaxe/modifiers/" ], + "parts": [ + { "name": "handle", "index": 1 }, + { "name": "head", "index": 0 } + ], + "overrides": [ + { + "predicate": { "tconstruct:broken": 1 }, + "model": "cosmiccore:item/tool/screwdriver/broken" + } + ] +} diff --git a/src/main/resources/assets/cosmiccore/models/item/screwdriver_broken.json b/src/main/resources/assets/cosmiccore/models/item/screwdriver_broken.json new file mode 100644 index 000000000..469bcefdd --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/screwdriver_broken.json @@ -0,0 +1,7 @@ +{ + "loader": "tconstruct:tool", + "textures": { + "broken": "cosmiccore:item/tool/screwdriver/broken" + }, + "parts": [ { "name": "broken" } ] +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/screwdriver_head.json b/src/main/resources/assets/cosmiccore/models/item/screwdriver_head.json new file mode 100644 index 000000000..546733b7c --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/screwdriver_head.json @@ -0,0 +1,11 @@ +{ + "parent": "forge:item/default", + "loader": "tconstruct:material", + "offset": [ + -2, + 1 + ], + "textures": { + "texture": "cosmiccore:item/tool/screwdriver/head" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/wailing_cosmic_upgrade.json b/src/main/resources/assets/cosmiccore/models/item/wailing_cosmic_upgrade.json new file mode 100644 index 000000000..1bf665990 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/wailing_cosmic_upgrade.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/wailing" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/wire_cutter.json b/src/main/resources/assets/cosmiccore/models/item/wire_cutter.json new file mode 100644 index 000000000..6b0459955 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/wire_cutter.json @@ -0,0 +1,22 @@ +{ + "loader": "tconstruct:tool", + "parent": "forge:item/default-tool", + "textures": { + "broken": "cosmiccore:item/tool/wire_cutter/broken", + "head": "cosmiccore:item/tool/wire_cutter/head", + "handle": "cosmiccore:item/tool/wire_cutter/handle", + "binding": "cosmiccore:item/tool/wire_cutter/binding" + }, + "modifier_roots": [ "tconstruct:item/tool/pickaxe/modifiers/" ], + "parts": [ + { "name": "head", "index": 0 }, + { "name": "handle", "index": 1 }, + { "name": "binding","index": 2 } + ], + "overrides": [ + { + "predicate": { "tconstruct:broken": 1 }, + "model": "tconstruct:item/tool/pickaxe/broken" + } + ] +} diff --git a/src/main/resources/assets/cosmiccore/models/item/wire_cutter_broken.json b/src/main/resources/assets/cosmiccore/models/item/wire_cutter_broken.json new file mode 100644 index 000000000..d6ae6bf30 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/wire_cutter_broken.json @@ -0,0 +1,7 @@ +{ + "loader": "tconstruct:tool", + "textures": { + "broken": "cosmiccore:item/tool/wire_cutter/broken" + }, + "parts": [ { "name": "broken" } ] +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/wrench.json b/src/main/resources/assets/cosmiccore/models/item/wrench.json new file mode 100644 index 000000000..268f886d0 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/wrench.json @@ -0,0 +1,22 @@ +{ + "loader": "tconstruct:tool", + "parent": "forge:item/default-tool", + "textures": { + "broken": "cosmiccore:item/tool/wrench/broken", + "head": "cosmiccore:item/tool/wrench/head_tool", + "binding":"cosmiccore:item/tool/wrench/binding", + "handle": "cosmiccore:item/tool/wrench/handle" + }, + "modifier_roots": [ "tconstruct:item/tool/pickaxe/modifiers/" ], + "parts": [ + { "name": "handle", "index": 2 }, + { "name": "binding", "index": 1 }, + { "name": "head", "index": 0 } + ], + "overrides": [ + { + "predicate": { "tconstruct:broken": 1 }, + "model": "cosmiccore:item/tool/wrench/broken" + } + ] +} diff --git a/src/main/resources/assets/cosmiccore/models/item/wrench_broken.json b/src/main/resources/assets/cosmiccore/models/item/wrench_broken.json new file mode 100644 index 000000000..1c38d4e92 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/wrench_broken.json @@ -0,0 +1,7 @@ +{ + "loader": "tconstruct:tool", + "textures": { + "broken": "cosmiccore:item/tool/wrench/broken" + }, + "parts": [ { "name": "broken" } ] +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/wrench_head.json b/src/main/resources/assets/cosmiccore/models/item/wrench_head.json new file mode 100644 index 000000000..a39c6fbc5 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/wrench_head.json @@ -0,0 +1,11 @@ +{ + "parent": "forge:item/default", + "loader": "tconstruct:material", + "offset": [ + -2, + 1 + ], + "textures": { + "texture": "cosmiccore:item/tool/wrench/head" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/shaders/core/galaxy_bg.fsh b/src/main/resources/assets/cosmiccore/shaders/core/galaxy_bg.fsh new file mode 100644 index 000000000..b82c44659 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/shaders/core/galaxy_bg.fsh @@ -0,0 +1,140 @@ +#version 150 + +in vec2 texCoord; +out vec4 fragColor; + +uniform float GameTime; +uniform vec2 ScreenSize; +uniform float Intensity; + +float hash(vec2 p) { + return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453); +} + +float hash21(vec2 p) { + p = fract(p * vec2(234.34, 435.345)); + p += dot(p, p + 34.23); + return fract(p.x * p.y); +} + +float noise(vec2 p) { + vec2 i = floor(p); + vec2 f = fract(p); + f = f * f * (3.0 - 2.0 * f); + + float a = hash(i); + float b = hash(i + vec2(1.0, 0.0)); + float c = hash(i + vec2(0.0, 1.0)); + float d = hash(i + vec2(1.0, 1.0)); + + return mix(mix(a, b, f.x), mix(c, d, f.x), f.y); +} + +float fbm(vec2 p) { + float value = 0.0; + float amplitude = 0.5; + for (int i = 0; i < 6; i++) { + value += amplitude * noise(p); + p *= 2.0; + amplitude *= 0.5; + } + return value; +} + +float stars(vec2 uv, float density, float seed) { + vec2 gv = fract(uv * density) - 0.5; + vec2 id = floor(uv * density); + + float star = 0.0; + float rnd = hash21(id + seed); + + if (rnd > 0.8) { + float size = (rnd - 0.8) * 5.0; + star = smoothstep(0.1 * size + 0.02, 0.0, length(gv)); + } + + return star; +} + +void main() { + float time = GameTime * 1200.0; + + vec2 uv = texCoord; + vec2 aspect = vec2(ScreenSize.x / ScreenSize.y, 1.0); + vec2 centered = (uv - 0.5) * aspect; + + vec3 color = vec3(0.01, 0.01, 0.02); + + // Nebula clouds + vec2 nebulaUV1 = centered * 2.0 + vec2(time * 0.005, time * 0.003); + vec2 nebulaUV2 = centered * 1.5 + vec2(-time * 0.004, time * 0.006); + vec2 nebulaUV3 = centered * 3.0 + vec2(time * 0.003, -time * 0.004); + + float nebula1 = fbm(nebulaUV1); + float nebula2 = fbm(nebulaUV2); + float nebula3 = fbm(nebulaUV3); + + nebula1 = pow(nebula1, 2.0) * smoothstep(0.3, 0.7, nebula1); + nebula2 = pow(nebula2, 2.5) * smoothstep(0.35, 0.75, nebula2); + nebula3 = pow(nebula3, 2.0) * smoothstep(0.25, 0.6, nebula3); + + vec3 nebulaColor1 = vec3(0.15, 0.05, 0.25); + vec3 nebulaColor2 = vec3(0.05, 0.10, 0.20); + vec3 nebulaColor3 = vec3(0.20, 0.08, 0.12); + + color += nebulaColor1 * nebula1 * 0.6; + color += nebulaColor2 * nebula2 * 0.5; + color += nebulaColor3 * nebula3 * 0.4; + + // Bright nebula cores + float brightCore1 = pow(nebula1, 4.0) * 2.0; + float brightCore2 = pow(nebula2, 4.0) * 1.5; + + color += vec3(0.4, 0.2, 0.5) * brightCore1 * 0.3; + color += vec3(0.2, 0.3, 0.5) * brightCore2 * 0.25; + + // Cosmic dust + vec2 dustUV = centered * 4.0 + vec2(time * 0.002, 0.0); + float dust = fbm(dustUV); + dust = smoothstep(0.4, 0.6, dust); + color *= 1.0 - dust * 0.3; + + // Star layers + float starLayer1 = stars(uv + vec2(0.0, time * 0.001), 80.0, 1.0); + color += vec3(0.6, 0.6, 0.7) * starLayer1 * 0.3; + + float starLayer2 = stars(uv + vec2(time * 0.002, 0.0), 40.0, 2.0); + color += vec3(0.8, 0.8, 0.9) * starLayer2 * 0.5; + + float starLayer3 = stars(uv, 20.0, 3.0); + float twinkle = sin(time * 0.5 + hash(floor(uv * 20.0)) * 6.28) * 0.3 + 0.7; + color += vec3(1.0, 0.95, 0.9) * starLayer3 * twinkle * 0.8; + + // Colored stars + float coloredStar = stars(uv + 0.5, 15.0, 4.0); + vec3 starColor = mix( + vec3(1.0, 0.7, 0.5), + vec3(0.7, 0.8, 1.0), + hash(floor(uv * 15.0 + 0.5)) + ); + color += starColor * coloredStar * 0.6; + + // Central glow + float coreGlow = exp(-length(centered) * 2.0) * 0.15; + color += vec3(0.3, 0.25, 0.35) * coreGlow; + + // Shimmer + float shimmer = sin(time * 0.1 + fbm(centered * 5.0) * 6.28) * 0.02 + 1.0; + color *= shimmer; + + // Vignette + float vignette = 1.0 - length(centered) * 0.4; + vignette = clamp(vignette, 0.0, 1.0); + vignette = pow(vignette, 1.2); + color *= 0.7 + vignette * 0.3; + + color *= Intensity; + color = clamp(color, 0.0, 1.0); + + fragColor = vec4(color, 1.0); +} diff --git a/src/main/resources/assets/cosmiccore/shaders/core/galaxy_bg.json b/src/main/resources/assets/cosmiccore/shaders/core/galaxy_bg.json new file mode 100644 index 000000000..af62135fa --- /dev/null +++ b/src/main/resources/assets/cosmiccore/shaders/core/galaxy_bg.json @@ -0,0 +1,21 @@ +{ + "blend": { + "func": "add", + "srcrgb": "one", + "dstrgb": "zero" + }, + "vertex": "cosmiccore:galaxy_bg", + "fragment": "cosmiccore:galaxy_bg", + "attributes": [ + "Position", + "UV0" + ], + "samplers": [], + "uniforms": [ + { "name": "ModelViewMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, + { "name": "ProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, + { "name": "GameTime", "type": "float", "count": 1, "values": [ 0.0 ] }, + { "name": "ScreenSize", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] }, + { "name": "Intensity", "type": "float", "count": 1, "values": [ 1.0 ] } + ] +} diff --git a/src/main/resources/assets/cosmiccore/shaders/core/galaxy_bg.vsh b/src/main/resources/assets/cosmiccore/shaders/core/galaxy_bg.vsh new file mode 100644 index 000000000..e58d02c9d --- /dev/null +++ b/src/main/resources/assets/cosmiccore/shaders/core/galaxy_bg.vsh @@ -0,0 +1,16 @@ +#version 150 + +#moj_import + +in vec3 Position; +in vec2 UV0; + +out vec2 texCoord; + +uniform mat4 ModelViewMat; +uniform mat4 ProjMat; + +void main() { + gl_Position = ProjMat * ModelViewMat * vec4(Position, 1.0); + texCoord = UV0; +} diff --git a/src/main/resources/assets/cosmiccore/shaders/core/soul_aura.fsh b/src/main/resources/assets/cosmiccore/shaders/core/soul_aura.fsh new file mode 100644 index 000000000..dd54efe41 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/shaders/core/soul_aura.fsh @@ -0,0 +1,132 @@ +#version 150 + +in vec2 texCoord; +out vec4 fragColor; + +uniform float GameTime; +uniform vec2 ScreenSize; +uniform vec2 Center; +uniform vec3 BaseColor; +uniform float Intensity; +uniform float Radius; + +float hash(vec2 p) { + return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453); +} + +void main() { + float time = GameTime * 1200.0; + + vec2 aspectRatio = vec2(ScreenSize.x / ScreenSize.y, 1.0); + vec2 uv = (texCoord - Center) * aspectRatio; + + float dist = length(uv); + + float alpha = 0.0; + vec3 color = BaseColor; + + // Slow water ripples + float ringSpeed = 0.12; + for (int i = 0; i < 3; i++) { + float phase = float(i) * 2.5 + time * ringSpeed; + float ringDist = mod(phase, Radius * 2.8); + float ringAlpha = 1.0 - ringDist / (Radius * 2.8); + ringAlpha = ringAlpha * ringAlpha * ringAlpha; + float ring = smoothstep(0.06, 0.0, abs(dist - ringDist)) * ringAlpha; + alpha += ring * 0.15; + } + + // Orbiting wisps + for (int i = 0; i < 4; i++) { + float fi = float(i); + float orbitSpeed = 0.3 + fi * 0.1; + float orbitRadius = Radius * (0.7 + fi * 0.15); + float orbitAngle = time * orbitSpeed + fi * 1.571; + + vec2 wispPos = vec2(cos(orbitAngle), sin(orbitAngle)) * orbitRadius; + float wispDist = length(uv - wispPos); + + float wispCore = smoothstep(Radius * 0.2, 0.0, wispDist); + wispCore = wispCore * wispCore; + + float trailAngle = orbitAngle - 0.4; + vec2 trailPos = vec2(cos(trailAngle), sin(trailAngle)) * orbitRadius; + float trailDist = length(uv - trailPos); + float trail = smoothstep(Radius * 0.25, 0.0, trailDist) * 0.3; + + alpha += (wispCore + trail) * 0.2; + } + + // Aurora flow (cartesian to avoid atan discontinuity) + float flow1 = sin(uv.x * 8.0 + uv.y * 6.0 + time * 0.6 + dist * 4.0) * 0.5 + 0.5; + flow1 = flow1 * flow1; + flow1 *= smoothstep(Radius * 1.6, Radius * 0.6, dist); + flow1 *= smoothstep(Radius * 0.3, Radius * 0.7, dist); + + float flow2 = sin(uv.x * 6.0 - uv.y * 8.0 - time * 0.4 + dist * 3.0 + 2.0) * 0.5 + 0.5; + flow2 = flow2 * flow2; + flow2 *= smoothstep(Radius * 1.4, Radius * 0.5, dist); + flow2 *= smoothstep(Radius * 0.25, Radius * 0.6, dist); + + alpha += (flow1 + flow2) * 0.1; + + // Floating embers + for (int i = 0; i < 6; i++) { + float fi = float(i); + float seed = fi * 127.1; + + float px = (hash(vec2(seed, 0.0)) - 0.5) * Radius * 1.6; + float baseY = hash(vec2(seed, 1.0)) * Radius * 2.0; + float py = mod(baseY - time * 0.15 - fi * 0.15, Radius * 2.5) - Radius * 0.3; + px += sin(time * 0.3 + fi * 2.0) * Radius * 0.08; + + vec2 emberPos = vec2(px, -py); + float emberDist = length(uv - emberPos); + + float ember = smoothstep(Radius * 0.1, 0.0, emberDist); + ember = ember * ember; + + float heightFade = smoothstep(Radius * 1.8, Radius * 0.3, -py); + + alpha += ember * heightFade * 0.25; + color = mix(color, vec3(1.0, 0.95, 0.85), ember * heightFade * 0.2); + } + + // Soft tendrils + for (int i = 0; i < 4; i++) { + float fi = float(i); + float tendrilAngle = fi * 1.571 + time * 0.1 + sin(time * 0.2 + fi) * 0.2; + + float alongTendril = dot(uv, vec2(cos(tendrilAngle), sin(tendrilAngle))); + float perpTendril = length(uv - vec2(cos(tendrilAngle), sin(tendrilAngle)) * max(alongTendril, 0.0)); + + float tendrilWidth = Radius * 0.1 * (1.0 - alongTendril / (Radius * 1.8)); + tendrilWidth = max(tendrilWidth, 0.02); + + float tendril = smoothstep(tendrilWidth, 0.0, perpTendril); + tendril *= smoothstep(0.0, Radius * 0.5, alongTendril); + tendril *= smoothstep(Radius * 1.6, Radius * 0.7, alongTendril); + tendril *= 0.6 + 0.4 * sin(alongTendril * 5.0 - time * 1.5); + + alpha += tendril * 0.1; + } + + // Core glow + float core = 1.0 - smoothstep(0.0, Radius * 0.6, dist); + core = pow(core, 1.8); + alpha += core * 0.25; + + // Outer glow + float outerGlow = 1.0 - smoothstep(Radius * 0.2, Radius * 1.5, dist); + outerGlow = outerGlow * outerGlow; + alpha += outerGlow * 0.15; + + alpha *= Intensity; + + float boundary = 1.0 - smoothstep(Radius * 1.3, Radius * 2.0, dist); + alpha *= boundary; + + alpha = clamp(alpha, 0.0, 1.0); + + fragColor = vec4(color, alpha); +} diff --git a/src/main/resources/assets/cosmiccore/shaders/core/soul_aura.json b/src/main/resources/assets/cosmiccore/shaders/core/soul_aura.json new file mode 100644 index 000000000..209d07c1f --- /dev/null +++ b/src/main/resources/assets/cosmiccore/shaders/core/soul_aura.json @@ -0,0 +1,24 @@ +{ + "blend": { + "func": "add", + "srcrgb": "srcalpha", + "dstrgb": "one" + }, + "vertex": "cosmiccore:soul_aura", + "fragment": "cosmiccore:soul_aura", + "attributes": [ + "Position", + "UV0" + ], + "samplers": [], + "uniforms": [ + { "name": "ModelViewMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, + { "name": "ProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, + { "name": "GameTime", "type": "float", "count": 1, "values": [ 0.0 ] }, + { "name": "ScreenSize", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] }, + { "name": "Center", "type": "float", "count": 2, "values": [ 0.5, 0.5 ] }, + { "name": "BaseColor", "type": "float", "count": 3, "values": [ 1.0, 0.85, 0.5 ] }, + { "name": "Intensity", "type": "float", "count": 1, "values": [ 1.0 ] }, + { "name": "Radius", "type": "float", "count": 1, "values": [ 0.15 ] } + ] +} diff --git a/src/main/resources/assets/cosmiccore/shaders/core/soul_aura.vsh b/src/main/resources/assets/cosmiccore/shaders/core/soul_aura.vsh new file mode 100644 index 000000000..e58d02c9d --- /dev/null +++ b/src/main/resources/assets/cosmiccore/shaders/core/soul_aura.vsh @@ -0,0 +1,16 @@ +#version 150 + +#moj_import + +in vec3 Position; +in vec2 UV0; + +out vec2 texCoord; + +uniform mat4 ModelViewMat; +uniform mat4 ProjMat; + +void main() { + gl_Position = ProjMat * ModelViewMat * vec4(Position, 1.0); + texCoord = UV0; +} diff --git a/src/main/resources/assets/cosmiccore/shaders/core/void_bg.fsh b/src/main/resources/assets/cosmiccore/shaders/core/void_bg.fsh new file mode 100644 index 000000000..eb6360eec --- /dev/null +++ b/src/main/resources/assets/cosmiccore/shaders/core/void_bg.fsh @@ -0,0 +1,119 @@ +#version 150 + +in vec2 texCoord; +out vec4 fragColor; + +uniform float GameTime; +uniform vec2 ScreenSize; +uniform float Intensity; + +float hash(vec2 p) { + return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453); +} + +float noise(vec2 p) { + vec2 i = floor(p); + vec2 f = fract(p); + f = f * f * (3.0 - 2.0 * f); + + float a = hash(i); + float b = hash(i + vec2(1.0, 0.0)); + float c = hash(i + vec2(0.0, 1.0)); + float d = hash(i + vec2(1.0, 1.0)); + + return mix(mix(a, b, f.x), mix(c, d, f.x), f.y); +} + +float fbm(vec2 p) { + float value = 0.0; + float amplitude = 0.5; + for (int i = 0; i < 5; i++) { + value += amplitude * noise(p); + p *= 2.0; + amplitude *= 0.5; + } + return value; +} + +void main() { + float time = GameTime * 1200.0; + + vec2 uv = texCoord; + vec2 aspect = vec2(ScreenSize.x / ScreenSize.y, 1.0); + vec2 centered = (uv - 0.5) * aspect; + + vec3 color = vec3(0.0); + + // Void mist + vec2 mistUV1 = centered * 1.5 + vec2(time * 0.02, time * 0.01); + vec2 mistUV2 = centered * 2.0 + vec2(-time * 0.015, time * 0.025); + + float mist1 = fbm(mistUV1) * 0.5 + 0.5; + float mist2 = fbm(mistUV2) * 0.5 + 0.5; + float mist = mist1 * mist2; + + vec3 mistColor = vec3(0.08, 0.04, 0.12); + color += mistColor * mist * 0.4; + + // Drifting wisps + for (int i = 0; i < 4; i++) { + float fi = float(i); + float wispTime = time * 0.03 + fi * 1.57; + + vec2 wispCenter = vec2( + sin(wispTime * 0.7 + fi * 2.0) * 0.3, + cos(wispTime * 0.5 + fi * 1.5) * 0.25 + ); + + vec2 toWisp = centered - wispCenter; + float wispDist = length(toWisp); + float wisp = exp(-wispDist * 4.0) * 0.3; + + vec3 wispColor = mix( + vec3(0.15, 0.08, 0.20), + vec3(0.10, 0.12, 0.18), + sin(fi * 1.5) * 0.5 + 0.5 + ); + + color += wispColor * wisp; + } + + // Energy tendrils + float tendrilNoise = fbm(centered * 3.0 + vec2(time * 0.05, 0.0)); + tendrilNoise = pow(tendrilNoise, 3.0); + + vec3 tendrilColor = vec3(0.12, 0.06, 0.15); + color += tendrilColor * tendrilNoise * 0.2; + + // Floating dust + for (int i = 0; i < 8; i++) { + float fi = float(i); + float seed = fi * 127.1; + + float px = (hash(vec2(seed, 0.0)) - 0.5) * 1.5; + float py = mod(hash(vec2(seed, 1.0)) - time * 0.02 - fi * 0.05, 1.5) - 0.75; + px += sin(time * 0.1 + fi * 2.0) * 0.05; + + vec2 particlePos = vec2(px, py); + float particleDist = length(centered - particlePos); + + float particle = exp(-particleDist * 50.0) * 0.3; + float twinkle = sin(time * (0.5 + fi * 0.2) + fi * 3.0) * 0.3 + 0.7; + + color += vec3(0.3, 0.25, 0.35) * particle * twinkle; + } + + // Ambient pulse + float pulse = sin(time * 0.15) * 0.02 + 0.98; + color *= pulse; + + // Vignette + float vignette = 1.0 - length(centered) * 0.6; + vignette = clamp(vignette, 0.0, 1.0); + vignette = pow(vignette, 1.5); + color *= vignette; + + color *= Intensity; + + fragColor = vec4(color, 1.0); +} diff --git a/src/main/resources/assets/cosmiccore/shaders/core/void_bg.json b/src/main/resources/assets/cosmiccore/shaders/core/void_bg.json new file mode 100644 index 000000000..2425414e1 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/shaders/core/void_bg.json @@ -0,0 +1,21 @@ +{ + "blend": { + "func": "add", + "srcrgb": "one", + "dstrgb": "zero" + }, + "vertex": "cosmiccore:void_bg", + "fragment": "cosmiccore:void_bg", + "attributes": [ + "Position", + "UV0" + ], + "samplers": [], + "uniforms": [ + { "name": "ModelViewMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, + { "name": "ProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, + { "name": "GameTime", "type": "float", "count": 1, "values": [ 0.0 ] }, + { "name": "ScreenSize", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] }, + { "name": "Intensity", "type": "float", "count": 1, "values": [ 1.0 ] } + ] +} diff --git a/src/main/resources/assets/cosmiccore/shaders/core/void_bg.vsh b/src/main/resources/assets/cosmiccore/shaders/core/void_bg.vsh new file mode 100644 index 000000000..e58d02c9d --- /dev/null +++ b/src/main/resources/assets/cosmiccore/shaders/core/void_bg.vsh @@ -0,0 +1,16 @@ +#version 150 + +#moj_import + +in vec3 Position; +in vec2 UV0; + +out vec2 texCoord; + +uniform mat4 ModelViewMat; +uniform mat4 ProjMat; + +void main() { + gl_Position = ProjMat * ModelViewMat * vec4(Position, 1.0); + texCoord = UV0; +} diff --git a/src/main/resources/assets/cosmiccore/sounds/dawnforge.ogg b/src/main/resources/assets/cosmiccore/sounds/dawnforge.ogg new file mode 100644 index 000000000..e6c2f3952 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/sounds/dawnforge.ogg differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/cosmetic/iron_plated_deepslate_tile.png b/src/main/resources/assets/cosmiccore/textures/block/casings/cosmetic/iron_plated_deepslate_tile.png new file mode 100644 index 000000000..b23079e15 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/cosmetic/iron_plated_deepslate_tile.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/cosmetic/iron_plated_deepslate_tile.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/cosmetic/iron_plated_deepslate_tile.png.mcmeta new file mode 100644 index 000000000..b2330d7f1 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/cosmetic/iron_plated_deepslate_tile.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/cosmetic/iron_plated_deepslate_tile_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/cosmetic/iron_plated_deepslate_tile_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/cosmetic/iron_plated_deepslate_tile_ctm.png new file mode 100644 index 000000000..0b1bea6dc Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/cosmetic/iron_plated_deepslate_tile_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/cosmetic/steel_rose_light.png b/src/main/resources/assets/cosmiccore/textures/block/casings/cosmetic/steel_rose_light.png new file mode 100644 index 000000000..89e756dcd Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/cosmetic/steel_rose_light.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/cosmetic/steel_rose_light.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/cosmetic/steel_rose_light.png.mcmeta new file mode 100644 index 000000000..d0242c2b5 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/cosmetic/steel_rose_light.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/cosmetic/steel_rose_light_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/cosmetic/steel_rose_light_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/cosmetic/steel_rose_light_ctm.png new file mode 100644 index 000000000..eeb4cb225 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/cosmetic/steel_rose_light_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/moth/moth_home_t1.png b/src/main/resources/assets/cosmiccore/textures/block/casings/moth/moth_home_t1.png new file mode 100644 index 000000000..274c1bd88 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/moth/moth_home_t1.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/moth/moth_home_t2.png b/src/main/resources/assets/cosmiccore/textures/block/casings/moth/moth_home_t2.png new file mode 100644 index 000000000..274c1bd88 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/moth/moth_home_t2.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/moth/moth_home_t3.png b/src/main/resources/assets/cosmiccore/textures/block/casings/moth/moth_home_t3.png new file mode 100644 index 000000000..274c1bd88 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/moth/moth_home_t3.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/moth/moth_home_t4.png b/src/main/resources/assets/cosmiccore/textures/block/casings/moth/moth_home_t4.png new file mode 100644 index 000000000..274c1bd88 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/moth/moth_home_t4.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/bolted_heavy_frame_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/bolted_heavy_frame_casing.png new file mode 100644 index 000000000..274c1bd88 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/bolted_heavy_frame_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/bolted_heavy_frame_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/bolted_heavy_frame_casing.png.mcmeta new file mode 100644 index 000000000..c517837e1 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/bolted_heavy_frame_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/bolted_heavy_frame_casing_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/bolted_heavy_frame_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/bolted_heavy_frame_casing_ctm.png new file mode 100644 index 000000000..726cea52a Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/bolted_heavy_frame_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/ethersteel_plated_ash_tiles.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/ethersteel_plated_ash_tiles.png new file mode 100644 index 000000000..e10d3989e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/ethersteel_plated_ash_tiles.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/ethersteel_plated_ash_tiles.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/ethersteel_plated_ash_tiles.png.mcmeta new file mode 100644 index 000000000..089900b1d --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/ethersteel_plated_ash_tiles.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/ethersteel_plated_ash_tiles_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/ethersteel_plated_ash_tiles_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/ethersteel_plated_ash_tiles_ctm.png new file mode 100644 index 000000000..cc7fe32ef Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/ethersteel_plated_ash_tiles_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/highly_flexible_reinforced_trinavine_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/highly_flexible_reinforced_trinavine_casing.png index 2c8437319..230a67867 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/highly_flexible_reinforced_trinavine_casing.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/highly_flexible_reinforced_trinavine_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/highly_flexible_reinforced_trinavine_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/highly_flexible_reinforced_trinavine_casing_ctm.png index 5478df7fd..653b13336 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/highly_flexible_reinforced_trinavine_casing_ctm.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/highly_flexible_reinforced_trinavine_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/light_dawnstone_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/light_dawnstone_casing.png new file mode 100644 index 000000000..05fa52388 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/light_dawnstone_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/light_dawnstone_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/light_dawnstone_casing.png.mcmeta new file mode 100644 index 000000000..d87330f56 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/light_dawnstone_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/light_dawnstone_casing_ctm" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/light_dawnstone_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/light_dawnstone_casing_ctm.png new file mode 100644 index 000000000..f54c79ff5 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/light_dawnstone_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/livingrock_tiles.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/livingrock_tiles.png new file mode 100644 index 000000000..7c1ab7204 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/livingrock_tiles.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/moth_station_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/moth_station_casing.png new file mode 100644 index 000000000..1d0ac9c6c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/moth_station_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reinforced_dawnstone_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reinforced_dawnstone_casing.png new file mode 100644 index 000000000..e5f682487 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reinforced_dawnstone_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reinforced_dawnstone_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reinforced_dawnstone_casing.png.mcmeta new file mode 100644 index 000000000..6efb52b31 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reinforced_dawnstone_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/reinforced_dawnstone_casing_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reinforced_dawnstone_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reinforced_dawnstone_casing_ctm.png new file mode 100644 index 000000000..aeba84212 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reinforced_dawnstone_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rigid_high_speed_steel_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rigid_high_speed_steel_casing.png new file mode 100644 index 000000000..9903d1581 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rigid_high_speed_steel_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rigid_high_speed_steel_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rigid_high_speed_steel_casing.png.mcmeta new file mode 100644 index 000000000..fdc049d84 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rigid_high_speed_steel_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/rigid_high_speed_steel_casing_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rigid_high_speed_steel_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rigid_high_speed_steel_casing_ctm.png new file mode 100644 index 000000000..bdb1262c9 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rigid_high_speed_steel_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/royal_ichorium_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/royal_ichorium_casing.png index 30aec6c5b..5315e71c0 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/royal_ichorium_casing.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/royal_ichorium_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/royal_ichorium_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/royal_ichorium_casing_ctm.png index 213853e44..2c8c103c6 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/royal_ichorium_casing_ctm.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/royal_ichorium_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rust_stained_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rust_stained_casing.png new file mode 100644 index 000000000..bafa025ae Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rust_stained_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rust_stained_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rust_stained_casing.png.mcmeta new file mode 100644 index 000000000..b15f99473 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rust_stained_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/pressure_containment_casing_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rust_stained_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rust_stained_casing_ctm.png new file mode 100644 index 000000000..1a412bd28 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rust_stained_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rust_weave_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rust_weave_casing.png new file mode 100644 index 000000000..13aa04203 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rust_weave_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rust_weave_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rust_weave_casing.png.mcmeta new file mode 100644 index 000000000..8c0317b4f --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rust_weave_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/rust_weave_casing_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rust_weave_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rust_weave_casing_ctm.png new file mode 100644 index 000000000..63fb4c0c6 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rust_weave_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/somarust_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/somarust_casing.png new file mode 100644 index 000000000..5b53395c4 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/somarust_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/somarust_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/somarust_casing.png.mcmeta new file mode 100644 index 000000000..79cd22d40 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/somarust_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/somarust_casing_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/somarust_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/somarust_casing_ctm.png new file mode 100644 index 000000000..f221941c5 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/somarust_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/soul_muted_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/soul_muted_casing.png new file mode 100644 index 000000000..762fcda5d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/soul_muted_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/soul_muted_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/soul_muted_casing.png.mcmeta new file mode 100644 index 000000000..0d6f3d332 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/soul_muted_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/soul_muted_casing_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/soul_muted_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/soul_muted_casing_ctm.png new file mode 100644 index 000000000..82eb7c210 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/soul_muted_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/soul_stained_steel_aluminium_plated_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/soul_stained_steel_aluminium_plated_casing.png new file mode 100644 index 000000000..30b838828 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/soul_stained_steel_aluminium_plated_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/soul_stained_steel_aluminium_plated_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/soul_stained_steel_aluminium_plated_casing.png.mcmeta new file mode 100644 index 000000000..fde8c8ffd --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/soul_stained_steel_aluminium_plated_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/soul_stained_steel_aluminium_plated_casing_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/soul_stained_steel_aluminium_plated_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/soul_stained_steel_aluminium_plated_casing_ctm.png new file mode 100644 index 000000000..b8b6fb86e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/soul_stained_steel_aluminium_plated_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/superheavy_steel_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/superheavy_steel_casing.png new file mode 100644 index 000000000..2897c291a Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/superheavy_steel_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/superheavy_steel_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/superheavy_steel_casing.png.mcmeta new file mode 100644 index 000000000..10c9765cb --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/superheavy_steel_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/superheavy_steel_casing_ctm" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/superheavy_steel_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/superheavy_steel_casing_ctm.png new file mode 100644 index 000000000..30f0945ca Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/superheavy_steel_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/diving_bell_escape_pad.png b/src/main/resources/assets/cosmiccore/textures/block/diving_bell_escape_pad.png new file mode 100644 index 000000000..274c1bd88 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/diving_bell_escape_pad.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/embers/archaic_large_bricks.png b/src/main/resources/assets/cosmiccore/textures/block/embers/archaic_large_bricks.png new file mode 100644 index 000000000..f53b4d57e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/embers/archaic_large_bricks.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.advanced_overclock_nutrient.png b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.advanced_overclock_nutrient.png new file mode 100644 index 000000000..ec969cef5 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.advanced_overclock_nutrient.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.advanced_overclock_nutrient.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.advanced_overclock_nutrient.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.advanced_overclock_nutrient.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.advanced_production_nutrient.png b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.advanced_production_nutrient.png new file mode 100644 index 000000000..021aa7f3e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.advanced_production_nutrient.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.advanced_production_nutrient.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.advanced_production_nutrient.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.advanced_production_nutrient.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.basic_overclock_nutrient.png b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.basic_overclock_nutrient.png new file mode 100644 index 000000000..e043c60a8 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.basic_overclock_nutrient.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.basic_overclock_nutrient.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.basic_overclock_nutrient.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.basic_overclock_nutrient.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.basic_production_nutrient.png b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.basic_production_nutrient.png new file mode 100644 index 000000000..9073459d7 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.basic_production_nutrient.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.basic_production_nutrient.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.basic_production_nutrient.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.basic_production_nutrient.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.pale_oil.png b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.pale_oil.png new file mode 100644 index 000000000..35e88f7f4 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.pale_oil.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.pale_oil.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.pale_oil.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.pale_oil.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.perfect_overclock_nutrient.png b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.perfect_overclock_nutrient.png new file mode 100644 index 000000000..ab922e10d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.perfect_overclock_nutrient.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.perfect_overclock_nutrient.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.perfect_overclock_nutrient.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.perfect_overclock_nutrient.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.perfect_production_nutrient.png b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.perfect_production_nutrient.png new file mode 100644 index 000000000..ce17fb8da Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.perfect_production_nutrient.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.perfect_production_nutrient.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.perfect_production_nutrient.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.perfect_production_nutrient.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.super_overclock_nutrient.png b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.super_overclock_nutrient.png new file mode 100644 index 000000000..75bc9308d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.super_overclock_nutrient.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.super_overclock_nutrient.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.super_overclock_nutrient.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.super_overclock_nutrient.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.super_production_nutrient.png b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.super_production_nutrient.png new file mode 100644 index 000000000..3e6db61e6 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.super_production_nutrient.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.super_production_nutrient.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.super_production_nutrient.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.super_production_nutrient.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/time_halo.png b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/time_halo.png new file mode 100644 index 000000000..4c2c10024 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/time_halo.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/time_halo.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/time_halo.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/time_halo.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/lanterns/steel_rose_lantern.png b/src/main/resources/assets/cosmiccore/textures/block/lanterns/steel_rose_lantern.png new file mode 100644 index 000000000..29305051c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/lanterns/steel_rose_lantern.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/lanterns/steel_rose_lantern.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/lanterns/steel_rose_lantern.png.mcmeta new file mode 100644 index 000000000..5169aabdc --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/lanterns/steel_rose_lantern.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 8 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/lanterns/steel_rose_lantern_hanging.png b/src/main/resources/assets/cosmiccore/textures/block/lanterns/steel_rose_lantern_hanging.png new file mode 100644 index 000000000..0481704b2 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/lanterns/steel_rose_lantern_hanging.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/lanterns/steel_rose_lantern_hanging.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/lanterns/steel_rose_lantern_hanging.png.mcmeta new file mode 100644 index 000000000..5169aabdc --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/lanterns/steel_rose_lantern_hanging.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 8 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/multiblock/dawnforge/overlay_front.png b/src/main/resources/assets/cosmiccore/textures/block/multiblock/dawnforge/overlay_front.png new file mode 100644 index 000000000..de1abfe72 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/multiblock/dawnforge/overlay_front.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/multiblock/dawnforge/overlay_front_active.png b/src/main/resources/assets/cosmiccore/textures/block/multiblock/dawnforge/overlay_front_active.png new file mode 100644 index 000000000..5b9e6ea67 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/multiblock/dawnforge/overlay_front_active.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/multiblock/dawnforge/overlay_front_active_emissive.png b/src/main/resources/assets/cosmiccore/textures/block/multiblock/dawnforge/overlay_front_active_emissive.png new file mode 100644 index 000000000..aac6af2f3 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/multiblock/dawnforge/overlay_front_active_emissive.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/multiblock/dawnforge/overlay_front_emissive.png b/src/main/resources/assets/cosmiccore/textures/block/multiblock/dawnforge/overlay_front_emissive.png new file mode 100644 index 000000000..c60f7cd03 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/multiblock/dawnforge/overlay_front_emissive.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/calx_reactor/overlay_front.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/calx_reactor/overlay_front.png new file mode 100644 index 000000000..9021e2c87 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/calx_reactor/overlay_front.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/industrial_apiary/overlay_front.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/industrial_apiary/overlay_front.png new file mode 100644 index 000000000..3621367bc Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/industrial_apiary/overlay_front.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/industrial_apiary/overlay_side.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/industrial_apiary/overlay_side.png new file mode 100644 index 000000000..3621367bc Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/industrial_apiary/overlay_side.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/industrial_apiary/overlay_top.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/industrial_apiary/overlay_top.png new file mode 100644 index 000000000..9884d8bd6 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/industrial_apiary/overlay_top.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/mana_leaching_tub/overlay_front.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/mana_leaching_tub/overlay_front.png new file mode 100644 index 000000000..c895d0094 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/mana_leaching_tub/overlay_front.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_fluid_hatch.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_fluid_hatch.png new file mode 100644 index 000000000..91b0b07d1 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_fluid_hatch.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_fluid_hatch_half_px_out.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_fluid_hatch_half_px_out.png new file mode 100644 index 000000000..becad5fac Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_fluid_hatch_half_px_out.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_fluid_hatch_input.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_fluid_hatch_input.png new file mode 100644 index 000000000..42561905a Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_fluid_hatch_input.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_fluid_hatch_output.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_fluid_hatch_output.png new file mode 100644 index 000000000..56af33b47 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_fluid_hatch_output.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_fluid_output.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_fluid_output.png new file mode 100644 index 000000000..903009bd1 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_fluid_output.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_fluid_output.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_fluid_output.png.mcmeta new file mode 100644 index 000000000..97596ba81 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_fluid_output.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_pipe_4x.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_pipe_4x.png new file mode 100644 index 000000000..8bd50cf86 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_pipe_4x.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_pipe_in_emissive.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_pipe_in_emissive.png new file mode 100644 index 000000000..06a1f6795 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_pipe_in_emissive.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_pipe_in_emissive.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_pipe_in_emissive.png.mcmeta new file mode 100644 index 000000000..ceecb036f --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_pipe_in_emissive.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_pipe_out_emissive.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_pipe_out_emissive.png new file mode 100644 index 000000000..0844c5b70 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_pipe_out_emissive.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_pipe_out_emissive.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_pipe_out_emissive.png.mcmeta new file mode 100644 index 000000000..ceecb036f --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_pipe_out_emissive.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/roaster/overlay_front.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/roaster/overlay_front.png new file mode 100644 index 000000000..f65b1a589 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/roaster/overlay_front.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/thermomagnitizer/overlay_front.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/thermomagnitizer/overlay_front.png new file mode 100644 index 000000000..e2388c021 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/thermomagnitizer/overlay_front.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/vaccum_bubbler/overlay_front.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/vaccum_bubbler/overlay_front.png new file mode 100644 index 000000000..c0a38c6bc Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/vaccum_bubbler/overlay_front.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/me_assemblyline_overlay_base.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/me_assemblyline_overlay_base.png new file mode 100644 index 000000000..a51deaa43 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/me_assemblyline_overlay_base.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/me_assemblyline_overlay_fluid_emissive.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/me_assemblyline_overlay_fluid_emissive.png new file mode 100644 index 000000000..67b10403a Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/me_assemblyline_overlay_fluid_emissive.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/me_assemblyline_overlay_item_emissive.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/me_assemblyline_overlay_item_emissive.png new file mode 100644 index 000000000..5a805da3c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/me_assemblyline_overlay_item_emissive.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/module_hatch.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/module_hatch.png new file mode 100644 index 000000000..e0a7319ab Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/module_hatch.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/module_hatch_emissive.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/module_hatch_emissive.png new file mode 100644 index 000000000..760aa101f Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/module_hatch_emissive.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/puff_plating_ev.png b/src/main/resources/assets/cosmiccore/textures/block/puff_plating_ev.png new file mode 100644 index 000000000..f995cd654 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/puff_plating_ev.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/puff_plating_hv.png b/src/main/resources/assets/cosmiccore/textures/block/puff_plating_hv.png new file mode 100644 index 000000000..92006c4d2 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/puff_plating_hv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/puff_plating_iv.png b/src/main/resources/assets/cosmiccore/textures/block/puff_plating_iv.png new file mode 100644 index 000000000..84fece590 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/puff_plating_iv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/puff_plating_luv.png b/src/main/resources/assets/cosmiccore/textures/block/puff_plating_luv.png new file mode 100644 index 000000000..426d0175c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/puff_plating_luv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/puff_plating_lv.png b/src/main/resources/assets/cosmiccore/textures/block/puff_plating_lv.png new file mode 100644 index 000000000..41a2275ae Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/puff_plating_lv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/puff_plating_mv.png b/src/main/resources/assets/cosmiccore/textures/block/puff_plating_mv.png new file mode 100644 index 000000000..46c54cdc2 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/puff_plating_mv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/puff_plating_steam.png b/src/main/resources/assets/cosmiccore/textures/block/puff_plating_steam.png new file mode 100644 index 000000000..135980525 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/puff_plating_steam.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/puff_plating_zpm.png b/src/main/resources/assets/cosmiccore/textures/block/puff_plating_zpm.png new file mode 100644 index 000000000..2bca0b06c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/puff_plating_zpm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/puff_tex_ev.png b/src/main/resources/assets/cosmiccore/textures/block/puff_tex_ev.png new file mode 100644 index 000000000..4a271c4b7 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/puff_tex_ev.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/puff_tex_hv.png b/src/main/resources/assets/cosmiccore/textures/block/puff_tex_hv.png new file mode 100644 index 000000000..7fe104407 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/puff_tex_hv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/puff_tex_iv.png b/src/main/resources/assets/cosmiccore/textures/block/puff_tex_iv.png new file mode 100644 index 000000000..ecbee98e7 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/puff_tex_iv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/puff_tex_luv.png b/src/main/resources/assets/cosmiccore/textures/block/puff_tex_luv.png new file mode 100644 index 000000000..8af1ac9b7 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/puff_tex_luv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/puff_tex_lv.png b/src/main/resources/assets/cosmiccore/textures/block/puff_tex_lv.png new file mode 100644 index 000000000..7acaf20b8 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/puff_tex_lv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/puff_tex_mv.png b/src/main/resources/assets/cosmiccore/textures/block/puff_tex_mv.png new file mode 100644 index 000000000..98b1ed345 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/puff_tex_mv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/puff_tex_steam.png b/src/main/resources/assets/cosmiccore/textures/block/puff_tex_steam.png new file mode 100644 index 000000000..b3999dd15 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/puff_tex_steam.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/puff_tex_zpm.png b/src/main/resources/assets/cosmiccore/textures/block/puff_tex_zpm.png new file mode 100644 index 000000000..8800b0804 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/puff_tex_zpm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/environment/blackhole.png b/src/main/resources/assets/cosmiccore/textures/environment/blackhole.png new file mode 100644 index 000000000..dc8ed851e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/environment/blackhole.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/environment/dead_sun.png b/src/main/resources/assets/cosmiccore/textures/environment/dead_sun.png new file mode 100644 index 000000000..e5ecc4a71 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/environment/dead_sun.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/gui/overlay/bee_overlay.png b/src/main/resources/assets/cosmiccore/textures/gui/overlay/bee_overlay.png new file mode 100644 index 000000000..2b8bdaaa1 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/gui/overlay/bee_overlay.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/gui/overlay/dawnforge_slot.png b/src/main/resources/assets/cosmiccore/textures/gui/overlay/dawnforge_slot.png new file mode 100644 index 000000000..f565b1b13 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/gui/overlay/dawnforge_slot.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/gui/overlay/explosive_overlay.png b/src/main/resources/assets/cosmiccore/textures/gui/overlay/explosive_overlay.png new file mode 100644 index 000000000..233553cca Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/gui/overlay/explosive_overlay.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/gui/overlay/overlay_bee_holder.png b/src/main/resources/assets/cosmiccore/textures/gui/overlay/overlay_bee_holder.png new file mode 100644 index 000000000..7fb22d73b Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/gui/overlay/overlay_bee_holder.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/gui/oxygen_bg.png b/src/main/resources/assets/cosmiccore/textures/gui/oxygen_bg.png new file mode 100644 index 000000000..4d9c51484 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/gui/oxygen_bg.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/gui/oxygen_fill.png b/src/main/resources/assets/cosmiccore/textures/gui/oxygen_fill.png new file mode 100644 index 000000000..eb386aa8f Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/gui/oxygen_fill.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/gui/states.png b/src/main/resources/assets/cosmiccore/textures/gui/states.png deleted file mode 100644 index 5744f50f9..000000000 Binary files a/src/main/resources/assets/cosmiccore/textures/gui/states.png and /dev/null differ diff --git a/src/main/resources/assets/cosmiccore/textures/gui/tinker_pattern/screwdriver.png b/src/main/resources/assets/cosmiccore/textures/gui/tinker_pattern/screwdriver.png new file mode 100644 index 000000000..0dd24d8df Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/gui/tinker_pattern/screwdriver.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/gui/tinker_pattern/screwdriver_head.png b/src/main/resources/assets/cosmiccore/textures/gui/tinker_pattern/screwdriver_head.png new file mode 100644 index 000000000..0dd24d8df Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/gui/tinker_pattern/screwdriver_head.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/gui/tinker_pattern/wrench.png b/src/main/resources/assets/cosmiccore/textures/gui/tinker_pattern/wrench.png new file mode 100644 index 000000000..35114f268 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/gui/tinker_pattern/wrench.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/gui/tinker_pattern/wrench_head.png b/src/main/resources/assets/cosmiccore/textures/gui/tinker_pattern/wrench_head.png new file mode 100644 index 000000000..35114f268 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/gui/tinker_pattern/wrench_head.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/abrasive_rosin_millstones.png b/src/main/resources/assets/cosmiccore/textures/item/abrasive_rosin_millstones.png new file mode 100644 index 000000000..7ef648331 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/abrasive_rosin_millstones.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/advanced_gene_kit.png b/src/main/resources/assets/cosmiccore/textures/item/advanced_gene_kit.png new file mode 100644 index 000000000..159afde1a Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/advanced_gene_kit.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/armored_freight_beetle_grade_1.png b/src/main/resources/assets/cosmiccore/textures/item/armored_freight_beetle_grade_1.png new file mode 100644 index 000000000..31c130af1 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/armored_freight_beetle_grade_1.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/armored_freight_beetle_grade_2.png b/src/main/resources/assets/cosmiccore/textures/item/armored_freight_beetle_grade_2.png new file mode 100644 index 000000000..09ece7b88 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/armored_freight_beetle_grade_2.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/armored_freight_beetle_grade_3.png b/src/main/resources/assets/cosmiccore/textures/item/armored_freight_beetle_grade_3.png new file mode 100644 index 000000000..d0629aa9b Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/armored_freight_beetle_grade_3.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/armored_freight_beetle_grade_4.png b/src/main/resources/assets/cosmiccore/textures/item/armored_freight_beetle_grade_4.png new file mode 100644 index 000000000..acdb74e7d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/armored_freight_beetle_grade_4.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/armored_freight_beetle_grade_5.png b/src/main/resources/assets/cosmiccore/textures/item/armored_freight_beetle_grade_5.png new file mode 100644 index 000000000..5c0bedb9f Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/armored_freight_beetle_grade_5.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/asteroid_targeting_chip.png b/src/main/resources/assets/cosmiccore/textures/item/asteroid_targeting_chip.png new file mode 100644 index 000000000..2c95773ac Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/asteroid_targeting_chip.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/auric_asteroid.png b/src/main/resources/assets/cosmiccore/textures/item/auric_asteroid.png new file mode 100644 index 000000000..eced51cdd Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/auric_asteroid.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/basic_gene_kit.png b/src/main/resources/assets/cosmiccore/textures/item/basic_gene_kit.png new file mode 100644 index 000000000..0ee8ea435 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/basic_gene_kit.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/bee/body1.png b/src/main/resources/assets/cosmiccore/textures/item/bee/body1.png new file mode 100644 index 000000000..a475eda1e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/bee/body1.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/bee/drone.body2.png b/src/main/resources/assets/cosmiccore/textures/item/bee/drone.body2.png new file mode 100644 index 000000000..574ec7932 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/bee/drone.body2.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/bee/drone.body2.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/bee/drone.body2.png.mcmeta new file mode 100644 index 000000000..2856c9eab --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/bee/drone.body2.png.mcmeta @@ -0,0 +1,39 @@ +{ + "animation": { + "frames": [ + { + "index": 0, + "time": 64 + }, + { + "index": 1, + "time": 2 + }, + { + "index": 2, + "time": 2 + }, + { + "index": 1, + "time": 2 + }, + { + "index": 0, + "time": 96 + }, + { + "index": 3, + "time": 4 + }, + { + "index": 0, + "time": 128 + }, + { + "index": 4, + "time": 2 + } + ], + "frametime": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/bee/drone.outline.png b/src/main/resources/assets/cosmiccore/textures/item/bee/drone.outline.png new file mode 100644 index 000000000..aa31dc5d4 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/bee/drone.outline.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/bee/drone.outline.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/bee/drone.outline.png.mcmeta new file mode 100644 index 000000000..e6a0a256c --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/bee/drone.outline.png.mcmeta @@ -0,0 +1 @@ +{"animation":{"frametime":1,"frames":[{"index":0,"time":64},{"index":1,"time":2},{"index":2,"time":2},{"index":1,"time":2},{"index":0,"time":96},{"index":3,"time":4},{"index":0,"time":128},{"index":4,"time":2}]}} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/bee/larvae.body.png b/src/main/resources/assets/cosmiccore/textures/item/bee/larvae.body.png new file mode 100644 index 000000000..0f63aaf51 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/bee/larvae.body.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/bee/larvae.body.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/bee/larvae.body.png.mcmeta new file mode 100644 index 000000000..9c14fabed --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/bee/larvae.body.png.mcmeta @@ -0,0 +1 @@ +{"animation":{"frametime":1,"frames":[{"index":0,"time":64},{"index":1,"time":2},{"index":0,"time":48},{"index":1,"time":2}]}} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/bee/larvae.body2.png b/src/main/resources/assets/cosmiccore/textures/item/bee/larvae.body2.png new file mode 100644 index 000000000..a50272330 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/bee/larvae.body2.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/bee/larvae.body2.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/bee/larvae.body2.png.mcmeta new file mode 100644 index 000000000..9c14fabed --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/bee/larvae.body2.png.mcmeta @@ -0,0 +1 @@ +{"animation":{"frametime":1,"frames":[{"index":0,"time":64},{"index":1,"time":2},{"index":0,"time":48},{"index":1,"time":2}]}} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/bee/larvae.outline.png b/src/main/resources/assets/cosmiccore/textures/item/bee/larvae.outline.png new file mode 100644 index 000000000..44430b19e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/bee/larvae.outline.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/bee/larvae.outline.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/bee/larvae.outline.png.mcmeta new file mode 100644 index 000000000..9c14fabed --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/bee/larvae.outline.png.mcmeta @@ -0,0 +1 @@ +{"animation":{"frametime":1,"frames":[{"index":0,"time":64},{"index":1,"time":2},{"index":0,"time":48},{"index":1,"time":2}]}} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/bee/princess.body2.png b/src/main/resources/assets/cosmiccore/textures/item/bee/princess.body2.png new file mode 100644 index 000000000..3dc16108d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/bee/princess.body2.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/bee/princess.body2.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/bee/princess.body2.png.mcmeta new file mode 100644 index 000000000..5663f647c --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/bee/princess.body2.png.mcmeta @@ -0,0 +1 @@ +{"animation":{"frametime":1,"frames":[{"index":0,"time":128},{"index":3,"time":4},{"index":0,"time":96},{"index":1,"time":2},{"index":2,"time":2},{"index":1,"time":2},{"index":0,"time":64},{"index":4,"time":2}]}} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/bee/princess.outline.png b/src/main/resources/assets/cosmiccore/textures/item/bee/princess.outline.png new file mode 100644 index 000000000..aa31dc5d4 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/bee/princess.outline.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/bee/princess.outline.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/bee/princess.outline.png.mcmeta new file mode 100644 index 000000000..5663f647c --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/bee/princess.outline.png.mcmeta @@ -0,0 +1 @@ +{"animation":{"frametime":1,"frames":[{"index":0,"time":128},{"index":3,"time":4},{"index":0,"time":96},{"index":1,"time":2},{"index":2,"time":2},{"index":1,"time":2},{"index":0,"time":64},{"index":4,"time":2}]}} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/bee/queen.body2.png b/src/main/resources/assets/cosmiccore/textures/item/bee/queen.body2.png new file mode 100644 index 000000000..6f5e10687 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/bee/queen.body2.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/bee/queen.body2.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/bee/queen.body2.png.mcmeta new file mode 100644 index 000000000..db3452220 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/bee/queen.body2.png.mcmeta @@ -0,0 +1 @@ +{"animation":{"frametime":1,"frames":[{"index":0,"time":96},{"index":3,"time":4},{"index":0,"time":64},{"index":4,"time":2},{"index":0,"time":128},{"index":1,"time":2},{"index":2,"time":2},{"index":1,"time":2}]}} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/bee/queen.outline.png b/src/main/resources/assets/cosmiccore/textures/item/bee/queen.outline.png new file mode 100644 index 000000000..aa31dc5d4 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/bee/queen.outline.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/bee/queen.outline.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/bee/queen.outline.png.mcmeta new file mode 100644 index 000000000..db3452220 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/bee/queen.outline.png.mcmeta @@ -0,0 +1 @@ +{"animation":{"frametime":1,"frames":[{"index":0,"time":96},{"index":3,"time":4},{"index":0,"time":64},{"index":4,"time":2},{"index":0,"time":128},{"index":1,"time":2},{"index":2,"time":2},{"index":1,"time":2}]}} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/bee/stripes.png b/src/main/resources/assets/cosmiccore/textures/item/bee/stripes.png new file mode 100644 index 000000000..3b82ab3df Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/bee/stripes.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/bitumen_wax.png b/src/main/resources/assets/cosmiccore/textures/item/bitumen_wax.png new file mode 100644 index 000000000..6934fb754 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/bitumen_wax.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/brimstone_asteroid.png b/src/main/resources/assets/cosmiccore/textures/item/brimstone_asteroid.png new file mode 100644 index 000000000..4664b4842 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/brimstone_asteroid.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/bronze_supply_tank.png b/src/main/resources/assets/cosmiccore/textures/item/bronze_supply_tank.png new file mode 100644 index 000000000..01e2673a9 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/bronze_supply_tank.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/capacity_chip.png b/src/main/resources/assets/cosmiccore/textures/item/capacity_chip.png new file mode 100644 index 000000000..a01107d5e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/capacity_chip.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/carbon_asteroid_base.png b/src/main/resources/assets/cosmiccore/textures/item/carbon_asteroid_base.png new file mode 100644 index 000000000..ffd5c418f Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/carbon_asteroid_base.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/abrasive.png b/src/main/resources/assets/cosmiccore/textures/item/comb/abrasive.png new file mode 100644 index 000000000..f77615c8a Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/abrasive.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/absent.png b/src/main/resources/assets/cosmiccore/textures/item/comb/absent.png new file mode 100644 index 000000000..767dac024 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/absent.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/ambrosic.png b/src/main/resources/assets/cosmiccore/textures/item/comb/ambrosic.png new file mode 100644 index 000000000..d1db6abe4 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/ambrosic.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/architect.png b/src/main/resources/assets/cosmiccore/textures/item/comb/architect.png new file mode 100644 index 000000000..1ff29a905 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/architect.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/ashen.png b/src/main/resources/assets/cosmiccore/textures/item/comb/ashen.png new file mode 100644 index 000000000..6875fe736 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/ashen.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/biohazard.png b/src/main/resources/assets/cosmiccore/textures/item/comb/biohazard.png new file mode 100644 index 000000000..5096b5680 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/biohazard.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/citrus_polymer.png b/src/main/resources/assets/cosmiccore/textures/item/comb/citrus_polymer.png new file mode 100644 index 000000000..dc457d67e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/citrus_polymer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/cobbled.png b/src/main/resources/assets/cosmiccore/textures/item/comb/cobbled.png new file mode 100644 index 000000000..6cea2cca2 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/cobbled.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/constructive.png b/src/main/resources/assets/cosmiccore/textures/item/comb/constructive.png new file mode 100644 index 000000000..2c6d2d2f8 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/constructive.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/cosmos.png b/src/main/resources/assets/cosmiccore/textures/item/comb/cosmos.png new file mode 100644 index 000000000..99b3ff574 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/cosmos.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/energized.png b/src/main/resources/assets/cosmiccore/textures/item/comb/energized.png new file mode 100644 index 000000000..d3f1ea587 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/energized.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/exhaustive.png b/src/main/resources/assets/cosmiccore/textures/item/comb/exhaustive.png new file mode 100644 index 000000000..977719b51 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/exhaustive.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/fate.png b/src/main/resources/assets/cosmiccore/textures/item/comb/fate.png new file mode 100644 index 000000000..2e037ed77 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/fate.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/fracking.png b/src/main/resources/assets/cosmiccore/textures/item/comb/fracking.png new file mode 100644 index 000000000..4e2c41e48 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/fracking.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/grand_garden.png b/src/main/resources/assets/cosmiccore/textures/item/comb/grand_garden.png new file mode 100644 index 000000000..8b6acea92 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/grand_garden.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/hadal.png b/src/main/resources/assets/cosmiccore/textures/item/comb/hadal.png new file mode 100644 index 000000000..a4d94a23c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/hadal.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/hellsmith.png b/src/main/resources/assets/cosmiccore/textures/item/comb/hellsmith.png new file mode 100644 index 000000000..b3844305d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/hellsmith.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/hydraulic.png b/src/main/resources/assets/cosmiccore/textures/item/comb/hydraulic.png new file mode 100644 index 000000000..0b0afadc6 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/hydraulic.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/illusive.png b/src/main/resources/assets/cosmiccore/textures/item/comb/illusive.png new file mode 100644 index 000000000..1ad5f46b7 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/illusive.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/inquisitive.png b/src/main/resources/assets/cosmiccore/textures/item/comb/inquisitive.png new file mode 100644 index 000000000..6408318d1 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/inquisitive.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/lofty_argon.png b/src/main/resources/assets/cosmiccore/textures/item/comb/lofty_argon.png new file mode 100644 index 000000000..039254f0e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/lofty_argon.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/lofty_hydrogen.png b/src/main/resources/assets/cosmiccore/textures/item/comb/lofty_hydrogen.png new file mode 100644 index 000000000..fbc31f75d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/lofty_hydrogen.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/lofty_nitrogen.png b/src/main/resources/assets/cosmiccore/textures/item/comb/lofty_nitrogen.png new file mode 100644 index 000000000..011b29b0b Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/lofty_nitrogen.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/lofty_oxygen.png b/src/main/resources/assets/cosmiccore/textures/item/comb/lofty_oxygen.png new file mode 100644 index 000000000..2a27a2775 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/lofty_oxygen.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/lunar.png b/src/main/resources/assets/cosmiccore/textures/item/comb/lunar.png new file mode 100644 index 000000000..f00e3215c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/lunar.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/pale.png b/src/main/resources/assets/cosmiccore/textures/item/comb/pale.png new file mode 100644 index 000000000..e9055579f Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/pale.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/prismatic.png b/src/main/resources/assets/cosmiccore/textures/item/comb/prismatic.png new file mode 100644 index 000000000..391ea0405 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/prismatic.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/pyrolytic.png b/src/main/resources/assets/cosmiccore/textures/item/comb/pyrolytic.png new file mode 100644 index 000000000..c36371e26 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/pyrolytic.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/radoxia.png b/src/main/resources/assets/cosmiccore/textures/item/comb/radoxia.png new file mode 100644 index 000000000..928c93c46 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/radoxia.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/rose_polymer.png b/src/main/resources/assets/cosmiccore/textures/item/comb/rose_polymer.png new file mode 100644 index 000000000..d05880ac3 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/rose_polymer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/runic.png b/src/main/resources/assets/cosmiccore/textures/item/comb/runic.png new file mode 100644 index 000000000..31d971753 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/runic.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/shaman.png b/src/main/resources/assets/cosmiccore/textures/item/comb/shaman.png new file mode 100644 index 000000000..7f0811b17 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/shaman.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/slick.png b/src/main/resources/assets/cosmiccore/textures/item/comb/slick.png new file mode 100644 index 000000000..ecfd5b781 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/slick.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/solar.png b/src/main/resources/assets/cosmiccore/textures/item/comb/solar.png new file mode 100644 index 000000000..4b416c3f6 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/solar.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/soul.png b/src/main/resources/assets/cosmiccore/textures/item/comb/soul.png new file mode 100644 index 000000000..cd436b052 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/soul.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/virtue.png b/src/main/resources/assets/cosmiccore/textures/item/comb/virtue.png new file mode 100644 index 000000000..95590f3a0 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/virtue.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/waxy_polymer.png b/src/main/resources/assets/cosmiccore/textures/item/comb/waxy_polymer.png new file mode 100644 index 000000000..f244cdf9e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/waxy_polymer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/crucible_mantis_grade_1.png b/src/main/resources/assets/cosmiccore/textures/item/crucible_mantis_grade_1.png new file mode 100644 index 000000000..f1d140525 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/crucible_mantis_grade_1.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/crucible_mantis_grade_2.png b/src/main/resources/assets/cosmiccore/textures/item/crucible_mantis_grade_2.png new file mode 100644 index 000000000..6d28daf77 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/crucible_mantis_grade_2.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/crucible_mantis_grade_3.png b/src/main/resources/assets/cosmiccore/textures/item/crucible_mantis_grade_3.png new file mode 100644 index 000000000..442eae4b5 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/crucible_mantis_grade_3.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/crucible_mantis_grade_4.png b/src/main/resources/assets/cosmiccore/textures/item/crucible_mantis_grade_4.png new file mode 100644 index 000000000..d6ce04586 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/crucible_mantis_grade_4.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/crucible_mantis_grade_5.png b/src/main/resources/assets/cosmiccore/textures/item/crucible_mantis_grade_5.png new file mode 100644 index 000000000..0b2afbbf6 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/crucible_mantis_grade_5.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/crusher_wasps_grade_1.png b/src/main/resources/assets/cosmiccore/textures/item/crusher_wasps_grade_1.png new file mode 100644 index 000000000..f4e4f460a Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/crusher_wasps_grade_1.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/crusher_wasps_grade_2.png b/src/main/resources/assets/cosmiccore/textures/item/crusher_wasps_grade_2.png new file mode 100644 index 000000000..73badc8ce Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/crusher_wasps_grade_2.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/crusher_wasps_grade_3.png b/src/main/resources/assets/cosmiccore/textures/item/crusher_wasps_grade_3.png new file mode 100644 index 000000000..7bb9d1a64 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/crusher_wasps_grade_3.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/crusher_wasps_grade_4.png b/src/main/resources/assets/cosmiccore/textures/item/crusher_wasps_grade_4.png new file mode 100644 index 000000000..3f7baf51b Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/crusher_wasps_grade_4.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/crusher_wasps_grade_5.png b/src/main/resources/assets/cosmiccore/textures/item/crusher_wasps_grade_5.png new file mode 100644 index 000000000..f19197fc7 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/crusher_wasps_grade_5.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/decaying.png b/src/main/resources/assets/cosmiccore/textures/item/decaying.png new file mode 100644 index 000000000..117b3c5ba Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/decaying.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/efficacy_chip.png b/src/main/resources/assets/cosmiccore/textures/item/efficacy_chip.png new file mode 100644 index 000000000..1c334d0b4 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/efficacy_chip.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/empty_fuel_rod.png b/src/main/resources/assets/cosmiccore/textures/item/empty_fuel_rod.png new file mode 100644 index 000000000..445a655a2 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/empty_fuel_rod.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/energized_silk.png b/src/main/resources/assets/cosmiccore/textures/item/energized_silk.png new file mode 100644 index 000000000..0c6789d2c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/energized_silk.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/enthelic_processor.png b/src/main/resources/assets/cosmiccore/textures/item/enthelic_processor.png new file mode 100644 index 000000000..1d08ecf64 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/enthelic_processor.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/enthelic_processor_assembly.png b/src/main/resources/assets/cosmiccore/textures/item/enthelic_processor_assembly.png new file mode 100644 index 000000000..cc42ab2e4 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/enthelic_processor_assembly.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/enthelic_processor_mainframe.png b/src/main/resources/assets/cosmiccore/textures/item/enthelic_processor_mainframe.png new file mode 100644 index 000000000..b7af73a38 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/enthelic_processor_mainframe.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/enthelic_processor_supercomputer.png b/src/main/resources/assets/cosmiccore/textures/item/enthelic_processor_supercomputer.png new file mode 100644 index 000000000..b3c45e8f3 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/enthelic_processor_supercomputer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/ev_wildfire_core.png b/src/main/resources/assets/cosmiccore/textures/item/ev_wildfire_core.png new file mode 100644 index 000000000..9c64c4a3a Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/ev_wildfire_core.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/ferric_asteroid.png b/src/main/resources/assets/cosmiccore/textures/item/ferric_asteroid.png new file mode 100644 index 000000000..5fd0b1b32 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/ferric_asteroid.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/flesh_packed_neptunium_fuel.png b/src/main/resources/assets/cosmiccore/textures/item/flesh_packed_neptunium_fuel.png new file mode 100644 index 000000000..cac8210f4 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/flesh_packed_neptunium_fuel.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/flesh_packed_neptunium_fuel.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/flesh_packed_neptunium_fuel.png.mcmeta new file mode 100644 index 000000000..e9aa92246 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/flesh_packed_neptunium_fuel.png.mcmeta @@ -0,0 +1,15 @@ +{ + "animation": { + "frametime": 1, + "frames": [ + { "index": 0, "time": 10}, + { "index": 1, "time": 2}, + { "index": 2, "time": 10}, + { "index": 3, "time": 2}, + { "index": 4, "time": 10}, + { "index": 5, "time": 2}, + { "index": 6, "time": 10}, + { "index": 7, "time": 2} + ] + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/item/flesh_packed_plutonium_fuel.png b/src/main/resources/assets/cosmiccore/textures/item/flesh_packed_plutonium_fuel.png new file mode 100644 index 000000000..d58749b36 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/flesh_packed_plutonium_fuel.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/flesh_packed_plutonium_fuel.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/flesh_packed_plutonium_fuel.png.mcmeta new file mode 100644 index 000000000..e9aa92246 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/flesh_packed_plutonium_fuel.png.mcmeta @@ -0,0 +1,15 @@ +{ + "animation": { + "frametime": 1, + "frames": [ + { "index": 0, "time": 10}, + { "index": 1, "time": 2}, + { "index": 2, "time": 10}, + { "index": 3, "time": 2}, + { "index": 4, "time": 10}, + { "index": 5, "time": 2}, + { "index": 6, "time": 10}, + { "index": 7, "time": 2} + ] + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/item/flesh_packed_uranium_fuel.png b/src/main/resources/assets/cosmiccore/textures/item/flesh_packed_uranium_fuel.png new file mode 100644 index 000000000..d498035f7 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/flesh_packed_uranium_fuel.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/flesh_packed_uranium_fuel.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/flesh_packed_uranium_fuel.png.mcmeta new file mode 100644 index 000000000..e9aa92246 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/flesh_packed_uranium_fuel.png.mcmeta @@ -0,0 +1,15 @@ +{ + "animation": { + "frametime": 1, + "frames": [ + { "index": 0, "time": 10}, + { "index": 1, "time": 2}, + { "index": 2, "time": 10}, + { "index": 3, "time": 2}, + { "index": 4, "time": 10}, + { "index": 5, "time": 2}, + { "index": 6, "time": 10}, + { "index": 7, "time": 2} + ] + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/item/fleshy_neptunium_waste.png b/src/main/resources/assets/cosmiccore/textures/item/fleshy_neptunium_waste.png new file mode 100644 index 000000000..1dc35fb5d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/fleshy_neptunium_waste.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/fleshy_neptunium_waste.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/fleshy_neptunium_waste.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/fleshy_neptunium_waste.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/fleshy_plutonium_waste.png b/src/main/resources/assets/cosmiccore/textures/item/fleshy_plutonium_waste.png new file mode 100644 index 000000000..700721ca1 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/fleshy_plutonium_waste.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/fleshy_plutonium_waste.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/fleshy_plutonium_waste.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/fleshy_plutonium_waste.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/fleshy_uranium_waste.png b/src/main/resources/assets/cosmiccore/textures/item/fleshy_uranium_waste.png new file mode 100644 index 000000000..f7d1d0a32 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/fleshy_uranium_waste.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/fleshy_uranium_waste.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/fleshy_uranium_waste.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/fleshy_uranium_waste.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/freight_beetle_grade_1.png b/src/main/resources/assets/cosmiccore/textures/item/freight_beetle_grade_1.png new file mode 100644 index 000000000..da77e4bd6 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/freight_beetle_grade_1.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/freight_beetle_grade_2.png b/src/main/resources/assets/cosmiccore/textures/item/freight_beetle_grade_2.png new file mode 100644 index 000000000..8be9593eb Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/freight_beetle_grade_2.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/freight_beetle_grade_3.png b/src/main/resources/assets/cosmiccore/textures/item/freight_beetle_grade_3.png new file mode 100644 index 000000000..f781a2971 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/freight_beetle_grade_3.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/freight_beetle_grade_4.png b/src/main/resources/assets/cosmiccore/textures/item/freight_beetle_grade_4.png new file mode 100644 index 000000000..cb01721fc Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/freight_beetle_grade_4.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/freight_beetle_grade_5.png b/src/main/resources/assets/cosmiccore/textures/item/freight_beetle_grade_5.png new file mode 100644 index 000000000..99739dd6c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/freight_beetle_grade_5.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/hex_processor.png b/src/main/resources/assets/cosmiccore/textures/item/hex_processor.png new file mode 100644 index 000000000..64ce4fc97 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/hex_processor.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/hex_processor_assembly.png b/src/main/resources/assets/cosmiccore/textures/item/hex_processor_assembly.png new file mode 100644 index 000000000..1f4bd4e79 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/hex_processor_assembly.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/hex_processor_mainframe.png b/src/main/resources/assets/cosmiccore/textures/item/hex_processor_mainframe.png new file mode 100644 index 000000000..3e90df9a5 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/hex_processor_mainframe.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/hex_processor_supercomputer.png b/src/main/resources/assets/cosmiccore/textures/item/hex_processor_supercomputer.png new file mode 100644 index 000000000..6d7843be1 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/hex_processor_supercomputer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/hv_wildfire_core.png b/src/main/resources/assets/cosmiccore/textures/item/hv_wildfire_core.png new file mode 100644 index 000000000..6ba4eb0d9 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/hv_wildfire_core.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/hydraulic_boots.png b/src/main/resources/assets/cosmiccore/textures/item/hydraulic_boots.png new file mode 100644 index 000000000..5a6a39a03 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/hydraulic_boots.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/intermediate_gene_kit.png b/src/main/resources/assets/cosmiccore/textures/item/intermediate_gene_kit.png new file mode 100644 index 000000000..0bee616e3 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/intermediate_gene_kit.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/iv_wildfire_core.png b/src/main/resources/assets/cosmiccore/textures/item/iv_wildfire_core.png new file mode 100644 index 000000000..20d724bb4 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/iv_wildfire_core.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/latent_capacity_wafer.png b/src/main/resources/assets/cosmiccore/textures/item/latent_capacity_wafer.png new file mode 100644 index 000000000..4929b1034 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/latent_capacity_wafer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/latent_efficacy_wafer.png b/src/main/resources/assets/cosmiccore/textures/item/latent_efficacy_wafer.png new file mode 100644 index 000000000..166e21dc8 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/latent_efficacy_wafer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/latent_potency_wafer.png b/src/main/resources/assets/cosmiccore/textures/item/latent_potency_wafer.png new file mode 100644 index 000000000..43fcbf443 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/latent_potency_wafer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/latent_verbosity_wafer.png b/src/main/resources/assets/cosmiccore/textures/item/latent_verbosity_wafer.png new file mode 100644 index 000000000..455534220 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/latent_verbosity_wafer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/lith_asteroid.png b/src/main/resources/assets/cosmiccore/textures/item/lith_asteroid.png new file mode 100644 index 000000000..ca839866a Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/lith_asteroid.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/livingrock_aluminate_boule.png b/src/main/resources/assets/cosmiccore/textures/item/livingrock_aluminate_boule.png new file mode 100644 index 000000000..3ce1e2ab8 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/livingrock_aluminate_boule.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/livirock_aluminite_wafer.png b/src/main/resources/assets/cosmiccore/textures/item/livirock_aluminite_wafer.png new file mode 100644 index 000000000..16fb5672b Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/livirock_aluminite_wafer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor.png b/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor.png new file mode 100644 index 000000000..623b390e0 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor.png.mcmeta new file mode 100644 index 000000000..ea9cd1fcf --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor.png.mcmeta @@ -0,0 +1,10 @@ +{ + "animation": { + "interpolate": true, + "frametime": 40, + "frames": [ + { "index": 0, "time": 2 }, + { "index": 1, "time": 38 } + ] + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor_assembly.png b/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor_assembly.png new file mode 100644 index 000000000..7e00afdc2 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor_assembly.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor_assembly.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor_assembly.png.mcmeta new file mode 100644 index 000000000..ea9cd1fcf --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor_assembly.png.mcmeta @@ -0,0 +1,10 @@ +{ + "animation": { + "interpolate": true, + "frametime": 40, + "frames": [ + { "index": 0, "time": 2 }, + { "index": 1, "time": 38 } + ] + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor_mainframe.png b/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor_mainframe.png new file mode 100644 index 000000000..6a2dfa387 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor_mainframe.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor_mainframe.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor_mainframe.png.mcmeta new file mode 100644 index 000000000..ea9cd1fcf --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor_mainframe.png.mcmeta @@ -0,0 +1,10 @@ +{ + "animation": { + "interpolate": true, + "frametime": 40, + "frames": [ + { "index": 0, "time": 2 }, + { "index": 1, "time": 38 } + ] + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor_supercomputer.png b/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor_supercomputer.png new file mode 100644 index 000000000..fb8e548fb Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor_supercomputer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor_supercomputer.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor_supercomputer.png.mcmeta new file mode 100644 index 000000000..ea9cd1fcf --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor_supercomputer.png.mcmeta @@ -0,0 +1,10 @@ +{ + "animation": { + "interpolate": true, + "frametime": 40, + "frames": [ + { "index": 0, "time": 2 }, + { "index": 1, "time": 38 } + ] + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/item/luv_wildfire_core.png b/src/main/resources/assets/cosmiccore/textures/item/luv_wildfire_core.png new file mode 100644 index 000000000..c31223ca8 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/luv_wildfire_core.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/lv_wildfire_core.png b/src/main/resources/assets/cosmiccore/textures/item/lv_wildfire_core.png new file mode 100644 index 000000000..1ccabe4f0 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/lv_wildfire_core.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/mafic_asteroid.png b/src/main/resources/assets/cosmiccore/textures/item/mafic_asteroid.png new file mode 100644 index 000000000..0eaecfc0b Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/mafic_asteroid.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/mossy_asteroid.png b/src/main/resources/assets/cosmiccore/textures/item/mossy_asteroid.png new file mode 100644 index 000000000..fcd76f90d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/mossy_asteroid.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/movanon_wafer.png b/src/main/resources/assets/cosmiccore/textures/item/movanon_wafer.png new file mode 100644 index 000000000..16fb5672b Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/movanon_wafer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/multilayered_enthel_circuit_board.png b/src/main/resources/assets/cosmiccore/textures/item/multilayered_enthel_circuit_board.png new file mode 100644 index 000000000..40eb11c44 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/multilayered_enthel_circuit_board.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/mv_wildfire_core.png b/src/main/resources/assets/cosmiccore/textures/item/mv_wildfire_core.png new file mode 100644 index 000000000..f19f4dbf8 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/mv_wildfire_core.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/nano_boots.png b/src/main/resources/assets/cosmiccore/textures/item/nano_boots.png new file mode 100644 index 000000000..35e75ef80 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/nano_boots.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/occult_asteroid.png b/src/main/resources/assets/cosmiccore/textures/item/occult_asteroid.png new file mode 100644 index 000000000..29df7a96d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/occult_asteroid.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_ev.png b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_ev.png index 77b67ad88..b4c27cd27 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_ev.png and b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_ev.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_ev.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_ev.png.mcmeta index 74968b30f..abd4bf08c 100644 --- a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_ev.png.mcmeta +++ b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_ev.png.mcmeta @@ -1,6 +1,16 @@ { "animation": { - "interpolate": false, - "frametime": 30 + "interpolate": true, + "frametime": 1, + "frames": [ + 0, + 1, + 2, + { "index": 3, "time": 2 }, + { "index": 4, "time": 2 }, + { "index": 5, "time": 3 }, + { "index": 6, "time": 7 }, + 6 + ] } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_hv.png b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_hv.png index 903967942..634f18be1 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_hv.png and b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_hv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_hv.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_hv.png.mcmeta index 74968b30f..c4f1b30ec 100644 --- a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_hv.png.mcmeta +++ b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_hv.png.mcmeta @@ -1,6 +1,6 @@ { "animation": { - "interpolate": false, - "frametime": 30 + "interpolate": true, + "frametime": 8 } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_iv.png b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_iv.png index f53ebe86c..8f652dd41 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_iv.png and b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_iv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_iv.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_iv.png.mcmeta index 74968b30f..8a6e059cf 100644 --- a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_iv.png.mcmeta +++ b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_iv.png.mcmeta @@ -1,6 +1,9 @@ { "animation": { "interpolate": false, - "frametime": 30 + "frametime": 2, + "frames": [ + 0, 1, 2, 3, 4, 3, 2, 1 + ] } } \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_luv.png b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_luv.png index 88e46be08..b23f43dfc 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_luv.png and b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_luv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_luv.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_luv.png.mcmeta index 74968b30f..0866333e6 100644 --- a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_luv.png.mcmeta +++ b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_luv.png.mcmeta @@ -1,6 +1,14 @@ { "animation": { - "interpolate": false, - "frametime": 30 + "interpolate": true, + "frametime": 2, + "frames": [ + { "index": 0, "time": 9 }, + 0, + 1, + 2, + 3, + 4 + ] } } \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_lv.png b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_lv.png index 51220bcec..ecff3ad23 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_lv.png and b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_lv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_lv.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_lv.png.mcmeta index 74968b30f..ba6e9aa61 100644 --- a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_lv.png.mcmeta +++ b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_lv.png.mcmeta @@ -1,6 +1,6 @@ { "animation": { - "interpolate": false, - "frametime": 30 + "interpolate": true, + "frametime": 16 } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_mv.png b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_mv.png index 1b2c4b3a8..7f2a268ec 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_mv.png and b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_mv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_mv.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_mv.png.mcmeta index 74968b30f..006df43d9 100644 --- a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_mv.png.mcmeta +++ b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_mv.png.mcmeta @@ -1,6 +1,6 @@ { "animation": { - "interpolate": false, - "frametime": 30 + "interpolate": true, + "frametime": 12 } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_opv.png b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_opv.png index 18ea42028..bad2db74a 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_opv.png and b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_opv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_opv.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_opv.png.mcmeta index 74968b30f..fda8ba7d6 100644 --- a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_opv.png.mcmeta +++ b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_opv.png.mcmeta @@ -1,6 +1,6 @@ -{ - "animation": { - "interpolate": false, - "frametime": 30 - } +{ + "animation": { + "interpolate": true, + "frametime": 6 + } } \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uev.png b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uev.png index 90f965e12..1e7bfc487 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uev.png and b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uev.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uev.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uev.png.mcmeta index 74968b30f..232d8cf26 100644 --- a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uev.png.mcmeta +++ b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uev.png.mcmeta @@ -1,6 +1,6 @@ -{ - "animation": { - "interpolate": false, - "frametime": 30 - } +{ + "animation": { + "interpolate": true, + "frametime": 3 + } } \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uhv.png b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uhv.png index 630e96bf5..19ce1c57f 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uhv.png and b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uhv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uhv.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uhv.png.mcmeta index 74968b30f..fb20356f7 100644 --- a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uhv.png.mcmeta +++ b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uhv.png.mcmeta @@ -1,6 +1,37 @@ { "animation": { "interpolate": false, - "frametime": 30 + "frametime": 2, + "frames": [ + { "index": 1, "time": 40 }, + 0, + 2, + { "index": 4, "time": 60 }, + 6, + 7, + 6, + 2, + { "index": 3, "time": 50 }, + 0, + { "index": 5, "time": 30 }, + 6, + 7, + 6, + { "index": 1, "time": 40 }, + 0, + 2, + { "index": 4, "time": 60 }, + 6, + 7, + 6, + 2, + { "index": 3, "time": 50 }, + 0, + { "index": 5, "time": 30 }, + { "index": 0, "time": 120 }, + 6, + 7, + 6 + ] } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uiv.png b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uiv.png index e88bd425e..7ceec5565 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uiv.png and b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uiv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uiv.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uiv.png.mcmeta index 74968b30f..f07dc8e17 100644 --- a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uiv.png.mcmeta +++ b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uiv.png.mcmeta @@ -1,6 +1,16 @@ -{ - "animation": { - "interpolate": false, - "frametime": 30 - } +{ + "animation": { + "interpolate": true, + "frametime": 1, + "frames": [ + { "index": 0, "time": 2 }, + { "index": 1, "time": 3 }, + { "index": 2, "time": 2 }, + { "index": 3, "time": 3 }, + { "index": 4, "time": 2 }, + { "index": 5, "time": 3 }, + { "index": 6, "time": 2 }, + { "index": 7, "time": 3 } + ] + } } \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uv.png b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uv.png index 6c54a1927..a597b9bf7 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uv.png and b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uv.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uv.png.mcmeta index 74968b30f..1321b296e 100644 --- a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uv.png.mcmeta +++ b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uv.png.mcmeta @@ -1,6 +1,9 @@ { "animation": { - "interpolate": false, - "frametime": 30 + "interpolate": true, + "frametime": 2, + "frames": [ + 0, 1, 2, 3, 4, 5, 6, 7 + ] } } \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uxv.png b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uxv.png index c43847a62..c49d6fa9c 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uxv.png and b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uxv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uxv.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uxv.png.mcmeta index 74968b30f..151deedaf 100644 --- a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uxv.png.mcmeta +++ b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uxv.png.mcmeta @@ -1,6 +1,9 @@ -{ - "animation": { - "interpolate": false, - "frametime": 30 - } +{ + "animation": { + "interpolate": true, + "frametime": 3, + "frames": [ + 0,1,2,3,4,5,6,7,8,9,10,11,11,11 + ] + } } \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_zpm.png b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_zpm.png index 03fd12d30..9958c5b33 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_zpm.png and b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_zpm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_zpm.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_zpm.png.mcmeta index 74968b30f..e87e67b18 100644 --- a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_zpm.png.mcmeta +++ b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_zpm.png.mcmeta @@ -1,6 +1,16 @@ { "animation": { - "interpolate": false, - "frametime": 30 + "interpolate": true, + "frametime": 3, + "frames": [ + { "index": 0, "time": 9 }, + 0, + 1, + 2, + 3, + 4, + 5, + 6 + ] } } \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/oxide_asteroid.png b/src/main/resources/assets/cosmiccore/textures/item/oxide_asteroid.png new file mode 100644 index 000000000..4b9d90ea2 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/oxide_asteroid.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/pale_saw.png b/src/main/resources/assets/cosmiccore/textures/item/pale_saw.png new file mode 100644 index 000000000..b65b665d3 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/pale_saw.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/pale_scrap.png b/src/main/resources/assets/cosmiccore/textures/item/pale_scrap.png new file mode 100644 index 000000000..067a89727 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/pale_scrap.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/plastic_circuit_board.png b/src/main/resources/assets/cosmiccore/textures/item/plastic_circuit_board.png new file mode 100644 index 000000000..674824c0e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/plastic_circuit_board.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/potency_chip.png b/src/main/resources/assets/cosmiccore/textures/item/potency_chip.png new file mode 100644 index 000000000..136207b03 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/potency_chip.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/pressurized_rebreather.png b/src/main/resources/assets/cosmiccore/textures/item/pressurized_rebreather.png new file mode 100644 index 000000000..be1c7b687 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/pressurized_rebreather.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/pulverizing_beetle_grade_1.png b/src/main/resources/assets/cosmiccore/textures/item/pulverizing_beetle_grade_1.png new file mode 100644 index 000000000..f0d993244 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/pulverizing_beetle_grade_1.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/pulverizing_beetle_grade_2.png b/src/main/resources/assets/cosmiccore/textures/item/pulverizing_beetle_grade_2.png new file mode 100644 index 000000000..089381631 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/pulverizing_beetle_grade_2.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/pulverizing_beetle_grade_3.png b/src/main/resources/assets/cosmiccore/textures/item/pulverizing_beetle_grade_3.png new file mode 100644 index 000000000..145a213ad Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/pulverizing_beetle_grade_3.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/pulverizing_beetle_grade_4.png b/src/main/resources/assets/cosmiccore/textures/item/pulverizing_beetle_grade_4.png new file mode 100644 index 000000000..b0bf4ae1d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/pulverizing_beetle_grade_4.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/pulverizing_beetle_grade_5.png b/src/main/resources/assets/cosmiccore/textures/item/pulverizing_beetle_grade_5.png new file mode 100644 index 000000000..75122e976 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/pulverizing_beetle_grade_5.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/quark_boots.png b/src/main/resources/assets/cosmiccore/textures/item/quark_boots.png new file mode 100644 index 000000000..7c5b6ad27 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/quark_boots.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/rare_metals_asteroid.png b/src/main/resources/assets/cosmiccore/textures/item/rare_metals_asteroid.png new file mode 100644 index 000000000..c3b5d6c72 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/rare_metals_asteroid.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/razor_hornet_grade_1.png b/src/main/resources/assets/cosmiccore/textures/item/razor_hornet_grade_1.png new file mode 100644 index 000000000..2497216fa Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/razor_hornet_grade_1.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/razor_hornet_grade_2.png b/src/main/resources/assets/cosmiccore/textures/item/razor_hornet_grade_2.png new file mode 100644 index 000000000..7c90f25e0 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/razor_hornet_grade_2.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/razor_hornet_grade_3.png b/src/main/resources/assets/cosmiccore/textures/item/razor_hornet_grade_3.png new file mode 100644 index 000000000..07c3a4267 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/razor_hornet_grade_3.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/razor_hornet_grade_4.png b/src/main/resources/assets/cosmiccore/textures/item/razor_hornet_grade_4.png new file mode 100644 index 000000000..1aa1d8c91 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/razor_hornet_grade_4.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/razor_hornet_grade_5.png b/src/main/resources/assets/cosmiccore/textures/item/razor_hornet_grade_5.png new file mode 100644 index 000000000..1d2c567cf Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/razor_hornet_grade_5.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/reflection_mirror.png b/src/main/resources/assets/cosmiccore/textures/item/reflection_mirror.png new file mode 100644 index 000000000..f66098920 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/reflection_mirror.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/runewoven_plastic_circuit_board.png b/src/main/resources/assets/cosmiccore/textures/item/runewoven_plastic_circuit_board.png new file mode 100644 index 000000000..8c04c1449 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/runewoven_plastic_circuit_board.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/runic_hex_cpu.png b/src/main/resources/assets/cosmiccore/textures/item/runic_hex_cpu.png new file mode 100644 index 000000000..4f72d1665 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/runic_hex_cpu.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/runic_hex_cpu_wafer.png b/src/main/resources/assets/cosmiccore/textures/item/runic_hex_cpu_wafer.png new file mode 100644 index 000000000..bb2cd65ad Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/runic_hex_cpu_wafer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/sanguine_asteroid.png b/src/main/resources/assets/cosmiccore/textures/item/sanguine_asteroid.png new file mode 100644 index 000000000..edacbe4e7 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/sanguine_asteroid.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/sanguine_boots.png b/src/main/resources/assets/cosmiccore/textures/item/sanguine_boots.png new file mode 100644 index 000000000..e6db71437 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/sanguine_boots.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/screwdriver_head_cast.png b/src/main/resources/assets/cosmiccore/textures/item/screwdriver_head_cast.png new file mode 100644 index 000000000..20b8ef85d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/screwdriver_head_cast.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/screwdriver_head_sand_cast.png b/src/main/resources/assets/cosmiccore/textures/item/screwdriver_head_sand_cast.png new file mode 100644 index 000000000..afd62f5e8 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/screwdriver_head_sand_cast.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/simple_rebreather.png b/src/main/resources/assets/cosmiccore/textures/item/simple_rebreather.png new file mode 100644 index 000000000..929f21035 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/simple_rebreather.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/spent_flesh_packed_neptunium_fuel.png b/src/main/resources/assets/cosmiccore/textures/item/spent_flesh_packed_neptunium_fuel.png new file mode 100644 index 000000000..5c8216a25 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/spent_flesh_packed_neptunium_fuel.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/spent_flesh_packed_neptunium_fuel.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/spent_flesh_packed_neptunium_fuel.png.mcmeta new file mode 100644 index 000000000..e9aa92246 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/spent_flesh_packed_neptunium_fuel.png.mcmeta @@ -0,0 +1,15 @@ +{ + "animation": { + "frametime": 1, + "frames": [ + { "index": 0, "time": 10}, + { "index": 1, "time": 2}, + { "index": 2, "time": 10}, + { "index": 3, "time": 2}, + { "index": 4, "time": 10}, + { "index": 5, "time": 2}, + { "index": 6, "time": 10}, + { "index": 7, "time": 2} + ] + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/item/spent_flesh_packed_plutonium_fuel.png b/src/main/resources/assets/cosmiccore/textures/item/spent_flesh_packed_plutonium_fuel.png new file mode 100644 index 000000000..fe6e1c2eb Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/spent_flesh_packed_plutonium_fuel.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/spent_flesh_packed_plutonium_fuel.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/spent_flesh_packed_plutonium_fuel.png.mcmeta new file mode 100644 index 000000000..e9aa92246 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/spent_flesh_packed_plutonium_fuel.png.mcmeta @@ -0,0 +1,15 @@ +{ + "animation": { + "frametime": 1, + "frames": [ + { "index": 0, "time": 10}, + { "index": 1, "time": 2}, + { "index": 2, "time": 10}, + { "index": 3, "time": 2}, + { "index": 4, "time": 10}, + { "index": 5, "time": 2}, + { "index": 6, "time": 10}, + { "index": 7, "time": 2} + ] + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/item/spent_flesh_packed_uranium_fuel.png b/src/main/resources/assets/cosmiccore/textures/item/spent_flesh_packed_uranium_fuel.png new file mode 100644 index 000000000..abebd2dd5 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/spent_flesh_packed_uranium_fuel.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/spent_flesh_packed_uranium_fuel.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/spent_flesh_packed_uranium_fuel.png.mcmeta new file mode 100644 index 000000000..e9aa92246 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/spent_flesh_packed_uranium_fuel.png.mcmeta @@ -0,0 +1,15 @@ +{ + "animation": { + "frametime": 1, + "frames": [ + { "index": 0, "time": 10}, + { "index": 1, "time": 2}, + { "index": 2, "time": 10}, + { "index": 3, "time": 2}, + { "index": 4, "time": 10}, + { "index": 5, "time": 2}, + { "index": 6, "time": 10}, + { "index": 7, "time": 2} + ] + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/item/spirit_engraved_enthel_circuit_board.png b/src/main/resources/assets/cosmiccore/textures/item/spirit_engraved_enthel_circuit_board.png new file mode 100644 index 000000000..68ff30535 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/spirit_engraved_enthel_circuit_board.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/spirit_runed_enthel_cpu.png b/src/main/resources/assets/cosmiccore/textures/item/spirit_runed_enthel_cpu.png new file mode 100644 index 000000000..42c1bfd4b Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/spirit_runed_enthel_cpu.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/spirit_runed_enthel_cpu_wafer.png b/src/main/resources/assets/cosmiccore/textures/item/spirit_runed_enthel_cpu_wafer.png new file mode 100644 index 000000000..b9449ff6a Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/spirit_runed_enthel_cpu_wafer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/steel_supply_tank.png b/src/main/resources/assets/cosmiccore/textures/item/steel_supply_tank.png new file mode 100644 index 000000000..f3c8e7913 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/steel_supply_tank.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/superheated_fuel_rod.png b/src/main/resources/assets/cosmiccore/textures/item/superheated_fuel_rod.png new file mode 100644 index 000000000..1a279306c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/superheated_fuel_rod.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/targeting_chip.png b/src/main/resources/assets/cosmiccore/textures/item/targeting_chip.png new file mode 100644 index 000000000..f77310e65 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/targeting_chip.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/tool/screwdriver/binding.png b/src/main/resources/assets/cosmiccore/textures/item/tool/screwdriver/binding.png new file mode 100644 index 000000000..3bf2520c2 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/tool/screwdriver/binding.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/tool/screwdriver/broken.png b/src/main/resources/assets/cosmiccore/textures/item/tool/screwdriver/broken.png new file mode 100644 index 000000000..02985cfd9 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/tool/screwdriver/broken.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/tool/screwdriver/handle.png b/src/main/resources/assets/cosmiccore/textures/item/tool/screwdriver/handle.png new file mode 100644 index 000000000..cb7837e07 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/tool/screwdriver/handle.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/tool/screwdriver/handle_tconstruct_unknown.png b/src/main/resources/assets/cosmiccore/textures/item/tool/screwdriver/handle_tconstruct_unknown.png new file mode 100644 index 000000000..7eaf07efd Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/tool/screwdriver/handle_tconstruct_unknown.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/tool/screwdriver/head.png b/src/main/resources/assets/cosmiccore/textures/item/tool/screwdriver/head.png new file mode 100644 index 000000000..266cca114 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/tool/screwdriver/head.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/tool/screwdriver/head_tconstruct_unknown.png b/src/main/resources/assets/cosmiccore/textures/item/tool/screwdriver/head_tconstruct_unknown.png new file mode 100644 index 000000000..0dd24d8df Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/tool/screwdriver/head_tconstruct_unknown.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/tool/screwdriver/head_tool.png b/src/main/resources/assets/cosmiccore/textures/item/tool/screwdriver/head_tool.png new file mode 100644 index 000000000..73cf86da7 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/tool/screwdriver/head_tool.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/tool/screwdriver/head_tool_tconstruct_unknown.png b/src/main/resources/assets/cosmiccore/textures/item/tool/screwdriver/head_tool_tconstruct_unknown.png new file mode 100644 index 000000000..0dd24d8df Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/tool/screwdriver/head_tool_tconstruct_unknown.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/tool/wire_cutter/binding.png b/src/main/resources/assets/cosmiccore/textures/item/tool/wire_cutter/binding.png new file mode 100644 index 000000000..be0be4a32 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/tool/wire_cutter/binding.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/tool/wire_cutter/broken.png b/src/main/resources/assets/cosmiccore/textures/item/tool/wire_cutter/broken.png new file mode 100644 index 000000000..85f306194 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/tool/wire_cutter/broken.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/tool/wire_cutter/handle.png b/src/main/resources/assets/cosmiccore/textures/item/tool/wire_cutter/handle.png new file mode 100644 index 000000000..51f4b5a96 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/tool/wire_cutter/handle.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/tool/wire_cutter/head.png b/src/main/resources/assets/cosmiccore/textures/item/tool/wire_cutter/head.png new file mode 100644 index 000000000..a15cb9345 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/tool/wire_cutter/head.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/tool/wrench/binding.png b/src/main/resources/assets/cosmiccore/textures/item/tool/wrench/binding.png new file mode 100644 index 000000000..3bf2520c2 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/tool/wrench/binding.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/tool/wrench/broken.png b/src/main/resources/assets/cosmiccore/textures/item/tool/wrench/broken.png new file mode 100644 index 000000000..20f026a31 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/tool/wrench/broken.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/tool/wrench/handle.png b/src/main/resources/assets/cosmiccore/textures/item/tool/wrench/handle.png new file mode 100644 index 000000000..69a42d35c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/tool/wrench/handle.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/tool/wrench/head.png b/src/main/resources/assets/cosmiccore/textures/item/tool/wrench/head.png new file mode 100644 index 000000000..cda11fbde Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/tool/wrench/head.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/tool/wrench/head_tconstruct_unknown.png b/src/main/resources/assets/cosmiccore/textures/item/tool/wrench/head_tconstruct_unknown.png new file mode 100644 index 000000000..35114f268 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/tool/wrench/head_tconstruct_unknown.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/tool/wrench/head_tool.png b/src/main/resources/assets/cosmiccore/textures/item/tool/wrench/head_tool.png new file mode 100644 index 000000000..b9b348049 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/tool/wrench/head_tool.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/trinavine_nanolattice_spool.png b/src/main/resources/assets/cosmiccore/textures/item/trinavine_nanolattice_spool.png new file mode 100644 index 000000000..d14584a59 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/trinavine_nanolattice_spool.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/tungstensteel_nanolattice_spool.png b/src/main/resources/assets/cosmiccore/textures/item/tungstensteel_nanolattice_spool.png new file mode 100644 index 000000000..a4d0f6489 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/tungstensteel_nanolattice_spool.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/verbosity_chip.png b/src/main/resources/assets/cosmiccore/textures/item/verbosity_chip.png new file mode 100644 index 000000000..3f20cb7b2 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/verbosity_chip.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/wailing.png b/src/main/resources/assets/cosmiccore/textures/item/wailing.png new file mode 100644 index 000000000..911ae49a4 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/wailing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/wasteland_asteroid.png b/src/main/resources/assets/cosmiccore/textures/item/wasteland_asteroid.png new file mode 100644 index 000000000..1fe855836 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/wasteland_asteroid.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/wrench_head_cast.png b/src/main/resources/assets/cosmiccore/textures/item/wrench_head_cast.png new file mode 100644 index 000000000..8ddf6600b Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/wrench_head_cast.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/wrench_head_sand_cast.png b/src/main/resources/assets/cosmiccore/textures/item/wrench_head_sand_cast.png new file mode 100644 index 000000000..c01962a6d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/wrench_head_sand_cast.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/zpm_wildfire_core.png b/src/main/resources/assets/cosmiccore/textures/item/zpm_wildfire_core.png new file mode 100644 index 000000000..195017bb2 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/zpm_wildfire_core.png differ diff --git a/src/main/resources/assets/cosmiccore/ui/recipe_type/dawn_forge.rtui b/src/main/resources/assets/cosmiccore/ui/recipe_type/dawn_forge.rtui new file mode 100644 index 000000000..8f18e304e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/ui/recipe_type/dawn_forge.rtui differ diff --git a/src/main/resources/assets/gtceu/models/block/cube_3_layer/all.json b/src/main/resources/assets/gtceu/models/block/cube_3_layer/all.json new file mode 100644 index 000000000..bd4649c5f --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/cube_3_layer/all.json @@ -0,0 +1,24 @@ +{ + "parent": "gtceu:block/cube_3_layer/default", + "textures": { + "particle": "#bot_all", + "bot_down": "#bot_all", + "bot_up": "#bot_all", + "bot_north": "#bot_all", + "bot_east": "#bot_all", + "bot_south": "#bot_all", + "bot_west": "#bot_all", + "mid_down": "#mid_all", + "mid_up": "#mid_all", + "mid_north": "#mid_all", + "mid_east": "#mid_all", + "mid_south": "#mid_all", + "mid_west": "#mid_all", + "top_down": "#top_all", + "top_up": "#top_all", + "top_north": "#top_all", + "top_east": "#top_all", + "top_south": "#top_all", + "top_west": "#top_all" + } +} diff --git a/src/main/resources/assets/gtceu/models/block/cube_3_layer/all_translucent.json b/src/main/resources/assets/gtceu/models/block/cube_3_layer/all_translucent.json new file mode 100644 index 000000000..7e9b40eb4 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/cube_3_layer/all_translucent.json @@ -0,0 +1,25 @@ +{ + "parent": "gtceu:block/cube_3_layer/default", + "render_type": "translucent", + "textures": { + "particle": "#bot_all", + "bot_down": "#bot_all", + "bot_up": "#bot_all", + "bot_north": "#bot_all", + "bot_east": "#bot_all", + "bot_south": "#bot_all", + "bot_west": "#bot_all", + "mid_down": "#mid_all", + "mid_up": "#mid_all", + "mid_north": "#mid_all", + "mid_east": "#mid_all", + "mid_south": "#mid_all", + "mid_west": "#mid_all", + "top_down": "#top_all", + "top_up": "#top_all", + "top_north": "#top_all", + "top_east": "#top_all", + "top_south": "#top_all", + "top_west": "#top_all" + } +} diff --git a/src/main/resources/assets/gtceu/models/block/cube_3_layer/default.json b/src/main/resources/assets/gtceu/models/block/cube_3_layer/default.json new file mode 100644 index 000000000..4919daa49 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/cube_3_layer/default.json @@ -0,0 +1,43 @@ +{ + "parent": "block/block", + "elements": [ + { + "from": [ 0, 0, 0 ], + "to": [ 16, 16, 16 ], + "faces": { + "down": { "texture": "#bot_down", "cullface": "down", "tintindex": 0 }, + "up": { "texture": "#bot_up", "cullface": "up", "tintindex": 0 }, + "north": { "texture": "#bot_north", "cullface": "north", "tintindex": 0 }, + "south": { "texture": "#bot_south", "cullface": "south", "tintindex": 0 }, + "west": { "texture": "#bot_west", "cullface": "west", "tintindex": 0 }, + "east": { "texture": "#bot_east", "cullface": "east", "tintindex": 0 } + } + }, + { + "from": [ 0, 0, 0 ], + "to": [ 16, 16, 16 ], + "shade": false, + "faces": { + "down": { "texture": "#mid_down", "cullface": "down", "tintindex": 1 }, + "up": { "texture": "#mid_up", "cullface": "up", "tintindex": 1 }, + "north": { "texture": "#mid_north", "cullface": "north", "tintindex": 1 }, + "south": { "texture": "#mid_south", "cullface": "south", "tintindex": 1 }, + "west": { "texture": "#mid_west", "cullface": "west", "tintindex": 1 }, + "east": { "texture": "#mid_east", "cullface": "east", "tintindex": 1 } + } + }, + { + "from": [ 0, 0, 0 ], + "to": [ 16, 16, 16 ], + "shade": false, + "faces": { + "down": { "texture": "#top_down", "cullface": "down", "tintindex": 2 }, + "up": { "texture": "#top_up", "cullface": "up", "tintindex": 2 }, + "north": { "texture": "#top_north", "cullface": "north", "tintindex": 2 }, + "south": { "texture": "#top_south", "cullface": "south", "tintindex": 2 }, + "west": { "texture": "#top_west", "cullface": "west", "tintindex": 2 }, + "east": { "texture": "#top_east", "cullface": "east", "tintindex": 2 } + } + } + ] +} diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/chonky/block.json b/src/main/resources/assets/gtceu/models/block/material_sets/chonky/block.json new file mode 100644 index 000000000..9f753d696 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/material_sets/chonky/block.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:block/cube_3_layer/all", + "textures": { + "bot_all": "gtceu:block/material_sets/chonky/block", + "mid_all": "gtceu:block/material_sets/chonky/block_secondary", + "top_all": "gtceu:block/material_sets/chonky/block_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/chonky/frame_gt.json b/src/main/resources/assets/gtceu/models/block/material_sets/chonky/frame_gt.json new file mode 100644 index 000000000..e98a4e16d --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/material_sets/chonky/frame_gt.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:block/cube_3_layer/all_translucent", + "textures": { + "bot_all": "gtceu:block/material_sets/chonky/frame_gt", + "mid_all": "gtceu:block/material_sets/chonky/frame_gt_secondary", + "top_all": "gtceu:block/material_sets/chonky/frame_gt_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/crystal/block.json b/src/main/resources/assets/gtceu/models/block/material_sets/crystal/block.json new file mode 100644 index 000000000..cab879c38 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/material_sets/crystal/block.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:block/cube_3_layer/all", + "textures": { + "bot_all": "gtceu:block/material_sets/crystal/block", + "mid_all": "gtceu:block/material_sets/crystal/block_secondary", + "top_all": "gtceu:block/material_sets/crystal/block_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/crystal/frame_gt.json b/src/main/resources/assets/gtceu/models/block/material_sets/crystal/frame_gt.json new file mode 100644 index 000000000..a8563a9c2 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/material_sets/crystal/frame_gt.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:block/cube_3_layer/all", + "textures": { + "bot_all": "gtceu:block/material_sets/crystal/frame_gt", + "mid_all": "gtceu:block/material_sets/crystal/frame_gt_secondary", + "top_all": "gtceu:block/material_sets/crystal/frame_gt_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/magic/block.json b/src/main/resources/assets/gtceu/models/block/material_sets/magic/block.json new file mode 100644 index 000000000..5bb11a408 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/material_sets/magic/block.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:block/cube_3_layer/all", + "textures": { + "bot_all": "gtceu:block/material_sets/magic/block", + "mid_all": "gtceu:block/material_sets/magic/block_secondary", + "top_all": "gtceu:block/material_sets/magic/block_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/magic/frame_gt.json b/src/main/resources/assets/gtceu/models/block/material_sets/magic/frame_gt.json new file mode 100644 index 000000000..5d9bf53cb --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/material_sets/magic/frame_gt.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:block/cube_3_layer/all_translucent", + "textures": { + "bot_all": "gtceu:block/material_sets/magic/frame_gt", + "mid_all": "gtceu:block/material_sets/magic/frame_gt_secondary", + "top_all": "gtceu:block/material_sets/magic/frame_gt_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/bright/alve_foil_insulator.json b/src/main/resources/assets/gtceu/models/item/material_sets/bright/alve_foil_insulator.json new file mode 100644 index 000000000..d5a3f441a --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/bright/alve_foil_insulator.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/bright/alve_foil_insulator", + "layer1": "gtceu:item/material_sets/bright/alve_foil_insulator_secondary", + "layer2": "gtceu:item/material_sets/bright/alve_foil_insulator_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/bright/shape_memory_foil.json b/src/main/resources/assets/gtceu/models/item/material_sets/bright/shape_memory_foil.json new file mode 100644 index 000000000..a2524f045 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/bright/shape_memory_foil.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/bright/shape_memory_foil", + "layer1": "gtceu:item/material_sets/bright/shape_memory_foil_secondary", + "layer2": "gtceu:item/material_sets/bright/shape_memory_foil_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/alve_foil_insulator.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/alve_foil_insulator.json new file mode 100644 index 000000000..2316988d3 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/alve_foil_insulator.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/alve_foil_insulator", + "layer1": "gtceu:item/material_sets/chonky/alve_foil_insulator_secondary", + "layer2": "gtceu:item/material_sets/chonky/alve_foil_insulator_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/bolt.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/bolt.json new file mode 100644 index 000000000..a320e0449 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/bolt.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/bolt", + "layer1": "gtceu:item/material_sets/chonky/bolt_secondary", + "layer2": "gtceu:item/material_sets/chonky/bolt_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/dust.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/dust.json new file mode 100644 index 000000000..00fd8c915 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/dust.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/dust", + "layer1": "gtceu:item/material_sets/chonky/dust_secondary", + "layer2": "gtceu:item/material_sets/chonky/dust_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/dust_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/dust_small.json new file mode 100644 index 000000000..27f42c2f8 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/dust_small.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/dust_small", + "layer1": "gtceu:item/material_sets/chonky/dust_small_secondary", + "layer2": "gtceu:item/material_sets/chonky/dust_small_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/dust_tiny.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/dust_tiny.json new file mode 100644 index 000000000..c747f635b --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/dust_tiny.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/dust_tiny", + "layer1": "gtceu:item/material_sets/chonky/dust_tiny_secondary", + "layer2": "gtceu:item/material_sets/chonky/dust_tiny_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/foil.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/foil.json new file mode 100644 index 000000000..5544d9ad3 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/foil.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/foil", + "layer1": "gtceu:item/material_sets/chonky/foil_secondary", + "layer2": "gtceu:item/material_sets/chonky/foil_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/gear.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/gear.json new file mode 100644 index 000000000..82ca9663b --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/gear.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/gear", + "layer1": "gtceu:item/material_sets/chonky/gear_secondary", + "layer2": "gtceu:item/material_sets/chonky/gear_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/gear_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/gear_small.json new file mode 100644 index 000000000..acb67309f --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/gear_small.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/gear_small", + "layer1": "gtceu:item/material_sets/chonky/gear_small_secondary", + "layer2": "gtceu:item/material_sets/chonky/gear_small_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/heavy_beam.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/heavy_beam.json new file mode 100644 index 000000000..714978e02 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/heavy_beam.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/heavy_beam", + "layer1": "gtceu:item/material_sets/chonky/heavy_beam_secondary", + "layer2": "gtceu:item/material_sets/chonky/heavy_beam_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/ingot.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/ingot.json new file mode 100644 index 000000000..10d721696 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/ingot.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/ingot", + "layer1": "gtceu:item/material_sets/chonky/ingot_secondary", + "layer2": "gtceu:item/material_sets/chonky/ingot_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/ingot_double.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/ingot_double.json new file mode 100644 index 000000000..e175b53d1 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/ingot_double.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/ingot_double", + "layer1": "gtceu:item/material_sets/chonky/ingot_double_secondary", + "layer2": "gtceu:item/material_sets/chonky/ingot_double_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/ingot_hot.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/ingot_hot.json new file mode 100644 index 000000000..db6a4ec37 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/ingot_hot.json @@ -0,0 +1,9 @@ +{ + "parent": "gtceu:item/material_sets/chonky/ingot", + "textures": { + "layer0":"gtceu:item/material_sets/chonky/ingot", + "layer1":"gtceu:item/material_sets/chonky/ingot_secondary", + "layer2":"gtceu:item/material_sets/chonky/ingot_overlay", + "layer3":"gtceu:item/material_sets/chonky/ingot_hot_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/modular_shelling.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/modular_shelling.json new file mode 100644 index 000000000..6dbbd5396 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/modular_shelling.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/modular_shelling", + "layer1": "gtceu:item/material_sets/chonky/modular_shelling_secondary", + "layer2": "gtceu:item/material_sets/chonky/modular_shelling_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/nugget.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/nugget.json new file mode 100644 index 000000000..d51b9e8d0 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/nugget.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/nugget", + "layer1": "gtceu:item/material_sets/chonky/nugget_secondary", + "layer2": "gtceu:item/material_sets/chonky/nugget_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/plate.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/plate.json new file mode 100644 index 000000000..ef4fa68c4 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/plate.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/plate", + "layer1": "gtceu:item/material_sets/chonky/plate_secondary", + "layer2": "gtceu:item/material_sets/chonky/plate_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/plate_dense.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/plate_dense.json new file mode 100644 index 000000000..8a6c53480 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/plate_dense.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/plate_dense", + "layer1": "gtceu:item/material_sets/chonky/plate_dense_secondary", + "layer2": "gtceu:item/material_sets/chonky/plate_dense_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/plate_double.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/plate_double.json new file mode 100644 index 000000000..7c028a4d2 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/plate_double.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/plate_double", + "layer1": "gtceu:item/material_sets/chonky/plate_double_secondary", + "layer2": "gtceu:item/material_sets/chonky/plate_double_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/ring.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/ring.json new file mode 100644 index 000000000..44baf2309 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/ring.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/ring", + "layer1": "gtceu:item/material_sets/chonky/ring_secondary", + "layer2": "gtceu:item/material_sets/chonky/ring_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/rod.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/rod.json new file mode 100644 index 000000000..ce7de469e --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/rod.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/rod", + "layer1": "gtceu:item/material_sets/chonky/rod_secondary", + "layer2": "gtceu:item/material_sets/chonky/rod_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/rod_long.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/rod_long.json new file mode 100644 index 000000000..8dbd0c5d7 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/rod_long.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/rod_long", + "layer1": "gtceu:item/material_sets/chonky/rod_long_secondary", + "layer2": "gtceu:item/material_sets/chonky/rod_long_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/rotor.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/rotor.json new file mode 100644 index 000000000..812ddd3af --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/rotor.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/rotor", + "layer1": "gtceu:item/material_sets/chonky/rotor_secondary", + "layer2": "gtceu:item/material_sets/chonky/rotor_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/round.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/round.json new file mode 100644 index 000000000..2e38b4bdb --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/round.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/round", + "layer1": "gtceu:item/material_sets/chonky/round_secondary", + "layer2": "gtceu:item/material_sets/chonky/round_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/screw.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/screw.json new file mode 100644 index 000000000..654403324 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/screw.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/screw", + "layer1": "gtceu:item/material_sets/chonky/screw_secondary", + "layer2": "gtceu:item/material_sets/chonky/screw_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/shape_memory_foil.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/shape_memory_foil.json new file mode 100644 index 000000000..5441d2d58 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/shape_memory_foil.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/shape_memory_foil", + "layer1": "gtceu:item/material_sets/chonky/shape_memory_foil_secondary", + "layer2": "gtceu:item/material_sets/chonky/shape_memory_foil_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/spring.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/spring.json new file mode 100644 index 000000000..47f8e0738 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/spring.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/spring", + "layer1": "gtceu:item/material_sets/chonky/spring_secondary", + "layer2": "gtceu:item/material_sets/chonky/spring_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/spring_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/spring_small.json new file mode 100644 index 000000000..c3bf346c7 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/spring_small.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/spring_small", + "layer1": "gtceu:item/material_sets/chonky/spring_small_secondary", + "layer2": "gtceu:item/material_sets/chonky/spring_small_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/tool_head_buzz_saw.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/tool_head_buzz_saw.json new file mode 100644 index 000000000..d4fc54bcc --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/tool_head_buzz_saw.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/tool_head_buzz_saw", + "layer1": "gtceu:item/material_sets/chonky/tool_head_buzz_saw_secondary", + "layer2": "gtceu:item/material_sets/chonky/tool_head_buzz_saw_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/tool_head_chainsaw.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/tool_head_chainsaw.json new file mode 100644 index 000000000..506a80994 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/tool_head_chainsaw.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/tool_head_chainsaw", + "layer1": "gtceu:item/material_sets/chonky/tool_head_chainsaw_secondary", + "layer2": "gtceu:item/material_sets/chonky/tool_head_chainsaw_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/tool_head_drill.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/tool_head_drill.json new file mode 100644 index 000000000..d49501db4 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/tool_head_drill.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/tool_head_drill", + "layer1": "gtceu:item/material_sets/chonky/tool_head_drill_secondary", + "layer2": "gtceu:item/material_sets/chonky/tool_head_drill_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/tool_head_screwdriver.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/tool_head_screwdriver.json new file mode 100644 index 000000000..68cfe62b1 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/tool_head_screwdriver.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/tool_head_screwdriver", + "layer1": "gtceu:item/material_sets/chonky/tool_head_screwdriver_secondary", + "layer2": "gtceu:item/material_sets/chonky/tool_head_screwdriver_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/tool_head_wrench.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/tool_head_wrench.json new file mode 100644 index 000000000..8a6646c14 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/tool_head_wrench.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/tool_head_wrench", + "layer1": "gtceu:item/material_sets/chonky/tool_head_wrench_secondary", + "layer2": "gtceu:item/material_sets/chonky/tool_head_wrench_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/turbine_blade.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/turbine_blade.json new file mode 100644 index 000000000..a501a9d22 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/turbine_blade.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/turbine_blade", + "layer1": "gtceu:item/material_sets/chonky/turbine_blade_secondary", + "layer2": "gtceu:item/material_sets/chonky/turbine_blade_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/ultra_dense.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/ultra_dense.json new file mode 100644 index 000000000..3914227de --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/ultra_dense.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/ultradense_plate", + "layer1": "gtceu:item/material_sets/chonky/ultradense_plate_secondary", + "layer2": "gtceu:item/material_sets/chonky/ultradense_plate_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/ultradense_plate.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/ultradense_plate.json new file mode 100644 index 000000000..3914227de --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/ultradense_plate.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/ultradense_plate", + "layer1": "gtceu:item/material_sets/chonky/ultradense_plate_secondary", + "layer2": "gtceu:item/material_sets/chonky/ultradense_plate_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/wire_fine.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/wire_fine.json new file mode 100644 index 000000000..7de8d6973 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/wire_fine.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/wire_fine", + "layer1": "gtceu:item/material_sets/chonky/wire_fine_secondary", + "layer2": "gtceu:item/material_sets/chonky/wire_fine_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/wire_spool.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/wire_spool.json new file mode 100644 index 000000000..12148397b --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/wire_spool.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/wire_spool", + "layer1": "gtceu:item/material_sets/chonky/wire_spool_secondary", + "layer2": "gtceu:item/material_sets/chonky/wire_spool_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/alve_foil_insulator.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/alve_foil_insulator.json new file mode 100644 index 000000000..443000ff6 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/alve_foil_insulator.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/alve_foil_insulator" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/crushed.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/crushed.json new file mode 100644 index 000000000..4a27f897d --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/crushed.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/chronon/crushed" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/crushed_purified.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/crushed_purified.json new file mode 100644 index 000000000..34d5a04d8 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/crushed_purified.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/crushed_purified", + "layer1": "gtceu:item/material_sets/chronon/crushed_purified" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/crushed_refined.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/crushed_refined.json new file mode 100644 index 000000000..ad3487f1f --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/crushed_refined.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/chronon/crushed_refined" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/dust_impure.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/dust_impure.json new file mode 100644 index 000000000..1dc324be4 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/dust_impure.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/chronon/dust_impure" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/dust_pure.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/dust_pure.json new file mode 100644 index 000000000..e15dd8619 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/dust_pure.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/chronon/dust_pure" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/gem.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/gem.json new file mode 100644 index 000000000..0919a32d8 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/gem.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/gem" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/gem_chipped.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/gem_chipped.json new file mode 100644 index 000000000..915525da9 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/gem_chipped.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/gem_chipped" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/gem_exquisite.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/gem_exquisite.json new file mode 100644 index 000000000..c7fb00dc1 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/gem_exquisite.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/gem_exquisite" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/gem_flawed.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/gem_flawed.json new file mode 100644 index 000000000..0c13e7bde --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/gem_flawed.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/gem_flawed" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/gem_flawless.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/gem_flawless.json new file mode 100644 index 000000000..7283e1a35 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/gem_flawless.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/gem_flawless" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/heavy_beam.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/heavy_beam.json new file mode 100644 index 000000000..52374925d --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/heavy_beam.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/chronon/heavy_beam" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/ingot_double.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/ingot_double.json new file mode 100644 index 000000000..7adb4b0ac --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/ingot_double.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/material_sets/chronon/ingot", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/chronon/ingot_double" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/ingot_hot.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/ingot_hot.json new file mode 100644 index 000000000..3830cd9a7 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/ingot_hot.json @@ -0,0 +1,9 @@ +{ + "parent": "gtceu:item/material_sets/chronon/ingot", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/chronon/ingot", + "layer3": "gtceu:item/material_sets/chronon/ingot_hot_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/lens.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/lens.json new file mode 100644 index 000000000..ee9726fb1 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/lens.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/lens" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/modular_shelling.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/modular_shelling.json new file mode 100644 index 000000000..d3de641ce --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/modular_shelling.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/chronon/modular_shelling" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/plate_dense.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/plate_dense.json new file mode 100644 index 000000000..abcdc73af --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/plate_dense.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/chronon/plate_dense" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/raw_ore.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/raw_ore.json new file mode 100644 index 000000000..59190d700 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/raw_ore.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/raw_ore", + "layer1": "gtceu:item/material_sets/chronon/raw_ore" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/shape_memory_foil.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/shape_memory_foil.json new file mode 100644 index 000000000..039d82e0d --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/shape_memory_foil.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/shape_memory_foil" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/tool_head_buzz_saw.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/tool_head_buzz_saw.json new file mode 100644 index 000000000..f10feecbe --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/tool_head_buzz_saw.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/chronon/tool_head_buzz_saw" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/tool_head_chainsaw.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/tool_head_chainsaw.json new file mode 100644 index 000000000..e9bf2e206 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/tool_head_chainsaw.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/tool_head_chainsaw", + "layer1": "gtceu:item/material_sets/chronon/tool_head_chainsaw" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/tool_head_drill.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/tool_head_drill.json new file mode 100644 index 000000000..0d950c3d6 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/tool_head_drill.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/tool_head_drill", + "layer1": "gtceu:item/material_sets/chronon/tool_head_drill" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/tool_head_screwdriver.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/tool_head_screwdriver.json new file mode 100644 index 000000000..a7e8127e4 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/tool_head_screwdriver.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/chronon/tool_head_screwdriver" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/tool_head_wire_cutter.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/tool_head_wire_cutter.json new file mode 100644 index 000000000..1d5fa34fa --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/tool_head_wire_cutter.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/tool_head_wirecutter" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/tool_head_wrench.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/tool_head_wrench.json new file mode 100644 index 000000000..bb27f9712 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/tool_head_wrench.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/chronon/tool_head_wrench" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/turbine_blade.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/turbine_blade.json new file mode 100644 index 000000000..80fa95834 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/turbine_blade.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/turbine_blade" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/ultra_dense.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/ultra_dense.json new file mode 100644 index 000000000..1eed162f1 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/ultra_dense.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/chronon/ultradense_plate" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/wire_spool.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/wire_spool.json new file mode 100644 index 000000000..047503d91 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/wire_spool.json @@ -0,0 +1,9 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/chronon/wire_spool", + "layer3": "gtceu:item/material_sets/dull/wire_spool_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/bolt.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/bolt.json new file mode 100644 index 000000000..41c2d13c3 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/bolt.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/bolt", + "layer1": "gtceu:item/material_sets/crystal/bolt_secondary", + "layer2": "gtceu:item/material_sets/crystal/bolt_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/crushed.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/crushed.json new file mode 100644 index 000000000..24199fd9a --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/crushed.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/crushed", + "layer1": "gtceu:item/material_sets/crystal/crushed_secondary", + "layer2": "gtceu:item/material_sets/crystal/crushed_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/crushed_purified.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/crushed_purified.json new file mode 100644 index 000000000..59ac95cd4 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/crushed_purified.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/crushed", + "layer1": "gtceu:item/material_sets/crystal/crushed_secondary" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/crushed_refined.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/crushed_refined.json new file mode 100644 index 000000000..6e77d63df --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/crushed_refined.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/crushed_refined", + "layer1": "gtceu:item/material_sets/crystal/crushed_refined_secondary", + "layer2": "gtceu:item/material_sets/crystal/crushed_refined_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/dust.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/dust.json new file mode 100644 index 000000000..53a19126b --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/dust.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/dust", + "layer1": "gtceu:item/material_sets/crystal/dust_secondary", + "layer2": "gtceu:item/material_sets/crystal/dust_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/dust_impure.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/dust_impure.json new file mode 100644 index 000000000..4b4d25c05 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/dust_impure.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/dust_impure", + "layer1": "gtceu:item/material_sets/crystal/dust_impure_secondary", + "layer2": "gtceu:item/material_sets/crystal/dust_impure_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/dust_pure.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/dust_pure.json new file mode 100644 index 000000000..bb0e69716 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/dust_pure.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/dust_pure", + "layer1": "gtceu:item/material_sets/crystal/dust_pure_secondary", + "layer2": "gtceu:item/material_sets/crystal/dust_pure_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/dust_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/dust_small.json new file mode 100644 index 000000000..efe1ef9d9 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/dust_small.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/dust_small", + "layer1": "gtceu:item/material_sets/crystal/dust_small_secondary" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/dust_tiny.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/dust_tiny.json new file mode 100644 index 000000000..d37b600a6 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/dust_tiny.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/dust_tiny", + "layer1": "gtceu:item/material_sets/crystal/dust_tiny_secondary" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/foil.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/foil.json new file mode 100644 index 000000000..113b794c7 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/foil.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/foil", + "layer1": "gtceu:item/material_sets/crystal/foil_secondary", + "layer2": "gtceu:item/material_sets/crystal/foil_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/gear.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/gear.json new file mode 100644 index 000000000..0e2169e96 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/gear.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/gear", + "layer1": "gtceu:item/material_sets/crystal/gear_secondary", + "layer2": "gtceu:item/material_sets/crystal/gear_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/gear_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/gear_small.json new file mode 100644 index 000000000..842096d7f --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/gear_small.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/gear_small", + "layer1": "gtceu:item/material_sets/crystal/gear_small_secondary", + "layer2": "gtceu:item/material_sets/crystal/gear_small_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/gem.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/gem.json new file mode 100644 index 000000000..59d82bda6 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/gem.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/gem", + "layer1": "gtceu:item/material_sets/crystal/gem_secondary", + "layer2": "gtceu:item/material_sets/crystal/gem_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/gem_chipped.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/gem_chipped.json new file mode 100644 index 000000000..ffd2c4aae --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/gem_chipped.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/gem_chipped", + "layer1": "gtceu:item/material_sets/crystal/gem_chipped_secondary", + "layer2": "gtceu:item/material_sets/crystal/gem_chipped_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/gem_exquisite.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/gem_exquisite.json new file mode 100644 index 000000000..266e125b2 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/gem_exquisite.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/gem_exquisite", + "layer1": "gtceu:item/material_sets/crystal/gem_exquisite_secondary", + "layer2": "gtceu:item/material_sets/crystal/gem_exquisite_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/gem_flawed.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/gem_flawed.json new file mode 100644 index 000000000..5a579ca95 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/gem_flawed.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/gem_flawed", + "layer1": "gtceu:item/material_sets/crystal/gem_flawed_secondary", + "layer2": "gtceu:item/material_sets/crystal/gem_flawed_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/gem_flawless.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/gem_flawless.json new file mode 100644 index 000000000..50f8f6f60 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/gem_flawless.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/gem_flawless", + "layer1": "gtceu:item/material_sets/crystal/gem_flawless_secondary", + "layer2": "gtceu:item/material_sets/crystal/gem_flawless_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/ingot.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/ingot.json new file mode 100644 index 000000000..e6240a4be --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/ingot.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/ingot", + "layer1": "gtceu:item/material_sets/crystal/ingot_secondary", + "layer2": "gtceu:item/material_sets/crystal/ingot_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/ingot_double.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/ingot_double.json new file mode 100644 index 000000000..8c602ab46 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/ingot_double.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:item/material_sets/crystal/ingot", + "textures": { + "layer3": "gtceu:item/material_sets/crystal/ingot_double_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/ingot_hot.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/ingot_hot.json new file mode 100644 index 000000000..5f2e94d61 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/ingot_hot.json @@ -0,0 +1,9 @@ +{ + "parent": "gtceu:item/material_sets/crystal/ingot", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/ingot", + "layer1": "gtceu:item/material_sets/crystal/ingot_secondary", + "layer2": "gtceu:item/material_sets/crystal/ingot_overlay", + "layer3": "gtceu:item/material_sets/crystal/ingot_hot_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/lens.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/lens.json new file mode 100644 index 000000000..e109ed826 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/lens.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/lens", + "layer1": "gtceu:item/material_sets/crystal/lens_secondary", + "layer2": "gtceu:item/material_sets/crystal/lens_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/nugget.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/nugget.json new file mode 100644 index 000000000..aa744db29 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/nugget.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/nugget", + "layer1": "gtceu:item/material_sets/crystal/nugget_secondary" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/plate.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/plate.json new file mode 100644 index 000000000..bb347443e --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/plate.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/plate", + "layer1": "gtceu:item/material_sets/crystal/plate_secondary", + "layer2": "gtceu:item/material_sets/crystal/plate_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/plate_dense.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/plate_dense.json new file mode 100644 index 000000000..d2cba3267 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/plate_dense.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/plate_dense", + "layer1": "gtceu:item/material_sets/crystal/plate_dense_secondary", + "layer2": "gtceu:item/material_sets/crystal/plate_dense_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/plate_double.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/plate_double.json new file mode 100644 index 000000000..a673d985e --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/plate_double.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/material_sets/crystal/plate", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/plate_double", + "layer1": "gtceu:item/material_sets/crystal/plate_double_secondary", + "layer2": "gtceu:item/material_sets/crystal/plate_double_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/raw_ore.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/raw_ore.json new file mode 100644 index 000000000..b04a43478 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/raw_ore.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/raw_ore", + "layer1": "gtceu:item/material_sets/crystal/raw_ore_secondary" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/ring.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/ring.json new file mode 100644 index 000000000..56f828d5f --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/ring.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/ring", + "layer1": "gtceu:item/material_sets/crystal/ring_secondary", + "layer2": "gtceu:item/material_sets/crystal/ring_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/rod.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/rod.json new file mode 100644 index 000000000..383d94059 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/rod.json @@ -0,0 +1,7 @@ +{ + "parent": "item/handheld", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/rod", + "layer1": "gtceu:item/material_sets/crystal/rod_secondary" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/rod_long.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/rod_long.json new file mode 100644 index 000000000..be204bff5 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/rod_long.json @@ -0,0 +1,7 @@ +{ + "parent": "item/handheld", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/rod_long", + "layer1": "gtceu:item/material_sets/crystal/rod_long_secondary" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/rotor.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/rotor.json new file mode 100644 index 000000000..b6791a910 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/rotor.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/rotor", + "layer1": "gtceu:item/material_sets/crystal/rotor_secondary", + "layer2": "gtceu:item/material_sets/crystal/rotor_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/round.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/round.json new file mode 100644 index 000000000..40d0f623a --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/round.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/round", + "layer1": "gtceu:item/material_sets/crystal/round_secondary" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/screw.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/screw.json new file mode 100644 index 000000000..d5af7dae8 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/screw.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/screw", + "layer1": "gtceu:item/material_sets/crystal/screw_secondary", + "layer2": "gtceu:item/material_sets/crystal/screw_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/spring.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/spring.json new file mode 100644 index 000000000..f4982245e --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/spring.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/spring", + "layer1": "gtceu:item/material_sets/crystal/spring_secondary", + "layer2": "gtceu:item/material_sets/crystal/spring_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/spring_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/spring_small.json new file mode 100644 index 000000000..face67b7d --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/spring_small.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/spring_small", + "layer1": "gtceu:item/material_sets/crystal/spring_small_secondary", + "layer2": "gtceu:item/material_sets/crystal/spring_small_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/tool_head_buzz_saw.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/tool_head_buzz_saw.json new file mode 100644 index 000000000..4440e6b49 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/tool_head_buzz_saw.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/tool_head_buzz_saw", + "layer1": "gtceu:item/material_sets/crystal/tool_head_buzz_saw_secondary", + "layer2": "gtceu:item/material_sets/crystal/tool_head_buzz_saw_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/tool_head_chainsaw.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/tool_head_chainsaw.json new file mode 100644 index 000000000..8d2cd191c --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/tool_head_chainsaw.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/tool_head_chainsaw", + "layer1": "gtceu:item/material_sets/crystal/tool_head_chainsaw_secondary" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/tool_head_drill.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/tool_head_drill.json new file mode 100644 index 000000000..4c7afcab5 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/tool_head_drill.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/tool_head_drill", + "layer1": "gtceu:item/material_sets/crystal/tool_head_drill_secondary" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/tool_head_screwdriver.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/tool_head_screwdriver.json new file mode 100644 index 000000000..733be1cbd --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/tool_head_screwdriver.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/tool_head_screwdriver", + "layer1": "gtceu:item/material_sets/crystal/tool_head_screwdriver_secondary", + "layer2": "gtceu:item/material_sets/crystal/tool_head_screwdriver_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/tool_head_wire_cutter.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/tool_head_wire_cutter.json new file mode 100644 index 000000000..3f8dd5851 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/tool_head_wire_cutter.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/tool_head_wirecutter" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/tool_head_wrench.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/tool_head_wrench.json new file mode 100644 index 000000000..2dcfb14bd --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/tool_head_wrench.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/tool_head_wrench", + "layer1": "gtceu:item/material_sets/crystal/tool_head_wrench_secondary", + "layer2": "gtceu:item/material_sets/crystal/tool_head_wrench_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/turbine_blade.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/turbine_blade.json new file mode 100644 index 000000000..e6cd960c3 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/turbine_blade.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/turbine_blade", + "layer1": "gtceu:item/material_sets/crystal/turbine_blade_secondary", + "layer2": "gtceu:item/material_sets/crystal/turbine_blade_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/wire_fine.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/wire_fine.json new file mode 100644 index 000000000..e2ff07596 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/wire_fine.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/wire_fine", + "layer1": "gtceu:item/material_sets/crystal/wire_fine_secondary", + "layer2": "gtceu:item/material_sets/crystal/wire_fine_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/diamond/raw_ore_cubic.json b/src/main/resources/assets/gtceu/models/item/material_sets/diamond/raw_ore_cubic.json new file mode 100644 index 000000000..97bf25c1d --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/diamond/raw_ore_cubic.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/diamond/raw_ore_cubic", + "layer1": "gtceu:item/material_sets/diamond/raw_ore_cubic_secondary" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/dull/alve_foil_insulator.json b/src/main/resources/assets/gtceu/models/item/material_sets/dull/alve_foil_insulator.json index 16dc23676..435d9514c 100644 --- a/src/main/resources/assets/gtceu/models/item/material_sets/dull/alve_foil_insulator.json +++ b/src/main/resources/assets/gtceu/models/item/material_sets/dull/alve_foil_insulator.json @@ -1,6 +1,8 @@ { "parent": "item/generated", "textures": { - "layer0": "gtceu:item/material_sets/dull/alve_foil_insulator" + "layer0": "gtceu:item/material_sets/dull/alve_foil_insulator", + "layer1": "gtceu:item/material_sets/dull/alve_foil_insulator_secondary", + "layer2": "gtceu:item/material_sets/dull/alve_foil_insulator_overlay" } } diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/dull/raw_ore_cubic.json b/src/main/resources/assets/gtceu/models/item/material_sets/dull/raw_ore_cubic.json new file mode 100644 index 000000000..cdf71ed56 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/dull/raw_ore_cubic.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/dull/raw_ore_cubic", + "layer1": "gtceu:item/material_sets/dull/raw_ore_cubic_secondary" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/dull/shape_memory_foil.json b/src/main/resources/assets/gtceu/models/item/material_sets/dull/shape_memory_foil.json index 1431e8edc..b6f6e074d 100644 --- a/src/main/resources/assets/gtceu/models/item/material_sets/dull/shape_memory_foil.json +++ b/src/main/resources/assets/gtceu/models/item/material_sets/dull/shape_memory_foil.json @@ -1,6 +1,8 @@ { "parent": "item/generated", "textures": { - "layer0": "gtceu:item/material_sets/dull/shape_memory_foil" + "layer0": "gtceu:item/material_sets/dull/shape_memory_foil", + "layer1": "gtceu:item/material_sets/dull/shape_memory_foil_secondary", + "layer2": "gtceu:item/material_sets/dull/shape_memory_foil_overlay" } } diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/fine/raw_ore_cubic.json b/src/main/resources/assets/gtceu/models/item/material_sets/fine/raw_ore_cubic.json new file mode 100644 index 000000000..9d94ccf29 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/fine/raw_ore_cubic.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/fine/raw_ore_cubic", + "layer1": "gtceu:item/material_sets/fine/raw_ore_cubic_secondary" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/bolt.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/bolt.json new file mode 100644 index 000000000..ee44fdfe4 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/bolt.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/bolt", + "layer1": "gtceu:item/material_sets/magic/bolt_secondary", + "layer2": "gtceu:item/material_sets/magic/bolt_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/dust.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/dust.json new file mode 100644 index 000000000..80dee3061 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/dust.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/dust", + "layer1": "gtceu:item/material_sets/magic/dust_secondary", + "layer2": "gtceu:item/material_sets/magic/dust_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/dust_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/dust_small.json new file mode 100644 index 000000000..a4be87088 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/dust_small.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/dust_small", + "layer1": "gtceu:item/material_sets/magic/dust_small_secondary", + "layer2": "gtceu:item/material_sets/magic/dust_small_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/dust_tiny.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/dust_tiny.json new file mode 100644 index 000000000..673b2d253 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/dust_tiny.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/dust_tiny", + "layer1": "gtceu:item/material_sets/magic/dust_tiny_secondary", + "layer2": "gtceu:item/material_sets/magic/dust_tiny_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/foil.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/foil.json new file mode 100644 index 000000000..1160deeae --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/foil.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/foil", + "layer1": "gtceu:item/material_sets/magic/foil_secondary", + "layer2": "gtceu:item/material_sets/magic/foil_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/gear.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/gear.json new file mode 100644 index 000000000..e597f873b --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/gear.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/gear", + "layer1": "gtceu:item/material_sets/magic/gear_secondary", + "layer2": "gtceu:item/material_sets/magic/gear_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/gear_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/gear_small.json new file mode 100644 index 000000000..99bd8cca1 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/gear_small.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/gear_small", + "layer1": "gtceu:item/material_sets/magic/gear_small_secondary", + "layer2": "gtceu:item/material_sets/magic/gear_small_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/ingot.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/ingot.json new file mode 100644 index 000000000..042ade59e --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/ingot.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/ingot", + "layer1": "gtceu:item/material_sets/magic/ingot_secondary", + "layer2": "gtceu:item/material_sets/magic/ingot_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/ingot_double.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/ingot_double.json new file mode 100644 index 000000000..3f11da2e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/ingot_double.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/ingot_double", + "layer1": "gtceu:item/material_sets/magic/ingot_double_secondary", + "layer2": "gtceu:item/material_sets/magic/ingot_double_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/ingot_hot.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/ingot_hot.json new file mode 100644 index 000000000..e9ec24c61 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/ingot_hot.json @@ -0,0 +1,9 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/ingot", + "layer1": "gtceu:item/material_sets/magic/ingot_secondary", + "layer2": "gtceu:item/material_sets/magic/ingot_overlay", + "layer3": "gtceu:item/material_sets/metallic/ingot_hot_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/nugget.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/nugget.json new file mode 100644 index 000000000..b634bf27c --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/nugget.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/nugget", + "layer1": "gtceu:item/material_sets/magic/nugget_secondary", + "layer2": "gtceu:item/material_sets/magic/nugget_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/plate.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/plate.json new file mode 100644 index 000000000..116a184ca --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/plate.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/plate", + "layer1": "gtceu:item/material_sets/magic/plate_secondary", + "layer2": "gtceu:item/material_sets/magic/plate_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/plate_dense.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/plate_dense.json new file mode 100644 index 000000000..5432eb1fc --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/plate_dense.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/plate_dense", + "layer1": "gtceu:item/material_sets/magic/plate_dense_secondary", + "layer2": "gtceu:item/material_sets/magic/plate_dense_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/plate_double.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/plate_double.json new file mode 100644 index 000000000..20600e177 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/plate_double.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/plate_double", + "layer1": "gtceu:item/material_sets/magic/plate_double_secondary", + "layer2": "gtceu:item/material_sets/magic/plate_double_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/ring.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/ring.json new file mode 100644 index 000000000..2c7477ac1 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/ring.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/ring", + "layer1": "gtceu:item/material_sets/magic/ring_secondary", + "layer2": "gtceu:item/material_sets/magic/ring_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/rod.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/rod.json new file mode 100644 index 000000000..4d12f6f2b --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/rod.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/rod", + "layer1": "gtceu:item/material_sets/magic/rod_secondary", + "layer2": "gtceu:item/material_sets/magic/rod_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/rod_long.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/rod_long.json new file mode 100644 index 000000000..f503360cc --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/rod_long.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/rod_long", + "layer1": "gtceu:item/material_sets/magic/rod_long_secondary", + "layer2": "gtceu:item/material_sets/magic/rod_long_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/rotor.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/rotor.json new file mode 100644 index 000000000..0f40bd619 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/rotor.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/rotor", + "layer1": "gtceu:item/material_sets/magic/rotor_secondary", + "layer2": "gtceu:item/material_sets/magic/rotor_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/round.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/round.json new file mode 100644 index 000000000..124f5c5f3 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/round.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/round", + "layer1": "gtceu:item/material_sets/magic/round_secondary", + "layer2": "gtceu:item/material_sets/magic/round_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/screw.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/screw.json new file mode 100644 index 000000000..81750edec --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/screw.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/screw", + "layer1": "gtceu:item/material_sets/magic/screw_secondary", + "layer2": "gtceu:item/material_sets/magic/screw_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/spring.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/spring.json new file mode 100644 index 000000000..9ec19f58e --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/spring.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/spring", + "layer1": "gtceu:item/material_sets/magic/spring_secondary", + "layer2": "gtceu:item/material_sets/magic/spring_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/spring_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/spring_small.json new file mode 100644 index 000000000..ad9212bc6 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/spring_small.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/spring_small", + "layer1": "gtceu:item/material_sets/magic/spring_small_secondary", + "layer2": "gtceu:item/material_sets/magic/spring_small_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/wire_fine.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/wire_fine.json new file mode 100644 index 000000000..7c7a4005a --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/wire_fine.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/wire_fine", + "layer1": "gtceu:item/material_sets/magic/wire_fine_secondary", + "layer2": "gtceu:item/material_sets/magic/wire_fine_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic_terra/ingot.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic_terra/ingot.json new file mode 100644 index 000000000..5d3ddbe67 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic_terra/ingot.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic_terra/ingot", + "layer1": "gtceu:item/material_sets/magic_terra/ingot_secondary", + "layer2": "gtceu:item/material_sets/magic_terra/ingot_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic_terra/ingot_double.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic_terra/ingot_double.json new file mode 100644 index 000000000..987afd9a1 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic_terra/ingot_double.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic_terra/ingot_double", + "layer1": "gtceu:item/material_sets/magic_terra/ingot_double_secondary", + "layer2": "gtceu:item/material_sets/magic_terra/ingot_double_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic_terra/ingot_hot.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic_terra/ingot_hot.json new file mode 100644 index 000000000..312dfb2cf --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic_terra/ingot_hot.json @@ -0,0 +1,9 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic_terra/ingot", + "layer1": "gtceu:item/material_sets/magic_terra/ingot_secondary", + "layer2": "gtceu:item/material_sets/magic_terra/ingot_overlay", + "layer3": "gtceu:item/material_sets/metallic/ingot_hot_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic_terra/nugget.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic_terra/nugget.json new file mode 100644 index 000000000..5c66d1e5b --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic_terra/nugget.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic_terra/nugget", + "layer1": "gtceu:item/material_sets/magic_terra/nugget_secondary", + "layer2": "gtceu:item/material_sets/magic_terra/nugget_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic_terra/plate.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic_terra/plate.json new file mode 100644 index 000000000..09739d0a6 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic_terra/plate.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic_terra/plate", + "layer1": "gtceu:item/material_sets/magic_terra/plate_secondary", + "layer2": "gtceu:item/material_sets/magic_terra/plate_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic_terra/plate_dense.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic_terra/plate_dense.json new file mode 100644 index 000000000..b1a5faea9 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic_terra/plate_dense.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic_terra/plate_dense", + "layer1": "gtceu:item/material_sets/magic_terra/plate_dense_secondary", + "layer2": "gtceu:item/material_sets/magic_terra/plate_dense_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic_terra/plate_double.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic_terra/plate_double.json new file mode 100644 index 000000000..d08030e81 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic_terra/plate_double.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic_terra/plate_double", + "layer1": "gtceu:item/material_sets/magic_terra/plate_double_secondary", + "layer2": "gtceu:item/material_sets/magic_terra/plate_double_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/metallic/alve_foil_insulator.json b/src/main/resources/assets/gtceu/models/item/material_sets/metallic/alve_foil_insulator.json new file mode 100644 index 000000000..4194fb5dd --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/metallic/alve_foil_insulator.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/metallic/alve_foil_insulator", + "layer1": "gtceu:item/material_sets/metallic/alve_foil_insulator_secondary", + "layer2": "gtceu:item/material_sets/metallic/alve_foil_insulator_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/metallic/raw_ore_cubic.json b/src/main/resources/assets/gtceu/models/item/material_sets/metallic/raw_ore_cubic.json new file mode 100644 index 000000000..dae4bdb22 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/metallic/raw_ore_cubic.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/metallic/raw_ore_cubic", + "layer1": "gtceu:item/material_sets/metallic/raw_ore_cubic_secondary" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/metallic/shape_memory_foil.json b/src/main/resources/assets/gtceu/models/item/material_sets/metallic/shape_memory_foil.json new file mode 100644 index 000000000..82868b633 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/metallic/shape_memory_foil.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/metallic/shape_memory_foil", + "layer1": "gtceu:item/material_sets/metallic/shape_memory_foil_secondary", + "layer2": "gtceu:item/material_sets/metallic/shape_memory_foil_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/shiny/alve_foil_insulator.json b/src/main/resources/assets/gtceu/models/item/material_sets/shiny/alve_foil_insulator.json new file mode 100644 index 000000000..b6891bd46 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/shiny/alve_foil_insulator.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/shiny/alve_foil_insulator", + "layer1": "gtceu:item/material_sets/shiny/alve_foil_insulator_secondary", + "layer2": "gtceu:item/material_sets/shiny/alve_foil_insulator_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/shiny/raw_ore_cubic.json b/src/main/resources/assets/gtceu/models/item/material_sets/shiny/raw_ore_cubic.json new file mode 100644 index 000000000..bd8bf4055 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/shiny/raw_ore_cubic.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/shiny/raw_ore_cubic", + "layer1": "gtceu:item/material_sets/shiny/raw_ore_cubic_secondary", + "layer2": "gtceu:item/material_sets/shiny/raw_ore_cubic_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/shiny/shape_memory_foil.json b/src/main/resources/assets/gtceu/models/item/material_sets/shiny/shape_memory_foil.json new file mode 100644 index 000000000..9797e12b5 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/shiny/shape_memory_foil.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/shiny/shape_memory_foil", + "layer1": "gtceu:item/material_sets/shiny/shape_memory_foil_secondary", + "layer2": "gtceu:item/material_sets/shiny/shape_memory_foil_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/chonky/block.png b/src/main/resources/assets/gtceu/textures/block/material_sets/chonky/block.png new file mode 100644 index 000000000..d456c5965 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/chonky/block.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/chonky/block_overlay.png b/src/main/resources/assets/gtceu/textures/block/material_sets/chonky/block_overlay.png new file mode 100644 index 000000000..baf443562 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/chonky/block_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/chonky/block_secondary.png b/src/main/resources/assets/gtceu/textures/block/material_sets/chonky/block_secondary.png new file mode 100644 index 000000000..6b7c18018 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/chonky/block_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/chonky/frame_gt.png b/src/main/resources/assets/gtceu/textures/block/material_sets/chonky/frame_gt.png new file mode 100644 index 000000000..d4ad8581b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/chonky/frame_gt.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/chonky/frame_gt_overlay.png b/src/main/resources/assets/gtceu/textures/block/material_sets/chonky/frame_gt_overlay.png new file mode 100644 index 000000000..bf82e85e4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/chonky/frame_gt_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/chonky/frame_gt_secondary.png b/src/main/resources/assets/gtceu/textures/block/material_sets/chonky/frame_gt_secondary.png new file mode 100644 index 000000000..bf4df82cf Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/chonky/frame_gt_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/crystal/block.png b/src/main/resources/assets/gtceu/textures/block/material_sets/crystal/block.png new file mode 100644 index 000000000..5492f0dfd Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/crystal/block.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/crystal/block_overlay.png b/src/main/resources/assets/gtceu/textures/block/material_sets/crystal/block_overlay.png new file mode 100644 index 000000000..156bd6232 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/crystal/block_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/crystal/block_secondary.png b/src/main/resources/assets/gtceu/textures/block/material_sets/crystal/block_secondary.png new file mode 100644 index 000000000..26b264721 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/crystal/block_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/crystal/frame_gt.png b/src/main/resources/assets/gtceu/textures/block/material_sets/crystal/frame_gt.png new file mode 100644 index 000000000..ee8aa5b6b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/crystal/frame_gt.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/crystal/frame_gt_overlay.png b/src/main/resources/assets/gtceu/textures/block/material_sets/crystal/frame_gt_overlay.png new file mode 100644 index 000000000..7178b23cd Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/crystal/frame_gt_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/crystal/frame_gt_secondary.png b/src/main/resources/assets/gtceu/textures/block/material_sets/crystal/frame_gt_secondary.png new file mode 100644 index 000000000..abe137d0b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/crystal/frame_gt_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/magic/block.png b/src/main/resources/assets/gtceu/textures/block/material_sets/magic/block.png new file mode 100644 index 000000000..82232a5bd Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/magic/block.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/magic/block_overlay.png b/src/main/resources/assets/gtceu/textures/block/material_sets/magic/block_overlay.png new file mode 100644 index 000000000..834a3b8b2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/magic/block_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/magic/block_secondary.png b/src/main/resources/assets/gtceu/textures/block/material_sets/magic/block_secondary.png new file mode 100644 index 000000000..97248af65 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/magic/block_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/magic/frame_gt.png b/src/main/resources/assets/gtceu/textures/block/material_sets/magic/frame_gt.png new file mode 100644 index 000000000..79692ec92 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/magic/frame_gt.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/magic/frame_gt_overlay.png b/src/main/resources/assets/gtceu/textures/block/material_sets/magic/frame_gt_overlay.png new file mode 100644 index 000000000..841d5b049 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/magic/frame_gt_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/magic/frame_gt_secondary.png b/src/main/resources/assets/gtceu/textures/block/material_sets/magic/frame_gt_secondary.png new file mode 100644 index 000000000..76490fb4b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/magic/frame_gt_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/bright/alve_foil_insulator.png b/src/main/resources/assets/gtceu/textures/item/material_sets/bright/alve_foil_insulator.png new file mode 100644 index 000000000..70b7494be Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/bright/alve_foil_insulator.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/bright/alve_foil_insulator_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/bright/alve_foil_insulator_overlay.png new file mode 100644 index 000000000..146a0b56d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/bright/alve_foil_insulator_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/bright/alve_foil_insulator_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/bright/alve_foil_insulator_secondary.png new file mode 100644 index 000000000..e508ab7b5 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/bright/alve_foil_insulator_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/bright/shape_memory_foil.png b/src/main/resources/assets/gtceu/textures/item/material_sets/bright/shape_memory_foil.png new file mode 100644 index 000000000..9bf0be809 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/bright/shape_memory_foil.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/bright/shape_memory_foil_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/bright/shape_memory_foil_overlay.png new file mode 100644 index 000000000..c2a4482e7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/bright/shape_memory_foil_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/bright/shape_memory_foil_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/bright/shape_memory_foil_secondary.png new file mode 100644 index 000000000..5d0627d68 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/bright/shape_memory_foil_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/modular_shelling.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/modular_shelling.png new file mode 100644 index 000000000..5e71e2053 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/modular_shelling.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/modular_shelling_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/modular_shelling_overlay.png new file mode 100644 index 000000000..a9630b3ff Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/modular_shelling_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/modular_shelling_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/modular_shelling_secondary.png new file mode 100644 index 000000000..484c0636d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/modular_shelling_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/nugget.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/nugget.png new file mode 100644 index 000000000..2950dd58f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/nugget.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/nugget_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/nugget_overlay.png new file mode 100644 index 000000000..2012f8c33 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/nugget_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/nugget_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/nugget_secondary.png new file mode 100644 index 000000000..8a2166461 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/nugget_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate.png new file mode 100644 index 000000000..c5852b31f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_dense.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_dense.png new file mode 100644 index 000000000..f402c662d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_dense.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_dense_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_dense_overlay.png new file mode 100644 index 000000000..881627b64 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_dense_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_dense_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_dense_secondary.png new file mode 100644 index 000000000..ec537401b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_dense_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_double.png new file mode 100644 index 000000000..eb91a8825 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_double_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_double_overlay.png new file mode 100644 index 000000000..cc7c6e60a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_double_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_double_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_double_secondary.png new file mode 100644 index 000000000..df0a19900 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_double_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_overlay.png new file mode 100644 index 000000000..98bb6f503 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_secondary.png new file mode 100644 index 000000000..89211c946 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/ring.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/ring.png new file mode 100644 index 000000000..37fd22e4d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/ring.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/ring_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/ring_overlay.png new file mode 100644 index 000000000..4cb2f1b8c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/ring_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/ring_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/ring_secondary.png new file mode 100644 index 000000000..00c57fd32 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/ring_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rod.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rod.png new file mode 100644 index 000000000..7861a5568 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rod.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rod_long.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rod_long.png new file mode 100644 index 000000000..aac16b378 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rod_long.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rod_long_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rod_long_overlay.png new file mode 100644 index 000000000..bf3ff7771 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rod_long_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rod_long_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rod_long_secondary.png new file mode 100644 index 000000000..b36c0bb6c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rod_long_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rod_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rod_overlay.png new file mode 100644 index 000000000..9063b94be Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rod_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rod_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rod_secondary.png new file mode 100644 index 000000000..e77a57cb3 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rod_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rotor.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rotor.png new file mode 100644 index 000000000..12733d7d4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rotor.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rotor_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rotor_overlay.png new file mode 100644 index 000000000..d567d4eb2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rotor_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rotor_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rotor_secondary.png new file mode 100644 index 000000000..d6bfa4c80 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rotor_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/round.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/round.png new file mode 100644 index 000000000..b85f9e915 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/round.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/round_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/round_overlay.png new file mode 100644 index 000000000..05589c8cc Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/round_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/round_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/round_secondary.png new file mode 100644 index 000000000..1c99631cd Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/round_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/screw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/screw.png new file mode 100644 index 000000000..980f4e98a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/screw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/screw_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/screw_overlay.png new file mode 100644 index 000000000..b287140b2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/screw_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/screw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/screw_secondary.png new file mode 100644 index 000000000..d80e57b98 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/screw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/shape_memory_foil.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/shape_memory_foil.png new file mode 100644 index 000000000..a5a109d02 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/shape_memory_foil.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/shape_memory_foil_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/shape_memory_foil_overlay.png new file mode 100644 index 000000000..6ba863507 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/shape_memory_foil_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/shape_memory_foil_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/shape_memory_foil_secondary.png new file mode 100644 index 000000000..e2fb2caf4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/shape_memory_foil_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/spring.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/spring.png new file mode 100644 index 000000000..c4c81adf0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/spring.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/spring_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/spring_overlay.png new file mode 100644 index 000000000..53d28ec22 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/spring_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/spring_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/spring_secondary.png new file mode 100644 index 000000000..f9d70dabc Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/spring_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/spring_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/spring_small.png new file mode 100644 index 000000000..a8975e211 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/spring_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/spring_small_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/spring_small_overlay.png new file mode 100644 index 000000000..401a0972b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/spring_small_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/spring_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/spring_small_secondary.png new file mode 100644 index 000000000..71fc8e5e7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/spring_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_buzz_saw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_buzz_saw.png new file mode 100644 index 000000000..9ef67bf86 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_buzz_saw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_buzz_saw_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_buzz_saw_overlay.png new file mode 100644 index 000000000..bdae8fcf8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_buzz_saw_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_buzz_saw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_buzz_saw_secondary.png new file mode 100644 index 000000000..485a43548 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_buzz_saw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_chainsaw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_chainsaw.png new file mode 100644 index 000000000..da3df1085 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_chainsaw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_chainsaw_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_chainsaw_overlay.png new file mode 100644 index 000000000..4d2ba9f4d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_chainsaw_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_chainsaw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_chainsaw_secondary.png new file mode 100644 index 000000000..03bbe678f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_chainsaw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_drill.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_drill.png new file mode 100644 index 000000000..a941ed464 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_drill.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_drill_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_drill_overlay.png new file mode 100644 index 000000000..97569c6c5 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_drill_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_drill_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_drill_secondary.png new file mode 100644 index 000000000..5ebc3dcc4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_drill_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_screwdriver.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_screwdriver.png new file mode 100644 index 000000000..69e290f23 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_screwdriver.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_screwdriver_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_screwdriver_overlay.png new file mode 100644 index 000000000..ef831b9cc Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_screwdriver_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_screwdriver_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_screwdriver_secondary.png new file mode 100644 index 000000000..78760659e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_screwdriver_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_wrench.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_wrench.png new file mode 100644 index 000000000..a3898bc25 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_wrench.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_wrench_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_wrench_overlay.png new file mode 100644 index 000000000..f26a211aa Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_wrench_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_wrench_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_wrench_secondary.png new file mode 100644 index 000000000..217cb691c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_wrench_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/turbine_blade.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/turbine_blade.png new file mode 100644 index 000000000..46349c3c7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/turbine_blade.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/turbine_blade_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/turbine_blade_overlay.png new file mode 100644 index 000000000..74ffd68e7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/turbine_blade_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/turbine_blade_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/turbine_blade_secondary.png new file mode 100644 index 000000000..e1f7d5ff5 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/turbine_blade_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/ultradense_plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/ultradense_plate.png new file mode 100644 index 000000000..cae134466 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/ultradense_plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/ultradense_plate_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/ultradense_plate_overlay.png new file mode 100644 index 000000000..c19b76d4b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/ultradense_plate_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/ultradense_plate_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/ultradense_plate_secondary.png new file mode 100644 index 000000000..0071301cd Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/ultradense_plate_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/wire_fine.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/wire_fine.png new file mode 100644 index 000000000..9dd582679 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/wire_fine.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/wire_fine_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/wire_fine_overlay.png new file mode 100644 index 000000000..8cc50d44b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/wire_fine_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/wire_fine_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/wire_fine_secondary.png new file mode 100644 index 000000000..de7589ef7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/wire_fine_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/wire_spool.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/wire_spool.png new file mode 100644 index 000000000..9e5bd8ad7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/wire_spool.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/wire_spool_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/wire_spool_overlay.png new file mode 100644 index 000000000..bea2dd86d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/wire_spool_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/wire_spool_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/wire_spool_secondary.png new file mode 100644 index 000000000..8b5da4665 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/wire_spool_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/alve_foil_insulator.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/alve_foil_insulator.png new file mode 100644 index 000000000..d79fcdf16 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/alve_foil_insulator.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/block.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/alve_foil_insulator.png.mcmeta similarity index 100% rename from src/main/resources/assets/gtceu/textures/item/material_sets/infinity/block.png.mcmeta rename to src/main/resources/assets/gtceu/textures/item/material_sets/chronon/alve_foil_insulator.png.mcmeta diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/alve_foil_insulator_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/alve_foil_insulator_overlay.png new file mode 100644 index 000000000..181255fc0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/alve_foil_insulator_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frame_gt.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/alve_foil_insulator_overlay.png.mcmeta similarity index 100% rename from src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frame_gt.png.mcmeta rename to src/main/resources/assets/gtceu/textures/item/material_sets/chronon/alve_foil_insulator_overlay.png.mcmeta diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/alve_foil_insulator_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/alve_foil_insulator_secondary.png new file mode 100644 index 000000000..9b46abae8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/alve_foil_insulator_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_exquisite.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/alve_foil_insulator_secondary.png.mcmeta similarity index 100% rename from src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_exquisite.png.mcmeta rename to src/main/resources/assets/gtceu/textures/item/material_sets/chronon/alve_foil_insulator_secondary.png.mcmeta diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/blank.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/blank.png new file mode 100644 index 000000000..2f714f749 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/blank.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_exquisite_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/blank.png.mcmeta similarity index 100% rename from src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_exquisite_secondary.png.mcmeta rename to src/main/resources/assets/gtceu/textures/item/material_sets/chronon/blank.png.mcmeta diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/block.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/block.png deleted file mode 100644 index 6f09cb026..000000000 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/block.png and /dev/null differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/block.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/block.png.mcmeta deleted file mode 100644 index 6b64c4ab3..000000000 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/block.png.mcmeta +++ /dev/null @@ -1 +0,0 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/bolt.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/bolt.png index 1c1642116..cd7d2ee45 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/bolt.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/bolt.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/bolt.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/bolt.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/bolt.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/bolt.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/bolt_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/bolt_overlay.png new file mode 100644 index 000000000..9be671def Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/bolt_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/bolt_overlay.png.mcmeta similarity index 100% rename from src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire.png.mcmeta rename to src/main/resources/assets/gtceu/textures/item/material_sets/chronon/bolt_overlay.png.mcmeta diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/bolt_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/bolt_secondary.png index a24d5bfde..c56aad7d5 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/bolt_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/bolt_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/bolt_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/bolt_secondary.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/bolt_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/bolt_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed.png index 8fc8f4934..4d8d41a90 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_overlay.png new file mode 100644 index 000000000..5d88a2220 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_end.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_overlay.png.mcmeta similarity index 100% rename from src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_end.png.mcmeta rename to src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_overlay.png.mcmeta diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_purified.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_purified.png index 752721bf4..4d8d41a90 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_purified.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_purified.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_purified.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_purified.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_purified.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_purified.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_purified_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_purified_secondary.png index 4a8ba428d..5ae5fd624 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_purified_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_purified_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_purified_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_purified_secondary.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_purified_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_purified_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_refined.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_refined.png index c918cd170..4d8d41a90 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_refined.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_refined.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_refined.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_refined.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_refined.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_refined.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_refined_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_refined_overlay.png new file mode 100644 index 000000000..71b79d3eb Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_refined_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_side.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_refined_overlay.png.mcmeta similarity index 100% rename from src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_side.png.mcmeta rename to src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_refined_overlay.png.mcmeta diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_refined_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_refined_secondary.png index 4a8ba428d..5ae5fd624 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_refined_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_refined_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_refined_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_refined_secondary.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_refined_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_refined_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_secondary.png index 4a8ba428d..5ae5fd624 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_secondary.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust.png index b1ff32e67..48940ed7e 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_impure.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_impure.png index 8d94c21f1..48940ed7e 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_impure.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_impure.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_impure.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_impure.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_impure.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_impure.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_impure_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_impure_overlay.png new file mode 100644 index 000000000..a5202ab2b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_impure_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_spool.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_impure_overlay.png.mcmeta similarity index 100% rename from src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_spool.png.mcmeta rename to src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_impure_overlay.png.mcmeta diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_impure_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_impure_secondary.png index 6689e4191..f3891bd86 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_impure_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_impure_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_impure_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_impure_secondary.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_impure_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_impure_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_pure.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_pure.png index b56b04d43..e10e135f3 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_pure.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_pure.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_pure.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_pure.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_pure.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_pure.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_pure_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_pure_overlay.png new file mode 100644 index 000000000..798fa4c2b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_pure_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_spool_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_pure_overlay.png.mcmeta similarity index 100% rename from src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_spool_overlay.png.mcmeta rename to src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_pure_overlay.png.mcmeta diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_pure_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_pure_secondary.png index ef9c31599..a514bea98 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_pure_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_pure_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_pure_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_pure_secondary.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_pure_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_pure_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_secondary.png index 6689e4191..f3891bd86 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_secondary.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_small.png index 90153c42f..1d0d93421 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_small.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_small.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_small.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_small.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_small.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_small_secondary.png index 49f3c82fb..9a9c897cc 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_small_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_small_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_small_secondary.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_small_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_small_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_tiny.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_tiny.png index 6ef3cf670..f966d6319 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_tiny.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_tiny.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_tiny.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_tiny.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_tiny.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_tiny.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_tiny_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_tiny_secondary.png index 86e23fab8..1b0250c69 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_tiny_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_tiny_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_tiny_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_tiny_secondary.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_tiny_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_tiny_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/foil.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/foil.png index 07e8ffcc7..9dd5503c3 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/foil.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/foil.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/foil.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/foil.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/foil.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/foil.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/foil_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/foil_overlay.png new file mode 100644 index 000000000..e63e561b9 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/foil_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/foil_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/foil_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/foil_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/foil_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/foil_secondary.png index 8810aeaef..96c242dbd 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/foil_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/foil_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/foil_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/foil_secondary.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/foil_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/foil_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/frame_gt.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/frame_gt.png deleted file mode 100644 index 16f5df152..000000000 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/frame_gt.png and /dev/null differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/frame_gt.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/frame_gt.png.mcmeta deleted file mode 100644 index 6b64c4ab3..000000000 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/frame_gt.png.mcmeta +++ /dev/null @@ -1 +0,0 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/frothed.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/frothed.png new file mode 100644 index 000000000..17342c37c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/frothed.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/frothed.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/frothed.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/frothed.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/frothed_overlay_glint.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/frothed_overlay_glint.png new file mode 100644 index 000000000..09ff111dc Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/frothed_overlay_glint.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/frothed_overlay_glint.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/frothed_overlay_glint.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/frothed_overlay_glint.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/frothed_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/frothed_secondary.png new file mode 100644 index 000000000..a77e6353d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/frothed_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/frothed_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/frothed_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/frothed_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear.png index df9dd0e1f..39d181a83 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_overlay.png new file mode 100644 index 000000000..30607fe0c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_secondary.png index 35c8dad9f..5920418bf 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_secondary.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_small.png index db9f1a8a5..59fa1ce69 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_small.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_small.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_small.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_small.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_small.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_small_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_small_overlay.png new file mode 100644 index 000000000..69dd3c233 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_small_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_small_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_small_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_small_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_small_secondary.png index ce031a626..3a153aa37 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_small_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_small_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_small_secondary.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_small_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_small_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem.png index 08b5189b1..24507da00 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_chipped.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_chipped.png index c99f01c8b..cf14f27e0 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_chipped.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_chipped.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_chipped.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_chipped.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_chipped.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_chipped.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_chipped_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_chipped_overlay.png new file mode 100644 index 000000000..a0879c428 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_chipped_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_chipped_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_chipped_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_chipped_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_chipped_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_chipped_secondary.png index 5cf768cb6..229b3305c 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_chipped_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_chipped_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_chipped_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_chipped_secondary.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_chipped_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_chipped_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_exquisite.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_exquisite.png deleted file mode 100644 index fe0234cf1..000000000 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_exquisite.png and /dev/null differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_exquisite.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_exquisite.png.mcmeta deleted file mode 100644 index 6b64c4ab3..000000000 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_exquisite.png.mcmeta +++ /dev/null @@ -1 +0,0 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_exquisite_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_exquisite_secondary.png deleted file mode 100644 index 857d59735..000000000 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_exquisite_secondary.png and /dev/null differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_exquisite_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_exquisite_secondary.png.mcmeta deleted file mode 100644 index 6b64c4ab3..000000000 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_exquisite_secondary.png.mcmeta +++ /dev/null @@ -1 +0,0 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawed.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawed.png index 098830b87..dc2a72d5b 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawed.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawed.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawed.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawed.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawed.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawed.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawed_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawed_overlay.png new file mode 100644 index 000000000..4cca85812 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawed_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawed_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawed_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawed_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawed_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawed_secondary.png index 5f2b12d13..0d06a0fd9 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawed_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawed_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawed_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawed_secondary.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawed_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawed_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawless.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawless.png index 244475f8f..b12bf28e0 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawless.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawless.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawless.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawless.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawless.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawless.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawless_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawless_overlay.png new file mode 100644 index 000000000..ad365b0c1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawless_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawless_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawless_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawless_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawless_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawless_secondary.png index ec93601f8..b200e4261 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawless_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawless_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawless_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawless_secondary.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawless_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawless_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_overlay.png new file mode 100644 index 000000000..49d236e64 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_secondary.png index 60f165699..eb76dc79e 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_secondary.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/halo.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/halo.png new file mode 100644 index 000000000..bf419489a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/halo.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/halo.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/halo.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/halo.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/heavy_beam.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/heavy_beam.png new file mode 100644 index 000000000..66cff4496 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/heavy_beam.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/heavy_beam.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/heavy_beam.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/heavy_beam.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/heavy_beam_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/heavy_beam_overlay.png new file mode 100644 index 000000000..61a360b8b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/heavy_beam_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/heavy_beam_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/heavy_beam_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/heavy_beam_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/heavy_beam_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/heavy_beam_secondary.png new file mode 100644 index 000000000..109428552 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/heavy_beam_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/heavy_beam_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/heavy_beam_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/heavy_beam_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot.png index c0a74351b..fac2fdb8e 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_double.png index 8df53b97d..6c65f6624 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_double.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_double.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_double.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_double.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_double.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_double_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_double_overlay.png new file mode 100644 index 000000000..7f326e556 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_double_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_double_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_double_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_double_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_double_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_double_secondary.png index ed37f4a45..ef85a657b 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_double_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_double_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_double_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_double_secondary.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_double_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_double_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_hot.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_hot.png deleted file mode 100644 index 88694ce44..000000000 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_hot.png and /dev/null differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_hot.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_hot.png.mcmeta deleted file mode 100644 index 6b64c4ab3..000000000 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_hot.png.mcmeta +++ /dev/null @@ -1 +0,0 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_hot_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_hot_secondary.png index 407a194d2..9f94e470f 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_hot_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_hot_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_hot_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_hot_secondary.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_hot_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_hot_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_overlay.png new file mode 100644 index 000000000..5368f6b23 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_secondary.png index 1132166d2..612a7c199 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_secondary.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/leached.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/leached.png new file mode 100644 index 000000000..c7aab6888 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/leached.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/leached.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/leached.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/leached.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/leached_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/leached_secondary.png new file mode 100644 index 000000000..9107eb7e6 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/leached_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/leached_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/leached_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/leached_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/lens.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/lens.png index 185bab044..7c60bbcf2 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/lens.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/lens.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/lens.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/lens.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/lens.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/lens.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/lens_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/lens_overlay.png new file mode 100644 index 000000000..2c2923d46 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/lens_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/lens_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/lens_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/lens_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/lens_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/lens_secondary.png index 9be58987c..b1a2a2c1c 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/lens_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/lens_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/lens_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/lens_secondary.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/lens_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/lens_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/modular_shelling.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/modular_shelling.png new file mode 100644 index 000000000..6d2aecadf Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/modular_shelling.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/modular_shelling.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/modular_shelling.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/modular_shelling.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/modular_shelling_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/modular_shelling_overlay.png new file mode 100644 index 000000000..dd69984e4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/modular_shelling_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/modular_shelling_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/modular_shelling_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/modular_shelling_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/modular_shelling_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/modular_shelling_secondary.png new file mode 100644 index 000000000..8edd6e664 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/modular_shelling_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/modular_shelling_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/modular_shelling_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/modular_shelling_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/nugget.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/nugget.png index e1a6999b3..83a1e5410 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/nugget.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/nugget.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/nugget.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/nugget.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/nugget.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/nugget.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/nugget_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/nugget_overlay.png new file mode 100644 index 000000000..321e5ea07 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/nugget_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/nugget_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/nugget_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/nugget_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/nugget_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/nugget_secondary.png index cc1b7dfb2..092c5c1c3 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/nugget_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/nugget_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/nugget_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/nugget_secondary.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/nugget_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/nugget_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plasmites.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plasmites.png new file mode 100644 index 000000000..5110a0d19 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plasmites.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plasmites.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plasmites.png.mcmeta new file mode 100644 index 000000000..6a199bf8f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plasmites.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate.png index bde423398..8350704f8 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_dense.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_dense.png index b60906d4e..36e476943 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_dense.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_dense.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_dense.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_dense.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_dense.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_dense.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_dense_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_dense_overlay.png new file mode 100644 index 000000000..41d349f33 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_dense_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_dense_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_dense_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_dense_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_dense_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_dense_secondary.png index 5712f18d1..f23327429 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_dense_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_dense_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_dense_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_dense_secondary.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_dense_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_dense_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_double.png index 1f3bac8ac..f9e11bc4a 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_double.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_double.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_double.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_double.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_double.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_double_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_double_overlay.png new file mode 100644 index 000000000..ab1dd8879 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_double_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_double_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_double_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_double_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_double_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_double_secondary.png index 47059666f..ce132685d 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_double_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_double_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_double_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_double_secondary.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_double_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_double_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_overlay.png new file mode 100644 index 000000000..6224446d2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_secondary.png index f4c7caddc..0a66304f1 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_secondary.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore.png index 15c7efd02..ef47d8d30 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore_cubic.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore_cubic.png new file mode 100644 index 000000000..c645cd70f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore_cubic.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore_cubic.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore_cubic.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore_cubic.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore_cubic_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore_cubic_secondary.png new file mode 100644 index 000000000..745b94a91 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore_cubic_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore_cubic_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore_cubic_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore_cubic_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore_secondary.png index 7fe19ad77..886fc3ec8 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore_secondary.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ring.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ring.png index 6b558e810..f964010e5 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ring.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ring.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ring.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ring.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ring.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ring.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ring_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ring_overlay.png new file mode 100644 index 000000000..54a5cea49 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ring_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ring_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ring_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ring_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ring_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ring_secondary.png index 1881cf8d9..3e499b9f8 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ring_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ring_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ring_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ring_secondary.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ring_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ring_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod.png index 5279457e8..471f46fd5 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod_long.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod_long.png index 6cb0b20f5..697b24e86 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod_long.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod_long.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod_long.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod_long.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod_long.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod_long.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod_long_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod_long_secondary.png index eb1f20103..771bb4d83 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod_long_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod_long_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod_long_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod_long_secondary.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod_long_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod_long_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod_secondary.png index 30efc3433..ef5d1018d 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod_secondary.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rotor.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rotor.png index ba99d9695..b61c86f93 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rotor.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rotor.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rotor.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rotor.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rotor.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rotor.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rotor_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rotor_overlay.png new file mode 100644 index 000000000..0a43ae385 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rotor_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rotor_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rotor_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rotor_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rotor_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rotor_secondary.png index e338837c8..1f4c8bbb9 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rotor_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rotor_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rotor_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rotor_secondary.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rotor_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rotor_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/round.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/round.png index abf2b61a4..6602c151f 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/round.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/round.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/round.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/round.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/round.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/round.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/round_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/round_secondary.png index f686c7f75..0ff4ba116 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/round_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/round_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/round_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/round_secondary.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/round_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/round_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/screw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/screw.png index 58d70b670..b2140182c 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/screw.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/screw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/screw.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/screw.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/screw.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/screw.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/screw_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/screw_overlay.png new file mode 100644 index 000000000..571696b88 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/screw_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/screw_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/screw_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/screw_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/screw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/screw_secondary.png index 8fccf84d2..769e68c50 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/screw_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/screw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/screw_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/screw_secondary.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/screw_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/screw_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/shape_memory_foil.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/shape_memory_foil.png new file mode 100644 index 000000000..f7d3d92b4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/shape_memory_foil.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/shape_memory_foil.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/shape_memory_foil.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/shape_memory_foil.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/shape_memory_foil_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/shape_memory_foil_overlay.png new file mode 100644 index 000000000..230c139c3 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/shape_memory_foil_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/shape_memory_foil_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/shape_memory_foil_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/shape_memory_foil_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/shape_memory_foil_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/shape_memory_foil_secondary.png new file mode 100644 index 000000000..6a7ded3ac Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/shape_memory_foil_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/shape_memory_foil_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/shape_memory_foil_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/shape_memory_foil_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring.png index 7389bce7e..2ed477acb 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_overlay.png new file mode 100644 index 000000000..a445ed373 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_secondary.png index e6eb0ce56..6359adc20 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_secondary.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_small.png index ebf1bf456..918e8d155 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_small.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_small.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_small.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_small.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_small.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_small_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_small_overlay.png new file mode 100644 index 000000000..b5da1db29 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_small_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_small_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_small_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_small_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_small_secondary.png index f4866ded0..d8bca4f19 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_small_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_small_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_small_secondary.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_small_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_small_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/time_halo.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/time_halo.png new file mode 100644 index 000000000..6403d8bf9 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/time_halo.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/time_halo.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/time_halo.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/time_halo.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_buzz_saw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_buzz_saw.png index d8753457c..b0a77c2bb 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_buzz_saw.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_buzz_saw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_buzz_saw.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_buzz_saw.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_buzz_saw.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_buzz_saw.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_buzz_saw_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_buzz_saw_overlay.png new file mode 100644 index 000000000..77fc59410 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_buzz_saw_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_buzz_saw_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_buzz_saw_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_buzz_saw_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_buzz_saw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_buzz_saw_secondary.png index 5a1cdbc9f..7f4f3c76f 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_buzz_saw_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_buzz_saw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_buzz_saw_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_buzz_saw_secondary.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_buzz_saw_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_buzz_saw_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_chainsaw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_chainsaw.png index 637426b25..08a68b292 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_chainsaw.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_chainsaw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_chainsaw.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_chainsaw.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_chainsaw.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_chainsaw.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_chainsaw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_chainsaw_secondary.png index 689a5ea48..34bf6cdcc 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_chainsaw_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_chainsaw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_chainsaw_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_chainsaw_secondary.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_chainsaw_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_chainsaw_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_drill.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_drill.png index 66b75e46b..b5a232bc6 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_drill.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_drill.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_drill.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_drill.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_drill.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_drill.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_drill_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_drill_secondary.png index 6a784ff63..aa3eb7613 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_drill_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_drill_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_drill_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_drill_secondary.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_drill_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_drill_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_screwdriver.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_screwdriver.png index e4624c82d..e02ee3e14 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_screwdriver.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_screwdriver.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_screwdriver.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_screwdriver.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_screwdriver.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_screwdriver.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_screwdriver_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_screwdriver_overlay.png new file mode 100644 index 000000000..5270c4bf3 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_screwdriver_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_screwdriver_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_screwdriver_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_screwdriver_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_screwdriver_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_screwdriver_secondary.png index 752d53ca5..86fd33e5f 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_screwdriver_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_screwdriver_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_screwdriver_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_screwdriver_secondary.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_screwdriver_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_screwdriver_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wirecutter.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wirecutter.png new file mode 100644 index 000000000..f2508fc2a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wirecutter.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wirecutter.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wirecutter.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wirecutter.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wrench.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wrench.png index a119b4231..20e67006b 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wrench.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wrench.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wrench.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wrench.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wrench.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wrench.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wrench_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wrench_overlay.png new file mode 100644 index 000000000..c018f15dd Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wrench_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wrench_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wrench_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wrench_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wrench_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wrench_secondary.png index b0fab8679..c4c941c9a 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wrench_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wrench_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wrench_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wrench_secondary.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wrench_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wrench_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/turbine_blade.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/turbine_blade.png index 79218f0f5..a100ad5fb 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/turbine_blade.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/turbine_blade.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/turbine_blade.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/turbine_blade.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/turbine_blade.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/turbine_blade.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/turbine_blade_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/turbine_blade_overlay.png new file mode 100644 index 000000000..0e163f6e3 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/turbine_blade_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/turbine_blade_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/turbine_blade_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/turbine_blade_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/turbine_blade_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/turbine_blade_secondary.png index 8fe192ed1..6004a4330 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/turbine_blade_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/turbine_blade_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/turbine_blade_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/turbine_blade_secondary.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/turbine_blade_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/turbine_blade_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ultradense_plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ultradense_plate.png new file mode 100644 index 000000000..a55d70e34 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ultradense_plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ultradense_plate.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ultradense_plate.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ultradense_plate.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ultradense_plate_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ultradense_plate_overlay.png new file mode 100644 index 000000000..fbb24cf34 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ultradense_plate_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ultradense_plate_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ultradense_plate_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ultradense_plate_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ultradense_plate_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ultradense_plate_secondary.png new file mode 100644 index 000000000..f23ef21c8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ultradense_plate_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ultradense_plate_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ultradense_plate_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ultradense_plate_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire.png deleted file mode 100644 index de53ca4ae..000000000 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire.png and /dev/null differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire.png.mcmeta deleted file mode 100644 index 6b64c4ab3..000000000 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire.png.mcmeta +++ /dev/null @@ -1 +0,0 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_end.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_end.png deleted file mode 100644 index de53ca4ae..000000000 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_end.png and /dev/null differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_end.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_end.png.mcmeta deleted file mode 100644 index 6b64c4ab3..000000000 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_end.png.mcmeta +++ /dev/null @@ -1 +0,0 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_fine.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_fine.png index 7a434daad..aa59a971e 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_fine.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_fine.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_fine.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_fine.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_fine.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_fine.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_fine_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_fine_overlay.png index d25cc6811..596c55984 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_fine_overlay.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_fine_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_fine_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_fine_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_fine_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_fine_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_fine_secondary.png index dcf81cfb7..911da2d9e 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_fine_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_fine_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_fine_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_fine_secondary.png.mcmeta index 6b64c4ab3..afdb2c14b 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_fine_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_fine_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_side.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_side.png deleted file mode 100644 index de53ca4ae..000000000 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_side.png and /dev/null differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_side.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_side.png.mcmeta deleted file mode 100644 index 6b64c4ab3..000000000 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_side.png.mcmeta +++ /dev/null @@ -1 +0,0 @@ -{ "animation": { "interpolate": true, "frametime": 8 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_spool.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_spool.png new file mode 100644 index 000000000..872067f6e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_spool.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_spool.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_spool.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_spool.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_spool_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_spool_overlay.png new file mode 100644 index 000000000..ef2cc4866 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_spool_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_spool_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_spool_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_spool_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/block.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/block.png new file mode 100644 index 000000000..5492f0dfd Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/block.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/block_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/block_overlay.png new file mode 100644 index 000000000..156bd6232 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/block_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/block_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/block_secondary.png new file mode 100644 index 000000000..26b264721 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/block_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/bolt.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/bolt.png new file mode 100644 index 000000000..2d88257ff Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/bolt.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/bolt_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/bolt_overlay.png new file mode 100644 index 000000000..797e4bf4e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/bolt_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/bolt_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/bolt_secondary.png new file mode 100644 index 000000000..d2c8b2d90 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/bolt_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust.png new file mode 100644 index 000000000..500535508 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_overlay.png new file mode 100644 index 000000000..0101b0b70 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_secondary.png new file mode 100644 index 000000000..e5ac75829 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_small.png new file mode 100644 index 000000000..4815aab97 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_small_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_small_overlay.png new file mode 100644 index 000000000..b50452c63 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_small_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_small_secondary.png new file mode 100644 index 000000000..09b86215b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_tiny.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_tiny.png new file mode 100644 index 000000000..26f5700de Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_tiny.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_tiny_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_tiny_overlay.png new file mode 100644 index 000000000..497ded000 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_tiny_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_tiny_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_tiny_secondary.png new file mode 100644 index 000000000..92c4e554c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_tiny_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/foil.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/foil.png new file mode 100644 index 000000000..99c5a618d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/foil.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/foil_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/foil_overlay.png new file mode 100644 index 000000000..0310a86c1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/foil_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/foil_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/foil_secondary.png new file mode 100644 index 000000000..f4cf6e2e4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/foil_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/frame_gt.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/frame_gt.png new file mode 100644 index 000000000..b7964c974 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/frame_gt.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/frame_gt_ctm.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/frame_gt_ctm.png new file mode 100644 index 000000000..f67a4737e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/frame_gt_ctm.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/frame_gt_ctm_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/frame_gt_ctm_overlay.png new file mode 100644 index 000000000..eebf1d8eb Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/frame_gt_ctm_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/frame_gt_ctm_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/frame_gt_ctm_secondary.png new file mode 100644 index 000000000..82d9c49c0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/frame_gt_ctm_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/frame_gt_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/frame_gt_overlay.png new file mode 100644 index 000000000..aa5c129c2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/frame_gt_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/frame_gt_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/frame_gt_secondary.png new file mode 100644 index 000000000..abe137d0b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/frame_gt_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/gear.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/gear.png new file mode 100644 index 000000000..1f09eff94 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/gear.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/gear_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/gear_overlay.png new file mode 100644 index 000000000..c9116fe5c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/gear_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/gear_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/gear_secondary.png new file mode 100644 index 000000000..38ad9b0ee Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/gear_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/gear_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/gear_small.png new file mode 100644 index 000000000..7c08cfcd6 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/gear_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/gear_small_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/gear_small_overlay.png new file mode 100644 index 000000000..11583ee26 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/gear_small_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/gear_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/gear_small_secondary.png new file mode 100644 index 000000000..b070e0964 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/gear_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot.png new file mode 100644 index 000000000..8da72a6a0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_double.png new file mode 100644 index 000000000..7a8ac22da Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_double_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_double_overlay.png new file mode 100644 index 000000000..77b3f45b6 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_double_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_double_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_double_secondary.png new file mode 100644 index 000000000..5b0d167fd Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_double_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_hot.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_hot.png new file mode 100644 index 000000000..8da72a6a0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_hot.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_hot_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_hot_overlay.png new file mode 100644 index 000000000..55b9fa6ab Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_hot_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_hot_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_hot_secondary.png new file mode 100644 index 000000000..375275f28 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_hot_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_overlay.png new file mode 100644 index 000000000..16839bdf4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_secondary.png new file mode 100644 index 000000000..375275f28 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/nugget.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/nugget.png new file mode 100644 index 000000000..826621c0e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/nugget.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/nugget_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/nugget_overlay.png new file mode 100644 index 000000000..229164a88 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/nugget_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/nugget_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/nugget_secondary.png new file mode 100644 index 000000000..4d425ae6d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/nugget_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate.png new file mode 100644 index 000000000..456305e41 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_dense.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_dense.png new file mode 100644 index 000000000..8026897a0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_dense.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_dense_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_dense_overlay.png new file mode 100644 index 000000000..280006fbf Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_dense_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_dense_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_dense_secondary.png new file mode 100644 index 000000000..806fb4328 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_dense_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_double.png new file mode 100644 index 000000000..7d2f6f0ab Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_double_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_double_overlay.png new file mode 100644 index 000000000..88c0d13fd Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_double_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_double_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_double_secondary.png new file mode 100644 index 000000000..3daf76174 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_double_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_overlay.png new file mode 100644 index 000000000..34dae1487 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_secondary.png new file mode 100644 index 000000000..e6f7efee6 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ring.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ring.png new file mode 100644 index 000000000..79492a134 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ring.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ring_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ring_overlay.png new file mode 100644 index 000000000..0e2dc9219 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ring_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ring_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ring_secondary.png new file mode 100644 index 000000000..6cbc89fbb Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ring_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rod.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rod.png new file mode 100644 index 000000000..76fdfb3d2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rod.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rod_long.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rod_long.png new file mode 100644 index 000000000..a4802f058 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rod_long.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rod_long_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rod_long_overlay.png new file mode 100644 index 000000000..840d0ffe5 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rod_long_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rod_long_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rod_long_secondary.png new file mode 100644 index 000000000..f843b6c8d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rod_long_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rod_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rod_overlay.png new file mode 100644 index 000000000..c1a681173 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rod_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rod_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rod_secondary.png new file mode 100644 index 000000000..733e77c87 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rod_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rotor.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rotor.png new file mode 100644 index 000000000..23a1c5e89 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rotor.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rotor_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rotor_overlay.png new file mode 100644 index 000000000..be2ebaaa9 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rotor_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rotor_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rotor_secondary.png new file mode 100644 index 000000000..c1d2c1634 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rotor_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/round.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/round.png new file mode 100644 index 000000000..fa1cde6e9 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/round.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/round_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/round_overlay.png new file mode 100644 index 000000000..75ba2b221 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/round_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/round_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/round_secondary.png new file mode 100644 index 000000000..a6df7388f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/round_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/screw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/screw.png new file mode 100644 index 000000000..0aa05ff99 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/screw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/screw_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/screw_overlay.png new file mode 100644 index 000000000..01233d72d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/screw_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/screw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/screw_secondary.png new file mode 100644 index 000000000..2dea42e1c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/screw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/spring.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/spring.png new file mode 100644 index 000000000..18218959a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/spring.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/spring_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/spring_overlay.png new file mode 100644 index 000000000..2439729f0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/spring_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/spring_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/spring_secondary.png new file mode 100644 index 000000000..8ccd983bd Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/spring_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/spring_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/spring_small.png new file mode 100644 index 000000000..17f42466e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/spring_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/spring_small_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/spring_small_overlay.png new file mode 100644 index 000000000..d851f2fa7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/spring_small_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/spring_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/spring_small_secondary.png new file mode 100644 index 000000000..afc33b72f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/spring_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/wire_fine.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/wire_fine.png new file mode 100644 index 000000000..6482b62be Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/wire_fine.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/wire_fine_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/wire_fine_overlay.png new file mode 100644 index 000000000..84d6732fe Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/wire_fine_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/wire_fine_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/wire_fine_secondary.png new file mode 100644 index 000000000..3ca1baa7f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/wire_fine_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/diamond/raw_ore_cubic.png b/src/main/resources/assets/gtceu/textures/item/material_sets/diamond/raw_ore_cubic.png new file mode 100644 index 000000000..5cbad6c8b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/diamond/raw_ore_cubic.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/diamond/raw_ore_cubic_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/diamond/raw_ore_cubic_secondary.png new file mode 100644 index 000000000..735e42b9e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/diamond/raw_ore_cubic_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/alve_foil_insulator.png b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/alve_foil_insulator.png index 7ed0db8c4..48de10d3f 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/alve_foil_insulator.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/alve_foil_insulator.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/alve_foil_insulator_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/alve_foil_insulator_overlay.png new file mode 100644 index 000000000..7defae615 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/alve_foil_insulator_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/alve_foil_insulator_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/alve_foil_insulator_secondary.png new file mode 100644 index 000000000..668eb1815 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/alve_foil_insulator_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/plasmites.png b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/plasmites.png index acd5eb833..5110a0d19 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/plasmites.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/plasmites.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/raw_ore_cubic.png b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/raw_ore_cubic.png new file mode 100644 index 000000000..c3b4178c2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/raw_ore_cubic.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/raw_ore_cubic_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/raw_ore_cubic_secondary.png new file mode 100644 index 000000000..a31bd4ba0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/raw_ore_cubic_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/shape_memory_foil.png b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/shape_memory_foil.png index 0fa6ba984..db665cc7c 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/shape_memory_foil.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/shape_memory_foil.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/shape_memory_foil_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/shape_memory_foil_overlay.png new file mode 100644 index 000000000..0a7a99169 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/shape_memory_foil_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/shape_memory_foil_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/shape_memory_foil_secondary.png new file mode 100644 index 000000000..ec41a2e89 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/shape_memory_foil_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/fine/raw_ore_cubic.png b/src/main/resources/assets/gtceu/textures/item/material_sets/fine/raw_ore_cubic.png new file mode 100644 index 000000000..f2e239d52 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/fine/raw_ore_cubic.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/fine/raw_ore_cubic_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/fine/raw_ore_cubic_secondary.png new file mode 100644 index 000000000..2c2b5d85f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/fine/raw_ore_cubic_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/alve_foil_insulator.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/alve_foil_insulator.png index f81690978..98fb810f9 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/alve_foil_insulator.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/alve_foil_insulator.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/alve_foil_insulator.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/alve_foil_insulator.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/alve_foil_insulator.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/alve_foil_insulator.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/alve_foil_insulator_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/alve_foil_insulator_overlay.png new file mode 100644 index 000000000..1f47f7ed6 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/alve_foil_insulator_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/alve_foil_insulator_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/alve_foil_insulator_overlay.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/alve_foil_insulator_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/alve_foil_insulator_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/alve_foil_insulator_secondary.png new file mode 100644 index 000000000..dc715dca4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/alve_foil_insulator_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/alve_foil_insulator_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/alve_foil_insulator_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/alve_foil_insulator_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/blank.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/blank.png index 19089da08..9b7ec38f5 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/blank.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/blank.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/blank.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/blank.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/blank.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/blank.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/bolt.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/bolt.png index f516bebe9..4f22bc43a 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/bolt.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/bolt.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/bolt.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/bolt.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/bolt.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/bolt.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/bolt_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/bolt_overlay.png index 5090100a5..0cdde644e 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/bolt_overlay.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/bolt_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/bolt_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/bolt_overlay.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/bolt_overlay.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/bolt_overlay.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/bolt_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/bolt_secondary.png index 04ba90a36..180e4e1b2 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/bolt_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/bolt_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/bolt_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/bolt_secondary.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/bolt_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/bolt_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed.png index 93b4b168f..7c99d0417 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_overlay.png index 25a0a7704..27d7d2e56 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_overlay.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_overlay.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_overlay.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_overlay.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_purified.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_purified.png index 93b4b168f..7c99d0417 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_purified.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_purified.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_purified.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_purified.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_purified.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_purified.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_purified_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_purified_secondary.png index 326745ddb..297306f1e 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_purified_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_purified_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_purified_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_purified_secondary.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_purified_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_purified_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_refined.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_refined.png index 93b4b168f..7c99d0417 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_refined.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_refined.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_refined.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_refined.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_refined.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_refined.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_refined_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_refined_overlay.png index a49618715..5c3d7e56d 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_refined_overlay.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_refined_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_refined_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_refined_overlay.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_refined_overlay.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_refined_overlay.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_refined_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_refined_secondary.png index 326745ddb..297306f1e 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_refined_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_refined_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_refined_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_refined_secondary.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_refined_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_refined_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_secondary.png index 326745ddb..297306f1e 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_secondary.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust.png index 15e36da6a..202e52457 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_impure.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_impure.png index 15e36da6a..202e52457 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_impure.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_impure.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_impure.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_impure.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_impure.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_impure.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_impure_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_impure_overlay.png index 5f7a97e08..b407a76bd 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_impure_overlay.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_impure_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_impure_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_impure_overlay.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_impure_overlay.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_impure_overlay.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_impure_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_impure_secondary.png index e5da0006b..8d69c4535 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_impure_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_impure_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_impure_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_impure_secondary.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_impure_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_impure_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_pure.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_pure.png index 7de319813..629a11138 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_pure.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_pure.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_pure.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_pure.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_pure.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_pure.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_pure_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_pure_overlay.png index 606025793..4c25b9053 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_pure_overlay.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_pure_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_pure_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_pure_overlay.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_pure_overlay.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_pure_overlay.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_pure_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_pure_secondary.png index 7ace5c2d1..ec59a26c4 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_pure_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_pure_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_pure_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_pure_secondary.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_pure_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_pure_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_secondary.png index e5da0006b..8d69c4535 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_secondary.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_small.png index 7f41b5f42..771cfd57a 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_small.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_small.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_small.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_small.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_small.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_small_secondary.png index e31e42cac..0568aeb68 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_small_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_small_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_small_secondary.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_small_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_small_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_tiny.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_tiny.png index ec91a4350..c46c5f72d 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_tiny.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_tiny.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_tiny.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_tiny.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_tiny.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_tiny.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_tiny_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_tiny_secondary.png index 1c280a759..327266874 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_tiny_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_tiny_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_tiny_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_tiny_secondary.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_tiny_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_tiny_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/foil.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/foil.png index b345bd033..66bb75676 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/foil.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/foil.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/foil.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/foil.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/foil.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/foil.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/foil_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/foil_overlay.png index cb8c123f4..b3b1f91c9 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/foil_overlay.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/foil_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/foil_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/foil_overlay.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/foil_overlay.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/foil_overlay.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/foil_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/foil_secondary.png index 987e0412e..5f07ee8e6 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/foil_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/foil_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/foil_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/foil_secondary.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/foil_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/foil_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frothed.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frothed.png index 13f6a310a..62c1a023f 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frothed.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frothed.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frothed.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frothed.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frothed.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frothed.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frothed_overlay_glint.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frothed_overlay_glint.png index 08d848db1..39caa7a36 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frothed_overlay_glint.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frothed_overlay_glint.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frothed_overlay_glint.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frothed_overlay_glint.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frothed_overlay_glint.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frothed_overlay_glint.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frothed_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frothed_secondary.png index 27c7beb27..e7d6e1452 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frothed_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frothed_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frothed_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frothed_secondary.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frothed_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frothed_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear.png index ece3871d8..e6fbf2009 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_overlay.png index c2807ee06..687d573f1 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_overlay.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_overlay.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_overlay.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_overlay.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_secondary.png index 28f4b1f13..fabcc9699 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_secondary.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_small.png index 1ceeeec8e..d6285c6de 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_small.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_small.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_small.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_small.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_small.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_small_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_small_overlay.png index 8bd603217..eef1c93ed 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_small_overlay.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_small_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_small_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_small_overlay.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_small_overlay.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_small_overlay.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_small_secondary.png index 2be8eeaf1..ab3bd8e3e 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_small_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_small_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_small_secondary.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_small_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_small_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem.png index 5d416bd61..d3c931855 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_chipped.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_chipped.png index c33edfb61..14d59a6e6 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_chipped.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_chipped.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_chipped.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_chipped.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_chipped.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_chipped.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_chipped_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_chipped_overlay.png index 61983aeb2..5f1c7d0c7 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_chipped_overlay.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_chipped_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_chipped_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_chipped_overlay.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_chipped_overlay.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_chipped_overlay.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_chipped_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_chipped_secondary.png index 93c519ca7..142954ad5 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_chipped_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_chipped_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_chipped_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_chipped_secondary.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_chipped_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_chipped_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawed.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawed.png index 2fa9545ee..6133f52ff 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawed.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawed.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawed.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawed.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawed.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawed.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawed_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawed_overlay.png index 8a0e893a2..fa46fad6a 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawed_overlay.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawed_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawed_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawed_overlay.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawed_overlay.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawed_overlay.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawed_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawed_secondary.png index 505dc22e1..eed4867bf 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawed_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawed_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawed_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawed_secondary.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawed_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawed_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawless.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawless.png index ea4b8dbd5..b928191d3 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawless.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawless.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawless.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawless.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawless.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawless.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawless_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawless_overlay.png index a429ee069..32d32be7f 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawless_overlay.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawless_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawless_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawless_overlay.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawless_overlay.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawless_overlay.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawless_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawless_secondary.png index d5deea546..6eec5a65f 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawless_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawless_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawless_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawless_secondary.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawless_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawless_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_overlay.png index 919d83caf..410669777 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_overlay.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_overlay.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_overlay.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_overlay.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_secondary.png index 53551b0e9..13c581745 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_secondary.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/heavy_beam.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/heavy_beam.png index 485044577..a06defbb2 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/heavy_beam.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/heavy_beam.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/heavy_beam.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/heavy_beam.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/heavy_beam.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/heavy_beam.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/heavy_beam_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/heavy_beam_overlay.png new file mode 100644 index 000000000..5fef3b998 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/heavy_beam_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/heavy_beam_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/heavy_beam_overlay.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/heavy_beam_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/heavy_beam_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/heavy_beam_secondary.png new file mode 100644 index 000000000..6df6bd9f4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/heavy_beam_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/heavy_beam_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/heavy_beam_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/heavy_beam_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot.png index fae3f9416..bae1259e9 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_double.png index 2ef6c4a88..7e46cccda 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_double.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_double.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_double.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_double.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_double.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_double_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_double_overlay.png index beb92c289..56a75bd25 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_double_overlay.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_double_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_double_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_double_overlay.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_double_overlay.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_double_overlay.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_double_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_double_secondary.png index 38578963b..e20984033 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_double_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_double_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_double_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_double_secondary.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_double_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_double_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_hot.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_hot.png index 67b4c7ad8..c48c5f0ab 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_hot.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_hot.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_hot.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_hot.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_hot.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_hot.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_hot_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_hot_overlay.png index 1dc388fc0..c2513e04f 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_hot_overlay.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_hot_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_hot_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_hot_overlay.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_hot_overlay.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_hot_overlay.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_hot_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_hot_secondary.png index 892d8add5..d4d08c411 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_hot_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_hot_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_hot_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_hot_secondary.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_hot_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_hot_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_overlay.png index ba7b3d355..531b67182 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_overlay.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_overlay.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_overlay.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_overlay.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_secondary.png index ac26fbbc0..d39d2e323 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_secondary.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/leached.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/leached.png index 64c66f817..5e82ce940 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/leached.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/leached.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/leached.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/leached.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/leached.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/leached.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/leached_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/leached_secondary.png index 45534dfe3..2f9043af2 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/leached_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/leached_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/leached_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/leached_secondary.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/leached_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/leached_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/lens.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/lens.png index ee202ece1..e82766e0c 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/lens.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/lens.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/lens.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/lens.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/lens.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/lens.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/lens_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/lens_overlay.png index 2dd82aabc..c2e3e9f2b 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/lens_overlay.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/lens_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/lens_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/lens_overlay.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/lens_overlay.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/lens_overlay.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/lens_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/lens_secondary.png index 5288abc51..0b3307930 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/lens_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/lens_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/lens_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/lens_secondary.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/lens_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/lens_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/modular_shelling.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/modular_shelling.png index 25c1a181e..b5305b4a1 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/modular_shelling.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/modular_shelling.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/modular_shelling.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/modular_shelling.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/modular_shelling.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/modular_shelling.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/modular_shelling_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/modular_shelling_overlay.png new file mode 100644 index 000000000..b6985d514 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/modular_shelling_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/modular_shelling_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/modular_shelling_overlay.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/modular_shelling_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/modular_shelling_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/modular_shelling_secondary.png new file mode 100644 index 000000000..c548f6144 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/modular_shelling_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/modular_shelling_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/modular_shelling_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/modular_shelling_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/nugget.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/nugget.png index 72aad21f4..6cb079731 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/nugget.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/nugget.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/nugget.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/nugget.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/nugget.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/nugget.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/nugget_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/nugget_overlay.png index 3c839b658..ff854547e 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/nugget_overlay.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/nugget_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/nugget_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/nugget_overlay.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/nugget_overlay.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/nugget_overlay.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/nugget_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/nugget_secondary.png index 2d521044b..ecb0277e4 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/nugget_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/nugget_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/nugget_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/nugget_secondary.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/nugget_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/nugget_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate.png index 3e4275b3a..255238069 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_dense.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_dense.png index 64add763b..00358108a 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_dense.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_dense.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_dense.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_dense.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_dense.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_dense.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_dense_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_dense_overlay.png index 69a2a7030..37630ac77 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_dense_overlay.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_dense_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_dense_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_dense_overlay.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_dense_overlay.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_dense_overlay.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_dense_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_dense_secondary.png index 5be147f7e..518c4b4cc 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_dense_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_dense_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_dense_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_dense_secondary.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_dense_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_dense_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_double.png index dbcc596fe..c6b7eab59 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_double.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_double.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_double.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_double.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_double.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_double_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_double_overlay.png index 12adf3d90..a755cc77f 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_double_overlay.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_double_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_double_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_double_overlay.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_double_overlay.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_double_overlay.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_double_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_double_secondary.png index 28e1d4bf6..3a4b87a38 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_double_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_double_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_double_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_double_secondary.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_double_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_double_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_overlay.png index 365d2eff6..f637c11e1 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_overlay.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_overlay.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_overlay.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_overlay.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_secondary.png index c18d674df..e7b3a8316 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_secondary.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore.png index a429ff9e1..60f2edff1 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore_cubic.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore_cubic.png new file mode 100644 index 000000000..e33463a7a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore_cubic.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore_cubic.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore_cubic.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore_cubic.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore_cubic_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore_cubic_secondary.png new file mode 100644 index 000000000..f68cb25c1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore_cubic_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore_cubic_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore_cubic_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore_cubic_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore_secondary.png index 04f873be4..16048422d 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore_secondary.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ring.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ring.png index af372b5ed..445c55b2c 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ring.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ring.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ring.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ring.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ring.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ring.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ring_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ring_overlay.png index 315e95b51..0b1c017aa 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ring_overlay.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ring_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ring_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ring_overlay.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ring_overlay.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ring_overlay.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ring_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ring_secondary.png index 264b9d010..97410608e 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ring_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ring_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ring_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ring_secondary.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ring_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ring_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod.png index 8254d7f5e..0511b1148 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod_long.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod_long.png index d53881a59..389e9ebfb 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod_long.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod_long.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod_long.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod_long.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod_long.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod_long.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod_long_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod_long_secondary.png index a87c8c06d..88792558a 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod_long_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod_long_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod_long_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod_long_secondary.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod_long_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod_long_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod_secondary.png index 3f32ecdb3..67831b355 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod_secondary.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rotor.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rotor.png index 1b352e48d..2ab82238c 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rotor.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rotor.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rotor.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rotor.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rotor.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rotor.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rotor_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rotor_overlay.png index e3d5a7a34..2d390fd72 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rotor_overlay.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rotor_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rotor_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rotor_overlay.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rotor_overlay.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rotor_overlay.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rotor_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rotor_secondary.png index 59d87d9a4..8460a60b2 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rotor_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rotor_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rotor_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rotor_secondary.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rotor_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rotor_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/round.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/round.png index 436f3a7cc..dfb7cbceb 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/round.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/round.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/round.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/round.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/round.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/round.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/round_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/round_secondary.png index 7d78ba045..9db14e3dd 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/round_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/round_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/round_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/round_secondary.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/round_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/round_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/screw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/screw.png index 6ae19f9cb..90d3e91de 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/screw.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/screw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/screw.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/screw.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/screw.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/screw.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/screw_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/screw_overlay.png index 694932e06..2d8775663 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/screw_overlay.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/screw_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/screw_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/screw_overlay.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/screw_overlay.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/screw_overlay.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/screw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/screw_secondary.png index b7651b3a3..f6a44cab6 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/screw_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/screw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/screw_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/screw_secondary.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/screw_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/screw_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/shape_memory_foil.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/shape_memory_foil.png index b3b4eb0cb..fe60c2e22 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/shape_memory_foil.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/shape_memory_foil.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/shape_memory_foil.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/shape_memory_foil.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/shape_memory_foil.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/shape_memory_foil.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/shape_memory_foil_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/shape_memory_foil_overlay.png new file mode 100644 index 000000000..c8a137785 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/shape_memory_foil_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/shape_memory_foil_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/shape_memory_foil_overlay.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/shape_memory_foil_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/shape_memory_foil_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/shape_memory_foil_secondary.png new file mode 100644 index 000000000..4f6dab7ca Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/shape_memory_foil_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/shape_memory_foil_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/shape_memory_foil_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/shape_memory_foil_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring.png index 7255fb5ed..a27ce0828 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_overlay.png index 647460ae2..0c645c33b 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_overlay.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_overlay.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_overlay.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_overlay.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_secondary.png index cc7131f13..1322aa57f 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_secondary.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_small.png index 2bcf88507..806f18810 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_small.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_small.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_small.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_small.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_small.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_small_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_small_overlay.png index 720e83e57..a28be7ef3 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_small_overlay.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_small_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_small_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_small_overlay.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_small_overlay.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_small_overlay.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_small_secondary.png index 3423defe3..c053afcf0 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_small_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_small_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_small_secondary.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_small_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_small_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_buzz_saw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_buzz_saw.png index 6faebad76..9ec95518c 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_buzz_saw.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_buzz_saw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_buzz_saw.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_buzz_saw.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_buzz_saw.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_buzz_saw.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_buzz_saw_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_buzz_saw_overlay.png index 74b186509..efa329970 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_buzz_saw_overlay.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_buzz_saw_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_buzz_saw_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_buzz_saw_overlay.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_buzz_saw_overlay.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_buzz_saw_overlay.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_buzz_saw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_buzz_saw_secondary.png index 2ec9122a1..2c22bed73 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_buzz_saw_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_buzz_saw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_buzz_saw_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_buzz_saw_secondary.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_buzz_saw_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_buzz_saw_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_chainsaw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_chainsaw.png index badcc8a83..6eb3e2383 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_chainsaw.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_chainsaw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_chainsaw.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_chainsaw.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_chainsaw.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_chainsaw.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_chainsaw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_chainsaw_secondary.png index dae78eba1..6ab6d76de 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_chainsaw_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_chainsaw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_chainsaw_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_chainsaw_secondary.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_chainsaw_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_chainsaw_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_drill.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_drill.png index 33c782a2c..5af9d2dfb 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_drill.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_drill.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_drill.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_drill.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_drill.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_drill.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_drill_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_drill_secondary.png index abe76be08..c68a6e40b 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_drill_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_drill_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_drill_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_drill_secondary.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_drill_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_drill_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_screwdriver.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_screwdriver.png index 111403300..9f40a8084 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_screwdriver.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_screwdriver.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_screwdriver.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_screwdriver.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_screwdriver.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_screwdriver.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_screwdriver_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_screwdriver_overlay.png index e0a36b763..2fc8bf432 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_screwdriver_overlay.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_screwdriver_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_screwdriver_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_screwdriver_overlay.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_screwdriver_overlay.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_screwdriver_overlay.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_screwdriver_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_screwdriver_secondary.png index 68ea77328..9ace22bad 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_screwdriver_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_screwdriver_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_screwdriver_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_screwdriver_secondary.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_screwdriver_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_screwdriver_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wirecutter.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wirecutter.png index e1591cedc..88ba7302c 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wirecutter.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wirecutter.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wirecutter.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wirecutter.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wirecutter.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wirecutter.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wrench.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wrench.png index 7cc029224..248a91e00 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wrench.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wrench.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wrench.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wrench.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wrench.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wrench.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wrench_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wrench_overlay.png index 3ab52817f..92455d744 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wrench_overlay.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wrench_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wrench_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wrench_overlay.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wrench_overlay.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wrench_overlay.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wrench_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wrench_secondary.png index b4fac9b39..88f9d9a34 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wrench_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wrench_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wrench_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wrench_secondary.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wrench_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wrench_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/turbine_blade.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/turbine_blade.png index c10d423fb..6c5dfdaa8 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/turbine_blade.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/turbine_blade.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/turbine_blade.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/turbine_blade.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/turbine_blade.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/turbine_blade.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/turbine_blade_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/turbine_blade_overlay.png index 9cf3278c5..4bb5673ab 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/turbine_blade_overlay.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/turbine_blade_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/turbine_blade_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/turbine_blade_overlay.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/turbine_blade_overlay.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/turbine_blade_overlay.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/turbine_blade_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/turbine_blade_secondary.png index 5a3f37007..64736434b 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/turbine_blade_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/turbine_blade_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/turbine_blade_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/turbine_blade_secondary.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/turbine_blade_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/turbine_blade_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ultradense_plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ultradense_plate.png index 49f4c468c..266053b9a 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ultradense_plate.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ultradense_plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ultradense_plate.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ultradense_plate.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ultradense_plate.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ultradense_plate.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ultradense_plate_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ultradense_plate_overlay.png index da1b8a649..99f08fc8f 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ultradense_plate_overlay.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ultradense_plate_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ultradense_plate_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ultradense_plate_overlay.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ultradense_plate_overlay.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ultradense_plate_overlay.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ultradense_plate_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ultradense_plate_secondary.png new file mode 100644 index 000000000..3711cbec7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ultradense_plate_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ultradense_plate_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ultradense_plate_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ultradense_plate_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_fine.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_fine.png index ddddb831d..8253ab6da 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_fine.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_fine.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_fine.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_fine.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_fine.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_fine.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_fine_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_fine_overlay.png index d328a62ef..304564656 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_fine_overlay.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_fine_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_fine_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_fine_overlay.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_fine_overlay.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_fine_overlay.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_fine_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_fine_secondary.png index 2f5d6101c..2a7d4a993 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_fine_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_fine_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_fine_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_fine_secondary.png.mcmeta index afdb2c14b..a075072e1 100644 --- a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_fine_secondary.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_fine_secondary.png.mcmeta @@ -1 +1 @@ -{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_spool.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_spool.png index a9ac6ae16..27960221c 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_spool.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_spool.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_spool_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_spool_overlay.png index 7f2493a34..d9f3a28b9 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_spool_overlay.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_spool_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/alve_foil_insulator.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/alve_foil_insulator.png new file mode 100644 index 000000000..f81690978 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/alve_foil_insulator.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/alve_foil_insulator.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/alve_foil_insulator.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/alve_foil_insulator.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/blank.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/blank.png new file mode 100644 index 000000000..19089da08 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/blank.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/blank.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/blank.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/blank.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/block.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/block.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/item/material_sets/infinity/block.png rename to src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/block.png diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/block.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/block.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/block.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/bolt.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/bolt.png new file mode 100644 index 000000000..f516bebe9 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/bolt.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/bolt.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/bolt.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/bolt.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/bolt_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/bolt_overlay.png new file mode 100644 index 000000000..5090100a5 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/bolt_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/bolt_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/bolt_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/bolt_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/bolt_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/bolt_secondary.png new file mode 100644 index 000000000..04ba90a36 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/bolt_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/bolt_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/bolt_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/bolt_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed.png new file mode 100644 index 000000000..93b4b168f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_overlay.png new file mode 100644 index 000000000..25a0a7704 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_purified.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_purified.png new file mode 100644 index 000000000..93b4b168f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_purified.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_purified.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_purified.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_purified.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_purified_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_purified_secondary.png new file mode 100644 index 000000000..326745ddb Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_purified_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_purified_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_purified_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_purified_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_refined.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_refined.png new file mode 100644 index 000000000..93b4b168f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_refined.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_refined.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_refined.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_refined.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_refined_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_refined_overlay.png new file mode 100644 index 000000000..a49618715 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_refined_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_refined_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_refined_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_refined_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_refined_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_refined_secondary.png new file mode 100644 index 000000000..326745ddb Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_refined_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_refined_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_refined_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_refined_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_secondary.png new file mode 100644 index 000000000..326745ddb Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust.png new file mode 100644 index 000000000..15e36da6a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_impure.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_impure.png new file mode 100644 index 000000000..15e36da6a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_impure.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_impure.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_impure.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_impure.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_impure_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_impure_overlay.png new file mode 100644 index 000000000..5f7a97e08 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_impure_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_impure_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_impure_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_impure_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_impure_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_impure_secondary.png new file mode 100644 index 000000000..e5da0006b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_impure_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_impure_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_impure_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_impure_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_pure.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_pure.png new file mode 100644 index 000000000..7de319813 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_pure.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_pure.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_pure.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_pure.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_pure_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_pure_overlay.png new file mode 100644 index 000000000..606025793 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_pure_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_pure_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_pure_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_pure_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_pure_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_pure_secondary.png new file mode 100644 index 000000000..7ace5c2d1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_pure_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_pure_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_pure_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_pure_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_secondary.png new file mode 100644 index 000000000..e5da0006b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_small.png new file mode 100644 index 000000000..7f41b5f42 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_small.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_small.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_small.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_small_secondary.png new file mode 100644 index 000000000..e31e42cac Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_small_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_small_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_small_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_tiny.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_tiny.png new file mode 100644 index 000000000..ec91a4350 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_tiny.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_tiny.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_tiny.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_tiny.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_tiny_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_tiny_secondary.png new file mode 100644 index 000000000..1c280a759 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_tiny_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_tiny_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_tiny_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_tiny_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/foil.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/foil.png new file mode 100644 index 000000000..b345bd033 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/foil.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/foil.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/foil.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/foil.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/foil_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/foil_overlay.png new file mode 100644 index 000000000..cb8c123f4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/foil_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/foil_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/foil_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/foil_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/foil_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/foil_secondary.png new file mode 100644 index 000000000..987e0412e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/foil_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/foil_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/foil_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/foil_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frame_gt.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frame_gt.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frame_gt.png rename to src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frame_gt.png diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frame_gt.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frame_gt.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frame_gt.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frothed.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frothed.png new file mode 100644 index 000000000..13f6a310a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frothed.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frothed.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frothed.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frothed.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frothed_overlay_glint.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frothed_overlay_glint.png new file mode 100644 index 000000000..08d848db1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frothed_overlay_glint.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frothed_overlay_glint.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frothed_overlay_glint.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frothed_overlay_glint.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frothed_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frothed_secondary.png new file mode 100644 index 000000000..27c7beb27 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frothed_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frothed_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frothed_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frothed_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear.png new file mode 100644 index 000000000..ece3871d8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_overlay.png new file mode 100644 index 000000000..c2807ee06 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_secondary.png new file mode 100644 index 000000000..28f4b1f13 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_small.png new file mode 100644 index 000000000..1ceeeec8e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_small.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_small.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_small.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_small_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_small_overlay.png new file mode 100644 index 000000000..8bd603217 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_small_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_small_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_small_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_small_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_small_secondary.png new file mode 100644 index 000000000..2be8eeaf1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_small_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_small_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_small_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem.png new file mode 100644 index 000000000..5d416bd61 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_chipped.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_chipped.png new file mode 100644 index 000000000..c33edfb61 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_chipped.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_chipped.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_chipped.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_chipped.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_chipped_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_chipped_overlay.png new file mode 100644 index 000000000..61983aeb2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_chipped_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_chipped_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_chipped_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_chipped_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_chipped_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_chipped_secondary.png new file mode 100644 index 000000000..93c519ca7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_chipped_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_chipped_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_chipped_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_chipped_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_exquisite.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_exquisite.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_exquisite.png rename to src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_exquisite.png diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_exquisite.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_exquisite.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_exquisite.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_exquisite_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_exquisite_secondary.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_exquisite_secondary.png rename to src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_exquisite_secondary.png diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_exquisite_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_exquisite_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_exquisite_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawed.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawed.png new file mode 100644 index 000000000..2fa9545ee Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawed.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawed.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawed.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawed.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawed_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawed_overlay.png new file mode 100644 index 000000000..8a0e893a2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawed_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawed_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawed_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawed_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawed_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawed_secondary.png new file mode 100644 index 000000000..505dc22e1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawed_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawed_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawed_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawed_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawless.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawless.png new file mode 100644 index 000000000..ea4b8dbd5 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawless.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawless.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawless.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawless.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawless_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawless_overlay.png new file mode 100644 index 000000000..a429ee069 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawless_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawless_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawless_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawless_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawless_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawless_secondary.png new file mode 100644 index 000000000..d5deea546 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawless_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawless_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawless_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawless_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_overlay.png new file mode 100644 index 000000000..919d83caf Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_secondary.png new file mode 100644 index 000000000..53551b0e9 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/heavy_beam.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/heavy_beam.png new file mode 100644 index 000000000..485044577 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/heavy_beam.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/heavy_beam.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/heavy_beam.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/heavy_beam.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot.png new file mode 100644 index 000000000..fae3f9416 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_double.png new file mode 100644 index 000000000..2ef6c4a88 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_double.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_double.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_double.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_double_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_double_overlay.png new file mode 100644 index 000000000..beb92c289 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_double_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_double_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_double_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_double_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_double_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_double_secondary.png new file mode 100644 index 000000000..38578963b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_double_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_double_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_double_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_double_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_hot.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_hot.png new file mode 100644 index 000000000..67b4c7ad8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_hot.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_hot.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_hot.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_hot.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_hot_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_hot_overlay.png new file mode 100644 index 000000000..1dc388fc0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_hot_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_hot_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_hot_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_hot_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_hot_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_hot_secondary.png new file mode 100644 index 000000000..892d8add5 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_hot_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_hot_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_hot_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_hot_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_overlay.png new file mode 100644 index 000000000..ba7b3d355 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_secondary.png new file mode 100644 index 000000000..ac26fbbc0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/leached.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/leached.png new file mode 100644 index 000000000..64c66f817 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/leached.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/leached.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/leached.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/leached.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/leached_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/leached_secondary.png new file mode 100644 index 000000000..45534dfe3 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/leached_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/leached_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/leached_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/leached_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/lens.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/lens.png new file mode 100644 index 000000000..ee202ece1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/lens.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/lens.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/lens.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/lens.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/lens_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/lens_overlay.png new file mode 100644 index 000000000..2dd82aabc Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/lens_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/lens_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/lens_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/lens_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/lens_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/lens_secondary.png new file mode 100644 index 000000000..5288abc51 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/lens_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/lens_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/lens_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/lens_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/modular_shelling.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/modular_shelling.png new file mode 100644 index 000000000..25c1a181e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/modular_shelling.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/modular_shelling.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/modular_shelling.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/modular_shelling.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/nugget.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/nugget.png new file mode 100644 index 000000000..72aad21f4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/nugget.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/nugget.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/nugget.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/nugget.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/nugget_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/nugget_overlay.png new file mode 100644 index 000000000..3c839b658 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/nugget_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/nugget_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/nugget_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/nugget_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/nugget_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/nugget_secondary.png new file mode 100644 index 000000000..2d521044b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/nugget_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/nugget_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/nugget_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/nugget_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate.png new file mode 100644 index 000000000..3e4275b3a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_dense.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_dense.png new file mode 100644 index 000000000..64add763b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_dense.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_dense.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_dense.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_dense.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_dense_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_dense_overlay.png new file mode 100644 index 000000000..69a2a7030 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_dense_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_dense_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_dense_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_dense_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_dense_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_dense_secondary.png new file mode 100644 index 000000000..5be147f7e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_dense_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_dense_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_dense_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_dense_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_double.png new file mode 100644 index 000000000..dbcc596fe Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_double.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_double.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_double.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_double_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_double_overlay.png new file mode 100644 index 000000000..12adf3d90 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_double_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_double_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_double_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_double_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_double_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_double_secondary.png new file mode 100644 index 000000000..28e1d4bf6 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_double_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_double_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_double_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_double_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_overlay.png new file mode 100644 index 000000000..365d2eff6 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_secondary.png new file mode 100644 index 000000000..c18d674df Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/raw_ore.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/raw_ore.png new file mode 100644 index 000000000..a429ff9e1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/raw_ore.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/raw_ore.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/raw_ore.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/raw_ore.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/raw_ore_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/raw_ore_secondary.png new file mode 100644 index 000000000..04f873be4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/raw_ore_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/raw_ore_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/raw_ore_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/raw_ore_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ring.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ring.png new file mode 100644 index 000000000..af372b5ed Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ring.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ring.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ring.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ring.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ring_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ring_overlay.png new file mode 100644 index 000000000..315e95b51 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ring_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ring_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ring_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ring_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ring_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ring_secondary.png new file mode 100644 index 000000000..264b9d010 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ring_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ring_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ring_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ring_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod.png new file mode 100644 index 000000000..8254d7f5e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod_long.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod_long.png new file mode 100644 index 000000000..d53881a59 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod_long.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod_long.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod_long.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod_long.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod_long_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod_long_secondary.png new file mode 100644 index 000000000..a87c8c06d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod_long_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod_long_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod_long_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod_long_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod_secondary.png new file mode 100644 index 000000000..3f32ecdb3 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rotor.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rotor.png new file mode 100644 index 000000000..1b352e48d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rotor.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rotor.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rotor.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rotor.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rotor_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rotor_overlay.png new file mode 100644 index 000000000..e3d5a7a34 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rotor_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rotor_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rotor_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rotor_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rotor_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rotor_secondary.png new file mode 100644 index 000000000..59d87d9a4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rotor_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rotor_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rotor_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rotor_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/round.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/round.png new file mode 100644 index 000000000..436f3a7cc Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/round.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/round.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/round.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/round.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/round_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/round_secondary.png new file mode 100644 index 000000000..7d78ba045 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/round_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/round_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/round_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/round_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/screw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/screw.png new file mode 100644 index 000000000..6ae19f9cb Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/screw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/screw.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/screw.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/screw.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/screw_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/screw_overlay.png new file mode 100644 index 000000000..694932e06 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/screw_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/screw_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/screw_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/screw_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/screw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/screw_secondary.png new file mode 100644 index 000000000..b7651b3a3 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/screw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/screw_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/screw_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/screw_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/shape_memory_foil.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/shape_memory_foil.png new file mode 100644 index 000000000..b3b4eb0cb Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/shape_memory_foil.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/shape_memory_foil.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/shape_memory_foil.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/shape_memory_foil.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring.png new file mode 100644 index 000000000..7255fb5ed Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_overlay.png new file mode 100644 index 000000000..647460ae2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_secondary.png new file mode 100644 index 000000000..cc7131f13 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_small.png new file mode 100644 index 000000000..2bcf88507 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_small.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_small.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_small.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_small_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_small_overlay.png new file mode 100644 index 000000000..720e83e57 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_small_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_small_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_small_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_small_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_small_secondary.png new file mode 100644 index 000000000..3423defe3 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_small_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_small_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_small_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_buzz_saw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_buzz_saw.png new file mode 100644 index 000000000..6faebad76 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_buzz_saw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_buzz_saw.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_buzz_saw.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_buzz_saw.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_buzz_saw_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_buzz_saw_overlay.png new file mode 100644 index 000000000..74b186509 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_buzz_saw_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_buzz_saw_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_buzz_saw_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_buzz_saw_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_buzz_saw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_buzz_saw_secondary.png new file mode 100644 index 000000000..2ec9122a1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_buzz_saw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_buzz_saw_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_buzz_saw_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_buzz_saw_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_chainsaw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_chainsaw.png new file mode 100644 index 000000000..badcc8a83 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_chainsaw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_chainsaw.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_chainsaw.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_chainsaw.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_chainsaw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_chainsaw_secondary.png new file mode 100644 index 000000000..dae78eba1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_chainsaw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_chainsaw_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_chainsaw_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_chainsaw_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_drill.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_drill.png new file mode 100644 index 000000000..33c782a2c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_drill.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_drill.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_drill.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_drill.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_drill_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_drill_secondary.png new file mode 100644 index 000000000..abe76be08 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_drill_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_drill_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_drill_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_drill_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_screwdriver.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_screwdriver.png new file mode 100644 index 000000000..111403300 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_screwdriver.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_screwdriver.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_screwdriver.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_screwdriver.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_screwdriver_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_screwdriver_overlay.png new file mode 100644 index 000000000..e0a36b763 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_screwdriver_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_screwdriver_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_screwdriver_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_screwdriver_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_screwdriver_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_screwdriver_secondary.png new file mode 100644 index 000000000..68ea77328 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_screwdriver_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_screwdriver_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_screwdriver_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_screwdriver_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wirecutter.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wirecutter.png new file mode 100644 index 000000000..e1591cedc Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wirecutter.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wirecutter.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wirecutter.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wirecutter.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wrench.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wrench.png new file mode 100644 index 000000000..7cc029224 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wrench.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wrench.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wrench.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wrench.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wrench_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wrench_overlay.png new file mode 100644 index 000000000..3ab52817f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wrench_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wrench_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wrench_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wrench_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wrench_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wrench_secondary.png new file mode 100644 index 000000000..b4fac9b39 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wrench_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wrench_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wrench_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wrench_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/turbine_blade.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/turbine_blade.png new file mode 100644 index 000000000..c10d423fb Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/turbine_blade.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/turbine_blade.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/turbine_blade.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/turbine_blade.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/turbine_blade_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/turbine_blade_overlay.png new file mode 100644 index 000000000..9cf3278c5 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/turbine_blade_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/turbine_blade_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/turbine_blade_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/turbine_blade_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/turbine_blade_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/turbine_blade_secondary.png new file mode 100644 index 000000000..5a3f37007 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/turbine_blade_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/turbine_blade_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/turbine_blade_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/turbine_blade_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ultradense_plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ultradense_plate.png new file mode 100644 index 000000000..49f4c468c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ultradense_plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ultradense_plate.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ultradense_plate.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ultradense_plate.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ultradense_plate_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ultradense_plate_overlay.png new file mode 100644 index 000000000..da1b8a649 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ultradense_plate_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ultradense_plate_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ultradense_plate_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ultradense_plate_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire.png rename to src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire.png diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_end.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_end.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_end.png rename to src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_end.png diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_end.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_end.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_end.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_fine.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_fine.png new file mode 100644 index 000000000..ddddb831d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_fine.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_fine.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_fine.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_fine.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_fine_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_fine_overlay.png new file mode 100644 index 000000000..d328a62ef Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_fine_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_fine_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_fine_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_fine_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_fine_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_fine_secondary.png new file mode 100644 index 000000000..2f5d6101c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_fine_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_fine_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_fine_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_fine_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_side.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_side.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_side.png rename to src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_side.png diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_side.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_side.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_side.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_spool.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_spool.png new file mode 100644 index 000000000..a9ac6ae16 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_spool.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_spool.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_spool.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_spool.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_spool_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_spool_overlay.png new file mode 100644 index 000000000..7f2493a34 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_spool_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_spool_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_spool_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_spool_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/bolt.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/bolt.png new file mode 100644 index 000000000..15c8f20e8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/bolt.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/bolt_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/bolt_overlay.png new file mode 100644 index 000000000..bfcccb010 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/bolt_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/bolt_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/bolt_secondary.png new file mode 100644 index 000000000..f7d40f2f8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/bolt_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust.png new file mode 100644 index 000000000..a58fdcdf8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_overlay.png new file mode 100644 index 000000000..4f18cfeb0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_secondary.png new file mode 100644 index 000000000..2f788ed41 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_small.png new file mode 100644 index 000000000..40406c895 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_small_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_small_overlay.png new file mode 100644 index 000000000..eb1f99e6b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_small_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_small_secondary.png new file mode 100644 index 000000000..3455201dd Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_tiny.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_tiny.png new file mode 100644 index 000000000..34eeb9478 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_tiny.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_tiny_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_tiny_overlay.png new file mode 100644 index 000000000..017f06018 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_tiny_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_tiny_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_tiny_secondary.png new file mode 100644 index 000000000..bc2b8764b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_tiny_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/foil.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/foil.png new file mode 100644 index 000000000..6f4e3af0a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/foil.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/foil_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/foil_overlay.png new file mode 100644 index 000000000..e6692629b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/foil_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/foil_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/foil_secondary.png new file mode 100644 index 000000000..f5a93e213 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/foil_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/gear.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/gear.png new file mode 100644 index 000000000..cd3a68612 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/gear.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/gear_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/gear_overlay.png new file mode 100644 index 000000000..1e2dabd59 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/gear_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/gear_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/gear_secondary.png new file mode 100644 index 000000000..490cb64c1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/gear_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/gear_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/gear_small.png new file mode 100644 index 000000000..163cacda5 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/gear_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/gear_small_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/gear_small_overlay.png new file mode 100644 index 000000000..13e6de5ab Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/gear_small_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/gear_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/gear_small_secondary.png new file mode 100644 index 000000000..b9813613c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/gear_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ingot.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ingot.png new file mode 100644 index 000000000..fafdb0126 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ingot.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ingot_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ingot_double.png new file mode 100644 index 000000000..e6e2de76a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ingot_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ingot_double_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ingot_double_overlay.png new file mode 100644 index 000000000..065dcaf5b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ingot_double_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ingot_double_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ingot_double_secondary.png new file mode 100644 index 000000000..d2b693131 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ingot_double_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ingot_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ingot_overlay.png new file mode 100644 index 000000000..ca2ec7381 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ingot_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ingot_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ingot_secondary.png new file mode 100644 index 000000000..fe79e4e4b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ingot_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/nugget.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/nugget.png new file mode 100644 index 000000000..9cb14039d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/nugget.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/nugget_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/nugget_overlay.png new file mode 100644 index 000000000..e5caa954b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/nugget_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/nugget_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/nugget_secondary.png new file mode 100644 index 000000000..4db80f012 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/nugget_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate.png new file mode 100644 index 000000000..15ab75d0b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_dense.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_dense.png new file mode 100644 index 000000000..98f1e563b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_dense.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_dense_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_dense_overlay.png new file mode 100644 index 000000000..f43038265 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_dense_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_dense_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_dense_secondary.png new file mode 100644 index 000000000..e1c099740 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_dense_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_double.png new file mode 100644 index 000000000..bc51c951a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_double_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_double_overlay.png new file mode 100644 index 000000000..a2005a803 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_double_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_double_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_double_secondary.png new file mode 100644 index 000000000..db078e08a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_double_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_overlay.png new file mode 100644 index 000000000..6b130a93a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_secondary.png new file mode 100644 index 000000000..4b9432505 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ring.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ring.png new file mode 100644 index 000000000..ef59c35d9 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ring.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ring_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ring_overlay.png new file mode 100644 index 000000000..2fa010e6b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ring_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ring_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ring_secondary.png new file mode 100644 index 000000000..368272449 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ring_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rod.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rod.png new file mode 100644 index 000000000..cfdd6427c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rod.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rod_long.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rod_long.png new file mode 100644 index 000000000..97c72a490 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rod_long.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rod_long_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rod_long_overlay.png new file mode 100644 index 000000000..72f63cc83 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rod_long_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rod_long_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rod_long_secondary.png new file mode 100644 index 000000000..921e06395 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rod_long_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rod_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rod_overlay.png new file mode 100644 index 000000000..d81be40ba Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rod_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rod_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rod_secondary.png new file mode 100644 index 000000000..964fefbde Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rod_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rotor.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rotor.png new file mode 100644 index 000000000..e02883861 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rotor.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rotor_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rotor_overlay.png new file mode 100644 index 000000000..77a6d6e65 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rotor_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rotor_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rotor_secondary.png new file mode 100644 index 000000000..d9c2e6c3e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rotor_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/round.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/round.png new file mode 100644 index 000000000..c0c970359 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/round.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/round_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/round_overlay.png new file mode 100644 index 000000000..47f7fba0f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/round_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/round_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/round_secondary.png new file mode 100644 index 000000000..915d42e56 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/round_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/screw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/screw.png new file mode 100644 index 000000000..37c645be7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/screw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/screw_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/screw_overlay.png new file mode 100644 index 000000000..d44904fdc Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/screw_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/screw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/screw_secondary.png new file mode 100644 index 000000000..64e686eb8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/screw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/spring.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/spring.png new file mode 100644 index 000000000..43a12bef2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/spring.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/spring_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/spring_overlay.png new file mode 100644 index 000000000..b63a76a70 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/spring_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/spring_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/spring_secondary.png new file mode 100644 index 000000000..c067d439a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/spring_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/spring_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/spring_small.png new file mode 100644 index 000000000..2bae27fee Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/spring_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/spring_small_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/spring_small_overlay.png new file mode 100644 index 000000000..cccd52cfc Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/spring_small_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/spring_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/spring_small_secondary.png new file mode 100644 index 000000000..988b8bb68 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/spring_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/wire_fine.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/wire_fine.png new file mode 100644 index 000000000..52a08b850 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/wire_fine.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/wire_fine_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/wire_fine_overlay.png new file mode 100644 index 000000000..9911fc4a7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/wire_fine_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/wire_fine_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/wire_fine_secondary.png new file mode 100644 index 000000000..0b1e94b96 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/wire_fine_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot.png new file mode 100644 index 000000000..3ee86e678 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_double.png new file mode 100644 index 000000000..4a929155d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_double_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_double_overlay.png new file mode 100644 index 000000000..623370742 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_double_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_double_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_double_secondary.png new file mode 100644 index 000000000..4bcf58b11 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_double_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_hot.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_hot.png new file mode 100644 index 000000000..3ee86e678 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_hot.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_hot_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_hot_overlay.png new file mode 100644 index 000000000..5060a681c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_hot_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_hot_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_hot_secondary.png new file mode 100644 index 000000000..76188827a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_hot_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_overlay.png new file mode 100644 index 000000000..5060a681c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_secondary.png new file mode 100644 index 000000000..76188827a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/nugget.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/nugget.png new file mode 100644 index 000000000..f1edb247a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/nugget.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/nugget_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/nugget_overlay.png new file mode 100644 index 000000000..b24ad2602 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/nugget_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/nugget_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/nugget_secondary.png new file mode 100644 index 000000000..d80b701ff Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/nugget_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate.png new file mode 100644 index 000000000..2b1c84338 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_dense.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_dense.png new file mode 100644 index 000000000..6409b27bf Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_dense.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_dense_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_dense_overlay.png new file mode 100644 index 000000000..c3fe7b52b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_dense_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_dense_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_dense_secondary.png new file mode 100644 index 000000000..b3523c16e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_dense_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_double.png new file mode 100644 index 000000000..714d84e68 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_double_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_double_overlay.png new file mode 100644 index 000000000..c54c530d4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_double_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_double_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_double_secondary.png new file mode 100644 index 000000000..2e52b57cc Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_double_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_overlay.png new file mode 100644 index 000000000..1f6158615 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_secondary.png new file mode 100644 index 000000000..32e47e1e7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/alve_foil_insulator.png b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/alve_foil_insulator.png new file mode 100644 index 000000000..a2098d509 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/alve_foil_insulator.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/alve_foil_insulator_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/alve_foil_insulator_overlay.png new file mode 100644 index 000000000..0a4f7efa5 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/alve_foil_insulator_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/alve_foil_insulator_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/alve_foil_insulator_secondary.png new file mode 100644 index 000000000..7dde24631 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/alve_foil_insulator_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/raw_ore_cubic.png b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/raw_ore_cubic.png new file mode 100644 index 000000000..275bd843f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/raw_ore_cubic.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/raw_ore_cubic_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/raw_ore_cubic_secondary.png new file mode 100644 index 000000000..4861a8989 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/raw_ore_cubic_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/shape_memory_foil.png b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/shape_memory_foil.png new file mode 100644 index 000000000..ac4aeca8e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/shape_memory_foil.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/shape_memory_foil_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/shape_memory_foil_overlay.png new file mode 100644 index 000000000..8f08c753a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/shape_memory_foil_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/shape_memory_foil_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/shape_memory_foil_secondary.png new file mode 100644 index 000000000..03bab733e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/shape_memory_foil_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/alve_foil_insulator.png b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/alve_foil_insulator.png new file mode 100644 index 000000000..e08286335 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/alve_foil_insulator.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/alve_foil_insulator_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/alve_foil_insulator_overlay.png new file mode 100644 index 000000000..681e0eb89 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/alve_foil_insulator_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/alve_foil_insulator_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/alve_foil_insulator_secondary.png new file mode 100644 index 000000000..ad05464f1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/alve_foil_insulator_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/raw_ore_cubic.png b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/raw_ore_cubic.png new file mode 100644 index 000000000..6086e06e6 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/raw_ore_cubic.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/raw_ore_cubic_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/raw_ore_cubic_overlay.png new file mode 100644 index 000000000..905def89f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/raw_ore_cubic_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/raw_ore_cubic_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/raw_ore_cubic_secondary.png new file mode 100644 index 000000000..48c9dfdb0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/raw_ore_cubic_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/shape_memory_foil.png b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/shape_memory_foil.png new file mode 100644 index 000000000..aba3b8778 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/shape_memory_foil.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/shape_memory_foil_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/shape_memory_foil_overlay.png new file mode 100644 index 000000000..0be8cefdb Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/shape_memory_foil_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/shape_memory_foil_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/shape_memory_foil_secondary.png new file mode 100644 index 000000000..7b72bb1b2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/shape_memory_foil_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plasmites.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plasmites.png index e014081d0..5110a0d19 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plasmites.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plasmites.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plasmites.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plasmites.png index 06ef30b0b..5110a0d19 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plasmites.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plasmites.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plasmites.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plasmites.png new file mode 100644 index 000000000..5110a0d19 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plasmites.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plasmites.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plasmites.png.mcmeta new file mode 100644 index 000000000..6a199bf8f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plasmites.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plasmites.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plasmites.png index 08385af9c..5110a0d19 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plasmites.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plasmites.png differ diff --git a/src/main/resources/cosmiccore.mixins.json b/src/main/resources/cosmiccore.mixins.json index dd63e2e8a..e0611494b 100644 --- a/src/main/resources/cosmiccore.mixins.json +++ b/src/main/resources/cosmiccore.mixins.json @@ -4,13 +4,18 @@ "package": "com.ghostipedia.cosmiccore.mixin", "compatibilityLevel": "JAVA_17", "minVersion": "0.8", + "plugin": "com.ghostipedia.cosmiccore.mixin.CosmicCoreMixinPlugin", "client": [ - "ae2.PatternProviderScreenMixin", - "ae2.ProcessingEncodingPanelMixin", - "ae2.SettingToggleButtonMixin", + "StarKillerMixin", + "accessor.MBPatternAccessor", "client.AdAstraPlanetsScreenMixin", "client.MinecraftMixin", + "client.PatternPreviewWidgetMixin", "client.SoundManagerMixin", + "embers.EmberDialBlockMixin", + "emi.EmiApiMixin", + "emi.EmiFavoritesMixin", + "emi.EmiScreenManagerMixin", "emi.RecipeScreenMixin", "ldlib.CustomBakedModelMixin" ], @@ -20,29 +25,39 @@ "ApotheosisRecipeHelperMixin", "ApothSmithingCategoryMixin", "BlockPatternMixin", + "BlocksMixin", "ComponentItemMixin", "DivingHelmetItemMixin", + "GendustryJEIPluginMixin", "GTValuesMixin", + "IndustrialApiaryBeeModifierMixin", "MAE2GTIntegrationMixin", "PlayerBreathingMixin", "TagPrefixItemMixin", + "frontiers.MinecraftRemoveOxygenMixin", "accessor.GTMMEBufferAccessor", "accessor.LivingEntityAccessor", "accessor.LootTableAccessor", - "ae2.AE2StyleManagerMixin", - "ae2.PatternEncodingTermMenuMixin", - "ae2.PatternProviderLogicMixin", - "ae2.PatternProviderMenuMixin", - "ae2.SettingsMixin", "ae2.eudisplay.EUAddAppearanceMixin", "ae2.eudisplay.EUAddPowerUnitMixin", "ae2.eudisplay.EUAddSettingMixin", "client.CosmicCoreRemainingAirOverlayMixin", + "gtceu.ElectricContainerBlockProviderMixin", + "gtceu.MetaMachineBlockEntityMixin", + "gtceu.ParallelProviderMixin", + "gtceu.RecipeLogicProviderMixin", + "gtceu.RecipeOutputProviderMixin", + "gtceu.WorkableBlockProviderMixin", "emi.EmiApiMixin", + "gtceu.MetaMachineBlockEntityMixin", + "gtceu.MetaMachineBlockMixin", + "gtceu.MetaMachineMixin", + "gtceu.PipeBlockEntityMixin", + "gtceu.PipeBlockMixin", "lso.FrostbiteEffectMixin", "lso.HeatstrokeEffectMixin", "lso.TemperatureCapabilityMixin", - "gtceu.MetaMachineBlockEntityMixin" + "tinkers.ModifiableItemMixin" ], "injectors": { "defaultRequire": 1, diff --git a/src/main/resources/data/cosmiccore/curios/entities/back.json b/src/main/resources/data/cosmiccore/curios/entities/back.json new file mode 100644 index 000000000..6cd82c21a --- /dev/null +++ b/src/main/resources/data/cosmiccore/curios/entities/back.json @@ -0,0 +1,4 @@ +{ + "entities": ["player"], + "slots": ["back"] +} diff --git a/src/main/resources/data/cosmiccore/curios/slots/back.json b/src/main/resources/data/cosmiccore/curios/slots/back.json new file mode 100644 index 000000000..66a689dc0 --- /dev/null +++ b/src/main/resources/data/cosmiccore/curios/slots/back.json @@ -0,0 +1,4 @@ +{ + "size": 2, + "icon": "curios:slot/empty_curio_slot" +} diff --git a/src/main/resources/data/cosmiccore/recipes/tconstruct/casting/screwdriver_head_cast_from_gold.json b/src/main/resources/data/cosmiccore/recipes/tconstruct/casting/screwdriver_head_cast_from_gold.json new file mode 100644 index 000000000..26aa2dfa6 --- /dev/null +++ b/src/main/resources/data/cosmiccore/recipes/tconstruct/casting/screwdriver_head_cast_from_gold.json @@ -0,0 +1,9 @@ +{ + "type": "tconstruct:casting_table", + "cast": { "item": "cosmiccore:screwdriver_head" }, + "cast_consumed": false, + "fluid": { "tag": "forge:molten_gold", "amount": 288 }, + "result": { "item": "cosmiccore:screwdriver_head_cast" }, + "cooling_time": 80, + "switch_slots": true +} \ No newline at end of file diff --git a/src/main/resources/data/cosmiccore/recipes/tconstruct/casting/screwdriver_head_cast_from_sand.json b/src/main/resources/data/cosmiccore/recipes/tconstruct/casting/screwdriver_head_cast_from_sand.json new file mode 100644 index 000000000..d86f29ec2 --- /dev/null +++ b/src/main/resources/data/cosmiccore/recipes/tconstruct/casting/screwdriver_head_cast_from_sand.json @@ -0,0 +1,9 @@ +{ + "type": "tconstruct:casting_table", + "cast": { "item": "cosmiccore:screwdriver_head" }, + "cast_consumed": true, + "fluid": { "tag": "forge:molten_gold", "amount": 288 }, + "result": { "item": "cosmiccore:screwdriver_head_cast" }, + "cooling_time": 80, + "switch_slots": true +} \ No newline at end of file diff --git a/src/main/resources/data/cosmiccore/recipes/tconstruct/casting/wrench_head_cast_from_gold.json b/src/main/resources/data/cosmiccore/recipes/tconstruct/casting/wrench_head_cast_from_gold.json new file mode 100644 index 000000000..eaa0aae60 --- /dev/null +++ b/src/main/resources/data/cosmiccore/recipes/tconstruct/casting/wrench_head_cast_from_gold.json @@ -0,0 +1,9 @@ +{ + "type": "tconstruct:casting_table", + "cast": { "item": "cosmiccore:wrench_head" }, + "cast_consumed": false, + "fluid": { "tag": "forge:molten_gold", "amount": 288 }, + "result": { "item": "cosmiccore:wrench_head_cast" }, + "cooling_time": 80, + "switch_slots": true +} \ No newline at end of file diff --git a/src/main/resources/data/cosmiccore/recipes/tconstruct/casting/wrench_head_cast_from_sand.json b/src/main/resources/data/cosmiccore/recipes/tconstruct/casting/wrench_head_cast_from_sand.json new file mode 100644 index 000000000..6e7adadf1 --- /dev/null +++ b/src/main/resources/data/cosmiccore/recipes/tconstruct/casting/wrench_head_cast_from_sand.json @@ -0,0 +1,9 @@ +{ + "type": "tconstruct:casting_table", + "cast": { "item": "cosmiccore:wrench_head" }, + "cast_consumed": true, + "fluid": { "tag": "forge:molten_gold", "amount": 288 }, + "result": { "item": "cosmiccore:wrench_head_cast" }, + "cooling_time": 80, + "switch_slots": true +} \ No newline at end of file diff --git a/src/main/resources/data/cosmiccore/recipes/tconstruct/materials/neutronium.json b/src/main/resources/data/cosmiccore/recipes/tconstruct/materials/neutronium.json new file mode 100644 index 000000000..7af3e1ab5 --- /dev/null +++ b/src/main/resources/data/cosmiccore/recipes/tconstruct/materials/neutronium.json @@ -0,0 +1,8 @@ +{ + "hidden": false, + "tier": 4, + "sortOrder": 50, + "craftable": false, + "castable": false, + "textColor": "9AD3FF" +} diff --git a/src/main/resources/data/cosmiccore/recipes/tconstruct/parts/screwdriver_head_casting_gold.json b/src/main/resources/data/cosmiccore/recipes/tconstruct/parts/screwdriver_head_casting_gold.json new file mode 100644 index 000000000..ea979a45e --- /dev/null +++ b/src/main/resources/data/cosmiccore/recipes/tconstruct/parts/screwdriver_head_casting_gold.json @@ -0,0 +1,7 @@ +{ + "type": "tconstruct:table_casting_material", + "cast": { "tag": "cosmiccore:casts/multi_use/screwdriver_head" }, + "cast_consumed": false, + "item_cost": 2, + "result": "cosmiccore:screwdriver_head" +} \ No newline at end of file diff --git a/src/main/resources/data/cosmiccore/recipes/tconstruct/parts/screwdriver_head_casting_sand.json b/src/main/resources/data/cosmiccore/recipes/tconstruct/parts/screwdriver_head_casting_sand.json new file mode 100644 index 000000000..5f2b1dfab --- /dev/null +++ b/src/main/resources/data/cosmiccore/recipes/tconstruct/parts/screwdriver_head_casting_sand.json @@ -0,0 +1,7 @@ +{ + "type": "tconstruct:table_casting_material", + "cast": { "tag": "cosmiccore:casts/multi_use/screwdriver_head_sand" }, + "cast_consumed": true, + "item_cost": 2, + "result": "cosmiccore:screwdriver_head" +} \ No newline at end of file diff --git a/src/main/resources/data/cosmiccore/recipes/tconstruct/parts/wrench_head_casting_gold.json b/src/main/resources/data/cosmiccore/recipes/tconstruct/parts/wrench_head_casting_gold.json new file mode 100644 index 000000000..9c24ec182 --- /dev/null +++ b/src/main/resources/data/cosmiccore/recipes/tconstruct/parts/wrench_head_casting_gold.json @@ -0,0 +1,7 @@ +{ + "type": "tconstruct:table_casting_material", + "cast": { "tag": "cosmiccore:casts/multi_use/wrench_head" }, + "cast_consumed": false, + "item_cost": 2, + "result": "cosmiccore:wrench_head" +} \ No newline at end of file diff --git a/src/main/resources/data/cosmiccore/recipes/tconstruct/parts/wrench_head_casting_sand.json b/src/main/resources/data/cosmiccore/recipes/tconstruct/parts/wrench_head_casting_sand.json new file mode 100644 index 000000000..25277da3f --- /dev/null +++ b/src/main/resources/data/cosmiccore/recipes/tconstruct/parts/wrench_head_casting_sand.json @@ -0,0 +1,7 @@ +{ + "type": "tconstruct:table_casting_material", + "cast": { "tag": "cosmiccore:casts/multi_use/wrench_head_sand" }, + "cast_consumed": true, + "item_cost": 2, + "result": "cosmiccore:wrench_head" +} \ No newline at end of file diff --git a/src/main/resources/data/cosmiccore/recipes/tools/parts/screwdriver_head.json b/src/main/resources/data/cosmiccore/recipes/tools/parts/screwdriver_head.json new file mode 100644 index 000000000..dc7fe8cac --- /dev/null +++ b/src/main/resources/data/cosmiccore/recipes/tools/parts/screwdriver_head.json @@ -0,0 +1,7 @@ +{ + "type": "tconstruct:part_builder", + "pattern": "cosmiccore:screwdriver_head", + "pattern_item": { "item": "tconstruct:pattern" }, + "cost": 1, + "result": { "item": "cosmiccore:screwdriver_head" } +} diff --git a/src/main/resources/data/cosmiccore/recipes/tools/parts/wrench_head.json b/src/main/resources/data/cosmiccore/recipes/tools/parts/wrench_head.json new file mode 100644 index 000000000..f38841e74 --- /dev/null +++ b/src/main/resources/data/cosmiccore/recipes/tools/parts/wrench_head.json @@ -0,0 +1,7 @@ +{ + "type": "tconstruct:part_builder", + "pattern": "cosmiccore:wrench_head", + "pattern_item": { "item": "tconstruct:pattern" }, + "cost": 2, + "result": { "item": "cosmiccore:wrench_head" } +} diff --git a/src/main/resources/data/cosmiccore/recipes/tools/screwdriver.json b/src/main/resources/data/cosmiccore/recipes/tools/screwdriver.json new file mode 100644 index 000000000..3cb9659a0 --- /dev/null +++ b/src/main/resources/data/cosmiccore/recipes/tools/screwdriver.json @@ -0,0 +1,7 @@ +{ + "type": "tconstruct:tool_building", + "result": "cosmiccore:screwdriver", + "layout_slot": "cosmiccore:screwdriver" +} + + diff --git a/src/main/resources/data/cosmiccore/recipes/tools/wire_cutter.json b/src/main/resources/data/cosmiccore/recipes/tools/wire_cutter.json new file mode 100644 index 000000000..7b6496bca --- /dev/null +++ b/src/main/resources/data/cosmiccore/recipes/tools/wire_cutter.json @@ -0,0 +1,4 @@ +{ + "type": "tconstruct:tool_building", + "result": "cosmiccore:wire_cutter" +} \ No newline at end of file diff --git a/src/main/resources/data/cosmiccore/recipes/tools/wrench.json b/src/main/resources/data/cosmiccore/recipes/tools/wrench.json new file mode 100644 index 000000000..bb8ade177 --- /dev/null +++ b/src/main/resources/data/cosmiccore/recipes/tools/wrench.json @@ -0,0 +1,7 @@ +{ + "type": "tconstruct:tool_building", + "result": "cosmiccore:wrench", + "layout_slot": "cosmiccore:wrench" +} + + diff --git a/src/main/resources/data/cosmiccore/tags/items/tconstruct/tool_parts.json b/src/main/resources/data/cosmiccore/tags/items/tconstruct/tool_parts.json new file mode 100644 index 000000000..5cdbafba6 --- /dev/null +++ b/src/main/resources/data/cosmiccore/tags/items/tconstruct/tool_parts.json @@ -0,0 +1,6 @@ +{ + "values": [ + "cosmiccore:wrench_head", + "cosmiccore:screwdriver_head" + ] +} \ No newline at end of file diff --git a/src/main/resources/data/cosmiccore/tinkering/station_layouts/screwdriver.json b/src/main/resources/data/cosmiccore/tinkering/station_layouts/screwdriver.json new file mode 100644 index 000000000..7579671b4 --- /dev/null +++ b/src/main/resources/data/cosmiccore/tinkering/station_layouts/screwdriver.json @@ -0,0 +1,26 @@ +{ + "translation_key": "tool.cosmiccore.screwdriver", + "sortIndex": 26, + + "icon": { + "item": "cosmiccore:screwdriver", + "nbt": "{Damage:0,tic_broken:0b,tic_display:1b,tic_materials:[\"tconstruct:ui_render#head\",\"tconstruct:ui_render#handle\"]}" + }, + + "input_slots": [ + { + "filter": { "item": "cosmiccore:screwdriver_head" }, + "icon": "cosmiccore:screwdriver_head", + "translation_key": "tool.cosmiccore.screwdriver.head", + "x": 44, + "y": 29 + }, + { + "filter": { "item": "tconstruct:tool_handle" }, + "icon": "tconstruct:tool_handle", + "translation_key": "item.tconstruct.tool_handle", + "x": 21, + "y": 52 + } + ] +} diff --git a/src/main/resources/data/cosmiccore/tinkering/station_layouts/wire_cutter.json b/src/main/resources/data/cosmiccore/tinkering/station_layouts/wire_cutter.json new file mode 100644 index 000000000..451d7164a --- /dev/null +++ b/src/main/resources/data/cosmiccore/tinkering/station_layouts/wire_cutter.json @@ -0,0 +1,45 @@ +{ + "icon": { + "item": "cosmiccore:wire_cutter", + "nbt": "{Damage:0,tic_broken:0b,tic_display:1b,tic_materials:[\"tconstruct:ui_render#head\",\"tconstruct:ui_render#head\",\"tconstruct:ui_render#extra\",\"tconstruct:ui_render#handle\",\"tconstruct:ui_render#handle\"]}" + }, + "input_slots": [ + { + "filter": { "item": "tconstruct:small_blade" }, + "icon": "tconstruct:small_blade", + "translation_key": "item.tconstruct.small_blade", + "x": 44, + "y": 29 + }, + { + "filter": { "item": "tconstruct:small_blade" }, + "icon": "tconstruct:small_blade", + "translation_key": "item.tconstruct.small_blade", + "x": 25, + "y": 20 + }, + { + "filter": { "item": "tconstruct:tool_binding" }, + "icon": "tconstruct:tool_binding", + "translation_key": "item.tconstruct.tool_binding", + "x": 50, + "y": 48 + }, + { + "filter": { "item": "tconstruct:tool_handle" }, + "icon": "tconstruct:tool_handle", + "translation_key": "item.tconstruct.tool_handle", + "x": 21, + "y": 52 + }, + { + "filter": { "item": "tconstruct:tool_handle" }, + "icon": "tconstruct:tool_handle", + "translation_key": "item.tconstruct.tool_handle", + "x": 70, + "y": 36 + } + ], + "sortIndex": 25, + "translation_key": "item.cosmiccore.wire_cutter" +} diff --git a/src/main/resources/data/cosmiccore/tinkering/station_layouts/wrench.json b/src/main/resources/data/cosmiccore/tinkering/station_layouts/wrench.json new file mode 100644 index 000000000..0eaf2f040 --- /dev/null +++ b/src/main/resources/data/cosmiccore/tinkering/station_layouts/wrench.json @@ -0,0 +1,15 @@ +{ + "translation_key": "item.cosmiccore.wrench", + "sortIndex": 24, + + "icon": { + "item": "cosmiccore:wrench", + "nbt": "{Damage:0,tic_broken:0b,tic_display:1b,tic_materials:[\"tconstruct:ui_render#head\",\"tconstruct:ui_render#extra\",\"tconstruct:ui_render#handle\"]}" + }, + + "input_slots": [ + { "filter": { "item": "cosmiccore:wrench_head" }, "icon": "cosmiccore:wrench_head", "translation_key": "item.cosmiccore.wrench_head", "x": 25, "y": 20 }, + { "filter": { "item": "tconstruct:tough_binding" }, "icon": "tconstruct:tough_binding", "translation_key": "item.tconstruct.tool_binding","x": 44, "y": 29}, + { "filter": { "item": "tconstruct:tool_handle" }, "icon": "tconstruct:tool_handle", "translation_key": "item.tconstruct.tool_handle", "x": 21, "y": 52 } + ] +} diff --git a/src/main/resources/data/curios/tags/items/back.json b/src/main/resources/data/curios/tags/items/back.json new file mode 100644 index 000000000..78896137f --- /dev/null +++ b/src/main/resources/data/curios/tags/items/back.json @@ -0,0 +1,6 @@ +{ + "values": [ + "cosmiccore:bronze_supply_tank", + "cosmiccore:steel_supply_tank" + ] +} diff --git a/src/main/resources/data/curios/tags/items/head.json b/src/main/resources/data/curios/tags/items/head.json index cab9d6d64..1df6d8775 100644 --- a/src/main/resources/data/curios/tags/items/head.json +++ b/src/main/resources/data/curios/tags/items/head.json @@ -1,5 +1,7 @@ { "values": [ - "cosmiccore:space_radio" + "cosmiccore:space_radio", + "cosmiccore:simple_rebreather", + "cosmiccore:pressurized_rebreather" ] } diff --git a/src/main/templates/META-INF/mods.toml b/src/main/templates/META-INF/mods.toml index aa589ff7f..1d7310811 100644 --- a/src/main/templates/META-INF/mods.toml +++ b/src/main/templates/META-INF/mods.toml @@ -44,4 +44,12 @@ description = "${mod_description}" mandatory=true versionRange="[1.20.1-1.20.1-2.0.15,)" ordering="BEFORE" - side="BOTH" \ No newline at end of file + side="BOTH" + +[[dependencies.${mod_id}]] + modId = "tconstruct" + mandatory = true + embedded = true + versionRange = "[1.20.1-3.9.2.37,)" + ordering = "AFTER" + side = "BOTH" \ No newline at end of file