diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index c43769a077..956bcfab3d 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -8,6 +8,8 @@ assignees: '' --- **Note:** If the bug happens on Forge/Neoforge in combination with **Sinytra Connector**, please report all issues to Sinytra Connector instead +**Note:** Currently supported versions: Minecraft 1.21.1 @ Fabric & Neoforge +**Note:** Known Incompatibilities: Enchancement **Describe the bug** A clear and concise description of what the bug is. diff --git a/build.gradle b/build.gradle index a9b30ec0f7..740208bb39 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,6 @@ plugins { id 'maven-publish' id 'idea' id 'net.neoforged.moddev' version '2.0.140' - id 'org.openrewrite.rewrite' version "latest.release" } version = project.mod_version @@ -11,7 +10,11 @@ group = project.maven_group repositories { maven { url = "https://maven.is-immensely.gay/releases" } // Revelationary, Fractal, AEA, Arrowhead, ... maven { url = "https://maven.shedaniel.me/" } // REI - maven { url = "https://maven.terraformersmc.com/" } // Modmenu, EMI + //maven { url = "https://maven.terraformersmc.com/" } + maven { + name = "Sleeping Town" + url = "https://repo.sleeping.town/" + } // EMI maven { url = "https://maven.nucleoid.xyz/" } // Common Protection API maven { url = "https://maven.blamejared.com" } // JEI, Botania maven { url = "https://maven.ladysnake.org/releases" } // Cardinal Components API @@ -31,10 +34,6 @@ repositories { mavenCentral() } -rewrite { - activeRecipe "org.openrewrite.java.jspecify.JSpecifyBestPractices" -} - base { archivesName = mod_id } @@ -67,6 +66,18 @@ neoForge { programArgument '--uuid=5010ad09-0229-4d70-8a2c-bc254821dcb3' } + // introduced in MC 1.21.9 + // client_debug { + // client() + // programArgument '-DMC_DEBUG_ENABLED' + // programArgument '-DMC_DEBUG_PATHFINDING' + // programArgument '-DMC_DEBUG_SHAPES' + // programArgument '-DMC_DEBUG_STRUCTURES' + // programArgument '-DMC_DEBUG_STRUCTURE_EDIT_MODE' + // programArgument '-DMC_DEBUG_STRUCTURE_GOAL_SELECTOR' + // programArgument '-DMC_DEBUG_KEEP_JIGSAW_BLOCKS_DURING_STRUCTURE_GEN' + // } + server { server() programArgument '--nogui' @@ -97,8 +108,6 @@ configurations { } dependencies { - rewrite "org.openrewrite.recipe:rewrite-migrate-java:3.34.1" - // TODO: remove additionalRuntimeClasspath for MC 1.21.9+ // see https://github.com/neoforged/ModDevGradle?tab=readme-ov-file#external-dependencies-runs // jgrapht (the graph lib we use) and its dependencies @@ -140,7 +149,6 @@ dependencies { // Mod Compat // KNOWN INCOMPAT: Colorful Hearts completely overrides neos heart rendering, making hearts unable to be modified by divinity / deadly poison - // implementation("maven.modrinth:colorful-hearts:${project.colorful_hearts_version}") { transitive = false } /*implementation*/ /*runtimeOnly*/ compileOnly("maven.modrinth:sodium:${project.sodium_version}") { transitive = false } /*implementation*/ /*runtimeOnly*/ compileOnly("com.unascribed:ears-api:${project.ears_version}") { transitive = false } /*implementation*/ /*runtimeOnly*/ compileOnly("maven.modrinth:create:${project.create_version}") { transitive = false } diff --git a/disabled/compat/botania/BotaniaCompat.java b/disabled/compat/botania/BotaniaCompat.java new file mode 100644 index 0000000000..4c3813fb72 --- /dev/null +++ b/disabled/compat/botania/BotaniaCompat.java @@ -0,0 +1,72 @@ +package de.dafuqs.spectrum.compat.botania; + +import de.dafuqs.fractal.api.*; +import de.dafuqs.spectrum.api.color.*; +import de.dafuqs.spectrum.api.ink.color.*; +import de.dafuqs.spectrum.api.interaction.*; +import de.dafuqs.spectrum.api.item_group.*; +import de.dafuqs.spectrum.compat.*; +import de.dafuqs.spectrum.registries.*; +import net.minecraft.world.entity.player.*; +import net.minecraft.world.item.*; +import net.minecraft.world.level.block.*; +import vazkii.botania.common.item.*; + +import static de.dafuqs.spectrum.registries.SpectrumItems.*; + +@SuppressWarnings("unused") +public class BotaniaCompat extends SpectrumIntegrationPacks.ModIntegrationPack { + + public static Item LEAST_BLACK_LOTUS = SpectrumItems.register(simple(item("least_black_lotus", new LeastBlackLotusItem(new Item.Properties()), InkColors.BLACK))); + public static Item BLACKEST_LOTUS = SpectrumItems.register(simple(item("blackest_lotus", new BlackestLotusItem(new Item.Properties()), InkColors.BLACK))); + + @Override + public void register() { + // registering it late, since Botania might not have been initialized yet + ServerLifecycleEvents.SERVER_STARTED.register(minecraftServer -> { + ItemColors.ITEM_COLORS.registerColorMapping(BotaniaItems.overgrowthSeed, InkColors.LIME); + ItemColors.ITEM_COLORS.registerColorMapping(BotaniaItems.blackLotus, InkColors.BLACK); + ItemColors.ITEM_COLORS.registerColorMapping(BotaniaItems.blackerLotus, InkColors.BLACK); + ItemColors.ITEM_COLORS.registerColorMapping(BotaniaItems.terrasteel, InkColors.LIME); + + ItemProviderRegistry.register(BotaniaItems.blackHoleTalisman, new ItemProvider() { + @Override + public int getItemCount(Player player, ItemStack stack, Item requestedItem) { + if (requestedItem instanceof BlockItem blockItem) { + Block storedBlock = BlackHoleTalismanItem.getBlock(stack); + if (blockItem.getBlock() == storedBlock) { + return BlackHoleTalismanItem.getBlockCount(stack); + } + } + return 0; + } + + @Override + public int provideItems(Player player, ItemStack stack, Item requestedItem, int amount) { + if (requestedItem instanceof BlockItem blockItem) { + Block storedBlock = BlackHoleTalismanItem.getBlock(stack); + if (blockItem.getBlock() == storedBlock) { + int storedAmount = BlackHoleTalismanItem.getBlockCount(stack); + int amountToRemove = Math.min(storedAmount, amount); + BlackHoleTalismanItem.setCount(stack, storedAmount - amountToRemove); + return amountToRemove; + } + } + return 0; + } + }); + }); + + ItemSubGroupEvents.modifyEntriesEvent(ItemGroupIDs.SUBTAB_EQUIPMENT).register(entries -> { + entries.accept(LEAST_BLACK_LOTUS); + entries.accept(BLACKEST_LOTUS); + }); + } + + + @Override + public void registerClient() { + + } + +} diff --git a/disabled/datagen/java/de/dafuqs/spectrum/data/BlockDatagen.java b/disabled/datagen/java/de/dafuqs/spectrum/data/BlockDatagen.java index 1c66fbffac..f05279c4f8 100644 --- a/disabled/datagen/java/de/dafuqs/spectrum/data/BlockDatagen.java +++ b/disabled/datagen/java/de/dafuqs/spectrum/data/BlockDatagen.java @@ -2,7 +2,7 @@ import de.dafuqs.spectrum.*; import de.dafuqs.spectrum.api.color.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.blocks.*; import de.dafuqs.spectrum.blocks.amphora.*; import de.dafuqs.spectrum.blocks.block_flooder.*; @@ -24,7 +24,7 @@ import de.dafuqs.spectrum.blocks.enchanter.*; import de.dafuqs.spectrum.blocks.end_portal.*; import de.dafuqs.spectrum.blocks.ender.*; -import de.dafuqs.spectrum.blocks.energy.*; +import de.dafuqs.spectrum.blocks.ink.*; import de.dafuqs.spectrum.blocks.farming.*; import de.dafuqs.spectrum.blocks.fluid.*; import de.dafuqs.spectrum.blocks.fusion_shrine.*; diff --git a/disabled/datagen/java/de/dafuqs/spectrum/data/SpectrumItems.java b/disabled/datagen/java/de/dafuqs/spectrum/data/SpectrumItems.java index 393cad6e0b..89df216b2f 100644 --- a/disabled/datagen/java/de/dafuqs/spectrum/data/SpectrumItems.java +++ b/disabled/datagen/java/de/dafuqs/spectrum/data/SpectrumItems.java @@ -3,7 +3,7 @@ import de.dafuqs.revelationary.api.revelations.*; import de.dafuqs.spectrum.*; import de.dafuqs.spectrum.api.color.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.api.item.*; import de.dafuqs.spectrum.blocks.conditional.*; import de.dafuqs.spectrum.blocks.gravity.*; @@ -17,7 +17,7 @@ import de.dafuqs.spectrum.items.bundles.*; import de.dafuqs.spectrum.items.conditional.*; import de.dafuqs.spectrum.items.conditional.CloakedItem; -import de.dafuqs.spectrum.items.energy.*; +import de.dafuqs.spectrum.items.ink.*; import de.dafuqs.spectrum.items.food.*; import de.dafuqs.spectrum.items.food.beverages.*; import de.dafuqs.spectrum.items.item_frame.*; @@ -232,7 +232,6 @@ public Map, Integer> getDefaultEnchantments() { // Fluid Buckets public static final DeferredItem LIQUID_CRYSTAL_BUCKET = register(simple(item("liquid_crystal_bucket", () -> new BucketItem(SpectrumFluids.LIQUID_CRYSTAL.get(), IS.of(1).craftRemainder(BUCKET)), InkColors.LIGHT_GRAY))); - public static final DeferredItem SLUDGE_BUCKET = register(simple(item("sludge_bucket", () -> new BucketItem(SpectrumFluids.SLUDGE.get(), IS.of(1).craftRemainder(BUCKET)), InkColors.BROWN))); public static final DeferredItem MIDNIGHT_SOLUTION_BUCKET = register(simple(item("midnight_solution_bucket", () -> new BucketItem(SpectrumFluids.MIDNIGHT_SOLUTION.get(), IS.of(1).craftRemainder(BUCKET)), InkColors.GRAY))); public static final DeferredItem DRAGONROT_BUCKET = register(simple(item("dragonrot_bucket", () -> new BucketItem(SpectrumFluids.DRAGONROT.get(), IS.of(1).craftRemainder(BUCKET)), InkColors.LIGHT_GRAY))); diff --git a/disabled/datagen/java/de/dafuqs/spectrum/data/SpectrumRecipeProvider.java b/disabled/datagen/java/de/dafuqs/spectrum/data/SpectrumRecipeProvider.java index 6943d9dfaa..1927a34e0f 100644 --- a/disabled/datagen/java/de/dafuqs/spectrum/data/SpectrumRecipeProvider.java +++ b/disabled/datagen/java/de/dafuqs/spectrum/data/SpectrumRecipeProvider.java @@ -2,7 +2,7 @@ import com.mojang.datafixers.util.*; import de.dafuqs.spectrum.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.recipe.*; import de.dafuqs.spectrum.recipe.crystallarieum.*; import de.dafuqs.spectrum.recipe.enchanter.*; diff --git a/gradle.properties b/gradle.properties index 8b342af1da..bd45cd4786 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,36 +9,35 @@ org.gradle.caching=true minecraft_version=1.21.1 parchment_minecraft_version=1.21.1 parchment_mappings_version=2024.11.17 -neoforge_version=21.1.222 -neoforge_version_range=[21.1.186,) +neoforge_version=21.1.249 +neoforge_version_range=[21.1.249,) # Mod Properties mod_id=spectrum -mod_version=1.11.8-1.21.1-neo +mod_version=1.12.9-1.21.1-neo maven_group=de.dafuqs archives_base_name=Spectrum # Dependencies modmenu_version=11.0.3 rei_version=16.0.799 -emi_version=1.1.22+1.21.1 +emi_version=1.1.24+1.21.1 architectury_version=13.0.8 # https://cloudsmith.io/~klikli-dev/repos/mods/groups/ -modonomicon_version=1.117.4 +modonomicon_version=1.120.4 modonomicon_version_range=[1.117.4,) -# https://maven.terraformersmc.com/releases/dev/emi/trinkets/ -trinkets_version=3.10.0 # https://maven.is-immensely.gay/#/releases/de/dafuqs/additionalentityattributes additional_entity_attributes_version=2.0.2+1.21.1-neoforge # https://maven.is-immensely.gay/#/releases/de/dafuqs/revelationary/revelationary -revelationary_version=1.5.0+1.21.1 -revelationary_version_range=[1.5.0+1.21.1,) +revelationary_version=1.5.2+1.21.1 +revelationary_version_range=[1.5.2+1.21.1,) +# https://modrinth.com/mod/curios/ +curios_version=9.5.1+1.21.1 +curios_version_range=[9.5.1+1.21.1,) # https://maven.is-immensely.gay/#/releases/de/dafuqs/fractal fractal_version=1.8.2+1.21.1-neoforge # https://maven.is-immensely.gay/#/releases/de/dafuqs/arrowhead arrowhead_version=2.1.0+1.21.1-neoforge -# https://github.com/Terrails/colorful-heartsf -colorful_hearts_version=us0gze50 # https://modrinth.com/mod/sodium sodium_version=mc1.21.1-0.6.13-neoforge # https://modrinth.com/mod/ears @@ -46,7 +45,8 @@ ears_version=1.4.7 # https://modrinth.com/mod/travelersbackpack/ travelers_backpack_version=1.21.1-10.1.31 # https://modrinth.com/mod/botania/ -botania_version=454-SNAPSHOT +# https://maven.blamejared.com/vazkii/botania/botania-neoforge-1.21.1/ +botania_version=455-20260812.060955-47 # https://modrinth.com/mod/create-fabric create_version=mc1.21.1-6.0.9 # https://modrinth.com/mod/malum @@ -61,9 +61,7 @@ vanityslots_version=xWfEA0yC # What recipe viewer to use ('emi', 'rei', or 'disabled') recipe_viewer=emi + # Datagen runtime mod versions gobber_version=5736976 -ae2_version=eDnBiYjR -# https://modrinth.com/mod/curios/ -curios_version=9.5.1+1.21.1 -curios_version_range=[9.5.1+1.21.1,) \ No newline at end of file +ae2_version=eDnBiYjR \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ca025c83a7..4f5eb9dcc0 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.5-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/images/concept_art/bedrock_anvils_by_shortstuffjoe.png b/images/concept_art/bedrock_anvils_by_shortstuffjoe.png new file mode 100644 index 0000000000..0522147fd9 Binary files /dev/null and b/images/concept_art/bedrock_anvils_by_shortstuffjoe.png differ diff --git a/images/inventories/ink_storage.xcf b/images/inventories/ink_storage.xcf new file mode 100644 index 0000000000..21aa2d0c04 Binary files /dev/null and b/images/inventories/ink_storage.xcf differ diff --git a/images/inventories/inventory_generic.xcf b/images/inventories/inventory_generic.xcf index 4a7ce37d45..4d38b85cbc 100644 Binary files a/images/inventories/inventory_generic.xcf and b/images/inventories/inventory_generic.xcf differ diff --git a/raw/Fluid_Interactions.xlsx b/raw/Fluid_Interactions.xlsx index bea4703f29..565b981843 100644 Binary files a/raw/Fluid_Interactions.xlsx and b/raw/Fluid_Interactions.xlsx differ diff --git a/raw/Generate-CrystallaeriumGrowables.ps1 b/raw/Generate-CrystallaeriumGrowables.ps1 index e69c76c07e..76cfc0d4c9 100644 --- a/raw/Generate-CrystallaeriumGrowables.ps1 +++ b/raw/Generate-CrystallaeriumGrowables.ps1 @@ -463,7 +463,7 @@ foreach($entry in $entries.GetEnumerator()) { New-Item -Path ".\crystallarieum\$name`.json" -ItemType File -Force -Value @" { "type": "spectrum:crystallarieum_growing", - "fluid_medium": { + "fluid": { "fluid": "$Fluid" }, "ingredient": { @@ -472,13 +472,13 @@ foreach($entry in $entries.GetEnumerator()) { "ink_color": "$InkColor", "ink_cost_tier": xxx, "seconds_per_growth_stage": 60, - "additional_recipe_manager_results": [ + "additional_recipe_viewer_results": [ { "count": 1, "id": "spectrum:pure_$name" } ], - "catalysts": [ + "additives": [ { "consume_chance_per_second": x.x, "growth_acceleration_mod": x.x, diff --git a/raw/models/crawfish.bbmodel b/raw/models/crawfish.bbmodel new file mode 100644 index 0000000000..6ee8196e2d --- /dev/null +++ b/raw/models/crawfish.bbmodel @@ -0,0 +1 @@ +{"meta":{"format_version":"5.0","model_format":"modded_entity","box_uv":true},"name":"SpectrumCrawfish","model_identifier":"","modded_entity_entity_class":"","modded_entity_version":"1.17","modded_entity_flip_y":true,"visible_box":[1,1,0],"variable_placeholders":"","multi_file_ruleset":"","variable_placeholder_buttons":[],"timeline_setups":[],"unhandled_root_fields":{},"resolution":{"width":32,"height":32},"elements":[{"name":"head","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-1,1.25,-4],"to":[1,3.25,-1],"autouv":0,"color":1,"origin":[0,1.25,-3],"uv_offset":[12,9],"faces":{"north":{"uv":[15,12,17,14],"texture":0},"east":{"uv":[12,12,15,14],"texture":0},"south":{"uv":[20,12,22,14],"texture":0},"west":{"uv":[17,12,20,14],"texture":0},"up":{"uv":[17,12,15,9],"texture":0},"down":{"uv":[19,9,17,12],"texture":0}},"type":"cube","uuid":"cdc5152c-09d7-6235-c24f-403ebdd775f9"},{"name":"body","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-1,1.3,-1.25],"to":[1,3.3,1.75],"autouv":0,"color":7,"inflate":0.1,"origin":[0,1.3,-0.25],"uv_offset":[14,0],"faces":{"north":{"uv":[17,3,19,5],"texture":0},"east":{"uv":[14,3,17,5],"texture":0},"south":{"uv":[22,3,24,5],"texture":0},"west":{"uv":[19,3,22,5],"texture":0},"up":{"uv":[19,3,17,0],"texture":0},"down":{"uv":[21,0,19,3],"texture":0}},"type":"cube","uuid":"7be95fb0-418b-e69e-099b-589c3b927a56"},{"name":"butt","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-1,1.25,1.25],"to":[1,3.25,3.25],"autouv":0,"color":0,"rotation":[12.5,0,0],"origin":[0,1.25,2.25],"uv_offset":[0,18],"faces":{"north":{"uv":[2,20,4,22],"texture":0},"east":{"uv":[0,20,2,22],"texture":0},"south":{"uv":[6,20,8,22],"texture":0},"west":{"uv":[4,20,6,22],"texture":0},"up":{"uv":[4,20,2,18],"texture":0},"down":{"uv":[6,18,4,20],"texture":0}},"type":"cube","uuid":"138b414c-cbd7-6f5d-b9c7-10196d2a62bf"},{"name":"tail","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-1,1.25,3.25],"to":[1,2.25,5.25],"autouv":0,"color":9,"rotation":[15,0,0],"origin":[0,1.25,4.25],"uv_offset":[16,19],"faces":{"north":{"uv":[18,21,20,22],"texture":0},"east":{"uv":[16,21,18,22],"texture":0},"south":{"uv":[22,21,24,22],"texture":0},"west":{"uv":[20,21,22,22],"texture":0},"up":{"uv":[20,21,18,19],"texture":0},"down":{"uv":[22,19,20,21],"texture":0}},"type":"cube","uuid":"b93dfd97-10d7-cad3-aaee-5b22f1ab9e1b"},{"name":"fin","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-2,1.5,5],"to":[2,1.5,7],"autouv":0,"color":6,"origin":[0,1.5,6],"uv_offset":[14,5],"faces":{"north":{"uv":[16,7,20,7],"texture":0},"east":{"uv":[14,7,16,7],"texture":0},"south":{"uv":[22,7,26,7],"texture":0},"west":{"uv":[20,7,22,7],"texture":0},"up":{"uv":[20,7,16,5],"texture":0},"down":{"uv":[24,5,20,7],"texture":0}},"type":"cube","uuid":"c3b6de98-49f3-2c24-b507-258948bef151"},{"name":"inner_claw_left","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-2,-0.7,-4.3],"to":[0,1.3,-1.3],"autouv":0,"color":6,"inflate":-0.6,"rotation":[-15.22074,-9.65594,2.61298],"origin":[-2,-0.7,-3.3],"uv_offset":[12,14],"faces":{"north":{"uv":[15,17,17,19],"texture":0},"east":{"uv":[12,17,15,19],"texture":0},"south":{"uv":[20,17,22,19],"texture":0},"west":{"uv":[17,17,20,19],"texture":0},"up":{"uv":[17,17,15,14],"texture":0},"down":{"uv":[19,14,17,17],"texture":0}},"type":"cube","uuid":"f383206e-2009-2521-2ade-7169700d5099"},{"name":"whisker_base_right","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-0.35,2.5,-4.5],"to":[1.65,4.5,-2.5],"autouv":0,"color":6,"mirror_uv":true,"inflate":-0.75,"rotation":[-15,0,0],"origin":[1.65,2.5,-3.5],"uv_offset":[8,19],"faces":{"north":{"uv":[12,21,10,23],"texture":0},"east":{"uv":[14,21,12,23],"texture":0},"south":{"uv":[16,21,14,23],"texture":0},"west":{"uv":[10,21,8,23],"texture":0},"up":{"uv":[10,21,12,19],"texture":0},"down":{"uv":[12,19,14,21],"texture":0}},"type":"cube","uuid":"8a6c8cdc-6536-60eb-e0e0-3685ce0ad127"},{"name":"whisker_left","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-1.68504,1.59455,-6.85],"to":[0.31496,6.59455,-2.85],"autouv":0,"color":6,"inflate":-1,"rotation":[-15,0,0],"origin":[-0.55,4.5,-5.6],"uv_offset":[0,9],"faces":{"north":{"uv":[4,13,6,18],"texture":0},"east":{"uv":[0,13,4,18],"texture":0},"south":{"uv":[10,13,12,18],"texture":0},"west":{"uv":[6,13,10,18],"texture":0},"up":{"uv":[6,13,4,9],"texture":0},"down":{"uv":[8,9,6,13],"texture":0}},"type":"cube","uuid":"6d063232-981d-d91b-54bd-16dc8843dd4e"},{"name":"whisker_right","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-0.31496,1.59455,-6.85],"to":[1.68504,6.59455,-2.85],"autouv":0,"color":6,"mirror_uv":true,"inflate":-1,"rotation":[-15,0,0],"origin":[0.55,4.5,-5.6],"uv_offset":[0,9],"faces":{"north":{"uv":[6,13,4,18],"texture":0},"east":{"uv":[10,13,6,18],"texture":0},"south":{"uv":[12,13,10,18],"texture":0},"west":{"uv":[4,13,0,18],"texture":0},"up":{"uv":[4,13,6,9],"texture":0},"down":{"uv":[6,9,8,13],"texture":0}},"type":"cube","uuid":"6f897b72-ac72-b616-fd8b-1b1b0de2f475"},{"name":"upper_claw_left","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-2,0.5,-2],"to":[-1,1.5,0],"autouv":0,"color":2,"rotation":[-22.81179,9.23186,-3.86032],"origin":[-2,0.5,-1],"uv_offset":[0,22],"faces":{"north":{"uv":[2,24,3,25],"texture":0},"east":{"uv":[0,24,2,25],"texture":0},"south":{"uv":[5,24,6,25],"texture":0},"west":{"uv":[3,24,5,25],"texture":0},"up":{"uv":[3,24,2,22],"texture":0},"down":{"uv":[4,22,3,24],"texture":0}},"type":"cube","uuid":"08659797-3145-7a52-732c-7e38a906765f"},{"name":"upper_claw_right","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[1,0.5,-2],"to":[2,1.5,0],"autouv":0,"color":2,"mirror_uv":true,"rotation":[-22.81179,-9.23186,3.86032],"origin":[2,0.5,-1],"uv_offset":[0,22],"faces":{"north":{"uv":[3,24,2,25],"texture":0},"east":{"uv":[5,24,3,25],"texture":0},"south":{"uv":[6,24,5,25],"texture":0},"west":{"uv":[2,24,0,25],"texture":0},"up":{"uv":[2,24,3,22],"texture":0},"down":{"uv":[3,22,4,24],"texture":0}},"type":"cube","uuid":"e2612684-1cdb-b32b-971b-970cc12ecf32"},{"name":"outer_claw_right","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[1.5,0,-4],"to":[2.5,1,-2],"autouv":0,"color":6,"inflate":0.1,"rotation":[0,-15,0],"origin":[2.5,0,-3],"uv_offset":[22,7],"faces":{"north":{"uv":[24,9,25,10],"texture":0},"east":{"uv":[22,9,24,10],"texture":0},"south":{"uv":[27,9,28,10],"texture":0},"west":{"uv":[25,9,27,10],"texture":0},"up":{"uv":[25,9,24,7],"texture":0},"down":{"uv":[26,7,25,9],"texture":0}},"type":"cube","uuid":"97313a0d-2ae0-b083-237e-04288ec7e54c"},{"name":"outer_claw_left","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-2.5,0,-4],"to":[-1.5,1,-2],"autouv":0,"color":6,"mirror_uv":true,"inflate":0.1,"rotation":[0,15,0],"origin":[-2.5,0,-3],"uv_offset":[22,7],"faces":{"north":{"uv":[25,9,24,10],"texture":0},"east":{"uv":[27,9,25,10],"texture":0},"south":{"uv":[28,9,27,10],"texture":0},"west":{"uv":[24,9,22,10],"texture":0},"up":{"uv":[24,9,25,7],"texture":0},"down":{"uv":[25,7,26,9],"texture":0}},"type":"cube","uuid":"3ac67d59-6184-1446-552a-9bca087c9c2c"},{"name":"inner_claw_right","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[0,-0.7,-4.3],"to":[2,1.3,-1.3],"autouv":0,"color":6,"mirror_uv":true,"inflate":-0.6,"rotation":[-15.22074,9.65594,-2.61298],"origin":[2,-0.7,-3.3],"uv_offset":[12,14],"faces":{"north":{"uv":[17,17,15,19],"texture":0},"east":{"uv":[20,17,17,19],"texture":0},"south":{"uv":[22,17,20,19],"texture":0},"west":{"uv":[15,17,12,19],"texture":0},"up":{"uv":[15,17,17,14],"texture":0},"down":{"uv":[17,14,19,17],"texture":0}},"type":"cube","uuid":"994b7101-3200-c102-d598-418297d010d0"},{"name":"whisker_base_left","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-1.65,2.5,-4.5],"to":[0.35,4.5,-2.5],"autouv":0,"color":6,"inflate":-0.75,"rotation":[-15,0,0],"origin":[-1.65,2.5,-3.5],"uv_offset":[8,19],"faces":{"north":{"uv":[10,21,12,23],"texture":0},"east":{"uv":[8,21,10,23],"texture":0},"south":{"uv":[14,21,16,23],"texture":0},"west":{"uv":[12,21,14,23],"texture":0},"up":{"uv":[12,21,10,19],"texture":0},"down":{"uv":[14,19,12,21],"texture":0}},"type":"cube","uuid":"3d5d8437-2f62-56c7-8013-b5bf3fbd67aa"},{"name":"legs_right","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[1,-1.75,-1],"to":[3,2.25,4],"autouv":0,"color":2,"inflate":-1,"rotation":[0,0,16],"origin":[0,-1.75,0],"faces":{"north":{"uv":[5,5,7,9],"texture":0},"east":{"uv":[0,5,5,9],"texture":0},"south":{"uv":[12,5,14,9],"texture":0},"west":{"uv":[7,5,12,9],"texture":0},"up":{"uv":[7,5,5,0],"texture":0},"down":{"uv":[9,0,7,5],"texture":0}},"type":"cube","uuid":"95141ff0-d653-84bf-f366-19f7e68797b8"},{"name":"legs_left","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-3,-1.75,-1],"to":[-1,2.25,4],"autouv":0,"color":2,"mirror_uv":true,"inflate":-1,"rotation":[0,0,-16],"origin":[0,-1.75,0],"faces":{"north":{"uv":[7,5,5,9],"texture":0},"east":{"uv":[12,5,7,9],"texture":0},"south":{"uv":[14,5,12,9],"texture":0},"west":{"uv":[5,5,0,9],"texture":0},"up":{"uv":[5,5,7,0],"texture":0},"down":{"uv":[7,0,9,5],"texture":0}},"type":"cube","uuid":"929b7f7b-2c52-7e96-50f1-2cb5711136c6"}],"groups":[{"name":"head","uuid":"b3e6a325-bbbe-7191-0b2f-b4d4ebb2d93f","export":true,"locked":false,"scope":0,"selected":false,"visibility":true,"_static":{"properties":{},"temp_data":{}},"origin":[0,1.25,-3],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"autouv":0,"isOpen":false,"primary_selected":true},{"name":"whiskers","uuid":"d4828a6e-54ae-51bc-b535-cd2b86fd38ac","export":true,"locked":false,"scope":0,"selected":false,"visibility":true,"_static":{"properties":{},"temp_data":{}},"origin":[-1.65,2.5,-3.5],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"autouv":0,"isOpen":false,"primary_selected":false},{"name":"body","uuid":"93000774-ac23-7df6-2965-fe2afbe12613","export":true,"locked":false,"scope":0,"selected":false,"visibility":true,"_static":{"properties":{},"temp_data":{}},"origin":[0,1.3,-0.25],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"autouv":0,"isOpen":false,"primary_selected":true},{"name":"claws","uuid":"07675025-e30a-5724-b8cb-8f1f6c351de5","export":true,"locked":false,"scope":0,"selected":false,"visibility":true,"_static":{"properties":{},"temp_data":{}},"origin":[2,0.5,-1],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"autouv":0,"isOpen":false,"primary_selected":false},{"name":"claw_itself","uuid":"313fcf9a-a419-dea6-8209-05366226f3a8","export":true,"locked":false,"scope":0,"selected":false,"visibility":true,"_static":{"properties":{},"temp_data":{}},"origin":[2.5,0,-3],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"tail","uuid":"3eeb4021-acea-6b18-6421-b95821cdc767","export":true,"locked":false,"scope":0,"selected":false,"visibility":true,"_static":{"properties":{},"temp_data":{}},"origin":[0,1.25,4.25],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"autouv":0,"isOpen":true,"primary_selected":true}],"outliner":[{"uuid":"b3e6a325-bbbe-7191-0b2f-b4d4ebb2d93f","isOpen":false,"children":["cdc5152c-09d7-6235-c24f-403ebdd775f9",{"uuid":"d4828a6e-54ae-51bc-b535-cd2b86fd38ac","isOpen":false,"children":["3d5d8437-2f62-56c7-8013-b5bf3fbd67aa","8a6c8cdc-6536-60eb-e0e0-3685ce0ad127","6f897b72-ac72-b616-fd8b-1b1b0de2f475","6d063232-981d-d91b-54bd-16dc8843dd4e"]}]},{"uuid":"93000774-ac23-7df6-2965-fe2afbe12613","isOpen":false,"children":["7be95fb0-418b-e69e-099b-589c3b927a56",{"uuid":"07675025-e30a-5724-b8cb-8f1f6c351de5","isOpen":false,"children":["08659797-3145-7a52-732c-7e38a906765f","e2612684-1cdb-b32b-971b-970cc12ecf32",{"uuid":"313fcf9a-a419-dea6-8209-05366226f3a8","isOpen":true,"children":["97313a0d-2ae0-b083-237e-04288ec7e54c","3ac67d59-6184-1446-552a-9bca087c9c2c","994b7101-3200-c102-d598-418297d010d0","f383206e-2009-2521-2ade-7169700d5099"]}]},"929b7f7b-2c52-7e96-50f1-2cb5711136c6","95141ff0-d653-84bf-f366-19f7e68797b8","138b414c-cbd7-6f5d-b9c7-10196d2a62bf"]},{"uuid":"3eeb4021-acea-6b18-6421-b95821cdc767","isOpen":true,"children":["b93dfd97-10d7-cad3-aaee-5b22f1ab9e1b","c3b6de98-49f3-2c24-b507-258948bef151"]}],"textures":[{"name":"SpectrumCrawfish.png","path":"","folder":"block","namespace":"","id":"1","group":"","scope":0,"width":32,"height":32,"uv_width":32,"uv_height":32,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","file_format":"png","render_mode":"default","render_sides":"auto","wrap_mode":"limited","pbr_channel":"color","fps":7,"frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":false,"uuid":"920c6b59-a34a-d5e4-97be-8e4d9b30ac03","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACBklEQVR4AeyWvUoDQRDH9xYL0UoMEaKCT2BlI+gTWAhiK2IhxkdIISIWeQQjVmIliKDgGwg2NpYWQkANGCJWioVw5ncwYe5yd7mPJFVCftnb2dn/zs5+5Kzpw6dSu3A1aST7EsDO6qKZmJ80Xx+/HkMP4LL+kmZMn2/mDJDy47trF0RxdmnaAG3lozMXpC2qzBxAlGBau5Uog2UvoWp5yzlY23Cebp8NJcgzbbXDXQd66dipmXHPJ1h6xoQ/m3tVFxK6+9xyL8HVacXR+NTbFTIL7cfQr+X40BIssfWDVqNlIErLsnY0BktsvWC3a7Q/s9bLQh20D8+5lkAuILIHCApsQL001EHapcwVQJ4LKHMApLy0su67gBA7qZ4b2riYAFsSOhkoLiy7CCfptF/Z7nILs3U5hRi8ABi4WX9wGvc3ToiPz8Qlw4aF98dPo9Ftvk4xFcvMkwwco5GryY7NFTMLcL41WYTs31szVT/OMugzjkChVDDYBWxJsKw9juxgDbZh4G1CBuIigai3GpkZ//egLxme+TPToJkEy6z1uUUcIRkwiQg+BA9RE8AnjE4GwhqxBQORYyf2vBOwcnYZDDjf2Li3gWzEgS99NNjoC2jG0cnAz+u3gaAzYnEE/dPWLetPGqUjdZD6oEvvfUDPUFI56IFFv7MEYhh2OQpglIGBZ6DXpv4HAAD//xfcxIAAAAAGSURBVAMAlnJKUBjBn1MAAAAASUVORK5CYII="}],"reference_images":[{"name":"Pasted","scope":"project","position":[760,256],"size":[400,386],"plane_position":[0,0,16],"plane_rotation":[0,180,0],"source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFgAAABVCAIAAABCabS9AAAEl0lEQVR4nOxbzU8TQRSfxbaCRSJSMEJVgkQSjHqQRMWEoxgPJhgTLyZEPfjBP6B/gSYeTfSkxqMXDxxM8Ej8SEyEwMFohIbERrSpIAhammKl7DLzoDO7M7vb7e7M/g7kdZl+/fLe733sa+RA827kFVbyReRXRLZHI8gT5FaKMY/eqgRRyj38aN5CW//LT4e0ROjgp8O7uEDVAw8dknsEhDkdChGhg0WHF0RUNy6oKKdDOY+AgHTUIOWh0xERzbei8GFclEPDoaFtXArAp64MtmpEpR3Et6CLpcbNxVLHKWzXp95t+W8g4kIHM2uo5hoW6VMdOrjqCBXoECioMB2/YgfxxV1luoBBFYjczk5sJ492Up+YnpzCdu3vKeQJhCtLDckJpUtsCKclNstBApQ4ddjxiEiyhTxITVOLDm2DoWIRJU6fxdc79nZjO9GaQDTAM6nZj9iuqHa4ExomaUULiKhEBKpIK+CvnPPx2J6FdY9QtsEAAKHhKh1NvUQX+s+dwfaOfXHq+T9fl8Ejoh2J1j5st2hEm8YmyGknenEitl83yjTCMR1BjAvEFEv1gsW0jpC1iqRB62pr4ToIvGMe9BqN+Wlsx3v6sT1wfQC5gUd3n2G79/BJbMMa5MXTJ9gW1YsbzT26wV1HyB4sggWVvMESNl0G7BABdQHqRZxx/lI7OfN8ZhpZ4cHQfWxfu30L21/G09TzcK6RfSOmEeMLGd0IPcJASISBGjsCqEmomrpHiOXG+SiJeRifsKeA4NGFTZ8pSS9tYO2Q/ZZFbmAy+914U3BR6ft+VI1QsS036TVU6jSssgZxjfhx0kccYcwUWbMGHsB5RCGdoZ5p62kiNiL26NAwtuu00pSUH38b8rrBkz4D5hr6lLQoGNnSbsyIDo3DgsqAndUhmM9Ts+Q6jHOWXsD5ws07g9h+fO8htvv6z1u+DgQ8PzpC9EJoNrFpdUjlOfam0FCZDopGSEMHvO1oCbPVIR4u4H3KkZevsM2aWQ5evojtieHP2IY9C6xNjqEubLPmGvA8FTwJ1Sx9anL1meYJVWB1SAKYuIaKdQRVO7Tkoe765Z9IBHPRDsszrP0oeP8SYmziLfW5cMYBZ5YsXYA7FHVLXHWETofMHlFYFThcIgKu+XBlzSiSDyUi1F6MMGAnNGKLJIfnG0huhzU/7Eca99RSX2f+Rw7bmSKZQcDaBOoCfE24NwHnl1AjhBB2nwZCIgwIE7H6D0kJNz2CRxdYMQ/rBagdM2OfsA1nDSxEF0KNcAYxImSNCxR6BEZk25w7NxHX8P7DKPU6a/+apSNwJwrCdvzzQMAjqh4X9m5YcKImcKOXCm25h1NsA06n2LDvyLym70GkG0hsX7hyFduwXmDtO8QWq/ebLiodEidOHczhrZ+1oxIyEdQfwLqeQbjSp4txwao14ByBXxdcpMOflaWYI7pCh5/3I8SUYI0OJ9ph7RGFauYLYY2y7R1ae8Li9xoFvyRO4S8nREeAus/KeoeFRvjGHTA0G9rBg4Auk7mvo8EdzAgvTJvvjZgR4b+4oMId7ZBmz9Jp+yHTzNJRY/QfAAD//4UTHaEAAAAGSURBVAMABu9LSS06zNUAAAAASUVORK5CYII="}],"fabricOptions":{"header":"package com.example.mod;","entity":"Entity","render":"","members":""}} \ No newline at end of file diff --git a/raw/models/koi.bbmodel b/raw/models/koi.bbmodel new file mode 100644 index 0000000000..12d16bd16b --- /dev/null +++ b/raw/models/koi.bbmodel @@ -0,0 +1 @@ +{"meta":{"format_version":"5.0","model_format":"modded_entity","box_uv":true},"name":"SpectrumKoi","model_identifier":"","modded_entity_entity_class":"","modded_entity_version":"1.17","modded_entity_flip_y":true,"visible_box":[1,1,0],"variable_placeholders":"\n","multi_file_ruleset":"","variable_placeholder_buttons":[],"timeline_setups":[],"unhandled_root_fields":{},"resolution":{"width":32,"height":32},"elements":[{"name":"body_front","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-1,3,-4],"to":[1,6,-1],"autouv":0,"color":2,"inflate":0.5,"origin":[0,3,-0.5],"uv_offset":[0,8],"faces":{"north":{"uv":[3,11,5,14],"texture":0},"east":{"uv":[0,11,3,14],"texture":0},"south":{"uv":[8,11,10,14],"texture":0},"west":{"uv":[5,11,8,14],"texture":0},"up":{"uv":[5,11,3,8],"texture":0},"down":{"uv":[7,8,5,11],"texture":0}},"type":"cube","uuid":"c6c3b227-3f5d-fc43-51ef-b9d201437335"},{"name":"head","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-1,3,-7],"to":[1,6,-4],"autouv":0,"color":8,"inflate":0.25,"origin":[0,4,-5],"uv_offset":[10,8],"faces":{"north":{"uv":[13,11,15,14],"texture":0},"east":{"uv":[10,11,13,14],"texture":0},"south":{"uv":[18,11,20,14],"texture":0},"west":{"uv":[15,11,18,14],"texture":0},"up":{"uv":[15,11,13,8],"texture":0},"down":{"uv":[17,8,15,11],"texture":0}},"type":"cube","uuid":"077efc0b-c14d-de3c-2319-668bed46d360"},{"name":"body_back","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-1,3,0],"to":[1,6,3],"autouv":0,"color":2,"inflate":0.5,"origin":[0,3,-0.5],"uv_offset":[12,0],"faces":{"north":{"uv":[15,3,17,6],"texture":0},"east":{"uv":[12,3,15,6],"texture":0},"south":{"uv":[20,3,22,6],"texture":0},"west":{"uv":[17,3,20,6],"texture":0},"up":{"uv":[17,3,15,0],"texture":0},"down":{"uv":[19,0,17,3],"texture":0}},"type":"cube","uuid":"e24adb25-8865-d5d7-8841-5aa98bd5b7da"},{"name":"tail","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-1,3,3],"to":[1,6,6],"autouv":0,"color":2,"origin":[0,4.5,3.25],"uv_offset":[0,14],"faces":{"north":{"uv":[3,17,5,20],"texture":0},"east":{"uv":[0,17,3,20],"texture":0},"south":{"uv":[8,17,10,20],"texture":0},"west":{"uv":[5,17,8,20],"texture":0},"up":{"uv":[5,17,3,14],"texture":0},"down":{"uv":[7,14,5,17],"texture":0}},"type":"cube","uuid":"d2546d28-baa8-1c41-f656-4e955035e6f1"},{"name":"whisker_left","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-2.28504,1.09455,-8.25],"to":[-0.28504,5.09455,-4.25],"autouv":0,"color":6,"inflate":-1,"rotation":[0,0,-20],"origin":[-1.15,4,-7],"faces":{"north":{"uv":[4,4,6,8],"texture":0},"east":{"uv":[0,4,4,8],"texture":0},"south":{"uv":[10,4,12,8],"texture":0},"west":{"uv":[6,4,10,8],"texture":0},"up":{"uv":[6,4,4,0],"texture":0},"down":{"uv":[8,0,6,4],"texture":0}},"type":"cube","uuid":"1ad49f8a-4f09-c764-e0f5-f1cfbb73797e"},{"name":"whisker_right","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[0.28504,1.09455,-8.25],"to":[2.28504,5.09455,-4.25],"autouv":0,"color":6,"inflate":-1,"rotation":[0,0,20],"origin":[1.15,4,-7],"faces":{"north":{"uv":[4,4,6,8],"texture":0},"east":{"uv":[0,4,4,8],"texture":0},"south":{"uv":[10,4,12,8],"texture":0},"west":{"uv":[6,4,10,8],"texture":0},"up":{"uv":[6,4,4,0],"texture":0},"down":{"uv":[8,0,6,4],"texture":0}},"type":"cube","uuid":"f4211a1b-2e75-d839-9878-64b86b642e30"},{"name":"tailfin_upper","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[0,5,5.5],"to":[0,8,8.5],"autouv":0,"color":2,"origin":[0,5,5.5],"uv_offset":[18,14],"faces":{"north":{"uv":[21,17,21,20],"texture":0},"east":{"uv":[18,17,21,20],"texture":0},"south":{"uv":[24,17,24,20],"texture":0},"west":{"uv":[21,17,24,20],"texture":0},"up":{"uv":[21,17,21,14],"texture":0},"down":{"uv":[21,14,21,17],"texture":0}},"type":"cube","uuid":"7b68ef40-b14b-79f9-d285-e29300f298ba"},{"name":"tailfin_lower","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[0,1,5.5],"to":[0,4,8.5],"autouv":0,"color":2,"origin":[0,4,5.5],"uv_offset":[0,20],"faces":{"north":{"uv":[3,23,3,26],"texture":0},"east":{"uv":[0,23,3,26],"texture":0},"south":{"uv":[6,23,6,26],"texture":0},"west":{"uv":[3,23,6,26],"texture":0},"up":{"uv":[3,23,3,20],"texture":0},"down":{"uv":[3,20,3,23],"texture":0}},"type":"cube","uuid":"453b72a4-847b-9f49-c19e-17895bab6f9f"},{"name":"backfin_centertop","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[0,6.25,-0.5],"to":[0,8.25,3.5],"autouv":0,"color":2,"origin":[0,6.25,1.5],"uv_offset":[10,14],"faces":{"north":{"uv":[14,18,14,20],"texture":0},"east":{"uv":[10,18,14,20],"texture":0},"south":{"uv":[18,18,18,20],"texture":0},"west":{"uv":[14,18,18,20],"texture":0},"up":{"uv":[14,18,14,14],"texture":0},"down":{"uv":[14,14,14,18],"texture":0}},"type":"cube","uuid":"36f765f5-dedc-aade-94b1-4b647af5f8f6"},{"name":"backfin_right","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[1.42125,1.36609,1.15217],"to":[1.42125,3.36609,4.15217],"autouv":0,"color":2,"rotation":[25,0,27.5],"origin":[1.43949,3.06227,1.5],"uv_offset":[20,6],"faces":{"north":{"uv":[23,9,23,11],"texture":0},"east":{"uv":[20,9,23,11],"texture":0},"south":{"uv":[26,9,26,11],"texture":0},"west":{"uv":[23,9,26,11],"texture":0},"up":{"uv":[23,9,23,6],"texture":0},"down":{"uv":[23,6,23,9],"texture":0}},"type":"cube","uuid":"aca51cab-d64e-5d4e-931f-0d738a3389a3"},{"name":"frontfin_left","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-1.51756,0.47264,-4.25],"to":[-1.51756,3.47264,-1.25],"autouv":0,"color":2,"rotation":[0,0,-27.5],"origin":[-1.42037,2.86877,-3.75],"uv_offset":[6,20],"faces":{"north":{"uv":[9,23,9,26],"texture":0},"east":{"uv":[6,23,9,26],"texture":0},"south":{"uv":[12,23,12,26],"texture":0},"west":{"uv":[9,23,12,26],"texture":0},"up":{"uv":[9,23,9,20],"texture":0},"down":{"uv":[9,20,9,23],"texture":0}},"type":"cube","uuid":"a2947908-4a68-bc73-5ee5-c7cd3cc04422"},{"name":"backfin_left","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-1.42125,1.36609,1.15217],"to":[-1.42125,3.36609,4.15217],"autouv":0,"color":2,"rotation":[25,0,-27.5],"origin":[-1.43949,3.06227,1.5],"uv_offset":[20,6],"faces":{"north":{"uv":[23,9,23,11],"texture":0},"east":{"uv":[20,9,23,11],"texture":0},"south":{"uv":[26,9,26,11],"texture":0},"west":{"uv":[23,9,26,11],"texture":0},"up":{"uv":[23,9,23,6],"texture":0},"down":{"uv":[23,6,23,9],"texture":0}},"type":"cube","uuid":"302f46f8-85d6-cbf4-6b3d-97ab05b37e9a"},{"name":"frontfin_right","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[1.51756,0.47264,-4.25],"to":[1.51756,3.47264,-1.25],"autouv":0,"color":2,"rotation":[0,0,27.5],"origin":[1.42037,2.86877,-3.75],"uv_offset":[6,20],"faces":{"north":{"uv":[9,23,9,26],"texture":0},"east":{"uv":[6,23,9,26],"texture":0},"south":{"uv":[12,23,12,26],"texture":0},"west":{"uv":[9,23,12,26],"texture":0},"up":{"uv":[9,23,9,20],"texture":0},"down":{"uv":[9,20,9,23],"texture":0}},"type":"cube","uuid":"e2250471-02f1-5596-44fc-07f1eca618d4"}],"groups":[{"name":"head","uuid":"b616631c-ddaf-536f-64f5-e2cae53b3bca","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[0,4,-4.25],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":false,"primary_selected":false},{"name":"whiskers","uuid":"1e785a65-218c-5d5c-1a1a-14fd41db118a","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[0,3,0],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"body_front","uuid":"7f0af4a3-4824-8298-1a6e-e31b974f83cf","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[0,3,-0.5],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":false,"primary_selected":false},{"name":"body_back","uuid":"82a32444-b325-6c8c-549a-f1473c024864","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[0,3,0.5],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":false,"primary_selected":false},{"name":"tail","uuid":"fdf1625a-adf0-1cea-66de-ad046f11abdf","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[0,4,3.5],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"frontfin","uuid":"e57f4839-2688-80e7-d3e0-09f50d99c1b1","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-3.5,1.25,-0.25],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"backfin","uuid":"90c3d77f-3a07-123f-f662-1531d74409d3","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[1.93949,2.06227,2.25],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false}],"outliner":[{"uuid":"b616631c-ddaf-536f-64f5-e2cae53b3bca","isOpen":false,"children":["077efc0b-c14d-de3c-2319-668bed46d360",{"uuid":"1e785a65-218c-5d5c-1a1a-14fd41db118a","isOpen":true,"children":["1ad49f8a-4f09-c764-e0f5-f1cfbb73797e","f4211a1b-2e75-d839-9878-64b86b642e30"]}]},{"uuid":"7f0af4a3-4824-8298-1a6e-e31b974f83cf","isOpen":false,"children":["c6c3b227-3f5d-fc43-51ef-b9d201437335",{"uuid":"e57f4839-2688-80e7-d3e0-09f50d99c1b1","isOpen":true,"children":["a2947908-4a68-bc73-5ee5-c7cd3cc04422","e2250471-02f1-5596-44fc-07f1eca618d4"]}]},{"uuid":"82a32444-b325-6c8c-549a-f1473c024864","isOpen":false,"children":["e24adb25-8865-d5d7-8841-5aa98bd5b7da","36f765f5-dedc-aade-94b1-4b647af5f8f6",{"uuid":"90c3d77f-3a07-123f-f662-1531d74409d3","isOpen":true,"children":["302f46f8-85d6-cbf4-6b3d-97ab05b37e9a","aca51cab-d64e-5d4e-931f-0d738a3389a3"]}]},{"uuid":"fdf1625a-adf0-1cea-66de-ad046f11abdf","isOpen":true,"children":["d2546d28-baa8-1c41-f656-4e955035e6f1","7b68ef40-b14b-79f9-d285-e29300f298ba","453b72a4-847b-9f49-c19e-17895bab6f9f"]}],"textures":[{"name":"SpectrumKoi.png","relative_path":"SpectrumKoi.png","folder":"block","namespace":"","id":"1","group":"","scope":0,"width":32,"height":32,"uv_width":32,"uv_height":32,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","file_format":"png","render_mode":"default","render_sides":"auto","wrap_mode":"limited","pbr_channel":"color","fps":7,"frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"f0a32379-cd5e-f2be-0858-9e404b0431f3","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACRUlEQVR4AeyWvUokQRDHe5sNLj04Du5MBPEBRAxMxMCXMDExE8FcEBHBXBAzExNfwkBMDMQnEDFSQQQTA4OFtX/VU2PP0D0fO6uIuOy/q+u7prp6dq3p8BmcHQwH1xdDpaOE6lSAJLy7EmLOTz1tuXYvQBNO/dZdK9q6AG03rc8zTcwa44BM4I4m19VsCgXcb24Ma+yNuXk20m5tvfLhESCrDeQN7OXy6hB4tsFabnXIaxGhrCakdGDu5KiH3d3tC6QS/cX1Xn91qyeUPYBXTM+LrjJIoLQkp/WtuhAE6LqVDvzf2+9RyMzSpJEhO9qV+50KLoOW2WCfsmsilwKihjpkMSW6hSWvcdPvN+/rwBVHV98l6V2xAIIywdC0T6WG5I83T4auVhpmSouDILy72TTTXoF7Imm7s4HPfD1xtuKf2TCgTZMTwBqeNrw28IDWKuBdorXtB3nh4KhYO341Bn/gbFTelPoj0ER4cb4KeJAFPlz5BVco4nDnn5eNuNo+9zaDxAiKyXV6x6GZba7jPaBweonRYvEdiDlQSEw+Zlm6gDEnSoWzhenm7ANL0fGHwyEQR7fcBO4+iBokhOkOUIzCDSEJiKGUfRl/p/6URbW8lZ9WzluhLvC6d5SXC8mVOlHhy/1H0LYIi2M+0akJd9PNywVbpSQrAz0oy6v49BFUeY1R9zUK4GxB7MFS8pjtKDL5McKR4YKGIHlMHtp03csRxJJ8RnKKl1vAZAMECqYZGVDZR1DpwEcEbhrzp4Dv34G6WXgDAAD//wCwSE0AAAAGSURBVAMAjOY0UGzDbPwAAAAASUVORK5CYII="}],"animation_variable_placeholders":"\n","reference_images":[{"name":"Pasted","scope":"project","position":[771,282],"size":[400,372],"source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFcAAABRCAIAAAAo860mAAADYklEQVR4nOyaT0hUURTG79AsYpACjSETTKmY0Vwk6aKgPwvTVYtMQgiDVkHQNpeuWti+IGjnLnUhtSlLqEUWFeOiQiGZMsyYcIIIoZV1GDvnPHt35s6bN3/S77fx886ZN4+Pc887974bTba1m21P1AC4kAMuEHCBgAsEXCDgAgEXCLhAwAUCLhBwgQjiwnB9gvVodsE3ZuzIMdZNrXWmEMvpn77jb5eyrDua633HbffgDnKBgAsEXCBcXdDzfGhu1jdm5twZ1vHeQ/JB01HfeLP8RuLV8NoXmfPmvrqMqi9az49L/FT0myke5AIBFwi4QJTqgq4X8cuD/kGt3aLTr0whYvukL+i8Ijp1J8Va14VkXGKmsqgLQYELBFwgXF3QfbteR1jXCKoX8GjdO2itYxa/Gz8SZ/ezvjHyhLWuC8FALhBwgYALhKsLtjV8R1rmZNzy3asjK+q/B6xuX9opwyd7RC8+9r1OrFvWKQNdn1jb1jXuIBcIuEDABSIS4ikO3Uf0nWpm7VlfPPOf8566YEP1FHoPYvKWrC+C7UEiFwi4QMAFIkwX9PuCh0+XZDx9l7Vej5y/foF1zHLNtfcfJWa3jOs9CP27JmsCgFwg4AIBF4hyueB5blvmat/LF6xj7S2+MT9S7yTm9F5THpALBFwg4AIRpgu6F9DvKWxnDfSZhTrdF6gasavzMOvMI6kjdR0NJjyQCwRcIOACkc8Fl7NJem579v+yha/ZmGhk7ekLLL2D/q2J8TnWeB8RDnCBiJr1dRMWIV4qMHQPEVMk+XJhKPWc9Zg5zrqzp4V1/MAeFSNMvP7AWs/bxKDsL+paYMMWM7UjI3o1Y0oDM+IP63CBgAtEJJlscw/O/ZnpV+caVV34+vkX65UFeTepa0GxTN68x3p0dd7hG0WXRsyIDeACPd3hArHZhZn+Xt84Pf9d0GsEG7ZeYHpaxt1qQalssVwIUBqJLeZCroUPtYP+b9HLmYhLZL5+YbghydrzLlCh9xTnM6IHug4WjLl28QRr3V8MpWb1LYbKJlM2fqJmc6FMy1P/NNnOT0pxBP0C4biOCPgE+pfhBjn7pGvN31rAVHTDBrlA1KYLld65Qy4QLnUhtKLgDHKhGsAFogZdqMJLDeQCAReIgi5U/gFRBZALxG8AAAD//z65z+sAAAAGSURBVAMAO2vZ6sXvRT8AAAAASUVORK5CYII="}]} \ No newline at end of file diff --git a/raw/models/tinting_station.bbmodel b/raw/models/tinting_station.bbmodel new file mode 100644 index 0000000000..f1dedae893 --- /dev/null +++ b/raw/models/tinting_station.bbmodel @@ -0,0 +1 @@ +{"meta":{"format_version":"5.0","model_format":"java_block","box_uv":false},"name":"tinting_station","parent":"","java_block_version":"1.9.0","ambientocclusion":true,"front_gui_light":false,"visible_box":[1,1,0],"variable_placeholders":"","multi_file_ruleset":"","variable_placeholder_buttons":[],"unhandled_root_fields":{},"resolution":{"width":64,"height":64},"elements":[{"name":"cube","box_uv":false,"render_order":"default","rescale":false,"locked":false,"shade":true,"light_emission":0,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[2,16,9],"to":[14,18,12],"autouv":0,"color":9,"origin":[12,10,10],"faces":{"north":{"uv":[40,20,52,22],"texture":0},"east":{"uv":[40,25,43,27],"texture":0},"south":{"uv":[40,20,52,22],"texture":0},"west":{"uv":[43,25,46,27],"texture":0},"up":{"uv":[40,22,52,25],"texture":0},"down":{"uv":[40,22,52,25],"texture":0}},"type":"cube","uuid":"a54de4da-c3d6-7c44-c482-2a8d83cb4d72"},{"name":"cube","box_uv":false,"render_order":"default","rescale":false,"locked":false,"shade":true,"light_emission":0,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[1,0,1],"to":[15,2,15],"autouv":0,"color":7,"origin":[7,0,7],"faces":{"north":{"uv":[14,28,28,30],"texture":0},"east":{"uv":[14,30,28,32],"texture":0},"south":{"uv":[14,32,28,34],"texture":0},"west":{"uv":[14,34,28,36],"texture":0},"up":{"uv":[14,0,28,14],"texture":0},"down":{"uv":[14,14,28,28],"texture":0}},"type":"cube","uuid":"04d93815-2ac0-beef-3454-cfc0741e28c0"},{"name":"cube","box_uv":false,"render_order":"default","rescale":false,"locked":false,"shade":true,"light_emission":0,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[2,2,2],"to":[14,12,14],"autouv":0,"color":2,"origin":[7,2,7],"faces":{"north":{"uv":[28,24,40,34],"texture":0},"east":{"uv":[40,0,52,10],"texture":0},"south":{"uv":[28,34,40,44],"texture":0},"west":{"uv":[40,10,52,20],"texture":0},"up":{"uv":[28,12,40,24],"texture":0},"down":{"uv":[28,0,40,12],"texture":0}},"type":"cube","uuid":"dcf4a469-7a2e-85a2-aa44-341bd21db834"},{"name":"cube","box_uv":false,"render_order":"default","rescale":false,"locked":false,"shade":true,"light_emission":0,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[1,12,1],"to":[15,16,15],"autouv":0,"color":1,"origin":[7,12,7],"faces":{"north":{"uv":[0,28,14,32],"texture":0},"east":{"uv":[0,32,14,36],"texture":0},"south":{"uv":[0,36,14,40],"texture":0},"west":{"uv":[0,40,14,44],"texture":0},"up":{"uv":[0,0,14,14],"texture":0},"down":{"uv":[0,14,14,28],"texture":0}},"type":"cube","uuid":"ab2516ce-be85-f630-198c-a18ee6781be1"},{"name":"cube","box_uv":false,"render_order":"default","rescale":false,"locked":false,"shade":true,"light_emission":0,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[0.9,18.9,11],"to":[15.1,22.9,15],"autouv":0,"color":8,"rotation":[45,0,0],"origin":[7,18.9,7],"faces":{"north":{"uv":[14,36,28,40],"texture":0},"east":{"uv":[14,40,18,44],"texture":0},"south":{"uv":[14,44,28,48],"texture":0},"west":{"uv":[18,40,22,44],"texture":0},"up":{"uv":[14,36,28,40],"texture":0},"down":{"uv":[0,44,14,48],"texture":0}},"type":"cube","uuid":"ec9a58c2-6ffe-1ad3-6071-3de0a66fc46f"},{"name":"cube","box_uv":false,"render_order":"default","rescale":false,"locked":false,"shade":true,"light_emission":0,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[11,18,9],"to":[14,19,12],"autouv":0,"color":0,"origin":[12,12,10],"faces":{"north":{"uv":[40,33,43,34],"texture":0},"east":{"uv":[40,32,43,33],"texture":0},"south":{"uv":[40,31,43,32],"texture":0},"west":{"uv":[40,30,43,31],"texture":0},"up":{"uv":[40,27,43,30],"texture":0},"down":{"uv":[40,27,43,30],"texture":0}},"type":"cube","uuid":"8a2aa886-46ab-76fd-f9a6-f3959858be56"},{"name":"cube","box_uv":false,"render_order":"default","rescale":false,"locked":false,"shade":true,"light_emission":0,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[8,18,9],"to":[11,19,12],"autouv":0,"color":1,"origin":[9,12,10],"faces":{"north":{"uv":[43,30,46,31],"texture":0},"east":{"uv":[43,33,46,34],"texture":0},"south":{"uv":[43,32,46,33],"texture":0},"west":{"uv":[43,31,46,32],"texture":0},"up":{"uv":[43,27,46,30],"texture":0},"down":{"uv":[43,27,46,30],"texture":0}},"type":"cube","uuid":"d504d9a8-2f8c-b875-e20b-616ee387ac61"},{"name":"cube","box_uv":false,"render_order":"default","rescale":false,"locked":false,"shade":true,"light_emission":0,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[5,18,9],"to":[8,19,12],"autouv":0,"color":4,"origin":[6,12,10],"faces":{"north":{"uv":[46,30,49,31],"texture":0},"east":{"uv":[46,33,49,34],"texture":0},"south":{"uv":[46,32,49,33],"texture":0},"west":{"uv":[46,31,49,32],"texture":0},"up":{"uv":[46,27,49,30],"texture":0},"down":{"uv":[46,27,49,30],"texture":0}},"type":"cube","uuid":"1cf5c7d8-28c2-d922-2f01-80f953926ca8"}],"groups":[{"name":"body","uuid":"6fb10ab1-0714-475e-1555-0675f22f69cb","export":true,"locked":false,"scope":0,"selected":false,"visibility":true,"_static":{"properties":{},"temp_data":{}},"origin":[7,0,7],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"flasks","uuid":"0cb5bd28-530c-6dac-9226-6b9b17bd7587","export":true,"locked":false,"scope":0,"selected":false,"visibility":true,"_static":{"properties":{},"temp_data":{}},"origin":[6,12,10],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"autouv":0,"isOpen":true,"primary_selected":false}],"outliner":[{"uuid":"0cb5bd28-530c-6dac-9226-6b9b17bd7587","isOpen":true,"children":["1cf5c7d8-28c2-d922-2f01-80f953926ca8","8a2aa886-46ab-76fd-f9a6-f3959858be56","d504d9a8-2f8c-b875-e20b-616ee387ac61"]},"a54de4da-c3d6-7c44-c482-2a8d83cb4d72","ec9a58c2-6ffe-1ad3-6071-3de0a66fc46f",{"uuid":"6fb10ab1-0714-475e-1555-0675f22f69cb","isOpen":true,"children":["04d93815-2ac0-beef-3454-cfc0741e28c0","ab2516ce-be85-f630-198c-a18ee6781be1","dcf4a469-7a2e-85a2-aa44-341bd21db834"]}],"textures":[{"name":"tinting_station.png","relative_path":"tinting_station.png","folder":"","namespace":"","id":"0","group":"","scope":0,"width":64,"height":64,"uv_width":64,"uv_height":64,"particle":true,"use_as_default":false,"layers_enabled":true,"sync_to_project":"","file_format":"png","render_mode":"default","render_sides":"auto","wrap_mode":"limited","pbr_channel":"color","fps":7,"frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"45a695e4-9d5c-6be9-ce0d-8e577a412021","layers":[{"type":"pixel_layer","name":"layer #2","parent_uuid":"","offset":[0,0],"scale":[1,1],"opacity":100,"visible":true,"blend_mode":"default","width":64,"height":64,"data_url":"data:image/png;base64,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"}],"source":"data:image/png;base64,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"}],"reference_images":[{"name":"Pasted","scope":"project","position":[939,138],"size":[651,218],"plane_position":[0,0,16],"plane_rotation":[0,180,0],"source":"data:image/png;base64,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"}]} \ No newline at end of file diff --git a/raw/models/tinting_station_slab.bbmodel b/raw/models/tinting_station_slab.bbmodel new file mode 100644 index 0000000000..4681ecce50 --- /dev/null +++ b/raw/models/tinting_station_slab.bbmodel @@ -0,0 +1 @@ +{"meta":{"format_version":"5.0","model_format":"java_block","box_uv":false},"name":"tinting_station_slab","parent":"","java_block_version":"1.9.0","ambientocclusion":true,"front_gui_light":false,"visible_box":[1,1,0],"variable_placeholders":"","multi_file_ruleset":"","variable_placeholder_buttons":[],"unhandled_root_fields":{},"resolution":{"width":64,"height":64},"elements":[{"name":"cube","box_uv":false,"render_order":"default","rescale":false,"locked":false,"shade":true,"light_emission":0,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[2,4,9],"to":[14,6,12],"autouv":0,"color":9,"origin":[12,-2,10],"faces":{"north":{"uv":[40,20,52,22],"texture":0},"east":{"uv":[40,25,43,27],"texture":0},"south":{"uv":[40,20,52,22],"texture":0},"west":{"uv":[43,25,46,27],"texture":0},"up":{"uv":[40,22,52,25],"texture":0},"down":{"uv":[40,22,52,25],"texture":0}},"type":"cube","uuid":"a54de4da-c3d6-7c44-c482-2a8d83cb4d72"},{"name":"cube","box_uv":false,"render_order":"default","rescale":false,"locked":false,"shade":true,"light_emission":0,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[1,0,1],"to":[15,4,15],"autouv":0,"color":1,"origin":[7,0,7],"faces":{"north":{"uv":[0,28,14,32],"texture":0},"east":{"uv":[0,32,14,36],"texture":0},"south":{"uv":[0,36,14,40],"texture":0},"west":{"uv":[0,40,14,44],"texture":0},"up":{"uv":[0,0,14,14],"texture":0},"down":{"uv":[0,14,14,28],"texture":0}},"type":"cube","uuid":"ab2516ce-be85-f630-198c-a18ee6781be1"},{"name":"cube","box_uv":false,"render_order":"default","rescale":false,"locked":false,"shade":true,"light_emission":0,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[0.9,6.9,11],"to":[15.1,10.9,15],"autouv":0,"color":8,"rotation":[45,0,0],"origin":[7,6.9,7],"faces":{"north":{"uv":[14,36,28,40],"texture":0},"east":{"uv":[14,40,18,44],"texture":0},"south":{"uv":[14,44,28,48],"texture":0},"west":{"uv":[18,40,22,44],"texture":0},"up":{"uv":[14,36,28,40],"texture":0},"down":{"uv":[0,44,14,48],"texture":0}},"type":"cube","uuid":"ec9a58c2-6ffe-1ad3-6071-3de0a66fc46f"},{"name":"cube","box_uv":false,"render_order":"default","rescale":false,"locked":false,"shade":true,"light_emission":0,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[11,6,9],"to":[14,7,12],"autouv":0,"color":0,"origin":[12,0,10],"faces":{"north":{"uv":[40,33,43,34],"texture":0},"east":{"uv":[40,32,43,33],"texture":0},"south":{"uv":[40,31,43,32],"texture":0},"west":{"uv":[40,30,43,31],"texture":0},"up":{"uv":[40,27,43,30],"texture":0},"down":{"uv":[40,27,43,30],"texture":0}},"type":"cube","uuid":"8a2aa886-46ab-76fd-f9a6-f3959858be56"},{"name":"cube","box_uv":false,"render_order":"default","rescale":false,"locked":false,"shade":true,"light_emission":0,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[8,6,9],"to":[11,7,12],"autouv":0,"color":1,"origin":[9,0,10],"faces":{"north":{"uv":[43,30,46,31],"texture":0},"east":{"uv":[43,33,46,34],"texture":0},"south":{"uv":[43,32,46,33],"texture":0},"west":{"uv":[43,31,46,32],"texture":0},"up":{"uv":[43,27,46,30],"texture":0},"down":{"uv":[43,27,46,30],"texture":0}},"type":"cube","uuid":"d504d9a8-2f8c-b875-e20b-616ee387ac61"},{"name":"cube","box_uv":false,"render_order":"default","rescale":false,"locked":false,"shade":true,"light_emission":0,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[5,6,9],"to":[8,7,12],"autouv":0,"color":4,"origin":[6,0,10],"faces":{"north":{"uv":[46,30,49,31],"texture":0},"east":{"uv":[46,33,49,34],"texture":0},"south":{"uv":[46,32,49,33],"texture":0},"west":{"uv":[46,31,49,32],"texture":0},"up":{"uv":[46,27,49,30],"texture":0},"down":{"uv":[46,27,49,30],"texture":0}},"type":"cube","uuid":"1cf5c7d8-28c2-d922-2f01-80f953926ca8"}],"groups":[{"name":"body","uuid":"6fb10ab1-0714-475e-1555-0675f22f69cb","export":true,"locked":false,"scope":0,"selected":false,"visibility":true,"_static":{"properties":{},"temp_data":{}},"origin":[7,0,7],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"flasks","uuid":"0cb5bd28-530c-6dac-9226-6b9b17bd7587","export":true,"locked":false,"scope":0,"selected":false,"visibility":true,"_static":{"properties":{},"temp_data":{}},"origin":[6,12,10],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"autouv":0,"isOpen":true,"primary_selected":false}],"outliner":[{"uuid":"0cb5bd28-530c-6dac-9226-6b9b17bd7587","isOpen":true,"children":["1cf5c7d8-28c2-d922-2f01-80f953926ca8","8a2aa886-46ab-76fd-f9a6-f3959858be56","d504d9a8-2f8c-b875-e20b-616ee387ac61"]},"a54de4da-c3d6-7c44-c482-2a8d83cb4d72","ec9a58c2-6ffe-1ad3-6071-3de0a66fc46f",{"uuid":"6fb10ab1-0714-475e-1555-0675f22f69cb","isOpen":true,"children":["ab2516ce-be85-f630-198c-a18ee6781be1"]}],"textures":[{"name":"tinting_station-slab.png","relative_path":"tinting_station-slab.png","folder":"","namespace":"","id":"0","group":"","scope":0,"width":64,"height":64,"uv_width":64,"uv_height":64,"particle":true,"use_as_default":false,"layers_enabled":true,"sync_to_project":"","file_format":"png","render_mode":"default","render_sides":"auto","wrap_mode":"limited","pbr_channel":"color","fps":7,"frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"45a695e4-9d5c-6be9-ce0d-8e577a412021","layers":[{"type":"pixel_layer","name":"layer #2","parent_uuid":"","offset":[0,0],"scale":[1,1],"opacity":100,"visible":true,"blend_mode":"default","width":64,"height":64,"data_url":"data:image/png;base64,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"}],"source":"data:image/png;base64,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"}],"reference_images":[{"name":"Pasted","scope":"project","position":[939,138],"size":[651,218],"plane_position":[0,0,16],"plane_rotation":[0,180,0],"source":"data:image/png;base64,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"}]} \ No newline at end of file diff --git a/raw/wip/guidebook/general/spectral_shard.json b/raw/wip/guidebook/general/spectral_shard.json index 5d6152cd69..d501d8b474 100644 --- a/raw/wip/guidebook/general/spectral_shard.json +++ b/raw/wip/guidebook/general/spectral_shard.json @@ -1,7 +1,7 @@ { "name": "Spectral Shard", "advancement": "spectrum:unlocks/resources/spectral_shard", - "secret": true, + "reveal_secret_advancement": "spectrum:TODO", "icon": "spectrum:spectral_shard", "category": "spectrum:general", "turnin": "spectrum:endgame/create_spectral_shard", diff --git a/raw/wip/guidebook/lore/pale_metal.json b/raw/wip/guidebook/lore/pale_metal.json index 8c7cdb4fa6..c00923d5c7 100644 --- a/raw/wip/guidebook/lore/pale_metal.json +++ b/raw/wip/guidebook/lore/pale_metal.json @@ -1,7 +1,7 @@ { "name": "Silver and Ivory", "icon": "spectrum:malachite_workstaff", - "secret": true, + "reveal_secret_advancement": "spectrum:TODO", "advancement": "spectrum:unlocks/malachite/malachite_tools", "category": "spectrum:lore", "pages": [ diff --git a/raw/wip/guidebook/magic/artists_palette.json b/raw/wip/guidebook/magic/artists_palette.json index 5e96ac170b..d36abfead4 100644 --- a/raw/wip/guidebook/magic/artists_palette.json +++ b/raw/wip/guidebook/magic/artists_palette.json @@ -1,7 +1,7 @@ { "name": "Artist's Palette", "advancement": "spectrum:unlocks/trinkets/artists_palette", - "secret": true, + "reveal_secret_advancement": "spectrum:TODO", "icon": "spectrum:artists_palette", "category": "spectrum:ink", "extra_recipe_mappings": { diff --git a/raw/wip/guidebook/magic/spirit_sallow.json b/raw/wip/guidebook/magic/spirit_sallow.json index 4a20d30fa7..c7f5ad28b5 100644 --- a/raw/wip/guidebook/magic/spirit_sallow.json +++ b/raw/wip/guidebook/magic/spirit_sallow.json @@ -1,7 +1,7 @@ { "name": "Spirit Sallow", "advancement": "spectrum:unlocks/blocks/ominous_sapling", - "secret": true, + "reveal_secret_advancement": "spectrum:TODO", "icon": "spectrum:ominous_sapling", "category": "spectrum:ink", "priority": true, diff --git a/raw/wip/guidebook/pastel_network/node_coloring.json b/raw/wip/guidebook/pastel_network/node_coloring.json index 9548d1894f..dd8ebdeeca 100644 --- a/raw/wip/guidebook/pastel_network/node_coloring.json +++ b/raw/wip/guidebook/pastel_network/node_coloring.json @@ -4,7 +4,7 @@ "advancement": "spectrum:unlocks/milestones/__todo_unlock_pastel_node_coloring", "category": "spectrum:pastel_network", "priority": true, - "secret": true, + "reveal_secret_advancement": "spectrum:TODO", "pages": [ { "type": "modonomicon:spotlight", diff --git a/src/main/java/de/dafuqs/spectrum/SpectrumClient.java b/src/main/java/de/dafuqs/spectrum/SpectrumClient.java index 0ea5fd9862..11c361d8d8 100644 --- a/src/main/java/de/dafuqs/spectrum/SpectrumClient.java +++ b/src/main/java/de/dafuqs/spectrum/SpectrumClient.java @@ -41,11 +41,15 @@ public SpectrumClient(IEventBus modBus, ModContainer modContainer) { modBus.addListener(SpectrumModelPredicateProviders::registerClient); modBus.addListener(SpectrumEntityRenderers::registerClient); modBus.addListener(SpectrumParticleFactories::register); - modBus.addListener(HudRenderers::register); - NeoForge.EVENT_BUS.addListener(HudRenderers::registerPost); + modBus.addListener(SpectrumFluids::registerClient); + modBus.addListener(SpectrumBlockEntities::registerClient); + modBus.addListener(SpectrumMenuTypes::registerClient); + modBus.addListener(SpectrumModelLayerLocations::register); + modBus.addListener(BedrockCapeRenderer::registerLayers); + modBus.addListener(SpectrumColorProviders::registerBlocks); + modBus.addListener(SpectrumColorProviders::registerItems); - NeoForge.EVENT_BUS.addListener(HudRenderers::registerPost); SpectrumEnvironmentalDataOverrides.register(); SpectrumClientEventListeners.register(modBus); @@ -55,15 +59,6 @@ public SpectrumClient(IEventBus modBus, ModContainer modContainer) { RevealingCallback.register(this); ClientAdvancementPacketCallback.registerCallback(this); - - modBus.addListener(SpectrumFluids::registerClient); - modBus.addListener(SpectrumBlockEntities::registerClient); - modBus.addListener(SpectrumScreenHandlerTypes::registerClient); - modBus.addListener(SpectrumModelLayerLocations::register); - modBus.addListener(BedrockCapeRenderer::registerLayers); - - modBus.addListener(SpectrumColorProviders::registerBlocks); - modBus.addListener(SpectrumColorProviders::registerItems); } @Override diff --git a/src/main/java/de/dafuqs/spectrum/SpectrumCommon.java b/src/main/java/de/dafuqs/spectrum/SpectrumCommon.java index 20dc5447b8..6cb9a9c973 100644 --- a/src/main/java/de/dafuqs/spectrum/SpectrumCommon.java +++ b/src/main/java/de/dafuqs/spectrum/SpectrumCommon.java @@ -1,10 +1,10 @@ package de.dafuqs.spectrum; import de.dafuqs.spectrum.api.color.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.attachment_types.*; import de.dafuqs.spectrum.blocks.pastel_network.*; -import de.dafuqs.spectrum.blocks.pastel_network.payloads.PastelPayload; +import de.dafuqs.spectrum.blocks.pastel_network.payloads.*; import de.dafuqs.spectrum.capabilities.*; import de.dafuqs.spectrum.compat.*; import de.dafuqs.spectrum.config.*; @@ -21,9 +21,7 @@ import de.dafuqs.spectrum.sound.*; import net.minecraft.resources.*; import net.minecraft.server.*; -import net.minecraft.tags.*; import net.minecraft.world.entity.player.*; -import net.minecraft.world.item.*; import net.minecraft.world.item.crafting.*; import net.minecraft.world.level.*; import net.neoforged.bus.api.*; @@ -33,11 +31,12 @@ import net.neoforged.fml.event.lifecycle.*; import net.neoforged.neoforge.common.*; import net.neoforged.neoforge.event.*; +import net.neoforged.neoforge.event.entity.player.*; import net.neoforged.neoforge.event.server.*; import net.neoforged.neoforge.event.tick.*; import net.neoforged.neoforge.network.event.*; import net.neoforged.neoforge.network.registration.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import org.slf4j.*; import java.util.*; @@ -49,9 +48,7 @@ public class SpectrumCommon { public static final String MOD_ID = "spectrum"; public static final Logger LOGGER = LoggerFactory.getLogger("Spectrum"); - // Todo: move to filter classes - public static final Map> CACHED_ITEM_TAG_MAP = new HashMap<>(); - + public static void logInfo(String message) { LOGGER.info("{}", message); } @@ -124,9 +121,9 @@ public SpectrumCommon(ModContainer container, IEventBus modBus) { SpectrumItemGroups.register(modBus); logInfo("Registering Block Entities..."); SpectrumBlockEntities.register(modBus); - PastelPayload.register(modBus); + SpectrumPastelPayloadTypes.register(modBus); + SpectrumPastelPayloads.register(modBus); modBus.addListener(SpectrumBlockEntities::addBlockEntityTypeBlocks); - SpectrumPastelUpgradeSignatures.register(modBus); // Worldgen logInfo("Registering Features..."); @@ -140,8 +137,7 @@ public SpectrumCommon(ModContainer container, IEventBus modBus) { // Recipes logInfo("Registering Recipe Types..."); - SpectrumRecipeScalings.init(); - SpectrumFusionShrineWorldEffects.register(modBus); + SpectrumWorldEffects.register(modBus); SpectrumRecipeTypes.register(modBus); SpectrumRecipeSerializers.register(modBus); @@ -153,7 +149,7 @@ public SpectrumCommon(ModContainer container, IEventBus modBus) { // GUI logInfo("Registering Screen Handler Types..."); - SpectrumScreenHandlerTypes.register(modBus); + SpectrumMenuTypes.register(modBus); logInfo("Registering Enchantment Drops..."); SpectrumGlobalLootModifierSerializers.register(modBus); @@ -227,6 +223,8 @@ public SpectrumCommon(ModContainer container, IEventBus modBus) { SpectrumEventListeners.register(); logInfo("Registering Tree Decorator Types..."); SpectrumTreeDecoratorTypes.register(modBus); + logInfo("Registering Cat Variants..."); + SpectrumCatVariants.register(modBus); logInfo("Registering Attachments..."); SpectrumAttachmentTypes.register(modBus); diff --git a/src/main/java/de/dafuqs/spectrum/api/block/AzureAuraEmitting.java b/src/main/java/de/dafuqs/spectrum/api/block/AzureAuraEmitting.java index 927e0e80f3..dc47c03fc0 100644 --- a/src/main/java/de/dafuqs/spectrum/api/block/AzureAuraEmitting.java +++ b/src/main/java/de/dafuqs/spectrum/api/block/AzureAuraEmitting.java @@ -1,5 +1,14 @@ package de.dafuqs.spectrum.api.block; +import de.dafuqs.spectrum.helpers.*; +import de.dafuqs.spectrum.particle.*; +import de.dafuqs.spectrum.sound.*; +import net.minecraft.core.*; +import net.minecraft.world.entity.player.*; +import net.minecraft.world.level.*; +import net.minecraft.world.level.block.state.*; +import net.minecraft.world.phys.*; + /** * Blocks with this interface increase nearby azure auras. * They regularity need to call @@ -7,5 +16,11 @@ * clientside, like via `animateTick`, to add them to an azure aura */ public interface AzureAuraEmitting { - + + default void onBreak(Level world, BlockPos pos) { + ParticleHelper.playTriangulatedParticle(world, SpectrumParticleTypes.AZURE_AURA, 1, false, Vec3.ZERO, 0, true, Vec3.atCenterOf(pos), new Vec3(0, 0.08D + world.getRandom().nextDouble() * 0.04, 0)); + ParticleHelper.playParticleAroundBlockSides(world, SpectrumParticleTypes.AZURE_MOTE_SMALL, pos, Direction.values(), 3, Vec3.ZERO); + BlockAuraSoundInstance.removeFromSoundInstances(world, pos); + } + } diff --git a/src/main/java/de/dafuqs/spectrum/api/block/ColorableBlock.java b/src/main/java/de/dafuqs/spectrum/api/block/ColorableBlock.java index 4023919c27..11b228cca4 100644 --- a/src/main/java/de/dafuqs/spectrum/api/block/ColorableBlock.java +++ b/src/main/java/de/dafuqs/spectrum/api/block/ColorableBlock.java @@ -7,7 +7,7 @@ import net.minecraft.world.entity.player.*; import net.minecraft.world.item.*; import net.minecraft.world.level.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/api/block/FilterConfigurable.java b/src/main/java/de/dafuqs/spectrum/api/block/FilterConfigurable.java index 8627691b9b..06c8292fa0 100644 --- a/src/main/java/de/dafuqs/spectrum/api/block/FilterConfigurable.java +++ b/src/main/java/de/dafuqs/spectrum/api/block/FilterConfigurable.java @@ -1,6 +1,5 @@ package de.dafuqs.spectrum.api.block; -import de.dafuqs.spectrum.*; import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.inventories.slots.*; import de.dafuqs.spectrum.networking.c2s_payloads.*; @@ -20,12 +19,21 @@ import net.minecraft.world.item.*; import net.neoforged.neoforge.network.*; import org.apache.commons.lang3.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; public interface FilterConfigurable { + // 'effectively' private + class Cache { + private static final Map> CACHED_ITEM_TAG_MAP = new HashMap<>(); + } + + static void invalidateCache() { + Cache.CACHED_ITEM_TAG_MAP.clear(); + } + default Object2BooleanMap> getFilteredTags() { return Object2BooleanMaps.emptyMap(); } @@ -96,7 +104,7 @@ default boolean addTagFilteringItem(ItemStack itemVariant) { } // Copied from PastelNodeBlockEntity. This entire section could potentially be a candidate to move into its own function. - TagKey tag = SpectrumCommon.CACHED_ITEM_TAG_MAP.computeIfAbsent(identifier, tagId -> BuiltInRegistries.ITEM.getTagNames() + TagKey tag = Cache.CACHED_ITEM_TAG_MAP.computeIfAbsent(identifier, tagId -> BuiltInRegistries.ITEM.getTagNames() .filter(t -> t.location().equals(tagId)) .findFirst() .orElse(null)); @@ -223,7 +231,7 @@ default boolean hasEmptyFilter() { record ExtendedData(List filterItems, int rows, int slotsPerRow, int drawnSlots) { - public static final StreamCodec PACKET_CODEC = StreamCodec.composite( + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( ItemStack.OPTIONAL_STREAM_CODEC.apply(ByteBufCodecs.list()), ExtendedData::filterItems, ByteBufCodecs.VAR_INT, ExtendedData::rows, ByteBufCodecs.VAR_INT, ExtendedData::slotsPerRow, @@ -239,9 +247,9 @@ public ExtendedDataWithPos(BlockPos pos, FilterConfigurable configurable) { this(pos, new ExtendedData(configurable.getItemFilters(), configurable.getFilterRows(), configurable.getSlotsPerRow(), configurable.getDrawnSlots())); } - public static final StreamCodec PACKET_CODEC = StreamCodec.composite( + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( BlockPos.STREAM_CODEC, c -> c.pos, - ExtendedData.PACKET_CODEC, c -> c.data, + ExtendedData.STREAM_CODEC, c -> c.data, ExtendedDataWithPos::new ); diff --git a/src/main/java/de/dafuqs/spectrum/api/block/GatedGuidebookPage.java b/src/main/java/de/dafuqs/spectrum/api/block/GatedGuidebookPage.java index f4b73bf38c..a2721662aa 100644 --- a/src/main/java/de/dafuqs/spectrum/api/block/GatedGuidebookPage.java +++ b/src/main/java/de/dafuqs/spectrum/api/block/GatedGuidebookPage.java @@ -30,7 +30,7 @@ static void runSanityCheck(ResourceLocation entryId, int pageNr, String pageAdva SpectrumCommon.logWarning("Guidebook page " + entryId + " page " + pageNr + " is missing its recipe"); continue; } - Optional recipeAdvId = recipe.getRequiredAdvancementIdentifier(); + Optional recipeAdvId = recipe.getRequiredAdvancement(); ResourceLocation combinedAdvId = recipeAdvId.orElse(recipe.getRecipeTypeUnlockIdentifier()); if (combinedAdvId == null) { SpectrumCommon.logWarning("Guidebook page " + entryId + "[" + pageNr + "] references advancement " + pageAdvancement + " for a recipe that does not have an unlock: " + recipeAdvId); diff --git a/src/main/java/de/dafuqs/spectrum/api/block/ImplementedInventory.java b/src/main/java/de/dafuqs/spectrum/api/block/ImplementedInventory.java index f743803254..f415a71b68 100644 --- a/src/main/java/de/dafuqs/spectrum/api/block/ImplementedInventory.java +++ b/src/main/java/de/dafuqs/spectrum/api/block/ImplementedInventory.java @@ -4,7 +4,6 @@ import net.minecraft.world.*; import net.minecraft.world.entity.player.*; import net.minecraft.world.item.*; -import javax.annotation.*; /** * A simple {@code Inventory} implementation with only default methods + an item list getter. diff --git a/src/main/java/de/dafuqs/spectrum/api/block/InkColorSelectedPacketReceiver.java b/src/main/java/de/dafuqs/spectrum/api/block/InkColorSelectedPacketReceiver.java index c5bff7145d..08f5cdb7ec 100644 --- a/src/main/java/de/dafuqs/spectrum/api/block/InkColorSelectedPacketReceiver.java +++ b/src/main/java/de/dafuqs/spectrum/api/block/InkColorSelectedPacketReceiver.java @@ -1,9 +1,9 @@ package de.dafuqs.spectrum.api.block; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import net.minecraft.core.*; import net.minecraft.world.level.block.entity.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/api/block/MoonstoneStrikeableBlock.java b/src/main/java/de/dafuqs/spectrum/api/block/MoonstoneStrikeableBlock.java index db43150e79..7f93759110 100644 --- a/src/main/java/de/dafuqs/spectrum/api/block/MoonstoneStrikeableBlock.java +++ b/src/main/java/de/dafuqs/spectrum/api/block/MoonstoneStrikeableBlock.java @@ -3,7 +3,7 @@ import net.minecraft.core.*; import net.minecraft.world.entity.*; import net.minecraft.world.level.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public interface MoonstoneStrikeableBlock { diff --git a/src/main/java/de/dafuqs/spectrum/api/block/MultiblockCrafter.java b/src/main/java/de/dafuqs/spectrum/api/block/MultiblockCrafter.java index 5cb73c061b..8080527f77 100644 --- a/src/main/java/de/dafuqs/spectrum/api/block/MultiblockCrafter.java +++ b/src/main/java/de/dafuqs/spectrum/api/block/MultiblockCrafter.java @@ -13,7 +13,7 @@ import net.minecraft.world.item.crafting.*; import net.minecraft.world.level.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public interface MultiblockCrafter extends Upgradeable, PlayerOwned { diff --git a/src/main/java/de/dafuqs/spectrum/api/block/PlayerOwned.java b/src/main/java/de/dafuqs/spectrum/api/block/PlayerOwned.java index 848dc82b70..d37d439aee 100644 --- a/src/main/java/de/dafuqs/spectrum/api/block/PlayerOwned.java +++ b/src/main/java/de/dafuqs/spectrum/api/block/PlayerOwned.java @@ -1,11 +1,10 @@ package de.dafuqs.spectrum.api.block; -import de.dafuqs.spectrum.*; import net.minecraft.nbt.*; import net.minecraft.server.level.*; import net.minecraft.world.entity.player.*; import net.minecraft.world.level.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/api/block/PlayerOwnedWithName.java b/src/main/java/de/dafuqs/spectrum/api/block/PlayerOwnedWithName.java index d271380851..80074a9ac8 100644 --- a/src/main/java/de/dafuqs/spectrum/api/block/PlayerOwnedWithName.java +++ b/src/main/java/de/dafuqs/spectrum/api/block/PlayerOwnedWithName.java @@ -3,19 +3,20 @@ import net.minecraft.nbt.*; import net.minecraft.world.entity.player.*; import net.minecraft.world.scores.*; +import org.jspecify.annotations.*; import java.util.*; public interface PlayerOwnedWithName extends PlayerOwned { - static UUID readOwnerUUID(CompoundTag nbt) { + static @Nullable UUID readOwnerUUID(CompoundTag nbt) { if (nbt.contains("OwnerUUID")) { return nbt.getUUID("OwnerUUID"); } return null; } - static void writeOwnerName(CompoundTag nbt, String ownerName) { + static void writeOwnerName(CompoundTag nbt, @Nullable String ownerName) { if (ownerName != null) { nbt.putString("OwnerName", ownerName); } @@ -28,13 +29,16 @@ static String readOwnerName(CompoundTag nbt) { return "???"; } - String getOwnerName(); + @Nullable String getOwnerName(); default boolean isOwnerOrSameTeamAsOwner(Player player) { - if(getOwnerUUID().equals(player.getUUID())) { + UUID ownerUUID = getOwnerUUID(); + if(ownerUUID == null) { + return false; + } + if(ownerUUID.equals(player.getUUID())) { return true; } - PlayerTeam team = player.getTeam(); return team != null && team.getPlayers().contains(getOwnerName()); } diff --git a/src/main/java/de/dafuqs/spectrum/api/block/StrippableDrop.java b/src/main/java/de/dafuqs/spectrum/api/block/StrippableDrop.java index c3aad19234..de3eaaba65 100644 --- a/src/main/java/de/dafuqs/spectrum/api/block/StrippableDrop.java +++ b/src/main/java/de/dafuqs/spectrum/api/block/StrippableDrop.java @@ -13,7 +13,7 @@ import net.minecraft.world.level.storage.loot.*; import net.minecraft.world.level.storage.loot.parameters.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/api/block/package-info.java b/src/main/java/de/dafuqs/spectrum/api/block/package-info.java index 65c133c2f8..cd1d120d58 100644 --- a/src/main/java/de/dafuqs/spectrum/api/block/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/api/block/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.api.block; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/api/color/ColorRegistry.java b/src/main/java/de/dafuqs/spectrum/api/color/ColorRegistry.java index 98a8434bde..63c0b66503 100644 --- a/src/main/java/de/dafuqs/spectrum/api/color/ColorRegistry.java +++ b/src/main/java/de/dafuqs/spectrum/api/color/ColorRegistry.java @@ -1,14 +1,11 @@ package de.dafuqs.spectrum.api.color; -import de.dafuqs.spectrum.api.energy.color.*; import de.dafuqs.spectrum.data_loaders.*; import net.minecraft.core.registries.*; import net.minecraft.world.item.*; import net.minecraft.world.level.material.*; import net.neoforged.neoforge.event.*; -import java.util.*; - public abstract class ColorRegistry { public static ColorMappingDataLoader ITEM_COLORS = new ColorMappingDataLoader<>("item", BuiltInRegistries.ITEM); diff --git a/src/main/java/de/dafuqs/spectrum/api/color/package-info.java b/src/main/java/de/dafuqs/spectrum/api/color/package-info.java index b91f6deb31..1181ad754a 100644 --- a/src/main/java/de/dafuqs/spectrum/api/color/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/api/color/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.api.color; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/api/damage_type/StackTracking.java b/src/main/java/de/dafuqs/spectrum/api/damage_type/StackTracking.java deleted file mode 100644 index 4e693bca1f..0000000000 --- a/src/main/java/de/dafuqs/spectrum/api/damage_type/StackTracking.java +++ /dev/null @@ -1,13 +0,0 @@ -package de.dafuqs.spectrum.api.damage_type; - -import net.minecraft.world.item.*; - -import java.util.*; - -// TODO: remove if possible -public interface StackTracking { - - Optional spectrum$getTrackedStack(); - - void spectrum$setTrackedStack(ItemStack stack); -} diff --git a/src/main/java/de/dafuqs/spectrum/api/damage_type/package-info.java b/src/main/java/de/dafuqs/spectrum/api/damage_type/package-info.java deleted file mode 100644 index 9a9dce56b5..0000000000 --- a/src/main/java/de/dafuqs/spectrum/api/damage_type/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@NullMarked -@MethodsReturnNonnullByDefault -@FieldsAreNonnullByDefault -package de.dafuqs.spectrum.api.damage_type; - -import net.minecraft.*; -import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/de/dafuqs/spectrum/api/energy/InkAmount.java b/src/main/java/de/dafuqs/spectrum/api/energy/InkAmount.java deleted file mode 100644 index 0561d627ca..0000000000 --- a/src/main/java/de/dafuqs/spectrum/api/energy/InkAmount.java +++ /dev/null @@ -1,22 +0,0 @@ -package de.dafuqs.spectrum.api.energy; - -import com.mojang.serialization.*; -import com.mojang.serialization.codecs.*; -import de.dafuqs.spectrum.api.energy.color.*; -import io.netty.buffer.*; -import net.minecraft.network.codec.*; - -public record InkAmount(InkColor color, long amount) { - - public static final Codec CODEC = RecordCodecBuilder.create(i -> i.group( - InkColor.CODEC.fieldOf("color").forGetter(InkAmount::color), - Codec.LONG.fieldOf("amount").forGetter(InkAmount::amount) - ).apply(i, InkAmount::new)); - - public static final StreamCodec PACKET_CODEC = StreamCodec.composite( - InkColor.PACKET_CODEC, InkAmount::color, - ByteBufCodecs.VAR_LONG, InkAmount::amount, - InkAmount::new - ); - -} \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/api/energy/InkPoweredStatusEffectInstance.java b/src/main/java/de/dafuqs/spectrum/api/energy/InkPoweredStatusEffectInstance.java deleted file mode 100644 index 55bfa94a53..0000000000 --- a/src/main/java/de/dafuqs/spectrum/api/energy/InkPoweredStatusEffectInstance.java +++ /dev/null @@ -1,136 +0,0 @@ -package de.dafuqs.spectrum.api.energy; - -import com.google.common.collect.*; -import com.mojang.serialization.*; -import com.mojang.serialization.codecs.*; -import de.dafuqs.spectrum.components.*; -import de.dafuqs.spectrum.helpers.*; -import de.dafuqs.spectrum.registries.*; -import net.minecraft.*; -import net.minecraft.core.*; -import net.minecraft.network.*; -import net.minecraft.network.chat.*; -import net.minecraft.network.codec.*; -import net.minecraft.util.*; -import net.minecraft.world.effect.*; -import net.minecraft.world.entity.ai.attributes.*; -import net.minecraft.world.item.*; -import net.minecraft.world.item.component.*; - -import java.util.*; - -public class InkPoweredStatusEffectInstance { - - public static final Codec CODEC = RecordCodecBuilder.create(i -> i.group( - MobEffectInstance.CODEC.fieldOf("effect").forGetter(c -> c.statusEffectInstance), - InkAmount.CODEC.fieldOf("ink_cost").forGetter(c -> c.cost), - Codec.INT.optionalFieldOf("custom_color", -1).forGetter(c -> c.customColor), - Codec.BOOL.optionalFieldOf("unidentifiable", false).forGetter(c -> c.unidentifiable) - ).apply(i, InkPoweredStatusEffectInstance::new)); - - public static final StreamCodec PACKET_CODEC = StreamCodec.composite( - MobEffectInstance.STREAM_CODEC, c -> c.statusEffectInstance, - InkAmount.PACKET_CODEC, c -> c.cost, - ByteBufCodecs.VAR_INT, c -> c.customColor, - ByteBufCodecs.BOOL, c -> c.unidentifiable, - InkPoweredStatusEffectInstance::new - ); - - private final MobEffectInstance statusEffectInstance; - private final InkAmount cost; - private final int customColor; // -1: use effect default - private final boolean unidentifiable; - - public InkPoweredStatusEffectInstance(MobEffectInstance statusEffectInstance, InkAmount cost, int customColor, boolean unidentifiable) { - this.statusEffectInstance = statusEffectInstance; - this.cost = cost; - this.customColor = customColor; - this.unidentifiable = unidentifiable; - } - - public MobEffectInstance getStatusEffectInstance() { - return statusEffectInstance; - } - - public InkAmount getInkCost() { - return cost; - } - - public static List getEffects(ItemStack stack) { - return stack.getOrDefault(SpectrumDataComponentTypes.INK_POWERED, InkPoweredComponent.DEFAULT).effects(); - } - - public static void setEffects(ItemStack stack, List effects) { - stack.set(SpectrumDataComponentTypes.INK_POWERED, new InkPoweredComponent(effects)); - } - - public static void buildTooltip(List tooltip, List effects, MutableComponent attributeModifierText, boolean showDuration, float tickRate) { - if (!effects.isEmpty()) { - List, AttributeModifier>> attributeModifiers = Lists.newArrayList(); - for (InkPoweredStatusEffectInstance entry : effects) { - if (entry.isUnidentifiable()) { - tooltip.add(Component.translatable("item.spectrum.potion.tooltip.unidentifiable")); - continue; - } - - MobEffectInstance effect = entry.getStatusEffectInstance(); - if (effect == null) { // serialization error or removed effect - continue; - } - - InkAmount cost = entry.getInkCost(); - - MutableComponent mutableText = Component.translatable(effect.getDescriptionId()); - if (effect.getAmplifier() > 0) { - mutableText = Component.translatable("potion.withAmplifier", mutableText, Component.translatable("potion.potency." + effect.getAmplifier())); - } - if (showDuration && effect.getDuration() > 20) { - mutableText = Component.translatable("potion.withDuration", mutableText, MobEffectUtil.formatDuration(effect, 1.0F, tickRate)); - } - mutableText.withStyle(effect.getEffect().value().getCategory().getTooltipFormatting()); - mutableText.append(Component.translatable("spectrum.tooltip.ink_cost", Support.getShortenedNumberString(cost.amount()), cost.color().getColoredInkName()).withStyle(ChatFormatting.GRAY)); - tooltip.add(mutableText); - - effect.getEffect().value().createModifiers(effect.getAmplifier(), (attribute, modifier) -> - attributeModifiers.add(new Tuple<>(attribute, modifier)) - ); - } - - if (!attributeModifiers.isEmpty()) { - tooltip.add(Component.empty()); - tooltip.add(attributeModifierText.withStyle(ChatFormatting.DARK_PURPLE)); - - for (var pair : attributeModifiers) { - var translatedAttribute = Component.translatable(pair.getA().value().getDescriptionId()); - var mutableText = pair.getB(); - - double statusEffect = mutableText.amount(); - double d; - if (mutableText.operation() != AttributeModifier.Operation.ADD_MULTIPLIED_BASE && mutableText.operation() != AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL) { - d = mutableText.amount(); - } else { - d = mutableText.amount() * 100.0D; - } - - if (statusEffect > 0.0D) { - tooltip.add((Component.translatable("attribute.modifier.plus." + mutableText.operation().id(), ItemAttributeModifiers.ATTRIBUTE_MODIFIER_FORMAT.format(d), translatedAttribute)).withStyle(ChatFormatting.BLUE)); - } else if (statusEffect < 0.0D) { - d *= -1.0D; - tooltip.add((Component.translatable("attribute.modifier.take." + mutableText.operation().id(), ItemAttributeModifiers.ATTRIBUTE_MODIFIER_FORMAT.format(d), translatedAttribute)).withStyle(ChatFormatting.RED)); - } - } - } - } - } - - public int getColor() { - if (this.customColor == -1) { - return statusEffectInstance.getEffect().value().getColor(); - } - return this.customColor; - } - - public boolean isUnidentifiable() { - return this.unidentifiable; - } -} diff --git a/src/main/java/de/dafuqs/spectrum/api/energy/InkStorage.java b/src/main/java/de/dafuqs/spectrum/api/energy/InkStorage.java deleted file mode 100644 index b3444bf692..0000000000 --- a/src/main/java/de/dafuqs/spectrum/api/energy/InkStorage.java +++ /dev/null @@ -1,195 +0,0 @@ -package de.dafuqs.spectrum.api.energy; - -import de.dafuqs.spectrum.*; -import de.dafuqs.spectrum.api.energy.color.*; -import de.dafuqs.spectrum.registries.*; -import net.minecraft.*; -import net.minecraft.nbt.*; -import net.minecraft.network.chat.*; -import net.minecraft.util.*; -import net.minecraft.world.*; -import javax.annotation.*; - -import java.util.*; - -import static de.dafuqs.spectrum.helpers.Support.*; - -/** - * This interface defines that an object can - * store pigment energy and how much - * TODO: migrate to capability - **/ -public interface InkStorage extends Clearable { - - /** - * Transfer Ink from one storage to another - * Transfers Ink using a "pressure like" system: Tries to balance the ink in source and destination. - * The more energy is in source, the more is getting transferred, up to when both storages even out. - * - * @param source The ink storage that is getting drawn from - * @param destination The ink storage receiving energy - * @return the total amount of energy that could be transferred - */ - static long transferInk(InkStorage source, InkStorage destination) { - long transferred = 0; - for (InkColor inkColor : source.getEnergy().keySet()) { - transferred += transferInk(source, destination, inkColor); - } - return transferred; - } - - /** - * Transfer Ink from one storage to another - * Transfers Ink using a "pressure like" system: Tries to balance the ink in source and destination. - * The more energy is in source, the more is getting transferred, up to when both storages even out. - * - * @param source The ink storage that is getting drawn from - * @param destination The ink storage receiving energy - * @param color The ink type to transfer - * @return the amount of energy that could be transferred - */ - static long transferInk(InkStorage source, InkStorage destination, InkColor color) { - if (!destination.accepts(color)) { - return 0; - } - - long sourceAmount = source.getEnergy(color); - if (sourceAmount > 0) { - long destinationRoom = destination.getRoom(color); - if (destinationRoom > 0) { - long destinationAmount = destination.getEnergy(color); - if (sourceAmount > destinationAmount + 1) { - long transferAmount = Math.max(1, (sourceAmount - destinationAmount) / 32); // the constant here is simulating pressure flow - transferAmount = Math.min(transferAmount, Math.min(sourceAmount, destinationRoom)); - destination.addEnergy(color, transferAmount); - source.drainEnergy(color, transferAmount); - return transferAmount; - } - } - } - return 0; - } - - /** - * Transfer Ink from one storage to another - * Transfers a fixed amount of energy - * => Use the pressure like system without fixed amount, where possible - * - * @param source The ink storage that is getting drawn from - * @param destination The ink storage receiving energy - * @param color The ink type to transfer - * @param amount The fixed amount of ink to transfer - * @return the amount of energy that could be transferred - */ - @Deprecated - static long transferInk(InkStorage source, InkStorage destination, InkColor color, long amount) { - if (!destination.accepts(color)) { - return 0; - } - - long sourceAmount = source.getEnergy(color); - if (sourceAmount > 0) { - long destinationRoom = destination.getRoom(color); - if (destinationRoom > 0) { - long transferAmount = Math.min(amount, Math.min(sourceAmount, destinationRoom)); - if (transferAmount > 0) { - destination.addEnergy(color, transferAmount); - source.drainEnergy(color, transferAmount); - return transferAmount; - } - } - } - return 0; - } - - // if the storage is able to store this kind of color - boolean accepts(InkColor color); - - // returns the amount of energy that could not be added - long addEnergy(InkColor color, long amount); - - // Drains energy from the storage. Returns the amount of energy that could be drained - // In contrast to requestEnergy this drains the energy up until 0, even if not requestedAmount of energy is stored - long drainEnergy(InkColor color, long requestedAmount); - - // returns true if the energy could be drained successfully - // if not enough energy is stored, the amount of stored energy remains unchanged - boolean requestEnergy(InkColor color, long requestedAmount); - - // gets the amount of stored energy of that type - long getEnergy(InkColor color); - - // gets all stored ink - // only use for syncing server <=> clientside - @Deprecated - Map getEnergy(); - - // sets the amount of stored energy of that type - // only use for syncing server <=> clientside - @Deprecated - void setEnergy(Map colors, long total); - - // the amount of energy that can be stored per individual color - long getMaxPerColor(); - - // the amount of energy that can be stored in total - long getMaxTotal(); - - // the amount of energy that is currently stored - long getCurrentTotal(); - - // true if no energy is stored - boolean isEmpty(); - - // true if the max total is reached - boolean isFull(); - - // fill up the storage with as much energy as possible - void fillCompletely(); - - // completely empty the storage - void clearContent(); - - // Returns how full the storage is, as a float - default float getFillPercent(InkColor color) { - return Mth.clamp((float) getEnergy(color) / getMaxPerColor(), 0, 1); - } - - // Same as above, but in total. - default float getTotalFillPercent() { - return Mth.clamp((float) getCurrentTotal() / getMaxTotal(), 0, 1); - } - - void addTooltip(List tooltip); - - long getRoom(InkColor color); - - static Map readEnergy(CompoundTag compound) { - Map energy = new HashMap<>(); - if (compound != null) { - for (String key : compound.getAllKeys()) { - InkColor inkColor = SpectrumRegistries.INK_COLOR.get(SpectrumCommon.locate(key)); - if (inkColor == null) { // TODO: needed? Fallback to a default color? - continue; - } - long amount = compound.getLong(key); - energy.put(inkColor, amount); - } - } - return energy; - } - - static CompoundTag writeEnergy(Map storedEnergy) { - CompoundTag energy = new CompoundTag(); - for (Map.Entry color : storedEnergy.entrySet()) { - energy.putLong(color.getKey().getID().toString(), color.getValue()); - } - return energy; - } - - static void addInkStoreBulletTooltip(List tooltip, InkColor color, long amount) { - MutableComponent inkName = color.getColoredInkName(); - tooltip.add(Component.translatable("spectrum.tooltip.ink_powered.bullet_amount", Component.literal(getShortenedNumberString(amount)).withStyle(ChatFormatting.WHITE), inkName).setStyle(inkName.getStyle())); - } - -} diff --git a/src/main/java/de/dafuqs/spectrum/api/energy/InkStorageItem.java b/src/main/java/de/dafuqs/spectrum/api/energy/InkStorageItem.java deleted file mode 100644 index 8107440b9a..0000000000 --- a/src/main/java/de/dafuqs/spectrum/api/energy/InkStorageItem.java +++ /dev/null @@ -1,63 +0,0 @@ -package de.dafuqs.spectrum.api.energy; - -import de.dafuqs.spectrum.components.*; -import de.dafuqs.spectrum.registries.*; -import net.minecraft.world.item.*; - -/** - * Defines that an object holds a PigmentEnergyStorage - * Objects are supposed to be items (so they implement getDefaultStack()) - * - * @param - */ -public interface InkStorageItem { - - enum Drainability { - ALWAYS, // ink storage should be able to be used via both machines and players - MACHINE_ONLY, // ink storage should only be drained via machines (block entities) - PLAYER_ONLY, // ink storage should only be drained via a player (ink storage trinkets) - NEVER; // ink storage should never be drained, only filled (upgradeable trinkets) - - public boolean canDrain(boolean isPlayer) { - switch (this) { - case NEVER -> { - return false; - } - case PLAYER_ONLY -> { - return isPlayer; - } - case MACHINE_ONLY -> { - return !isPlayer; - } - default -> { - return true; - } - } - } - } - - Drainability getDrainability(); - - PStorage getEnergyStorage(ItemStack itemStack); - - default void setEnergyStorage(ItemStack itemStack, InkStorage storage) { - itemStack.set(SpectrumDataComponentTypes.INK_STORAGE, new InkStorageComponent(storage)); - } - - ItemStack getDefaultInstance(); - - default ItemStack getFullStack() { - ItemStack stack = this.getDefaultInstance(); - PStorage storage = getEnergyStorage(stack); - storage.fillCompletely(); - setEnergyStorage(stack, storage); - return stack; - } - - default void clearEnergyStorage(ItemStack stack) { - PStorage storage = getEnergyStorage(stack); - storage.clearContent(); - setEnergyStorage(stack, storage); - } - -} \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/api/energy/color/package-info.java b/src/main/java/de/dafuqs/spectrum/api/energy/color/package-info.java deleted file mode 100644 index c416262c1b..0000000000 --- a/src/main/java/de/dafuqs/spectrum/api/energy/color/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@NullMarked -@MethodsReturnNonnullByDefault -@FieldsAreNonnullByDefault -package de.dafuqs.spectrum.api.energy.color; - -import net.minecraft.*; -import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/de/dafuqs/spectrum/api/energy/package-info.java b/src/main/java/de/dafuqs/spectrum/api/energy/package-info.java deleted file mode 100644 index f09a1b4a34..0000000000 --- a/src/main/java/de/dafuqs/spectrum/api/energy/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@NullMarked -@MethodsReturnNonnullByDefault -@FieldsAreNonnullByDefault -package de.dafuqs.spectrum.api.energy; - -import net.minecraft.*; -import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/de/dafuqs/spectrum/api/energy/storage/FixedSingleInkStorage.java b/src/main/java/de/dafuqs/spectrum/api/energy/storage/FixedSingleInkStorage.java deleted file mode 100644 index 2baa81920c..0000000000 --- a/src/main/java/de/dafuqs/spectrum/api/energy/storage/FixedSingleInkStorage.java +++ /dev/null @@ -1,30 +0,0 @@ -package de.dafuqs.spectrum.api.energy.storage; - -import de.dafuqs.spectrum.api.energy.color.*; - -public class FixedSingleInkStorage extends SingleInkStorage { - - public FixedSingleInkStorage(long maxEnergy, InkColor color) { - super(maxEnergy); - this.storedColor = color; - } - - public FixedSingleInkStorage(long maxEnergy, InkColor color, long amount) { - super(maxEnergy, color, amount); - } - - @Override - public boolean accepts(InkColor color) { - return this.storedColor == color; - } - - @Override - public long getRoom(InkColor color) { - if (this.storedColor == color) { - return this.maxEnergy - this.storedEnergy; - } else { - return 0; - } - } - -} \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/api/energy/storage/SingleInkStorage.java b/src/main/java/de/dafuqs/spectrum/api/energy/storage/SingleInkStorage.java deleted file mode 100644 index 3f0605c057..0000000000 --- a/src/main/java/de/dafuqs/spectrum/api/energy/storage/SingleInkStorage.java +++ /dev/null @@ -1,164 +0,0 @@ -package de.dafuqs.spectrum.api.energy.storage; - -import de.dafuqs.spectrum.api.energy.*; -import de.dafuqs.spectrum.api.energy.color.*; -import net.minecraft.network.chat.*; - -import java.util.*; - -import static de.dafuqs.spectrum.helpers.Support.*; - -public class SingleInkStorage implements InkStorage { - - protected final long maxEnergy; - protected InkColor storedColor; - protected long storedEnergy; - - /** - * Stores a single type of Pigment Energy - * Can only be filled with a new type if it is empty - **/ - public SingleInkStorage(long maxEnergy) { - this.maxEnergy = maxEnergy; - this.storedColor = InkColors.CYAN; - this.storedEnergy = 0; - } - - public SingleInkStorage(long maxEnergy, InkColor color, long amount) { - this.maxEnergy = maxEnergy; - this.storedColor = color; - this.storedEnergy = amount; - } - - public InkColor getStoredColor() { - return storedColor; - } - - @Override - public boolean accepts(InkColor color) { - return this.storedEnergy == 0 || this.storedColor == color; - } - - @Override - public long addEnergy(InkColor color, long amount) { - if (color == storedColor) { - long resultingAmount = this.storedEnergy + amount; - this.storedEnergy = resultingAmount; - if (resultingAmount > this.maxEnergy) { - long overflow = this.storedEnergy - this.maxEnergy; - this.storedEnergy = this.maxEnergy; - return overflow; - } - return 0; - } else if (this.storedEnergy == 0) { - this.storedColor = color; - this.storedEnergy = amount; - } - return amount; - } - - @Override - public boolean requestEnergy(InkColor color, long amount) { - if (color == this.storedColor && amount >= this.storedEnergy) { - this.storedEnergy -= amount; - return true; - } else { - return false; - } - } - - @Override - public long drainEnergy(InkColor color, long amount) { - if (color == this.storedColor) { - long drainedAmount = Math.min(this.storedEnergy, amount); - this.storedEnergy -= drainedAmount; - return drainedAmount; - } else { - return 0; - } - } - - @Override - public long getEnergy(InkColor color) { - if (color == this.storedColor) { - return this.storedEnergy; - } else { - return 0; - } - } - - @Override - @Deprecated - public Map getEnergy() { - return Map.of(this.storedColor, this.storedEnergy); - } - - @Override - @Deprecated - public void setEnergy(Map colors, long total) { - for (Map.Entry color : colors.entrySet()) { - long value = color.getValue(); - if (value > 0) { - this.storedColor = color.getKey(); - this.storedEnergy = color.getValue(); - } - } - } - - @Override - public long getMaxTotal() { - return this.maxEnergy; - } - - @Override - public long getMaxPerColor() { - return this.maxEnergy; - } - - @Override - public long getCurrentTotal() { - return this.storedEnergy; - } - - @Override - public boolean isEmpty() { - return this.storedEnergy == 0; - } - - @Override - public boolean isFull() { - return this.storedEnergy >= this.maxEnergy; - } - - @Override - public void addTooltip(List tooltip) { - tooltip.add(Component.translatable("item.spectrum.ink_storage.stores_up_to_ink_per_type", getShortenedNumberString(this.maxEnergy))); - if (this.storedEnergy > 0) { - InkStorage.addInkStoreBulletTooltip(tooltip, this.storedColor, this.storedEnergy); - } - } - - @Override - public long getRoom(InkColor color) { - if (this.storedEnergy == 0 || this.storedColor == color) { - return this.maxEnergy - this.storedEnergy; - } else { - return 0; - } - } - - @Override - public void fillCompletely() { - this.storedEnergy = this.maxEnergy; - } - - @Override - public void clearContent() { - this.storedEnergy = 0; - } - - public void convertColor(InkColor color) { - this.storedColor = color; - } - -} \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/api/energy/storage/TotalCappedElementalMixingInkStorage.java b/src/main/java/de/dafuqs/spectrum/api/energy/storage/TotalCappedElementalMixingInkStorage.java deleted file mode 100644 index 2ef54d8c89..0000000000 --- a/src/main/java/de/dafuqs/spectrum/api/energy/storage/TotalCappedElementalMixingInkStorage.java +++ /dev/null @@ -1,159 +0,0 @@ -package de.dafuqs.spectrum.api.energy.storage; - -import de.dafuqs.spectrum.api.energy.color.*; -import net.minecraft.network.chat.*; - -import java.util.*; - -import static de.dafuqs.spectrum.helpers.Support.*; - -public class TotalCappedElementalMixingInkStorage extends TotalCappedInkStorage { - - public TotalCappedElementalMixingInkStorage(long maxEnergyTotal, Map storedEnergy) { - super(maxEnergyTotal, storedEnergy); - } - - @Override - public boolean accepts(InkColor color) { - return color.isIn(InkColorTags.ELEMENTAL_COLORS); - } - - @Override - public boolean requestEnergy(InkColor color, long amount) { - if (color.isIn(InkColorTags.ELEMENTAL_COLORS)) { - // can be output directly - long storedAmount = this.storedEnergy.get(color); - if (storedAmount < amount) { - return false; - } else { - this.currentTotal -= amount; - this.storedEnergy.put(color, storedAmount - amount); - return true; - } - } - - // mix! - Optional> requiredElementals = InkColorMixes.getColorsToMix(color); - if (requiredElementals.isEmpty()) { - return false; - } - - // check if we have enough - for (Map.Entry entry : requiredElementals.get().entrySet()) { - long storedAmount = this.storedEnergy.get(entry.getKey()); - long requiredAmount = (int) Math.ceil(entry.getValue() * amount); - if (storedAmount < requiredAmount) { - return false; - } - } - - // yes, we got stored enough. Drain - for (Map.Entry entry : requiredElementals.get().entrySet()) { - long storedAmount = this.storedEnergy.get(entry.getKey()); - long requiredAmount = (int) Math.ceil(entry.getValue() * amount); - this.currentTotal -= requiredAmount; - this.storedEnergy.put(entry.getKey(), storedAmount - requiredAmount); - } - return true; - } - - @Override - public long drainEnergy(InkColor color, long amount) { - if (color.isIn(InkColorTags.ELEMENTAL_COLORS)) { - // can be output directly - long storedAmount = this.storedEnergy.get(color); - long drainedAmount = Math.min(storedAmount, amount); - this.storedEnergy.put(color, storedAmount - drainedAmount); - - this.currentTotal -= drainedAmount; - return drainedAmount; - } - - // mix! - Optional> requiredElementals = InkColorMixes.getColorsToMix(color); - if (requiredElementals.isEmpty()) { - return 0; - } - - // calculate the max amount that can be drained over all colors - float percentageAbleToDrain = 1.0F; - for (Map.Entry entry : requiredElementals.get().entrySet()) { - long storedAmount = this.storedEnergy.get(entry.getKey()); - long requiredAmount = (int) Math.ceil(entry.getValue() * amount); - if (storedAmount < requiredAmount) { - percentageAbleToDrain = Math.min(percentageAbleToDrain, storedAmount / (float) requiredAmount); - } - } - - // drain - for (Map.Entry entry : requiredElementals.get().entrySet()) { - long storedAmount = this.storedEnergy.get(entry.getKey()); - long drainedAmount = (int) Math.ceil(entry.getValue() * amount * percentageAbleToDrain); - this.storedEnergy.put(entry.getKey(), storedAmount - drainedAmount); - } - - long drainedAmount = (int) Math.floor(percentageAbleToDrain * amount); - this.currentTotal -= drainedAmount; - return drainedAmount; - } - - @Override - public long getEnergy(InkColor color) { - if (color.isIn(InkColorTags.ELEMENTAL_COLORS)) { - // can be output directly - return this.storedEnergy.get(color); - } - - // mix! - long maxAmount = Long.MAX_VALUE; - Optional> requiredElementals = InkColorMixes.getColorsToMix(color); - if (requiredElementals.isEmpty()) { - return 0; - } - - for (Map.Entry entry : requiredElementals.get().entrySet()) { - long mixedAmount = (long) Math.floor(entry.getValue() * this.storedEnergy.get(entry.getKey())); - maxAmount = Math.min(maxAmount, mixedAmount); - } - return maxAmount; - } - - @Override - public void fillCompletely() { - this.storedEnergy.clear(); - List elementals = InkColors.elementals(); - if (elementals.isEmpty()) { - // in case the tag is empty or something queries that method - // before tags are fully synced - // looking at you, Mouse Wheelie - return; - } - - long energyPerColor = this.maxEnergyTotal / elementals.size(); - for (InkColor color : elementals) { - this.storedEnergy.put(color, energyPerColor); - } - this.currentTotal = energyPerColor * elementals.size(); // in case rounding is weird - } - - @Override - public void clearContent() { - this.storedEnergy.clear(); - } - - @Override - public long getRoom(InkColor color) { - if (color.isIn(InkColorTags.ELEMENTAL_COLORS)) { - return this.maxEnergyTotal - this.currentTotal; - } - return 0; - } - - @Override - public void addTooltip(List tooltip) { - tooltip.add(Component.translatable("item.spectrum.artists_palette.tooltip", getShortenedNumberString(this.maxEnergyTotal))); - tooltip.add(Component.translatable("item.spectrum.artists_palette.tooltip.mix_on_demand")); - addInkContentTooltip(tooltip); - } - -} diff --git a/src/main/java/de/dafuqs/spectrum/api/energy/storage/TotalCappedInkStorage.java b/src/main/java/de/dafuqs/spectrum/api/energy/storage/TotalCappedInkStorage.java deleted file mode 100644 index 8c3ff67899..0000000000 --- a/src/main/java/de/dafuqs/spectrum/api/energy/storage/TotalCappedInkStorage.java +++ /dev/null @@ -1,151 +0,0 @@ -package de.dafuqs.spectrum.api.energy.storage; - -import de.dafuqs.spectrum.api.energy.*; -import de.dafuqs.spectrum.api.energy.color.*; -import de.dafuqs.spectrum.registries.*; -import it.unimi.dsi.fastutil.objects.*; -import net.minecraft.network.chat.*; - -import java.util.*; - -import static de.dafuqs.spectrum.helpers.Support.*; - -public class TotalCappedInkStorage implements InkStorage { - - protected final long maxEnergyTotal; - protected Map storedEnergy = new Object2LongArrayMap<>(); - protected long currentTotal; // This is a cache for quick lookup. Can be recalculated anytime using the values in storedEnergy. - - public TotalCappedInkStorage(long maxEnergyTotal, Map energy) { - this.maxEnergyTotal = maxEnergyTotal; - - this.currentTotal = 0; - this.storedEnergy.putAll(energy); - for (Map.Entry color : energy.entrySet()) { - this.currentTotal += color.getValue(); - } - } - - @Override - public boolean accepts(InkColor color) { - return true; - } - - @Override - public long addEnergy(InkColor color, long amount) { - long overflow = Math.max(0, amount + this.currentTotal - this.maxEnergyTotal); - long amountToAdd = amount - overflow; - this.currentTotal += amountToAdd; - this.storedEnergy.put(color, this.storedEnergy.getOrDefault(color, 0L) + amountToAdd); - return overflow; - } - - @Override - public boolean requestEnergy(InkColor color, long amount) { - long storedAmount = this.storedEnergy.getOrDefault(color, 0L); - if (storedAmount < amount) { - return false; - } else { - this.currentTotal -= amount; - this.storedEnergy.put(color, storedAmount - amount); - return true; - } - } - - @Override - public long drainEnergy(InkColor color, long amount) { - long storedAmount = this.storedEnergy.getOrDefault(color, 0L); - long drainedAmount = Math.min(storedAmount, amount); - this.storedEnergy.put(color, storedAmount - drainedAmount); - this.currentTotal -= drainedAmount; - return drainedAmount; - } - - @Override - public long getEnergy(InkColor color) { - return this.storedEnergy.getOrDefault(color, 0L); - } - - @Override - @Deprecated - public Map getEnergy() { - return this.storedEnergy; - } - - @Override - @Deprecated - public void setEnergy(Map colors, long total) { - this.storedEnergy.putAll(colors); - this.currentTotal = total; - } - - @Override - public long getMaxTotal() { - return this.maxEnergyTotal; - } - - @Override - public long getMaxPerColor() { - return this.maxEnergyTotal; - } - - @Override - public long getCurrentTotal() { - return this.currentTotal; - } - - @Override - public boolean isEmpty() { - return this.currentTotal == 0; - } - - @Override - public boolean isFull() { - return this.currentTotal >= this.maxEnergyTotal; - } - - @Override - public long getRoom(InkColor color) { - return this.maxEnergyTotal - this.currentTotal; - } - - @Override - public void fillCompletely() { - this.storedEnergy.clear(); - - int inkColorCount = SpectrumRegistries.INK_COLOR.size(); - long energyPerColor = this.maxEnergyTotal / inkColorCount; - for (InkColor color : InkColors.all()) { - this.storedEnergy.put(color, energyPerColor); - } - this.currentTotal = energyPerColor * inkColorCount; // in case rounding is weird - } - - @Override - public void clearContent() { - Set supportedColors = this.storedEnergy.keySet(); - Map newContent = new HashMap<>(); - for (InkColor color : supportedColors) { - newContent.put(color, 0L); - } - this.storedEnergy = newContent; - this.currentTotal = 0; - } - - @Override - public void addTooltip(List tooltip) { - tooltip.add(Component.translatable("item.spectrum.total_capped_simple_pigment_energy_storage.tooltip", getShortenedNumberString(maxEnergyTotal))); - addInkContentTooltip(tooltip); - } - - protected void addInkContentTooltip(List tooltip) { - // we are iterating them this way to preserve the ordering in which they were registered - for (InkColor color : SpectrumRegistries.INK_COLOR) { - long amount = this.storedEnergy.getOrDefault(color, 0L); - if (amount > 0) { - InkStorage.addInkStoreBulletTooltip(tooltip, color, amount); - } - } - } - -} \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/api/energy/storage/package-info.java b/src/main/java/de/dafuqs/spectrum/api/energy/storage/package-info.java deleted file mode 100644 index 2d2cb404be..0000000000 --- a/src/main/java/de/dafuqs/spectrum/api/energy/storage/package-info.java +++ /dev/null @@ -1,8 +0,0 @@ -@NullMarked -@MethodsReturnNonnullByDefault -@FieldsAreNonnullByDefault -package de.dafuqs.spectrum.api.energy.storage; - -import net.minecraft.FieldsAreNonnullByDefault; -import net.minecraft.MethodsReturnNonnullByDefault; -import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/de/dafuqs/spectrum/api/entity/POIMemorized.java b/src/main/java/de/dafuqs/spectrum/api/entity/POIMemorized.java index 8c8142928d..6fea00bffd 100644 --- a/src/main/java/de/dafuqs/spectrum/api/entity/POIMemorized.java +++ b/src/main/java/de/dafuqs/spectrum/api/entity/POIMemorized.java @@ -6,7 +6,7 @@ import net.minecraft.server.level.*; import net.minecraft.tags.*; import net.minecraft.world.entity.ai.village.poi.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/api/entity/PackEntity.java b/src/main/java/de/dafuqs/spectrum/api/entity/PackEntity.java index 7a4a32614a..cdeaa79648 100644 --- a/src/main/java/de/dafuqs/spectrum/api/entity/PackEntity.java +++ b/src/main/java/de/dafuqs/spectrum/api/entity/PackEntity.java @@ -2,7 +2,7 @@ import net.minecraft.world.entity.*; import net.minecraft.world.entity.ai.goal.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; import java.util.function.*; diff --git a/src/main/java/de/dafuqs/spectrum/api/entity/PlayerEntityAccessor.java b/src/main/java/de/dafuqs/spectrum/api/entity/PlayerEntityAccessor.java deleted file mode 100644 index 077fa41d3f..0000000000 --- a/src/main/java/de/dafuqs/spectrum/api/entity/PlayerEntityAccessor.java +++ /dev/null @@ -1,6 +0,0 @@ -package de.dafuqs.spectrum.api.entity; - -public interface PlayerEntityAccessor { - - void spectrum$setSleepTimer(int ticks); -} \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/api/entity/package-info.java b/src/main/java/de/dafuqs/spectrum/api/entity/package-info.java index 0eb66afcaa..cafe0bcb13 100644 --- a/src/main/java/de/dafuqs/spectrum/api/entity/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/api/entity/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.api.entity; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/api/fluid/SpectrumFluidTank.java b/src/main/java/de/dafuqs/spectrum/api/fluid/SpectrumFluidTank.java index 0f3a0cf559..b2d4f79c0f 100644 --- a/src/main/java/de/dafuqs/spectrum/api/fluid/SpectrumFluidTank.java +++ b/src/main/java/de/dafuqs/spectrum/api/fluid/SpectrumFluidTank.java @@ -2,7 +2,6 @@ import net.neoforged.neoforge.fluids.*; import net.neoforged.neoforge.fluids.capability.templates.*; -import javax.annotation.*; public class SpectrumFluidTank extends FluidTank { private final Callback updateCallback; diff --git a/src/main/java/de/dafuqs/spectrum/api/fluid/package-info.java b/src/main/java/de/dafuqs/spectrum/api/fluid/package-info.java index 34ee035307..2f670fafa5 100644 --- a/src/main/java/de/dafuqs/spectrum/api/fluid/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/api/fluid/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.api.fluid; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/api/gui/SpectrumTooltipComponent.java b/src/main/java/de/dafuqs/spectrum/api/gui/SpectrumTooltipComponent.java index 18f92b0774..91df3695b5 100644 --- a/src/main/java/de/dafuqs/spectrum/api/gui/SpectrumTooltipComponent.java +++ b/src/main/java/de/dafuqs/spectrum/api/gui/SpectrumTooltipComponent.java @@ -6,7 +6,6 @@ import net.minecraft.client.gui.screens.inventory.tooltip.*; import net.minecraft.resources.*; import net.minecraft.world.item.*; -import javax.annotation.*; public interface SpectrumTooltipComponent extends ClientTooltipComponent { diff --git a/src/main/java/de/dafuqs/spectrum/api/gui/package-info.java b/src/main/java/de/dafuqs/spectrum/api/gui/package-info.java index b7de02e765..a07e0d063e 100644 --- a/src/main/java/de/dafuqs/spectrum/api/gui/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/api/gui/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.api.gui; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/api/ink/InkAmount.java b/src/main/java/de/dafuqs/spectrum/api/ink/InkAmount.java new file mode 100644 index 0000000000..583d35d9dd --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/api/ink/InkAmount.java @@ -0,0 +1,22 @@ +package de.dafuqs.spectrum.api.ink; + +import com.mojang.serialization.*; +import com.mojang.serialization.codecs.*; +import de.dafuqs.spectrum.api.ink.color.*; +import io.netty.buffer.*; +import net.minecraft.network.codec.*; + + public record InkAmount(InkColor color, long amount) { + + public static final Codec CODEC = RecordCodecBuilder.create(i -> i.group( + InkColor.CODEC.fieldOf("color").forGetter(InkAmount::color), + Codec.LONG.fieldOf("amount").forGetter(InkAmount::amount) + ).apply(i, InkAmount::new)); + + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + InkColor.PACKET_CODEC, InkAmount::color, + ByteBufCodecs.VAR_LONG, InkAmount::amount, + InkAmount::new + ); + +} \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/api/energy/InkPowered.java b/src/main/java/de/dafuqs/spectrum/api/ink/InkPowered.java similarity index 88% rename from src/main/java/de/dafuqs/spectrum/api/energy/InkPowered.java rename to src/main/java/de/dafuqs/spectrum/api/ink/InkPowered.java index 24dfc4b75a..70e2d1b23f 100644 --- a/src/main/java/de/dafuqs/spectrum/api/energy/InkPowered.java +++ b/src/main/java/de/dafuqs/spectrum/api/ink/InkPowered.java @@ -1,18 +1,17 @@ -package de.dafuqs.spectrum.api.energy; +package de.dafuqs.spectrum.api.ink; import de.dafuqs.revelationary.api.advancements.*; -import de.dafuqs.spectrum.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; +import de.dafuqs.spectrum.api.ink.storage.*; import de.dafuqs.spectrum.compat.*; import de.dafuqs.spectrum.helpers.*; -import de.dafuqs.spectrum.progression.*; +import de.dafuqs.spectrum.registries.*; import net.minecraft.*; import net.minecraft.client.*; import net.minecraft.core.*; import net.minecraft.core.registries.*; import net.minecraft.network.chat.*; import net.minecraft.resources.*; -import net.minecraft.server.level.*; import net.minecraft.world.*; import net.minecraft.world.effect.*; import net.minecraft.world.entity.player.*; @@ -20,19 +19,13 @@ import net.minecraft.world.item.crafting.*; import net.minecraft.world.item.enchantment.*; import net.neoforged.api.distmarker.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import top.theillusivec4.curios.api.*; import java.util.*; public interface InkPowered { - /** - * The advancement the player needs to have in order to use ink powered tools - */ - ResourceLocation REQUIRED_ADVANCEMENT = SpectrumCommon.locate("milestones/unlock_ink_use"); - - @OnlyIn(Dist.CLIENT) static boolean canUseClient() { Minecraft client = Minecraft.getInstance(); @@ -40,36 +33,41 @@ static boolean canUseClient() { } static boolean canUse(@Nullable Player playerEntity) { - return AdvancementHelper.hasAdvancement(playerEntity, InkPowered.REQUIRED_ADVANCEMENT); + return AdvancementHelper.hasAdvancement(playerEntity, SpectrumAdvancements.UNLOCK_INK_USE); } /** * The colors that the object requires for working. * These are added as the player facing tooltip **/ - List getUsedColors(); + @Deprecated(forRemoval = true) + default List getUsedColors() { + return Collections.emptyList(); + } + + List getUsedColors(ItemStack stack); /** * The colors that the object requires for working. * These are added as the player facing tooltip **/ @OnlyIn(Dist.CLIENT) - default void addInkPoweredTooltip(List tooltip) { + default void addInkPoweredTooltip(ItemStack stack, List tooltip) { if (canUseClient()) { - if (getUsedColors().size() > 1) { + if (getUsedColors(stack).size() > 1) { tooltip.add(Component.translatable("spectrum.tooltip.ink_powered.prefix").withStyle(ChatFormatting.GRAY)); - for (InkColor color : getUsedColors()) { + for (InkColor color : getUsedColors(stack)) { tooltip.add(color.getColoredInkName().withStyle(ChatFormatting.GRAY)); } } else { - tooltip.add(Component.translatable("spectrum.tooltip.ink_powered.consume", getUsedColors().getFirst().getColoredInkName()).withStyle(ChatFormatting.GRAY)); + tooltip.add(Component.translatable("spectrum.tooltip.ink_powered.consume", getUsedColors(stack).getFirst().getColoredInkName()).withStyle(ChatFormatting.GRAY)); } } } private static long tryDrainEnergy(ItemStack stack, InkColor color, long amount, @Nullable Player player) { if (stack.getItem() instanceof InkStorageItem inkStorageItem) { - if (!inkStorageItem.getDrainability().canDrain(player != null)) { + if (!inkStorageItem.canDrain(player != null)) { return 0; } @@ -77,9 +75,6 @@ private static long tryDrainEnergy(ItemStack stack, InkColor color, long amount, long drained = inkStorage.drainEnergy(color, amount); if (drained > 0) { - if (player instanceof ServerPlayer serverPlayer) { - SpectrumAdvancementCriteria.INK_CONTAINER_INTERACTION.trigger(serverPlayer, stack, inkStorage, color, -amount); - } inkStorageItem.setEnergyStorage(stack, inkStorage); } diff --git a/src/main/java/de/dafuqs/spectrum/api/ink/InkPoweredMobEffectInstance.java b/src/main/java/de/dafuqs/spectrum/api/ink/InkPoweredMobEffectInstance.java new file mode 100644 index 0000000000..c3cca3c393 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/api/ink/InkPoweredMobEffectInstance.java @@ -0,0 +1,111 @@ +package de.dafuqs.spectrum.api.ink; + +import com.google.common.collect.*; +import com.mojang.serialization.*; +import com.mojang.serialization.codecs.*; +import de.dafuqs.spectrum.components.*; +import de.dafuqs.spectrum.helpers.*; +import de.dafuqs.spectrum.registries.*; +import net.minecraft.*; +import net.minecraft.core.*; +import net.minecraft.network.*; +import net.minecraft.network.chat.*; +import net.minecraft.network.codec.*; +import net.minecraft.util.*; +import net.minecraft.world.effect.*; +import net.minecraft.world.entity.ai.attributes.*; +import net.minecraft.world.item.*; +import net.minecraft.world.item.component.*; + +import java.util.*; + +public record InkPoweredMobEffectInstance(MobEffectInstance statusEffectInstance, InkAmount cost, Optional customColor, boolean unidentifiable) { + + public static final Codec CODEC = RecordCodecBuilder.create(i -> i.group( + MobEffectInstance.CODEC.fieldOf("effect").forGetter(c -> c.statusEffectInstance), + InkAmount.CODEC.fieldOf("ink_cost").forGetter(c -> c.cost), + Codec.INT.optionalFieldOf("custom_color").forGetter(c -> c.customColor), + Codec.BOOL.optionalFieldOf("unidentifiable", false).forGetter(c -> c.unidentifiable) + ).apply(i, InkPoweredMobEffectInstance::new)); + + public static final StreamCodec PACKET_CODEC = StreamCodec.composite( + MobEffectInstance.STREAM_CODEC, c -> c.statusEffectInstance, + InkAmount.STREAM_CODEC, c -> c.cost, + ByteBufCodecs.optional(ByteBufCodecs.VAR_INT), c -> c.customColor, + ByteBufCodecs.BOOL, c -> c.unidentifiable, + InkPoweredMobEffectInstance::new + ); + + // for displaying purposes + @Deprecated + public MobEffectInstance getStatusEffectInstance() { + return statusEffectInstance; + } + + // for application + public MobEffectInstance getFreshStatusEffectInstance() { + return new MobEffectInstance(statusEffectInstance); + } + + public InkAmount getInkCost() { + return cost; + } + + public int getColor() { + if(this.customColor.isPresent()) { + return this.customColor.get(); + } + return statusEffectInstance.getEffect().value().getColor(); + } + + public static void buildTooltip(List tooltip, List effects, MutableComponent attributeModifierText, boolean showDuration, float tickRate) { + if (!effects.isEmpty()) { + List, AttributeModifier>> attributeModifiers = Lists.newArrayList(); + for (InkPoweredMobEffectInstance entry : effects) { + MobEffectInstance effect = entry.getStatusEffectInstance(); + InkAmount cost = entry.getInkCost(); + + MutableComponent mutableText = Component.translatable(effect.getDescriptionId()); + if (effect.getAmplifier() > 0) { + mutableText = Component.translatable("potion.withAmplifier", mutableText, Component.translatable("potion.potency." + effect.getAmplifier())); + } + if (showDuration && effect.getDuration() > 20) { + mutableText = Component.translatable("potion.withDuration", mutableText, MobEffectUtil.formatDuration(effect, 1.0F, tickRate)); + } + mutableText.withStyle(effect.getEffect().value().getCategory().getTooltipFormatting()); + mutableText.append(Component.translatable("spectrum.tooltip.ink_cost", Support.getShortenedNumberString(cost.amount()), cost.color().getColoredInkName()).withStyle(ChatFormatting.GRAY)); + tooltip.add(mutableText); + + effect.getEffect().value().createModifiers(effect.getAmplifier(), (attribute, modifier) -> + attributeModifiers.add(new Tuple<>(attribute, modifier)) + ); + } + + if (!attributeModifiers.isEmpty()) { + tooltip.add(Component.empty()); + tooltip.add(attributeModifierText.withStyle(ChatFormatting.DARK_PURPLE)); + + for (var pair : attributeModifiers) { + var translatedAttribute = Component.translatable(pair.getA().value().getDescriptionId()); + var mutableText = pair.getB(); + + double statusEffect = mutableText.amount(); + double d; + if (mutableText.operation() != AttributeModifier.Operation.ADD_MULTIPLIED_BASE && mutableText.operation() != AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL) { + d = mutableText.amount(); + } else { + d = mutableText.amount() * 100.0D; + } + + if (statusEffect > 0.0D) { + tooltip.add((Component.translatable("attribute.modifier.plus." + mutableText.operation().id(), ItemAttributeModifiers.ATTRIBUTE_MODIFIER_FORMAT.format(d), translatedAttribute)).withStyle(ChatFormatting.BLUE)); + } else if (statusEffect < 0.0D) { + d *= -1.0D; + tooltip.add((Component.translatable("attribute.modifier.take." + mutableText.operation().id(), ItemAttributeModifiers.ATTRIBUTE_MODIFIER_FORMAT.format(d), translatedAttribute)).withStyle(ChatFormatting.RED)); + } + } + } + } + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/api/ink/InkTransferHelper.java b/src/main/java/de/dafuqs/spectrum/api/ink/InkTransferHelper.java new file mode 100644 index 0000000000..fbca548163 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/api/ink/InkTransferHelper.java @@ -0,0 +1,127 @@ +package de.dafuqs.spectrum.api.ink; + +import de.dafuqs.spectrum.api.ink.capability.*; +import de.dafuqs.spectrum.api.ink.color.*; +import de.dafuqs.spectrum.api.ink.storage.*; +import de.dafuqs.spectrum.registries.*; +import it.unimi.dsi.fastutil.objects.*; + +import javax.annotation.*; +import java.util.*; + +public class InkTransferHelper { + + /** + * Transfers Ink from storages with lots of Ink to storages with less. + * When called repeatedly (like every tick) the values of all storages will equalize, limited by their max storage. + * Don't forget to mark your stuff dirty, like with InkStorageBlockEntity.setInkDirty()! + * @param capabilities The InkCapabilities to run an equalization tick on + */ + public static void equalizeInk(List capabilities) { + SpectrumRegistries.INK_COLOR.stream().forEach(inkColor -> equalizeInk(capabilities, inkColor)); + } + + public static void equalizeInk(InkCapability capability1, InkCapability capability2, @Nullable InkColor color) { + if(color == null) { + equalizeInk(capability1, capability2); + } else { + equalizeInk(List.of(capability1, capability2), color); + } + } + + public static void equalizeInk(InkCapability capability1, InkCapability capability2) { + SpectrumRegistries.INK_COLOR.stream().forEach(inkColor -> equalizeInk(List.of(capability1, capability2), inkColor)); + } + + private static void equalizeInk(List targets, InkColor color) { + final double PRESSURE_FACTOR = 0.02; + + Map map = new Object2ObjectArrayMap<>(); + Set dirtyCapabilities = new ObjectArraySet<>(); + for (InkCapability cap : targets) { + InkStorage storage = cap.getStorage(); + if (storage.accepts(color)) { + map.put(storage, cap); + } + } + + if (map.isEmpty()) { + return; + } + + // Compute average + long total = 0; + for (InkStorage s : map.keySet()) { + total += s.getEnergy(color); + } + double avg = (double) total / map.size(); + + for (Map.Entry source : map.entrySet()) { + InkCapability sourceCapability = source.getValue(); + InkStorage sourceStorage = source.getKey(); + long current = sourceStorage.getEnergy(color); + double diff = avg - current; + + if (diff > 0) { // Needs ink + if (!sourceCapability.canFill()) continue; + + long remainingNeed = (long) Math.ceil(diff * PRESSURE_FACTOR); + + for (Map.Entry other : map.entrySet()) { + if (other == sourceStorage) continue; + InkCapability otherCapability = other.getValue(); + if (!otherCapability.canDrain(false)) continue; + + InkStorage otherStorage = other.getKey(); + long available = otherStorage.getEnergy(color); + if (available <= 0) continue; + + long room = sourceStorage.getRoom(color); + if (room <= 0) break; + + long toTransfer = Math.min(Math.min(available, remainingNeed), room); + if (toTransfer > 0) { + long drained = otherStorage.drainEnergy(color, toTransfer); + sourceStorage.addEnergy(color, drained); + dirtyCapabilities.add(otherCapability); + dirtyCapabilities.add(sourceCapability); + + remainingNeed -= drained; + if (remainingNeed <= 0) break; + } + } + + } else if (diff < 0) { // Has excess + if (!sourceCapability.canDrain(false)) continue; + + long remainingExcess = (long) Math.ceil(-diff * PRESSURE_FACTOR); + + for (Map.Entry destination : map.entrySet()) { + if (destination == sourceStorage) continue; + InkCapability destinationCapability = destination.getValue(); + if (!destinationCapability.canFill()) continue; + + InkStorage destinationStorage = destination.getKey(); + long room = destinationStorage.getRoom(color); + if (room <= 0) continue; + + long toTransfer = Math.min(room, remainingExcess); + if (toTransfer > 0) { + long drained = sourceStorage.drainEnergy(color, toTransfer); + destinationStorage.addEnergy(color, drained); + dirtyCapabilities.add(destinationCapability); + dirtyCapabilities.add(sourceCapability); + + remainingExcess -= drained; + if (remainingExcess <= 0) break; + } + } + } + } + + for (InkCapability cap : dirtyCapabilities) { + cap.markDirty(); + } + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/api/ink/capability/BlockEntityInkCapability.java b/src/main/java/de/dafuqs/spectrum/api/ink/capability/BlockEntityInkCapability.java new file mode 100644 index 0000000000..a9a6655cc8 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/api/ink/capability/BlockEntityInkCapability.java @@ -0,0 +1,50 @@ +package de.dafuqs.spectrum.api.ink.capability; + +import de.dafuqs.spectrum.api.ink.storage.*; +import net.minecraft.core.*; +import net.minecraft.world.level.*; +import net.minecraft.world.level.block.entity.*; + +import javax.annotation.*; + +public class BlockEntityInkCapability implements InkCapability { + protected final InkStorageBlockEntity inkStorageBlockEntity; + protected final InkStorage storage; + + public static @Nullable BlockEntityInkCapability of(Level level, BlockPos pos) { + return of(level.getBlockEntity(pos)); + } + + public static @Nullable BlockEntityInkCapability of(BlockEntity blockEntity) { + if (blockEntity instanceof InkStorageBlockEntity inkBlockEntity) { + return new BlockEntityInkCapability(inkBlockEntity); + } + return null; + } + + private BlockEntityInkCapability(InkStorageBlockEntity inkBlockEntity) { + this.inkStorageBlockEntity = inkBlockEntity; + this.storage = inkBlockEntity.getInkStorage(); + } + + @Override + public InkStorage getStorage() { + return storage; + } + + @Override + public void markDirty() { + inkStorageBlockEntity.setInkDirty(); + } + + @Override + public boolean canFill() { + return true; + } + + @Override + public boolean canDrain(boolean player) { + return true; + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/api/ink/capability/InkCapabilities.java b/src/main/java/de/dafuqs/spectrum/api/ink/capability/InkCapabilities.java new file mode 100644 index 0000000000..89dd6469d1 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/api/ink/capability/InkCapabilities.java @@ -0,0 +1,22 @@ +package de.dafuqs.spectrum.api.ink.capability; + +import de.dafuqs.spectrum.*; +import net.neoforged.neoforge.capabilities.*; + +public class InkCapabilities { + + public static final BlockCapability BLOCK = + BlockCapability.create( + SpectrumCommon.locate("ink_handler"), + InkCapability.class, + Void.class + ); + + public static final ItemCapability ITEM = + ItemCapability.create( + SpectrumCommon.locate("ink_handler"), + InkCapability.class, + Void.class + ); + +} diff --git a/src/main/java/de/dafuqs/spectrum/api/ink/capability/InkCapability.java b/src/main/java/de/dafuqs/spectrum/api/ink/capability/InkCapability.java new file mode 100644 index 0000000000..3973516913 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/api/ink/capability/InkCapability.java @@ -0,0 +1,10 @@ +package de.dafuqs.spectrum.api.ink.capability; + +import de.dafuqs.spectrum.api.ink.storage.*; + +public interface InkCapability { + InkStorage getStorage(); + void markDirty(); + boolean canFill(); + boolean canDrain(boolean player); +} diff --git a/src/main/java/de/dafuqs/spectrum/api/ink/capability/ItemInkCapability.java b/src/main/java/de/dafuqs/spectrum/api/ink/capability/ItemInkCapability.java new file mode 100644 index 0000000000..945fa6405b --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/api/ink/capability/ItemInkCapability.java @@ -0,0 +1,46 @@ +package de.dafuqs.spectrum.api.ink.capability; + +import de.dafuqs.spectrum.api.ink.storage.*; +import net.minecraft.world.item.*; + +import javax.annotation.*; + +public class ItemInkCapability implements InkCapability { + protected final ItemStack stack; + protected final InkStorageItem item; + protected final InkStorage storage; + + public static @Nullable ItemInkCapability of(ItemStack stack) { + if (stack.getItem() instanceof InkStorageItem inkStorageItem) { + return new ItemInkCapability(stack, inkStorageItem); + } + return null; + } + + private ItemInkCapability(ItemStack stack, InkStorageItem inkStorageItem) { + this.stack = stack; + this.item = inkStorageItem; + this.storage = inkStorageItem.getEnergyStorage(stack); + } + + @Override + public InkStorage getStorage() { + return storage; + } + + @Override + public void markDirty() { + item.setEnergyStorage(stack, storage); + } + + @Override + public boolean canFill() { + return item.canFill(); + } + + @Override + public boolean canDrain(boolean player) { + return item.canDrain(player); + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/api/energy/color/InkColor.java b/src/main/java/de/dafuqs/spectrum/api/ink/color/InkColor.java similarity index 92% rename from src/main/java/de/dafuqs/spectrum/api/energy/color/InkColor.java rename to src/main/java/de/dafuqs/spectrum/api/ink/color/InkColor.java index 501b4834b7..543158d91e 100644 --- a/src/main/java/de/dafuqs/spectrum/api/energy/color/InkColor.java +++ b/src/main/java/de/dafuqs/spectrum/api/ink/color/InkColor.java @@ -1,4 +1,4 @@ -package de.dafuqs.spectrum.api.energy.color; +package de.dafuqs.spectrum.api.ink.color; import com.mojang.serialization.*; import de.dafuqs.spectrum.helpers.*; @@ -8,9 +8,10 @@ import net.minecraft.network.codec.*; import net.minecraft.resources.*; import net.minecraft.tags.*; +import net.minecraft.util.*; import net.minecraft.world.item.*; import org.joml.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; @@ -106,10 +107,19 @@ public Vector3f getColorVec() { return this.colorVec; } + @Deprecated(forRemoval = true) public int getColorInt() { return this.colorInt; } + public int getColorARGB() { + return this.colorInt; + } + + public int getColorRGB() { + return FastColor.ARGB32.opaque(this.colorInt); + } + public int getTextColorInt() { return this.textColor; } diff --git a/src/main/java/de/dafuqs/spectrum/api/energy/color/InkColorMixes.java b/src/main/java/de/dafuqs/spectrum/api/ink/color/InkColorMixes.java similarity index 95% rename from src/main/java/de/dafuqs/spectrum/api/energy/color/InkColorMixes.java rename to src/main/java/de/dafuqs/spectrum/api/ink/color/InkColorMixes.java index b5b02f699e..038ccd5ae7 100644 --- a/src/main/java/de/dafuqs/spectrum/api/energy/color/InkColorMixes.java +++ b/src/main/java/de/dafuqs/spectrum/api/ink/color/InkColorMixes.java @@ -1,10 +1,10 @@ -package de.dafuqs.spectrum.api.energy.color; +package de.dafuqs.spectrum.api.ink.color; import net.minecraft.util.*; import java.util.*; -import static de.dafuqs.spectrum.api.energy.color.InkColors.*; +import static de.dafuqs.spectrum.api.ink.color.InkColors.*; public class InkColorMixes { diff --git a/src/main/java/de/dafuqs/spectrum/api/energy/color/InkColorTags.java b/src/main/java/de/dafuqs/spectrum/api/ink/color/InkColorTags.java similarity index 91% rename from src/main/java/de/dafuqs/spectrum/api/energy/color/InkColorTags.java rename to src/main/java/de/dafuqs/spectrum/api/ink/color/InkColorTags.java index cedbdd4ece..1eb570b651 100644 --- a/src/main/java/de/dafuqs/spectrum/api/energy/color/InkColorTags.java +++ b/src/main/java/de/dafuqs/spectrum/api/ink/color/InkColorTags.java @@ -1,4 +1,4 @@ -package de.dafuqs.spectrum.api.energy.color; +package de.dafuqs.spectrum.api.ink.color; import de.dafuqs.spectrum.*; import de.dafuqs.spectrum.registries.*; diff --git a/src/main/java/de/dafuqs/spectrum/api/energy/color/InkColors.java b/src/main/java/de/dafuqs/spectrum/api/ink/color/InkColors.java similarity index 99% rename from src/main/java/de/dafuqs/spectrum/api/energy/color/InkColors.java rename to src/main/java/de/dafuqs/spectrum/api/ink/color/InkColors.java index 34d322c248..4946cef170 100644 --- a/src/main/java/de/dafuqs/spectrum/api/energy/color/InkColors.java +++ b/src/main/java/de/dafuqs/spectrum/api/ink/color/InkColors.java @@ -1,4 +1,4 @@ -package de.dafuqs.spectrum.api.energy.color; +package de.dafuqs.spectrum.api.ink.color; import de.dafuqs.spectrum.*; import de.dafuqs.spectrum.registries.*; diff --git a/src/main/java/de/dafuqs/spectrum/api/ink/color/package-info.java b/src/main/java/de/dafuqs/spectrum/api/ink/color/package-info.java new file mode 100644 index 0000000000..1be76b1b04 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/api/ink/color/package-info.java @@ -0,0 +1,7 @@ +@NullMarked +@MethodsReturnNonnullByDefault +@FieldsAreNonnullByDefault +package de.dafuqs.spectrum.api.energy.color; + +import net.minecraft.*; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/api/ink/package-info.java b/src/main/java/de/dafuqs/spectrum/api/ink/package-info.java new file mode 100644 index 0000000000..9f1becfa23 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/api/ink/package-info.java @@ -0,0 +1,7 @@ +@NullMarked +@MethodsReturnNonnullByDefault +@FieldsAreNonnullByDefault +package de.dafuqs.spectrum.api.energy; + +import net.minecraft.*; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/api/energy/storage/CreativeInkStorage.java b/src/main/java/de/dafuqs/spectrum/api/ink/storage/CreativeInkStorage.java similarity index 75% rename from src/main/java/de/dafuqs/spectrum/api/energy/storage/CreativeInkStorage.java rename to src/main/java/de/dafuqs/spectrum/api/ink/storage/CreativeInkStorage.java index 4c5bd6f795..77ecdaf4b1 100644 --- a/src/main/java/de/dafuqs/spectrum/api/energy/storage/CreativeInkStorage.java +++ b/src/main/java/de/dafuqs/spectrum/api/ink/storage/CreativeInkStorage.java @@ -1,12 +1,11 @@ -package de.dafuqs.spectrum.api.energy.storage; +package de.dafuqs.spectrum.api.ink.storage; -import de.dafuqs.spectrum.api.energy.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import net.minecraft.network.chat.*; import java.util.*; -public class CreativeInkStorage implements InkStorage { +public class CreativeInkStorage extends InkStorage { private static final Map STORAGE = new HashMap<>() {{ for (InkColor inkColor : InkColors.all()) { @@ -33,11 +32,6 @@ public long drainEnergy(InkColor color, long requestedAmount) { return requestedAmount; } - @Override - public boolean requestEnergy(InkColor color, long requestedAmount) { - return true; - } - @Override public long getEnergy(InkColor color) { return Long.MAX_VALUE; @@ -86,8 +80,8 @@ public void clearContent() { } @Override - public void addTooltip(List tooltip) { - tooltip.add(Component.translatable("item.spectrum.creative_ink_assortment.tooltip")); + public List getTooltip() { + return List.of(Component.translatable("item.spectrum.creative_ink_assortment.tooltip")); } @Override diff --git a/src/main/java/de/dafuqs/spectrum/api/ink/storage/FixedSingleInkStorage.java b/src/main/java/de/dafuqs/spectrum/api/ink/storage/FixedSingleInkStorage.java new file mode 100644 index 0000000000..131ece0fea --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/api/ink/storage/FixedSingleInkStorage.java @@ -0,0 +1,21 @@ +package de.dafuqs.spectrum.api.ink.storage; + +import de.dafuqs.spectrum.api.ink.color.*; + +public class FixedSingleInkStorage extends SingleInkStorage { + + public FixedSingleInkStorage(long maxEnergy, InkColor color) { + super(maxEnergy); + this.storedColor = color; + } + + public FixedSingleInkStorage(long maxEnergy, InkColor color, long amount) { + super(maxEnergy, color, amount); + } + + @Override + public boolean accepts(InkColor color) { + return this.storedColor == color; + } + +} \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/api/energy/storage/IndividualCappedInkStorage.java b/src/main/java/de/dafuqs/spectrum/api/ink/storage/IndividualCappedInkStorage.java similarity index 82% rename from src/main/java/de/dafuqs/spectrum/api/energy/storage/IndividualCappedInkStorage.java rename to src/main/java/de/dafuqs/spectrum/api/ink/storage/IndividualCappedInkStorage.java index 1d4942133e..82c7d16033 100644 --- a/src/main/java/de/dafuqs/spectrum/api/energy/storage/IndividualCappedInkStorage.java +++ b/src/main/java/de/dafuqs/spectrum/api/ink/storage/IndividualCappedInkStorage.java @@ -1,7 +1,6 @@ -package de.dafuqs.spectrum.api.energy.storage; +package de.dafuqs.spectrum.api.ink.storage; -import de.dafuqs.spectrum.api.energy.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.registries.*; import it.unimi.dsi.fastutil.objects.*; import net.minecraft.network.chat.*; @@ -10,7 +9,7 @@ import static de.dafuqs.spectrum.helpers.Support.*; -public class IndividualCappedInkStorage implements InkStorage { +public class IndividualCappedInkStorage extends InkStorage { protected final long maxEnergyPerColor; protected Map storedEnergy = new Object2LongArrayMap<>(); @@ -41,6 +40,12 @@ public IndividualCappedInkStorage(long maxEnergyPerColor, Map co } } + // Overridden for speed and to preserve order + @Override + public Collection acceptedColors() { + return this.storedEnergy.keySet(); + } + @Override public boolean accepts(InkColor color) { return this.storedEnergy.containsKey(color); @@ -61,18 +66,6 @@ public long addEnergy(InkColor color, long amount) { } } - @Override - public boolean requestEnergy(InkColor color, long amount) { - long storedAmount = this.storedEnergy.getOrDefault(color, 0L); - if (storedAmount < amount) { - return false; - } else { - this.currentTotal -= amount; - this.storedEnergy.put(color, storedAmount - amount); - return true; - } - } - @Override public long drainEnergy(InkColor color, long amount) { long storedAmount = this.storedEnergy.getOrDefault(color, 0L); @@ -126,16 +119,22 @@ public boolean isFull() { } @Override - public void addTooltip(List tooltip) { + public List getTooltip() { + List tooltip = new ArrayList<>(); tooltip.add(Component.translatable("item.spectrum.ink_storage.stores_ink_per_type", getShortenedNumberString(maxEnergyPerColor))); // we are iterating them this way to preserve the ordering - for (InkColor color : SpectrumRegistries.INK_COLOR) { - long amount = this.storedEnergy.getOrDefault(color, 0L); - if (amount > 0) { - InkStorage.addInkStoreBulletTooltip(tooltip, color, amount); + if(isEmpty()) { + tooltip.add(Component.translatable("spectrum.tooltip.ink_powered.empty")); + } else { + for (InkColor color : SpectrumRegistries.INK_COLOR) { + long amount = this.storedEnergy.getOrDefault(color, 0L); + if (amount > 0) { + tooltip.add(InkStorage.getInkStoreBulletTooltip(color, amount)); + } } } + return tooltip; } @Override @@ -155,7 +154,7 @@ public void fillCompletely() { @Override public void clearContent() { Set supportedColors = this.storedEnergy.keySet(); - Map newContent = new HashMap<>(); + Map newContent = new Object2LongArrayMap<>(); for (InkColor color : supportedColors) { newContent.put(color, 0L); } @@ -163,8 +162,4 @@ public void clearContent() { this.currentTotal = 0L; } - public Set getSupportedColors() { - return this.storedEnergy.keySet(); - } - } \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/api/ink/storage/InkStorage.java b/src/main/java/de/dafuqs/spectrum/api/ink/storage/InkStorage.java new file mode 100644 index 0000000000..a5bcad1332 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/api/ink/storage/InkStorage.java @@ -0,0 +1,95 @@ +package de.dafuqs.spectrum.api.ink.storage; + +import de.dafuqs.spectrum.api.ink.color.*; +import net.minecraft.*; +import net.minecraft.client.gui.components.*; +import net.minecraft.network.chat.*; +import net.minecraft.world.*; + +import java.util.*; + +import static de.dafuqs.spectrum.helpers.Support.*; + +/** + * Defines an object can store ink + **/ +public abstract class InkStorage implements Clearable { + + // if the storage is able to store this kind of color + public abstract boolean accepts(InkColor color); + + public Collection acceptedColors() { + List colors = new ArrayList<>(); + for(InkColor color : InkColors.all()) { + if(accepts(color)) colors.add(color); + } + return colors; + } + + /** + * Adds energy to the storage + * @param color the color to add to + * @param amount the amount to add + * @return the amount of energy that could not be added + */ + public abstract long addEnergy(InkColor color, long amount); + + // Drains energy from the storage. Returns the amount of energy that could be drained + // In contrast to requestEnergy this drains the energy up until 0, even if not requestedAmount of energy is stored + public abstract long drainEnergy(InkColor color, long requestedAmount); + + // gets the amount of stored energy of that type + public abstract long getEnergy(InkColor color); + + // gets all stored ink + // only use for syncing server <=> clientside + @Deprecated + public abstract Map getEnergy(); + + // sets the amount of stored energy of that type + // only use for syncing server <=> clientside + @Deprecated + public abstract void setEnergy(Map colors, long total); + + // the amount of energy that can be stored per individual color + public abstract long getMaxPerColor(); + + // the amount of energy that can be stored in total + public abstract long getMaxTotal(); + + // the amount of energy that is currently stored + public abstract long getCurrentTotal(); + + // true if no energy is stored + public abstract boolean isEmpty(); + + // true if the max total is reached + public abstract boolean isFull(); + + // fill up the storage with as much energy as possible + public abstract void fillCompletely(); + + // List instead of appended Components, since line breaks do not work in the GUI consistently + // WONTFIX as of https://bugs.mojang.com/browse/MC/issues/MC-269003 + public abstract List getTooltip(); + + public Tooltip getWidgetTooltip() { + MutableComponent mutableComponent = Component.literal(""); + List lines = getTooltip(); + for (int i = 0; i < lines.size(); i++) { + mutableComponent.append(lines.get(i)); + if (i < lines.size() - 1) { + mutableComponent.append(CommonComponents.NEW_LINE); + } + } + return Tooltip.create(mutableComponent); + } + + public abstract long getRoom(InkColor color); + + public static Component getInkStoreBulletTooltip(InkColor color, long amount) { + MutableComponent inkName = color.getColoredInkName(); + return Component.translatable("spectrum.tooltip.ink_powered.bullet_amount", Component.literal(getShortenedNumberString(amount)).withStyle(ChatFormatting.WHITE), inkName).setStyle(inkName.getStyle()); + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/api/energy/InkStorageBlockEntity.java b/src/main/java/de/dafuqs/spectrum/api/ink/storage/InkStorageBlockEntity.java similarity index 81% rename from src/main/java/de/dafuqs/spectrum/api/energy/InkStorageBlockEntity.java rename to src/main/java/de/dafuqs/spectrum/api/ink/storage/InkStorageBlockEntity.java index 67148bf191..57fd5951cf 100644 --- a/src/main/java/de/dafuqs/spectrum/api/energy/InkStorageBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/api/ink/storage/InkStorageBlockEntity.java @@ -1,18 +1,17 @@ -package de.dafuqs.spectrum.api.energy; +package de.dafuqs.spectrum.api.ink.storage; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.blocks.upgrade.*; -import javax.annotation.*; /** * Defines that an object holds a PigmentEnergyStorage * Objects are supposed to be block entities * - * @param + * @param */ -public interface InkStorageBlockEntity { +public interface InkStorageBlockEntity { - PStorage getEnergyStorage(); + IS getInkStorage(); /** * Drains ink exponentially increased by the amount of upgrades used. @@ -27,7 +26,7 @@ default float drainInkForUpgrades(Upgradeable upgradeable, Upgradeable.UpgradeTy } long inkToDrain = useEfficiency ? upgradeHolder.getEffectiveCostUsingEfficiency(upgradeType) : upgradeHolder.getEffectiveCost(upgradeType); - if (getEnergyStorage().drainEnergy(color, inkToDrain) == inkToDrain) { + if (getInkStorage().drainEnergy(color, inkToDrain) == inkToDrain) { setInkDirty(); return upgradeHolder.getEffectiveValue(upgradeType); } @@ -44,7 +43,7 @@ default float drainInkForUpgrades(Upgradeable upgradeable, Upgradeable.UpgradeTy default boolean drainInkForUpgradesRequired(Upgradeable upgradeable, Upgradeable.UpgradeType upgradeType, InkColor color, boolean useEfficiency) { Upgradeable.UpgradeHolder upgradeHolder = upgradeable.getUpgradeHolder(); long inkToDrain = useEfficiency ? upgradeHolder.getEffectiveCostUsingEfficiency(upgradeType) : upgradeHolder.getEffectiveCost(upgradeType); - if (getEnergyStorage().drainEnergy(color, inkToDrain) == inkToDrain) { + if (getInkStorage().drainEnergy(color, inkToDrain) == inkToDrain) { setInkDirty(); return true; } @@ -60,7 +59,7 @@ default boolean drainInkForUpgradesRequired(Upgradeable upgradeable, Upgradeable */ default boolean drainInkForUpgradesRequired(Upgradeable upgradeable, InkColor color, long amount, boolean useEfficiency) { long inkToDrain = useEfficiency ? upgradeable.getUpgradeHolder().getEffectiveCostUsingEfficiency(amount) : amount; - if (getEnergyStorage().drainEnergy(color, inkToDrain) == inkToDrain) { + if (getInkStorage().drainEnergy(color, inkToDrain) == inkToDrain) { setInkDirty(); return true; } diff --git a/src/main/java/de/dafuqs/spectrum/api/ink/storage/InkStorageItem.java b/src/main/java/de/dafuqs/spectrum/api/ink/storage/InkStorageItem.java new file mode 100644 index 0000000000..8706e23f36 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/api/ink/storage/InkStorageItem.java @@ -0,0 +1,45 @@ +package de.dafuqs.spectrum.api.ink.storage; + +import de.dafuqs.spectrum.components.*; +import de.dafuqs.spectrum.registries.*; +import net.minecraft.world.item.*; + +/** + * Defines that an object holds a PigmentEnergyStorage + * Objects are supposed to be items (so they implement getDefaultStack()) + * + * @param + */ +public interface InkStorageItem { + + default boolean canFill() { + return true; + } + + default boolean canDrain(boolean player) { + return true; + } + + PStorage getEnergyStorage(ItemStack itemStack); + + default void setEnergyStorage(ItemStack itemStack, InkStorage storage) { + itemStack.set(SpectrumDataComponentTypes.INK_STORAGE, new InkStorageComponent(storage)); + } + + ItemStack getDefaultInstance(); + + default ItemStack getFullStack() { + ItemStack stack = this.getDefaultInstance(); + PStorage storage = getEnergyStorage(stack); + storage.fillCompletely(); + setEnergyStorage(stack, storage); + return stack; + } + + default void clearEnergyStorage(ItemStack stack) { + PStorage storage = getEnergyStorage(stack); + storage.clearContent(); + setEnergyStorage(stack, storage); + } + +} \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/api/ink/storage/SingleInkStorage.java b/src/main/java/de/dafuqs/spectrum/api/ink/storage/SingleInkStorage.java new file mode 100644 index 0000000000..4fcc052106 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/api/ink/storage/SingleInkStorage.java @@ -0,0 +1,158 @@ +package de.dafuqs.spectrum.api.ink.storage; + +import de.dafuqs.spectrum.api.ink.color.*; +import net.minecraft.network.chat.*; + +import java.util.*; + +import static de.dafuqs.spectrum.helpers.Support.*; + +public class SingleInkStorage extends InkStorage { + + protected final long maxEnergy; + protected InkColor storedColor; + protected long storedEnergy; + + /** + * Stores a single type of Pigment Energy + * Can only be filled with a new type if it is empty + **/ + public SingleInkStorage(long maxEnergy) { + this.maxEnergy = maxEnergy; + this.storedColor = InkColors.CYAN; + this.storedEnergy = 0; + } + + public SingleInkStorage(long maxEnergy, InkColor color, long amount) { + this.maxEnergy = maxEnergy; + this.storedColor = color; + this.storedEnergy = amount; + } + + public InkColor getStoredColor() { + return storedColor; + } + + @Override + public boolean accepts(InkColor color) { + return this.storedEnergy == 0 || this.storedColor == color; + } + + @Override + public long addEnergy(InkColor color, long amount) { + if (!this.accepts(color)) { + return amount; + } + + if (this.storedEnergy == 0) { + this.storedColor = color; + } + long resultingAmount = this.storedEnergy + amount; + this.storedEnergy = resultingAmount; + if (resultingAmount > this.maxEnergy) { + long overflow = this.storedEnergy - this.maxEnergy; + this.storedEnergy = this.maxEnergy; + return overflow; + } + return 0; + } + + @Override + public long drainEnergy(InkColor color, long amount) { + if (color == this.storedColor) { + long drainedAmount = Math.min(this.storedEnergy, amount); + this.storedEnergy -= drainedAmount; + return drainedAmount; + } else { + return 0; + } + } + + @Override + public long getEnergy(InkColor color) { + if (color == this.storedColor) { + return this.storedEnergy; + } else { + return 0; + } + } + + @Override + @Deprecated + public Map getEnergy() { + return Map.of(this.storedColor, this.storedEnergy); + } + + @Override + @Deprecated + public void setEnergy(Map colors, long total) { + for (Map.Entry color : colors.entrySet()) { + long value = color.getValue(); + if (value > 0) { + this.storedColor = color.getKey(); + this.storedEnergy = color.getValue(); + } + } + } + + @Override + public long getMaxTotal() { + return this.maxEnergy; + } + + @Override + public long getMaxPerColor() { + return this.maxEnergy; + } + + @Override + public long getCurrentTotal() { + return this.storedEnergy; + } + + @Override + public boolean isEmpty() { + return this.storedEnergy == 0; + } + + @Override + public boolean isFull() { + return this.storedEnergy >= this.maxEnergy; + } + + @Override + public List getTooltip() { + List tooltip = new ArrayList<>(); + tooltip.add(Component.translatable("item.spectrum.ink_storage.stores_up_to_ink_per_type", getShortenedNumberString(this.maxEnergy))); + if (this.storedEnergy > 0) { + tooltip.add(InkStorage.getInkStoreBulletTooltip(this.storedColor, this.storedEnergy)); + } else { + tooltip.add(Component.translatable("spectrum.tooltip.ink_powered.empty")); + } + return tooltip; + } + + @Override + public long getRoom(InkColor color) { + if (this.accepts(color)) { + return this.maxEnergy - this.storedEnergy; + } else { + return 0; + } + } + + @Override + public void fillCompletely() { + this.storedEnergy = this.maxEnergy; + } + + @Override + public void clearContent() { + this.storedEnergy = 0; + } + + public void convertColor(InkColor color) { + this.storedColor = color; + } + +} \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/api/ink/storage/TotalCappedElementalMixingInkStorage.java b/src/main/java/de/dafuqs/spectrum/api/ink/storage/TotalCappedElementalMixingInkStorage.java new file mode 100644 index 0000000000..a628cc3870 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/api/ink/storage/TotalCappedElementalMixingInkStorage.java @@ -0,0 +1,122 @@ +package de.dafuqs.spectrum.api.ink.storage; + +import de.dafuqs.spectrum.api.ink.color.*; +import net.minecraft.network.chat.*; + +import java.util.*; + +import static de.dafuqs.spectrum.helpers.Support.*; + +public class TotalCappedElementalMixingInkStorage extends TotalCappedInkStorage { + + public TotalCappedElementalMixingInkStorage(long maxEnergyTotal, Map storedEnergy) { + super(maxEnergyTotal, storedEnergy); + } + + @Override + public boolean accepts(InkColor color) { + return color.isIn(InkColorTags.ELEMENTAL_COLORS); + } + + @Override + public long drainEnergy(InkColor color, long amount) { + if (color.isIn(InkColorTags.ELEMENTAL_COLORS)) { + // can be output directly + long storedAmount = this.storedEnergy.get(color); + long drainedAmount = Math.min(storedAmount, amount); + this.storedEnergy.put(color, storedAmount - drainedAmount); + + this.currentTotal -= drainedAmount; + return drainedAmount; + } + + // mix! + Optional> requiredElementals = InkColorMixes.getColorsToMix(color); + if (requiredElementals.isEmpty()) { + return 0; + } + + // calculate the max amount that can be drained over all colors + float percentageAbleToDrain = 1.0F; + for (Map.Entry entry : requiredElementals.get().entrySet()) { + long storedAmount = this.storedEnergy.get(entry.getKey()); + long requiredAmount = (int) Math.ceil(entry.getValue() * amount); + if (storedAmount < requiredAmount) { + percentageAbleToDrain = Math.min(percentageAbleToDrain, storedAmount / (float) requiredAmount); + } + } + + // drain + for (Map.Entry entry : requiredElementals.get().entrySet()) { + long storedAmount = this.storedEnergy.get(entry.getKey()); + long drainedAmount = (int) Math.ceil(entry.getValue() * amount * percentageAbleToDrain); + this.storedEnergy.put(entry.getKey(), storedAmount - drainedAmount); + } + + long drainedAmount = (int) Math.floor(percentageAbleToDrain * amount); + this.currentTotal -= drainedAmount; + return drainedAmount; + } + + @Override + public long getEnergy(InkColor color) { + if (color.isIn(InkColorTags.ELEMENTAL_COLORS)) { + // can be output directly + return this.storedEnergy.get(color); + } + + // mix! + long maxAmount = Long.MAX_VALUE; + Optional> requiredElementals = InkColorMixes.getColorsToMix(color); + if (requiredElementals.isEmpty()) { + return 0; + } + + for (Map.Entry entry : requiredElementals.get().entrySet()) { + long mixedAmount = (long) Math.floor(entry.getValue() * this.storedEnergy.get(entry.getKey())); + maxAmount = Math.min(maxAmount, mixedAmount); + } + return maxAmount; + } + + @Override + public void fillCompletely() { + this.storedEnergy.clear(); + List elementals = InkColors.elementals(); + if (elementals.isEmpty()) { + // in case the tag is empty or something queries that method + // before tags are fully synced + // looking at you, Mouse Wheelie + return; + } + + long energyPerColor = this.maxEnergyTotal / elementals.size(); + for (InkColor color : elementals) { + this.storedEnergy.put(color, energyPerColor); + } + this.currentTotal = energyPerColor * elementals.size(); // in case rounding is weird + } + + @Override + public void clearContent() { + this.storedEnergy.clear(); + } + + @Override + public long getRoom(InkColor color) { + if (color.isIn(InkColorTags.ELEMENTAL_COLORS)) { + return this.maxEnergyTotal - this.currentTotal; + } + return 0; + } + + @Override + public List getTooltip() { + List tooltip = new ArrayList<>(); + tooltip.add(Component.translatable("item.spectrum.artists_palette.tooltip", getShortenedNumberString(this.maxEnergyTotal))); + tooltip.add(Component.translatable("item.spectrum.artists_palette.tooltip.mix_on_demand")); + appendInkStoreBulletTooltips(tooltip); + return tooltip; + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/api/ink/storage/TotalCappedInkStorage.java b/src/main/java/de/dafuqs/spectrum/api/ink/storage/TotalCappedInkStorage.java new file mode 100644 index 0000000000..ee86a9d690 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/api/ink/storage/TotalCappedInkStorage.java @@ -0,0 +1,144 @@ +package de.dafuqs.spectrum.api.ink.storage; + +import de.dafuqs.spectrum.api.ink.color.*; +import de.dafuqs.spectrum.helpers.*; +import de.dafuqs.spectrum.registries.*; +import it.unimi.dsi.fastutil.objects.*; +import net.minecraft.network.chat.*; + +import java.util.*; + +public class TotalCappedInkStorage extends InkStorage { + + protected final long maxEnergyTotal; + protected Map storedEnergy = new Object2LongArrayMap<>(); + protected long currentTotal; // This is a cache for quick lookup. Can be recalculated anytime using the values in storedEnergy. + + public TotalCappedInkStorage(long maxEnergyTotal, Map energy) { + this.maxEnergyTotal = maxEnergyTotal; + + this.currentTotal = 0; + this.storedEnergy.putAll(energy); + for (Map.Entry color : energy.entrySet()) { + this.currentTotal += color.getValue(); + } + } + + @Override + public boolean accepts(InkColor color) { + return true; + } + + @Override + public long addEnergy(InkColor color, long amount) { + long overflow = Math.max(0, amount + this.currentTotal - this.maxEnergyTotal); + long amountToAdd = amount - overflow; + this.currentTotal += amountToAdd; + this.storedEnergy.put(color, this.storedEnergy.getOrDefault(color, 0L) + amountToAdd); + return overflow; + } + + @Override + public long drainEnergy(InkColor color, long amount) { + long storedAmount = this.storedEnergy.getOrDefault(color, 0L); + long drainedAmount = Math.min(storedAmount, amount); + this.storedEnergy.put(color, storedAmount - drainedAmount); + this.currentTotal -= drainedAmount; + return drainedAmount; + } + + @Override + public long getEnergy(InkColor color) { + return this.storedEnergy.getOrDefault(color, 0L); + } + + @Override + @Deprecated + public Map getEnergy() { + return this.storedEnergy; + } + + @Override + @Deprecated + public void setEnergy(Map colors, long total) { + this.storedEnergy.putAll(colors); + this.currentTotal = total; + } + + @Override + public long getMaxTotal() { + return this.maxEnergyTotal; + } + + @Override + public long getMaxPerColor() { + return this.maxEnergyTotal; + } + + @Override + public long getCurrentTotal() { + return this.currentTotal; + } + + @Override + public boolean isEmpty() { + return this.currentTotal == 0; + } + + @Override + public boolean isFull() { + return this.currentTotal >= this.maxEnergyTotal; + } + + @Override + public long getRoom(InkColor color) { + return this.maxEnergyTotal - this.currentTotal; + } + + @Override + public void fillCompletely() { + this.storedEnergy.clear(); + + int inkColorCount = SpectrumRegistries.INK_COLOR.size(); + long energyPerColor = this.maxEnergyTotal / inkColorCount; + for (InkColor color : InkColors.all()) { + this.storedEnergy.put(color, energyPerColor); + } + this.currentTotal = energyPerColor * inkColorCount; // in case rounding is weird + } + + @Override + public void clearContent() { + Map newContent = new HashMap<>(); + for (InkColor color : this.storedEnergy.keySet()) { + newContent.put(color, 0L); + } + this.storedEnergy = newContent; + this.currentTotal = 0; + } + + @Override + public List getTooltip() { + List tooltip = new ArrayList<>(); + + tooltip.add(Component.translatable("item.spectrum.total_capped_energy_storage.tooltip", Support.getShortenedNumberString(getMaxTotal()))); + appendInkStoreBulletTooltips(tooltip); + + return tooltip; + } + + protected void appendInkStoreBulletTooltips(List tooltip) { + if(isEmpty()) { + tooltip.add(Component.translatable("spectrum.tooltip.ink_powered.empty")); + return; + } + + for (InkColor color : SpectrumRegistries.INK_COLOR) { // we are iterating them this way to preserve the ordering + long amount = this.storedEnergy.getOrDefault(color, -1L); + if (amount > 0) { + tooltip.add(InkStorage.getInkStoreBulletTooltip(color, amount)); + } + } + } + +} \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/api/ink/storage/package-info.java b/src/main/java/de/dafuqs/spectrum/api/ink/storage/package-info.java new file mode 100644 index 0000000000..d9439ce159 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/api/ink/storage/package-info.java @@ -0,0 +1,7 @@ +@NullMarked +@MethodsReturnNonnullByDefault +@FieldsAreNonnullByDefault +package de.dafuqs.spectrum.api.energy.storage; + +import net.minecraft.*; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/api/interaction/EntityColorProcessor.java b/src/main/java/de/dafuqs/spectrum/api/interaction/EntityColorProcessor.java index 48a03fc745..26e06f3922 100644 --- a/src/main/java/de/dafuqs/spectrum/api/interaction/EntityColorProcessor.java +++ b/src/main/java/de/dafuqs/spectrum/api/interaction/EntityColorProcessor.java @@ -3,7 +3,7 @@ import net.minecraft.world.entity.*; import net.minecraft.world.entity.player.*; import net.minecraft.world.item.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/api/interaction/EntityColorProcessorRegistry.java b/src/main/java/de/dafuqs/spectrum/api/interaction/EntityColorProcessorRegistry.java index edc87c172f..2adcf20c6a 100644 --- a/src/main/java/de/dafuqs/spectrum/api/interaction/EntityColorProcessorRegistry.java +++ b/src/main/java/de/dafuqs/spectrum/api/interaction/EntityColorProcessorRegistry.java @@ -4,7 +4,7 @@ import net.minecraft.world.entity.player.*; import net.minecraft.world.item.*; import org.apache.commons.lang3.function.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; import java.util.function.*; diff --git a/src/main/java/de/dafuqs/spectrum/api/interaction/ItemProjectileBehavior.java b/src/main/java/de/dafuqs/spectrum/api/interaction/ItemProjectileBehavior.java index b819c411da..e97e22daec 100644 --- a/src/main/java/de/dafuqs/spectrum/api/interaction/ItemProjectileBehavior.java +++ b/src/main/java/de/dafuqs/spectrum/api/interaction/ItemProjectileBehavior.java @@ -23,7 +23,7 @@ import net.minecraft.world.item.enchantment.*; import net.minecraft.world.level.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; import java.util.function.*; @@ -178,14 +178,14 @@ public ItemStack onEntityHit(ItemProjectileEntity projectile, ItemStack stack, E livingOwner.setLastHurtMob(target); } - if (dealDamage(projectile, owner, target)) { + if (dealDamage(projectile, owner, target) && target.getType() != EntityType.ENDERMAN) { int targetFireTicks = target.getRemainingFireTicks(); if (projectile.isOnFire()) { target.setRemainingFireTicks(targetFireTicks); } if (target instanceof LivingEntity livingTarget) { - if (owner.level() instanceof ServerLevel serverWorld) { + if (owner.level() instanceof ServerLevel serverWorld && livingTarget.getLastDamageSource() != null) { EnchantmentHelper.doPostAttackEffectsWithItemSource(serverWorld, target, livingTarget.getLastDamageSource(), stack); } if (target != owner && target instanceof Player && owner instanceof ServerPlayer serverPlayerOwner && !projectile.isSilent()) { diff --git a/src/main/java/de/dafuqs/spectrum/api/interaction/ItemProviderRegistry.java b/src/main/java/de/dafuqs/spectrum/api/interaction/ItemProviderRegistry.java index a3a079d7cf..276745c562 100644 --- a/src/main/java/de/dafuqs/spectrum/api/interaction/ItemProviderRegistry.java +++ b/src/main/java/de/dafuqs/spectrum/api/interaction/ItemProviderRegistry.java @@ -1,7 +1,7 @@ package de.dafuqs.spectrum.api.interaction; import net.minecraft.world.item.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/api/interaction/OmniAcceleratorProjectile.java b/src/main/java/de/dafuqs/spectrum/api/interaction/OmniAcceleratorProjectile.java index 2cca547155..d151468f7e 100644 --- a/src/main/java/de/dafuqs/spectrum/api/interaction/OmniAcceleratorProjectile.java +++ b/src/main/java/de/dafuqs/spectrum/api/interaction/OmniAcceleratorProjectile.java @@ -10,7 +10,7 @@ import net.minecraft.world.item.*; import net.minecraft.world.level.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; import java.util.function.*; diff --git a/src/main/java/de/dafuqs/spectrum/api/interaction/ResonanceProcessor.java b/src/main/java/de/dafuqs/spectrum/api/interaction/ResonanceProcessor.java index 454e3a0625..5f1d5f8430 100644 --- a/src/main/java/de/dafuqs/spectrum/api/interaction/ResonanceProcessor.java +++ b/src/main/java/de/dafuqs/spectrum/api/interaction/ResonanceProcessor.java @@ -7,6 +7,7 @@ import net.minecraft.world.item.*; import net.minecraft.world.level.block.entity.*; import net.minecraft.world.level.block.state.*; +import org.jspecify.annotations.*; import java.util.*; @@ -23,10 +24,19 @@ public ResonanceProcessor(BrokenBlockPredicate blockPredicate) { this.blockPredicate = blockPredicate; } - public abstract boolean process(BlockState state, BlockEntity blockEntity, List droppedStacks); - - public static void applyResonance(RegistryAccess drm, BlockState minedState, BlockEntity blockEntity, List droppedStacks) { - drm.registryOrThrow(SpectrumRegistryKeys.RESONANCE_PROCESSOR).forEach(entry -> entry.process(minedState, blockEntity, droppedStacks)); + public abstract Optional> process(BlockState state, @Nullable BlockEntity blockEntity, List droppedStacks); + + public static List applyResonance(RegistryAccess drm, BlockState minedState, BlockEntity blockEntity, List original) { + Registry resonanceProcessors = drm.registryOrThrow(SpectrumRegistryKeys.RESONANCE_PROCESSOR); + for(ResonanceProcessor processor : resonanceProcessors) { + // since droppedStacks can be immutable (e.g. empty lists) we should always return a new list, + // instead of modifying the existing one + Optional> result = processor.process(minedState, blockEntity, original); + if(result.isPresent()) { + return result.get(); + } + } + return original; } public abstract MapCodec getCodec(); diff --git a/src/main/java/de/dafuqs/spectrum/api/interaction/package-info.java b/src/main/java/de/dafuqs/spectrum/api/interaction/package-info.java index b18b4af8bb..8f2965fb84 100644 --- a/src/main/java/de/dafuqs/spectrum/api/interaction/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/api/interaction/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.api.interaction; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/api/item/ExpandedStatTooltip.java b/src/main/java/de/dafuqs/spectrum/api/item/ExpandedStatTooltip.java index e55563d468..7e4826e56b 100644 --- a/src/main/java/de/dafuqs/spectrum/api/item/ExpandedStatTooltip.java +++ b/src/main/java/de/dafuqs/spectrum/api/item/ExpandedStatTooltip.java @@ -3,7 +3,7 @@ import net.minecraft.network.chat.*; import net.minecraft.world.entity.player.*; import net.minecraft.world.item.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.function.*; diff --git a/src/main/java/de/dafuqs/spectrum/api/item/ExperienceStorageItem.java b/src/main/java/de/dafuqs/spectrum/api/item/ExperienceStorageItem.java index e02f68c7b4..2418fb4983 100644 --- a/src/main/java/de/dafuqs/spectrum/api/item/ExperienceStorageItem.java +++ b/src/main/java/de/dafuqs/spectrum/api/item/ExperienceStorageItem.java @@ -1,9 +1,7 @@ package de.dafuqs.spectrum.api.item; -import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.core.*; -import net.minecraft.util.*; import net.minecraft.world.item.*; public interface ExperienceStorageItem { diff --git a/src/main/java/de/dafuqs/spectrum/api/item/InkPoweredPotionFillable.java b/src/main/java/de/dafuqs/spectrum/api/item/InkPoweredPotionFillable.java index 1235abd491..348a35130f 100644 --- a/src/main/java/de/dafuqs/spectrum/api/item/InkPoweredPotionFillable.java +++ b/src/main/java/de/dafuqs/spectrum/api/item/InkPoweredPotionFillable.java @@ -1,10 +1,11 @@ package de.dafuqs.spectrum.api.item; -import de.dafuqs.spectrum.api.energy.*; +import de.dafuqs.spectrum.api.ink.*; +import de.dafuqs.spectrum.components.*; +import de.dafuqs.spectrum.registries.*; import net.minecraft.network.chat.*; import net.minecraft.world.effect.*; import net.minecraft.world.item.*; -import javax.annotation.*; import java.util.*; @@ -16,60 +17,52 @@ public interface InkPoweredPotionFillable { // used for calculating the items amount to apply a certain effect // calculated once and then stored in the items nbt for quick lookup and nicer modifiability // via commands or special loot (so ones found in dungeon chests can be cheaper!) - default long adjustFinalCostFor(InkPoweredStatusEffectInstance instance) { + default long adjustFinalCostFor(InkPoweredMobEffectInstance instance) { return (long) Math.pow(instance.getInkCost().amount(), 1 + instance.getStatusEffectInstance().getAmplifier()); } // saving - default void addOrUpgradeEffects(ItemStack potionFillableStack, List newEffects) { - if (!isFull(potionFillableStack)) { - // by default, values are immutable, so we need to copy the values to an arraylist to be able to add stuff to it - List existingEffects = new ArrayList<>(InkPoweredStatusEffectInstance.getEffects(potionFillableStack)); - int maxCount = maxEffectCount(); - int maxAmplifier = maxEffectAmplifier(); - for (InkPoweredStatusEffectInstance newEffect : newEffects) { - MobEffectInstance statusEffectInstance = newEffect.getStatusEffectInstance(); - if (statusEffectInstance.getAmplifier() > maxAmplifier) { - statusEffectInstance = new MobEffectInstance(statusEffectInstance.getEffect(), statusEffectInstance.getDuration(), maxAmplifier, statusEffectInstance.isAmbient(), statusEffectInstance.isVisible()); - } - if (existingEffects.size() == maxCount) { - break; - } - - // calculate the final amount of this effect and add it - InkAmount adjustedCost = new InkAmount(newEffect.getInkCost().color(), adjustFinalCostFor(newEffect)); - InkPoweredStatusEffectInstance modifiedInstance = new InkPoweredStatusEffectInstance(statusEffectInstance, adjustedCost, newEffect.getColor(), newEffect.isUnidentifiable()); - existingEffects.add(modifiedInstance); + default void addOrUpgradeEffects(ItemStack potionFillableStack, List newEffects, Optional color, boolean unidentifiable) { + if(newEffects.isEmpty()) { + return; + } + if (isFull(potionFillableStack)) { + return; + } + + // by default, values are immutable, so we need to copy the values to an arraylist to be able to add stuff to it + List existingEffects = new ArrayList<>(InkPoweredPotionContentsComponent.getEffects(potionFillableStack)); + int maxCount = maxEffectCount(); + int maxAmplifier = maxEffectAmplifier(); + for (InkPoweredMobEffectInstance newEffect : newEffects) { + MobEffectInstance statusEffectInstance = newEffect.getStatusEffectInstance(); + if (statusEffectInstance.getAmplifier() > maxAmplifier) { + statusEffectInstance = new MobEffectInstance(statusEffectInstance.getEffect(), statusEffectInstance.getDuration(), maxAmplifier, statusEffectInstance.isAmbient(), statusEffectInstance.isVisible()); + } + if (existingEffects.size() == maxCount) { + break; } - InkPoweredStatusEffectInstance.setEffects(potionFillableStack, existingEffects); + // calculate the final amount of this effect and add it + InkAmount adjustedCost = new InkAmount(newEffect.getInkCost().color(), adjustFinalCostFor(newEffect)); + InkPoweredMobEffectInstance modifiedInstance = new InkPoweredMobEffectInstance(statusEffectInstance, adjustedCost, color, unidentifiable); + existingEffects.add(modifiedInstance); } - } - - static List getEffects(ItemStack stack) { - return InkPoweredStatusEffectInstance.getEffects(stack); - } - - @Deprecated - default List getVanillaEffects(ItemStack stack) { - return InkPoweredStatusEffectInstance.getEffects(stack).stream().map(InkPoweredStatusEffectInstance::getStatusEffectInstance).toList(); + + InkPoweredPotionContentsComponent.setEffects(potionFillableStack, existingEffects); } default boolean isFull(ItemStack itemStack) { - return InkPoweredStatusEffectInstance.getEffects(itemStack).size() >= maxEffectCount(); + return InkPoweredPotionContentsComponent.getEffects(itemStack).size() >= maxEffectCount(); } default boolean isAtLeastPartiallyFilled(ItemStack itemStack) { - return !InkPoweredStatusEffectInstance.getEffects(itemStack).isEmpty(); - } - - default void clearEffects(ItemStack itemStack) { - InkPoweredStatusEffectInstance.setEffects(itemStack, List.of()); + return !InkPoweredPotionContentsComponent.getEffects(itemStack).isEmpty(); } default void appendPotionFillableTooltip(ItemStack stack, List tooltip, MutableComponent attributeModifierText, boolean showDuration, float tickRate) { - List effects = InkPoweredStatusEffectInstance.getEffects(stack); - InkPoweredStatusEffectInstance.buildTooltip(tooltip, effects, attributeModifierText, showDuration, tickRate); + List effects = InkPoweredPotionContentsComponent.getEffects(stack); + InkPoweredMobEffectInstance.buildTooltip(tooltip, effects, attributeModifierText, showDuration, tickRate); int maxEffectCount = maxEffectCount(); if (effects.size() < maxEffectCount) { diff --git a/src/main/java/de/dafuqs/spectrum/api/item/Preenchanted.java b/src/main/java/de/dafuqs/spectrum/api/item/Preenchanted.java index 0d6074cc6d..4fd113469b 100644 --- a/src/main/java/de/dafuqs/spectrum/api/item/Preenchanted.java +++ b/src/main/java/de/dafuqs/spectrum/api/item/Preenchanted.java @@ -7,7 +7,7 @@ import net.minecraft.resources.*; import net.minecraft.world.item.*; import net.minecraft.world.item.enchantment.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/api/item/SlotReservingItem.java b/src/main/java/de/dafuqs/spectrum/api/item/SlotReservingItem.java index 1769a4c4f9..598f95030b 100644 --- a/src/main/java/de/dafuqs/spectrum/api/item/SlotReservingItem.java +++ b/src/main/java/de/dafuqs/spectrum/api/item/SlotReservingItem.java @@ -1,8 +1,11 @@ package de.dafuqs.spectrum.api.item; import de.dafuqs.spectrum.registries.*; +import net.minecraft.core.component.*; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.player.*; import net.minecraft.world.item.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; @@ -28,4 +31,14 @@ static void free(ItemStack stack) { stack.remove(SpectrumDataComponentTypes.SLOT_RESERVER); } + static void inventoryTick(Entity entity, ItemStack stack) { + if (entity instanceof Player player) { + if (player.getCooldowns().isOnCooldown(stack.getItem()) || SlotReservingItem.isReservingSlot(stack)) { + stack.remove(DataComponents.ATTRIBUTE_MODIFIERS); + } else { + stack.set(DataComponents.ATTRIBUTE_MODIFIERS, stack.getPrototype().get(DataComponents.ATTRIBUTE_MODIFIERS)); + } + } + } + } diff --git a/src/main/java/de/dafuqs/spectrum/api/item/package-info.java b/src/main/java/de/dafuqs/spectrum/api/item/package-info.java index baa8894b4c..3876020e84 100644 --- a/src/main/java/de/dafuqs/spectrum/api/item/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/api/item/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.api.item; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/api/item_group/package-info.java b/src/main/java/de/dafuqs/spectrum/api/item_group/package-info.java index d77b3d4829..2967c73e98 100644 --- a/src/main/java/de/dafuqs/spectrum/api/item_group/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/api/item_group/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.api.item_group; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/api/pastel_network/PastelUpgradeSignature.java b/src/main/java/de/dafuqs/spectrum/api/pastel_network/PastelUpgradeSignature.java index bc5a9add65..cd09598b84 100644 --- a/src/main/java/de/dafuqs/spectrum/api/pastel_network/PastelUpgradeSignature.java +++ b/src/main/java/de/dafuqs/spectrum/api/pastel_network/PastelUpgradeSignature.java @@ -1,46 +1,107 @@ package de.dafuqs.spectrum.api.pastel_network; +import com.mojang.serialization.*; +import com.mojang.serialization.codecs.*; +import de.dafuqs.spectrum.*; +import de.dafuqs.spectrum.registries.*; import net.minecraft.core.*; import net.minecraft.resources.*; +import net.minecraft.util.*; import net.minecraft.world.*; import net.minecraft.world.item.*; import net.minecraft.world.level.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public final class PastelUpgradeSignature { - + + public static Holder.@Nullable Reference of(Level level, Item item) { + return level.registryAccess().registry(SpectrumRegistryKeys.PASTEL_UPGRADE).get().holders() + .filter(pastelUpgradeSignature -> pastelUpgradeSignature.value().upgradeItem.value().equals(item)) + .findFirst() + .orElse(null); + } + + public enum RedstoneBehavior implements StringRepresentable { + NONE("none"), + ALWAYS_ACTIVE("always_active"), + ALWAYS_INACTIVE("always_inactive"), + INVERTED("inverted"), + LAMP("lamp"), + SENSOR("sensor"); + + public static final Codec CODEC = StringRepresentable.fromEnum(RedstoneBehavior::values); + + private final String name; + + RedstoneBehavior(String name) { + this.name = name; + } + + @Override + public String getSerializedName() { + return name; + } + } + + public static final Codec CODEC = RecordCodecBuilder.create((i -> i.group( + ItemStack.ITEM_NON_AIR_CODEC.fieldOf("item").forGetter(c -> c.upgradeItem), + Codec.STRING.fieldOf("name").forGetter(c -> c.name), + Codec.BOOL.optionalFieldOf("goes_to_redstone_ring", false).forGetter(c -> c.goesToRedstoneRing), + Codec.INT.optionalFieldOf("additional_filter_rows", 0).forGetter(c -> c.additionalFilterRows), + Codec.FLOAT.optionalFieldOf("transfer_count_multiplier", 1.0F).forGetter(c -> c.transferCountMultiplier), + Codec.FLOAT.optionalFieldOf("transfer_duration_multiplier", 1.0F).forGetter(c -> c.transferDurationMultiplier), + Codec.FLOAT.optionalFieldOf("transfer_cooldown_multiplier", 1.0F).forGetter(c -> c.transferCooldownMultiplier), + Codec.BOOL.optionalFieldOf("light", false).forGetter(c -> c.light), + Codec.BOOL.optionalFieldOf("trigger", false).forGetter(c -> c.triggerTransfer), + Codec.BOOL.optionalFieldOf("lamp", false).forGetter(c -> c.lamp), + Codec.BOOL.optionalFieldOf("sensor", false).forGetter(c -> c.sensor), + RedstoneBehavior.CODEC.optionalFieldOf("redstone", RedstoneBehavior.NONE).forGetter(c -> c.redstoneBehavior) + ).apply(i, PastelUpgradeSignature::new))); + public static final String INNER_RING_BASE_PATH = "textures/block/pastel_node_inner_ring_"; public static final String OUTER_RING_BASE_PATH = "textures/block/pastel_node_outer_ring_"; public static final String REDSTONE_RING_BASE_PATH = "textures/block/pastel_node_redstone_ring_"; - - public final Item upgradeItem; + + public final Holder upgradeItem; public final String name; + public final boolean goesToRedstoneRing; public final ResourceLocation outerRing, innerRing; - public final int stack, speed, slotRows; - public final float stackMult, speedMult; - public final boolean light, priority, triggerTransfer, lamp, sensor; - public final Category category; + public final int additionalFilterRows; + public final float transferCountMultiplier, transferDurationMultiplier, transferCooldownMultiplier; + public final boolean light, triggerTransfer, lamp, sensor; + public final RedstoneBehavior redstoneBehavior; public final RedstoneStateModifier preProcessor; public final RedstoneStateModifier postProcessor; - private PastelUpgradeSignature(Item upgradeItem, String name, ResourceLocation outerRing, ResourceLocation innerRing, int stack, int speed, int slotRows, float stackMult, float speedMult, boolean light, boolean priority, boolean triggerTransfer, boolean lamp, boolean sensor, Category category, RedstoneStateModifier preProcessor, RedstoneStateModifier postProcessor) { + private PastelUpgradeSignature(Holder upgradeItem, String name, boolean goesToRedstoneRing, int additionalFilterRows, float transferCountMultiplier, float transferDurationMultiplier, float transferCooldownMultiplier, boolean light, boolean triggerTransfer, boolean lamp, boolean sensor, RedstoneBehavior redstoneBehavior) { + this(upgradeItem, name, goesToRedstoneRing, additionalFilterRows, transferCountMultiplier, transferDurationMultiplier, transferCooldownMultiplier, light, redstoneBehavior != RedstoneBehavior.NONE || triggerTransfer, lamp, sensor, redstoneBehavior, switch (redstoneBehavior) { + case ALWAYS_ACTIVE -> (RedstoneStateModifier) context -> InteractionResult.SUCCESS; + case ALWAYS_INACTIVE -> (RedstoneStateModifier) context -> InteractionResult.FAIL; + default -> RedstoneStateModifier.PASS; + }, switch (redstoneBehavior) { + case INVERTED -> (RedstoneStateModifier) context -> context.active() ? InteractionResult.FAIL : InteractionResult.SUCCESS; + default -> RedstoneStateModifier.PASS; + }); + } + + private PastelUpgradeSignature(Holder upgradeItem, String name, boolean goesToRedstoneRing, int additionalFilterRows, float transferCountMultiplier, float transferDurationMultiplier, float transferCooldownMultiplier, boolean light, boolean triggerTransfer, boolean lamp, boolean sensor, RedstoneBehavior redstoneBehavior, RedstoneStateModifier preProcessor, RedstoneStateModifier postProcessor) { this.upgradeItem = upgradeItem; this.name = name; - this.outerRing = outerRing; - this.innerRing = innerRing; - this.stack = stack; - this.speed = speed; - this.slotRows = slotRows; - this.stackMult = stackMult; - this.speedMult = speedMult; + this.goesToRedstoneRing = goesToRedstoneRing; + this.additionalFilterRows = additionalFilterRows; + this.transferCountMultiplier = transferCountMultiplier; + this.transferDurationMultiplier = transferDurationMultiplier; + this.transferCooldownMultiplier = transferCooldownMultiplier; this.light = light; - this.priority = priority; this.triggerTransfer = triggerTransfer; this.lamp = lamp; - this.category = category; this.preProcessor = preProcessor; this.postProcessor = postProcessor; this.sensor = sensor; + this.redstoneBehavior = redstoneBehavior; + + this.innerRing = SpectrumCommon.locate(INNER_RING_BASE_PATH + name + ".png"); + this.outerRing = goesToRedstoneRing() ? SpectrumCommon.locate(REDSTONE_RING_BASE_PATH + name + ".png") : SpectrumCommon.locate(OUTER_RING_BASE_PATH + name + ".png"); } public ResourceLocation outerRing() { @@ -50,173 +111,11 @@ public ResourceLocation outerRing() { public ResourceLocation innerRing() { return innerRing; } - - public static Builder builder(Item upgradeItem, Category category, String namespace) { - return new Builder(upgradeItem, category, namespace); - } - - public static final class Builder { - private final Item upgradeItem; - private final Category category; - private final String namespace; - private @Nullable String name, outerRing, innerRing; - private int stackMod, speedMod, slotRowMod; - private float stackMult = 1, speedMult = 1; - private boolean light, priority, triggerTransfer, lamp, sensor; - private RedstoneStateModifier preProcessor = RedstoneStateModifier.PASS; - private RedstoneStateModifier postProcessor = RedstoneStateModifier.PASS; - - public Builder(Item upgradeItem, Category category, String namespace) { - this.upgradeItem = upgradeItem; - this.category = category; - this.namespace = namespace; - } - - public Builder named(String name) { - name(name); - outerRing(name); - innerRing(name); - return this; - } - - public Builder name(String name) { - this.name = name; - return this; - } - - public Builder outerRing(String name) { - this.outerRing = OUTER_RING_BASE_PATH + name + ".png"; - return this; - } - - public Builder innerRing(String name) { - this.innerRing = INNER_RING_BASE_PATH + name + ".png"; - return this; - } - - public Builder redstone(String name) { - name(name); - this.outerRing = REDSTONE_RING_BASE_PATH + name + ".png"; - return this; - } - - public Builder stackMod(int stackMod) { - this.stackMod = stackMod; - return this; - } - - public Builder speedMod(int speedMod) { - this.speedMod = speedMod; - return this; - } - - public Builder slotRowMod(int slotRowMod) { - this.slotRowMod = slotRowMod; - return this; - } - - public Builder stackMult(float stackMult) { - this.stackMult = stackMult; - return this; - } - - public Builder speedMult(float speedMult) { - this.speedMult = speedMult; - return this; - } - - public Builder light() { - this.light = true; - return this; - } - - public Builder priority() { - this.priority = true; - return this; - } - - public Builder triggerTransfer() { - this.triggerTransfer = true; - return this; - } - - public Builder lamp() { - this.lamp = true; - return this; - } - - public Builder sensor() { - this.sensor = true; - return this; - } - - public Builder redstonePreProcess(RedstoneStateModifier modifier) { - this.preProcessor = modifier; - return this; - } - - public Builder redstonePostProcess(RedstoneStateModifier modifier) { - this.postProcessor = modifier; - return this; - } - - public PastelUpgradeSignature build() { - verify(); - - return new PastelUpgradeSignature( - upgradeItem, - name, - ResourceLocation.fromNamespaceAndPath(namespace, outerRing), - ResourceLocation.fromNamespaceAndPath(namespace, innerRing), - stackMod, - speedMod, - slotRowMod, - stackMult, - speedMult, - light, - priority, - triggerTransfer, - lamp, - sensor, - category, - preProcessor, - postProcessor - ); - } - - public PastelUpgradeSignature buildRedstone() { - verify(); - - return new PastelUpgradeSignature( - upgradeItem, - name, - ResourceLocation.fromNamespaceAndPath(namespace, outerRing), - null, - 0, - 0, - 0, - 0, - 0, - false, - false, - triggerTransfer, - lamp, - sensor, - category, - preProcessor, - postProcessor - ); - } - - private void verify() { - if (name == null) - throw new IllegalStateException("PastelUpgradeSignature name can't be null"); - - if (outerRing == null) - throw new IllegalStateException("PastelUpgradeSignature main path can't be null"); - } + + public boolean goesToRedstoneRing() { + return goesToRedstoneRing; } - + /** * SUCCESS = on

* FAIL = off

@@ -231,44 +130,5 @@ public interface RedstoneStateModifier { public record RedstoneContext(PastelUpgradeable upgradeable, Level world, BlockPos pos, boolean active) { } - - public abstract static class Category { - public abstract boolean compoundsWith(Category other); - - public static Category simple() { - return new Category() { - @Override - public boolean compoundsWith(Category other) { - return other == this; - } - }; - } - - public static Category nonCompounding() { - return new Category() { - @Override - public boolean compoundsWith(Category other) { - return false; - } - }; - } - - public static Category redstone() { - return new Category() { - @Override - public boolean compoundsWith(Category other) { - return false; - } - - @Override - public boolean isRedstone() { - return true; - } - }; - } - - public boolean isRedstone() { - return false; - } - } + } diff --git a/src/main/java/de/dafuqs/spectrum/api/pastel_network/PastelUpgradeable.java b/src/main/java/de/dafuqs/spectrum/api/pastel_network/PastelUpgradeable.java index 240c366c11..f45de4c72d 100644 --- a/src/main/java/de/dafuqs/spectrum/api/pastel_network/PastelUpgradeable.java +++ b/src/main/java/de/dafuqs/spectrum/api/pastel_network/PastelUpgradeable.java @@ -1,10 +1,10 @@ package de.dafuqs.spectrum.api.pastel_network; -import java.util.*; +import org.jspecify.annotations.*; public interface PastelUpgradeable { - default void apply(PastelUpgradeSignature upgrade, List previousUpgrades) { + default void apply(PastelUpgradeSignature upgrade, @Nullable PastelUpgradeSignature previous) { if (upgrade.light) { markLit(); } @@ -18,29 +18,13 @@ default void apply(PastelUpgradeSignature upgrade, List if (upgrade.sensor) markSensor(); - if (upgrade.category.isRedstone()) + if (upgrade.goesToRedstoneRing()) return; - - if (previousUpgrades.stream().anyMatch(u -> u.category.compoundsWith(upgrade.category))) { - applyCompounding(upgrade); - } else { - applySimple(upgrade); - } - - applySlotUpgrade(upgrade); - - if (upgrade.priority) { - upgradePriority(); - } + + applySignature(upgrade); } - - void applyCompounding(PastelUpgradeSignature upgrade); - - void applySimple(PastelUpgradeSignature upgrade); - - void applySlotUpgrade(PastelUpgradeSignature upgrade); - - void upgradePriority(); + + void applySignature(PastelUpgradeSignature upgrade); void markLit(); diff --git a/src/main/java/de/dafuqs/spectrum/api/pastel_network/package-info.java b/src/main/java/de/dafuqs/spectrum/api/pastel_network/package-info.java index caebcc666c..33e048cf2b 100644 --- a/src/main/java/de/dafuqs/spectrum/api/pastel_network/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/api/pastel_network/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.api.pastel_network; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/api/predicate/block/package-info.java b/src/main/java/de/dafuqs/spectrum/api/predicate/block/package-info.java index 26154e8b8c..1a948e0dd0 100644 --- a/src/main/java/de/dafuqs/spectrum/api/predicate/block/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/api/predicate/block/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.api.predicate.block; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/api/predicate/item/BottomlessStackPredicate.java b/src/main/java/de/dafuqs/spectrum/api/predicate/item/BottomlessStackPredicate.java index 83dad01b2f..0937819af4 100644 --- a/src/main/java/de/dafuqs/spectrum/api/predicate/item/BottomlessStackPredicate.java +++ b/src/main/java/de/dafuqs/spectrum/api/predicate/item/BottomlessStackPredicate.java @@ -8,7 +8,6 @@ import net.minecraft.advancements.critereon.*; import net.minecraft.core.component.*; import net.minecraft.world.item.*; -import javax.annotation.*; public record BottomlessStackPredicate(ItemPredicate template, LongRange count) implements SingleComponentItemPredicate { diff --git a/src/main/java/de/dafuqs/spectrum/api/predicate/item/InfusedBeveragePredicate.java b/src/main/java/de/dafuqs/spectrum/api/predicate/item/InfusedBeveragePredicate.java index f8020be546..9e300403ad 100644 --- a/src/main/java/de/dafuqs/spectrum/api/predicate/item/InfusedBeveragePredicate.java +++ b/src/main/java/de/dafuqs/spectrum/api/predicate/item/InfusedBeveragePredicate.java @@ -7,7 +7,6 @@ import net.minecraft.advancements.critereon.*; import net.minecraft.core.component.*; import net.minecraft.world.item.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/api/predicate/item/InkPredicate.java b/src/main/java/de/dafuqs/spectrum/api/predicate/item/InkPredicate.java new file mode 100644 index 0000000000..b6c4b99068 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/api/predicate/item/InkPredicate.java @@ -0,0 +1,55 @@ +package de.dafuqs.spectrum.api.predicate.item; + +import com.mojang.serialization.*; +import com.mojang.serialization.codecs.*; +import de.dafuqs.spectrum.api.ink.color.*; +import de.dafuqs.spectrum.components.*; +import de.dafuqs.spectrum.helpers.*; +import de.dafuqs.spectrum.progression.advancement.*; +import de.dafuqs.spectrum.registries.*; +import net.minecraft.advancements.critereon.*; +import net.minecraft.core.component.*; +import net.minecraft.world.item.*; + +import java.util.*; + +public record InkPredicate(LongRange totalRange, Map colorRanges) implements SingleComponentItemPredicate { + + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + LongRange.CODEC.optionalFieldOf("total", LongRange.ANY).forGetter(InkPredicate::totalRange), + CodecHelper.registryMap(SpectrumRegistries.INK_COLOR, LongRange.CODEC).fieldOf("colors").forGetter(InkPredicate::colorRanges) + ).apply(instance, InkPredicate::new)); + + public InkPredicate(LongRange totalRange, Map colorRanges) { + this.totalRange = totalRange; + this.colorRanges = colorRanges; + } + + @Override + public DataComponentType componentType() { + return SpectrumDataComponentTypes.INK_STORAGE.get(); + } + + public boolean matches(ItemStack stack, InkStorageComponent value) { + Map storedEnergy = value.storedEnergy(); + + long total = 0L; + for(long i : storedEnergy.values()) { + total += i; + } + if(!totalRange.test(total)) { + return false; + } + + Map colorRanges = colorRanges(); + if(colorRanges.isEmpty()) { + return true; + } + + return colorRanges.entrySet().stream().allMatch(entry -> { + LongRange required = colorRanges.get(entry.getKey()); + Long stored = storedEnergy.getOrDefault(entry.getKey(), 0L); + return required.test(stored); + }); + } + } \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/api/predicate/item/StoredExperiencePredicate.java b/src/main/java/de/dafuqs/spectrum/api/predicate/item/StoredExperiencePredicate.java index 1f77231633..0bf1ab0f3f 100644 --- a/src/main/java/de/dafuqs/spectrum/api/predicate/item/StoredExperiencePredicate.java +++ b/src/main/java/de/dafuqs/spectrum/api/predicate/item/StoredExperiencePredicate.java @@ -5,7 +5,6 @@ import net.minecraft.advancements.critereon.*; import net.minecraft.core.component.*; import net.minecraft.world.item.*; -import javax.annotation.*; public record StoredExperiencePredicate(MinMaxBounds.Ints experience) implements SingleComponentItemPredicate { diff --git a/src/main/java/de/dafuqs/spectrum/api/predicate/item/SweetenedPredicate.java b/src/main/java/de/dafuqs/spectrum/api/predicate/item/SweetenedPredicate.java index 72d56da4cd..af8bd00858 100644 --- a/src/main/java/de/dafuqs/spectrum/api/predicate/item/SweetenedPredicate.java +++ b/src/main/java/de/dafuqs/spectrum/api/predicate/item/SweetenedPredicate.java @@ -6,7 +6,6 @@ import net.minecraft.advancements.critereon.*; import net.minecraft.core.component.*; import net.minecraft.world.item.*; -import javax.annotation.*; public record SweetenedPredicate(boolean sweetened) implements SingleComponentItemPredicate { diff --git a/src/main/java/de/dafuqs/spectrum/api/predicate/item/package-info.java b/src/main/java/de/dafuqs/spectrum/api/predicate/item/package-info.java index d6310bdaf1..bec5ae9c96 100644 --- a/src/main/java/de/dafuqs/spectrum/api/predicate/item/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/api/predicate/item/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.api.predicate.item; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/api/predicate/location/CommandPredicate.java b/src/main/java/de/dafuqs/spectrum/api/predicate/location/CommandPredicate.java index 9fb13b7d2b..e5f166cbbc 100644 --- a/src/main/java/de/dafuqs/spectrum/api/predicate/location/CommandPredicate.java +++ b/src/main/java/de/dafuqs/spectrum/api/predicate/location/CommandPredicate.java @@ -9,7 +9,6 @@ import net.minecraft.server.*; import net.minecraft.server.level.*; import net.minecraft.world.phys.*; -import javax.annotation.*; import java.util.concurrent.atomic.*; diff --git a/src/main/java/de/dafuqs/spectrum/api/predicate/location/MoonPhasePredicate.java b/src/main/java/de/dafuqs/spectrum/api/predicate/location/MoonPhasePredicate.java index 714d984920..b8818c019f 100644 --- a/src/main/java/de/dafuqs/spectrum/api/predicate/location/MoonPhasePredicate.java +++ b/src/main/java/de/dafuqs/spectrum/api/predicate/location/MoonPhasePredicate.java @@ -6,7 +6,6 @@ import net.minecraft.network.codec.*; import net.minecraft.server.level.*; import net.minecraft.util.*; -import javax.annotation.*; public enum MoonPhasePredicate implements StringRepresentable { FULL_MOON, diff --git a/src/main/java/de/dafuqs/spectrum/api/predicate/location/TimeOfDayPredicate.java b/src/main/java/de/dafuqs/spectrum/api/predicate/location/TimeOfDayPredicate.java index e8eb5ea173..87a64b4125 100644 --- a/src/main/java/de/dafuqs/spectrum/api/predicate/location/TimeOfDayPredicate.java +++ b/src/main/java/de/dafuqs/spectrum/api/predicate/location/TimeOfDayPredicate.java @@ -7,7 +7,7 @@ import net.minecraft.network.codec.*; import net.minecraft.server.level.*; import net.minecraft.util.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public record TimeOfDayPredicate(TimeHelper.@Nullable TimeOfDay name, MinMaxBounds.Ints range) { diff --git a/src/main/java/de/dafuqs/spectrum/api/predicate/location/WeatherPredicate.java b/src/main/java/de/dafuqs/spectrum/api/predicate/location/WeatherPredicate.java index 38c0598e9b..5a4d5d7d69 100644 --- a/src/main/java/de/dafuqs/spectrum/api/predicate/location/WeatherPredicate.java +++ b/src/main/java/de/dafuqs/spectrum/api/predicate/location/WeatherPredicate.java @@ -7,7 +7,6 @@ import net.minecraft.server.level.*; import net.minecraft.util.*; import net.minecraft.world.level.*; -import javax.annotation.*; import java.util.function.*; diff --git a/src/main/java/de/dafuqs/spectrum/api/predicate/location/package-info.java b/src/main/java/de/dafuqs/spectrum/api/predicate/location/package-info.java index 8bf44321a6..ee672de772 100644 --- a/src/main/java/de/dafuqs/spectrum/api/predicate/location/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/api/predicate/location/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.api.predicate.location; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/api/recipe/FusionShrineRecipeWorldEffect.java b/src/main/java/de/dafuqs/spectrum/api/recipe/FusionShrineRecipeWorldEffect.java deleted file mode 100644 index abce0438cd..0000000000 --- a/src/main/java/de/dafuqs/spectrum/api/recipe/FusionShrineRecipeWorldEffect.java +++ /dev/null @@ -1,137 +0,0 @@ -package de.dafuqs.spectrum.api.recipe; - -import com.google.gson.*; -import com.mojang.serialization.*; -import de.dafuqs.spectrum.*; -import de.dafuqs.spectrum.registries.*; -import io.netty.buffer.*; -import net.minecraft.commands.*; -import net.minecraft.core.*; -import net.minecraft.network.chat.*; -import net.minecraft.network.codec.*; -import net.minecraft.server.*; -import net.minecraft.server.level.*; -import net.minecraft.world.phys.*; -import javax.annotation.*; - -/** - * Effects that are played when crafting with the fusion shrine - */ -public interface FusionShrineRecipeWorldEffect { - - Codec CODEC = Codec.STRING.xmap( - FusionShrineRecipeWorldEffect::fromString, - effect -> effect instanceof CommandRecipeWorldEffect command - ? command.command - : String.valueOf(SpectrumRegistries.WORLD_EFFECT.getKey(effect))); - - StreamCodec PACKET_CODEC = ByteBufCodecs.STRING_UTF8.map( - FusionShrineRecipeWorldEffect::fromString, - effect -> effect instanceof CommandRecipeWorldEffect command - ? command.command - : String.valueOf(SpectrumRegistries.WORLD_EFFECT.getKey(effect))); - - FusionShrineRecipeWorldEffect NOTHING = register("nothing", new FusionShrineRecipeWorldEffect.SingleTimeRecipeWorldEffect() { - @Override - public void trigger(ServerLevel world, BlockPos pos) { - } - }); - - static FusionShrineRecipeWorldEffect register(String id, FusionShrineRecipeWorldEffect effect) { - Registry.register(SpectrumRegistries.WORLD_EFFECT, SpectrumCommon.locate(id), effect); - return effect; - } - - static FusionShrineRecipeWorldEffect fromString(String string) { - if (string.isBlank()) { - return NOTHING; - } - if (string.startsWith("/")) { - return new CommandRecipeWorldEffect(string); - } - - FusionShrineRecipeWorldEffect effect = SpectrumRegistries.WORLD_EFFECT.get(SpectrumCommon.ofSpectrumDefaulted(string)); - if (effect == null) { - SpectrumCommon.logError("Unknown fusion shrine world effect '" + string + "'. Will be ignored."); - return NOTHING; - } - return effect; - } - - /** - * True for all effects that should just play once. - * Otherwise, it will be triggered each tick of the recipe - */ - boolean isOneTimeEffect(); - - void trigger(ServerLevel world, BlockPos pos); - - abstract class EveryTickRecipeWorldEffect implements FusionShrineRecipeWorldEffect { - - public EveryTickRecipeWorldEffect() { - } - - @Override - public boolean isOneTimeEffect() { - return false; - } - - } - - abstract class SingleTimeRecipeWorldEffect implements FusionShrineRecipeWorldEffect { - - public SingleTimeRecipeWorldEffect() { - } - - @Override - public boolean isOneTimeEffect() { - return true; - } - - } - - class CommandRecipeWorldEffect implements FusionShrineRecipeWorldEffect, CommandSource { - - protected final String command; - - public CommandRecipeWorldEffect(String command) { - this.command = command; - } - - public static CommandRecipeWorldEffect fromJson(JsonObject json) { - return new CommandRecipeWorldEffect(json.getAsString()); - } - - @Override - public boolean isOneTimeEffect() { - return false; - } - - @Override - public void trigger(ServerLevel world, BlockPos pos) { - MinecraftServer minecraftServer = world.getServer(); - CommandSourceStack serverCommandSource = new CommandSourceStack(this, Vec3.atCenterOf(pos), Vec2.ZERO, world, 2, "FusionShrine", world.getBlockState(pos).getBlock().getName(), minecraftServer, null); - minecraftServer.getCommands().performPrefixedCommand(serverCommandSource, command); - } - - @Override - public void sendSystemMessage(Component message) { - } - - @Override - public boolean acceptsSuccess() { - return false; - } - - @Override - public boolean acceptsFailure() { - return false; - } - - @Override - public boolean shouldInformAdmins() { - return false; - } - } - -} diff --git a/src/main/java/de/dafuqs/spectrum/api/recipe/GatedRecipe.java b/src/main/java/de/dafuqs/spectrum/api/recipe/GatedRecipe.java index e24c448794..9221764159 100644 --- a/src/main/java/de/dafuqs/spectrum/api/recipe/GatedRecipe.java +++ b/src/main/java/de/dafuqs/spectrum/api/recipe/GatedRecipe.java @@ -6,26 +6,28 @@ import net.minecraft.network.chat.*; import net.minecraft.resources.*; import net.minecraft.world.entity.player.*; +import net.minecraft.world.item.*; import net.minecraft.world.item.crafting.*; -import net.neoforged.api.distmarker.*; import net.neoforged.fml.loading.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; public interface GatedRecipe extends Recipe { - boolean isSecret(); + Optional getRevealSecretAdvancement(); - Optional getRequiredAdvancementIdentifier(); + Optional getRequiredAdvancement(); @Nullable ResourceLocation getRecipeTypeUnlockIdentifier(); String getRecipeTypeShortID(); + List getAdditionalResults(); + default boolean canPlayerCraft(@Nullable Player playerEntity) { return AdvancementHelper.hasAdvancement(playerEntity, getRecipeTypeUnlockIdentifier()) - && AdvancementHelper.hasAdvancement(playerEntity, getRequiredAdvancementIdentifier().orElse(null)); + && AdvancementHelper.hasAdvancement(playerEntity, getRequiredAdvancement().orElse(null)); } default Component getSingleUnlockToastString() { @@ -47,7 +49,7 @@ private void registerInToastManagerClient(RecipeType recipeType, GatedRecipe< } default @Nullable Component getSecretHintText(ResourceLocation id) { - if (isSecret()) { + if (getRevealSecretAdvancement().isPresent()) { String secretHintLangKey = id.toLanguageKey("recipe", "hint").replace("/", "."); return Language.getInstance().has(secretHintLangKey) ? Component.translatable(secretHintLangKey) diff --git a/src/main/java/de/dafuqs/spectrum/api/recipe/IngredientStack.java b/src/main/java/de/dafuqs/spectrum/api/recipe/IngredientStack.java index 38ca3a1ade..758bf3d1ab 100644 --- a/src/main/java/de/dafuqs/spectrum/api/recipe/IngredientStack.java +++ b/src/main/java/de/dafuqs/spectrum/api/recipe/IngredientStack.java @@ -4,6 +4,8 @@ import com.mojang.serialization.*; import com.mojang.serialization.codecs.*; import de.dafuqs.spectrum.registries.*; +import io.netty.buffer.*; +import net.minecraft.advancements.critereon.*; import net.minecraft.core.component.*; import net.minecraft.core.registries.*; import net.minecraft.network.*; @@ -12,7 +14,7 @@ import net.minecraft.world.item.*; import net.minecraft.world.item.crafting.*; import net.neoforged.neoforge.common.crafting.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; import java.util.stream.*; @@ -22,6 +24,7 @@ public class IngredientStack implements ICustomIngredient { public static final MapCodec MAP_CODEC = RecordCodecBuilder.mapCodec(i -> i.group( MapCodec.assumeMapUnsafe(Ingredient.CODEC_NONEMPTY).forGetter(IngredientStack::getIngredient), DataComponentPredicate.CODEC.optionalFieldOf("components", DataComponentPredicate.EMPTY).forGetter(o -> o.componentPredicate), + ItemSubPredicate.CODEC.optionalFieldOf("predicates", Map.of()).forGetter(o -> o.subPredicates), DataComponentPatch.CODEC.optionalFieldOf("preview_components", DataComponentPatch.EMPTY).forGetter(o -> o.previewComponents), Codec.INT.optionalFieldOf("count", 1).forGetter(o -> o.count) ).apply(i, IngredientStack::new)); @@ -34,9 +37,20 @@ public class IngredientStack implements ICustomIngredient { ) ); + public static final StreamCodec, ItemSubPredicate>> NOOP = new StreamCodec<>() { + public Map, ItemSubPredicate> decode(ByteBuf buf) { + return Map.of(); + } + + public void encode(ByteBuf buf, Map, ItemSubPredicate> predicate) { + + } + }; + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( Ingredient.CONTENTS_STREAM_CODEC, o -> o.ingredient, DataComponentPredicate.STREAM_CODEC, o -> o.componentPredicate, + NOOP, o -> o.subPredicates, DataComponentPatch.STREAM_CODEC, o -> o.previewComponents, ByteBufCodecs.VAR_INT, o -> o.count, IngredientStack::new @@ -44,6 +58,7 @@ public class IngredientStack implements ICustomIngredient { private final Ingredient ingredient; private final DataComponentPredicate componentPredicate; + private final Map, ItemSubPredicate> subPredicates; private final DataComponentPatch previewComponents; private final int count; @@ -51,17 +66,18 @@ public class IngredientStack implements ICustomIngredient { private @Nullable Item item = null; private @Nullable TagKey tag = null; - public static final IngredientStack EMPTY = new IngredientStack(Ingredient.EMPTY, DataComponentPredicate.EMPTY, DataComponentPatch.EMPTY, 0); + public static final IngredientStack EMPTY = new IngredientStack(Ingredient.EMPTY, DataComponentPredicate.EMPTY, Map.of(), DataComponentPatch.EMPTY, 0); - public IngredientStack(Ingredient ingredient, DataComponentPredicate componentPredicate, DataComponentPatch previewComponents, int count) { + public IngredientStack(Ingredient ingredient, DataComponentPredicate componentPredicate, Map, ItemSubPredicate> subPredicates, DataComponentPatch previewComponents, int count) { this.ingredient = ingredient; this.componentPredicate = componentPredicate; + this.subPredicates = subPredicates; this.previewComponents = previewComponents; this.count = count; } private IngredientStack(Ingredient ingredient) { - this(ingredient, DataComponentPredicate.EMPTY, DataComponentPatch.EMPTY, 1); + this(ingredient, DataComponentPredicate.EMPTY, Map.of(), DataComponentPatch.EMPTY, 1); } public int getCount() { @@ -76,12 +92,20 @@ public static IngredientStack of(Ingredient ingredient) { return new IngredientStack(ingredient); } + public static IngredientStack of(ItemStack stack) { + return new IngredientStack(Ingredient.of(stack)); + } + + public static IngredientStack of(Ingredient ingredient, int count) { + return new IngredientStack(ingredient, DataComponentPredicate.EMPTY, Map.of(), DataComponentPatch.EMPTY, count); + } + public static IngredientStack ofItems(Item item) { return new IngredientStack(Ingredient.of(item)); } public static IngredientStack ofItems(Item item, int count) { - IngredientStack ingredientStack = new IngredientStack(Ingredient.of(item), DataComponentPredicate.EMPTY, DataComponentPatch.EMPTY, count); + IngredientStack ingredientStack = new IngredientStack(Ingredient.of(item), DataComponentPredicate.EMPTY, Map.of(), DataComponentPatch.EMPTY, count); ingredientStack.item = item; return ingredientStack; } @@ -91,16 +115,30 @@ public static IngredientStack ofTag(TagKey tag) { } public static IngredientStack ofTag(TagKey tag, int count) { - IngredientStack ingredientStack = new IngredientStack(Ingredient.of(tag), DataComponentPredicate.EMPTY, DataComponentPatch.EMPTY, count); + IngredientStack ingredientStack = new IngredientStack(Ingredient.of(tag), DataComponentPredicate.EMPTY, Map.of(), DataComponentPatch.EMPTY, count); ingredientStack.tag = tag; return ingredientStack; } @Override public boolean test(ItemStack stack) { - return this.ingredient.test(stack) - && this.count <= stack.getCount() - && this.componentPredicate.test(stack.getComponents()); + if(!this.ingredient.test(stack)) { + return false; + } + if(stack.getCount() < this.count) { + return false; + } + if(!this.componentPredicate.test(stack.getComponents())) { + return false; + } + + for (ItemSubPredicate itemsubpredicate : this.subPredicates.values()) { + if (!itemsubpredicate.matches(stack)) { + return false; + } + } + + return true; } @Override diff --git a/src/main/java/de/dafuqs/spectrum/api/recipe/WorldEffect.java b/src/main/java/de/dafuqs/spectrum/api/recipe/WorldEffect.java new file mode 100644 index 0000000000..9042232eff --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/api/recipe/WorldEffect.java @@ -0,0 +1,160 @@ +package de.dafuqs.spectrum.api.recipe; + +import com.google.gson.*; +import com.mojang.serialization.*; +import com.mojang.serialization.codecs.*; +import de.dafuqs.spectrum.*; +import de.dafuqs.spectrum.helpers.*; +import de.dafuqs.spectrum.registries.*; +import io.netty.buffer.*; +import net.minecraft.commands.*; +import net.minecraft.core.*; +import net.minecraft.network.*; +import net.minecraft.network.chat.*; +import net.minecraft.network.codec.*; +import net.minecraft.server.*; +import net.minecraft.server.level.*; +import net.minecraft.world.phys.*; + +import java.util.*; + +/** + * Effects that are played when crafting with the fusion shrine or similar + */ +public interface WorldEffect { + + record CraftingWorldEffects(WorldEffect start, List during, WorldEffect finish) { + + public static final CraftingWorldEffects EMPTY = new CraftingWorldEffects(WorldEffect.NOTHING, List.of(), WorldEffect.NOTHING); + public static final CraftingWorldEffects FUSION_SHRINE_DEFAULT = new CraftingWorldEffects(WorldEffect.NOTHING, List.of(), SpectrumWorldEffects.SINGLE_VISUAL_EXPLOSION_ON_SHRINE); + + public static final Codec CODEC = RecordCodecBuilder.create(i -> i.group( + WorldEffect.CODEC.fieldOf("start").forGetter(recipe -> recipe.start), + WorldEffect.CODEC.listOf().optionalFieldOf("during", List.of()).forGetter(recipe -> recipe.during), + WorldEffect.CODEC.fieldOf("finish").forGetter(recipe -> recipe.finish) + ).apply(i, CraftingWorldEffects::new)); + + public static final StreamCodec STREAM_CODEC = PacketCodecHelper.tuple( + WorldEffect.STREAM_CODEC, recipe -> recipe.start, + WorldEffect.STREAM_CODEC.apply(ByteBufCodecs.list()), recipe -> recipe.during, + WorldEffect.STREAM_CODEC, recipe -> recipe.finish, + CraftingWorldEffects::new + ); + } + + Codec CODEC = Codec.STRING.xmap( + WorldEffect::fromString, + effect -> effect instanceof CommandRecipeWorldEffect command + ? command.command + : String.valueOf(SpectrumRegistries.WORLD_EFFECT.getKey(effect))); + + StreamCodec STREAM_CODEC = ByteBufCodecs.STRING_UTF8.map( + WorldEffect::fromString, + effect -> effect instanceof CommandRecipeWorldEffect command + ? command.command + : String.valueOf(SpectrumRegistries.WORLD_EFFECT.getKey(effect))); + + WorldEffect NOTHING = register("nothing", new WorldEffect.SingleTimeRecipeWorldEffect() { + @Override + public void trigger(ServerLevel world, BlockPos pos) { + } + }); + + static WorldEffect register(String id, WorldEffect effect) { + Registry.register(SpectrumRegistries.WORLD_EFFECT, SpectrumCommon.locate(id), effect); + return effect; + } + + static WorldEffect fromString(String string) { + if (string.isBlank()) { + return NOTHING; + } + if (string.startsWith("/")) { + return new CommandRecipeWorldEffect(string); + } + + WorldEffect effect = SpectrumRegistries.WORLD_EFFECT.get(SpectrumCommon.ofSpectrumDefaulted(string)); + if (effect == null) { + SpectrumCommon.logError("Unknown world effect '" + string + "'. Will be ignored."); + return NOTHING; + } + return effect; + } + + /** + * True for all effects that should just play once. + * Otherwise, it will be triggered each tick of the recipe + */ + boolean isOneTimeEffect(); + + void trigger(ServerLevel world, BlockPos pos); + + abstract class EveryTickRecipeWorldEffect implements WorldEffect { + + public EveryTickRecipeWorldEffect() { + } + + @Override + public boolean isOneTimeEffect() { + return false; + } + + } + + abstract class SingleTimeRecipeWorldEffect implements WorldEffect { + + public SingleTimeRecipeWorldEffect() { + } + + @Override + public boolean isOneTimeEffect() { + return true; + } + + } + + class CommandRecipeWorldEffect implements WorldEffect, CommandSource { + + protected final String command; + + public CommandRecipeWorldEffect(String command) { + this.command = command; + } + + public static CommandRecipeWorldEffect fromJson(JsonObject json) { + return new CommandRecipeWorldEffect(json.getAsString()); + } + + @Override + public boolean isOneTimeEffect() { + return false; + } + + @Override + public void trigger(ServerLevel world, BlockPos pos) { + MinecraftServer minecraftServer = world.getServer(); + CommandSourceStack serverCommandSource = new CommandSourceStack(this, Vec3.atCenterOf(pos), Vec2.ZERO, world, 2, "WorldEffect", world.getBlockState(pos).getBlock().getName(), minecraftServer, null); + minecraftServer.getCommands().performPrefixedCommand(serverCommandSource, command); + } + + @Override + public void sendSystemMessage(Component message) { + } + + @Override + public boolean acceptsSuccess() { + return false; + } + + @Override + public boolean acceptsFailure() { + return false; + } + + @Override + public boolean shouldInformAdmins() { + return false; + } + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/api/recipe/package-info.java b/src/main/java/de/dafuqs/spectrum/api/recipe/package-info.java index c7346bd18d..8c407132c2 100644 --- a/src/main/java/de/dafuqs/spectrum/api/recipe/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/api/recipe/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.api.recipe; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/api/render/DynamicItemRenderer.java b/src/main/java/de/dafuqs/spectrum/api/render/DynamicItemRenderer.java deleted file mode 100644 index a5694c76dd..0000000000 --- a/src/main/java/de/dafuqs/spectrum/api/render/DynamicItemRenderer.java +++ /dev/null @@ -1,38 +0,0 @@ -package de.dafuqs.spectrum.api.render; - -import com.mojang.blaze3d.vertex.*; -import it.unimi.dsi.fastutil.objects.*; -import net.minecraft.client.renderer.*; -import net.minecraft.client.renderer.entity.*; -import net.minecraft.client.resources.model.*; -import net.minecraft.world.item.*; - -import java.util.function.*; - -// TODO: make usable on neoforge -// Similar to FAPIs DynamicItemRenderer, except with a little more information. -@FunctionalInterface -public interface DynamicItemRenderer { - - Object2ObjectArrayMap RENDERERS = new Object2ObjectArrayMap<>(); - - /** - * Renders an item stack. - * - * @param renderer the currently used ItemRenderer instance - * @param stack the rendered item stack - * @param mode the model transformation mode - * @param leftHanded the handedness boolean in the original render methods arguments - * @param matrices the matrix stack - * @param vertexConsumers the vertex consumer provider - * @param light packed lightmap coordinates - * @param overlay the overlay UV passed to {@link com.mojang.blaze3d.vertex.VertexConsumer#setOverlay(int)} - * @param model the original model [use this to render the underlying item model] - */ - void render(ItemRenderer renderer, ItemStack stack, ItemDisplayContext mode, boolean leftHanded, PoseStack matrices, MultiBufferSource vertexConsumers, int light, int overlay, BakedModel model); - - static void registerDynamicItemRenderer(Item item, Supplier renderer) { - DynamicItemRenderer.RENDERERS.put(item, renderer.get()); - } - -} diff --git a/src/main/java/de/dafuqs/spectrum/api/render/DynamicRenderModel.java b/src/main/java/de/dafuqs/spectrum/api/render/DynamicRenderModel.java deleted file mode 100644 index a51b650c02..0000000000 --- a/src/main/java/de/dafuqs/spectrum/api/render/DynamicRenderModel.java +++ /dev/null @@ -1,158 +0,0 @@ -package de.dafuqs.spectrum.api.render; - -import it.unimi.dsi.fastutil.objects.*; -import net.minecraft.client.multiplayer.*; -import net.minecraft.client.renderer.block.model.*; -import net.minecraft.client.renderer.texture.*; -import net.minecraft.client.resources.model.*; -import net.minecraft.core.Direction; -import net.minecraft.resources.*; -import net.minecraft.util.RandomSource; -import net.minecraft.world.entity.*; -import net.minecraft.world.item.*; -import net.minecraft.world.level.block.state.BlockState; -import org.jspecify.annotations.Nullable; - -import java.util.*; -import java.util.function.*; - -// TODO: use -class ForwardingBakedModel implements BakedModel { - protected @Nullable BakedModel wrapped; - - public BakedModel getWrappedModel() { - return this.wrapped; - } - - protected void setWrappedModel(BakedModel model) { - this.wrapped = model; - } - - @Override - public List getQuads(@Nullable BlockState state, @Nullable Direction side, RandomSource rand) { - return this.wrapped.getQuads(state, side, rand); - } - - @Override - public boolean useAmbientOcclusion() { - return this.wrapped.useAmbientOcclusion(); - } - - @Override - public boolean isGui3d() { - return this.wrapped.isGui3d(); - } - - @Override - public boolean usesBlockLight() { - return this.wrapped.usesBlockLight(); - } - - @Override - public boolean isCustomRenderer() { - return this.wrapped.isCustomRenderer(); - } - - @Override - public TextureAtlasSprite getParticleIcon() { - return this.wrapped.getParticleIcon(); - } - - @Override - public ItemTransforms getTransforms() { - return this.wrapped.getTransforms(); - } - - @Override - public ItemOverrides getOverrides() { - return this.wrapped.getOverrides(); - } -} - -public class DynamicRenderModel extends ForwardingBakedModel implements UnbakedModel { - - public static final ObjectOpenHashSet CUSTOM_ITEM_MODELS = new ObjectOpenHashSet<>(); - - private static class WrappingOverridesList extends ItemOverrides { - private final ItemOverrides wrapped; - - private WrappingOverridesList(ItemOverrides orig) { - super(null, null, List.of()); - this.wrapped = orig; - } - - @Override - public @Nullable BakedModel resolve(BakedModel model, ItemStack stack, @Nullable ClientLevel world, @Nullable LivingEntity entity, int seed) { - BakedModel newModel = wrapped.resolve(model, stack, world, entity, seed); - return newModel == model ? model : new DynamicRenderModel(newModel); - } - } - - // only used pre-bake; set to null after bake - private @Nullable UnbakedModel baseUnbaked; - - // pre-bake constructor - public DynamicRenderModel(UnbakedModel base) { - this.baseUnbaked = base; - } - - // post-bake / post-override constructor - public DynamicRenderModel(BakedModel base) { - this.wrapped = base instanceof DynamicRenderModel fm ? fm.getWrappedModel() : base; - } - - // avoid FAPI builtin model lookup - @Override - public boolean isCustomRenderer() { - // maintain behavior from original - return false; - } - - private DynamicRenderModel wrap(BakedModel model) { - this.wrapped = model instanceof DynamicRenderModel fm ? fm.getWrappedModel() : model; - return this; - } - - @Override - public Collection getDependencies() { - // If we no longer have an unbaked delegate, return empty to avoid NPEs - return this.baseUnbaked != null ? this.baseUnbaked.getDependencies() : Collections.emptyList(); - } - - // override so wrap persists over override - ensures that renderer is called - @Override - public ItemOverrides getOverrides() { - // When used pre-bake `wrapped` may be null — avoid calling super.getOverrides() in that case - if (this.wrapped == null) { - // Lightweight safe fallback overrides instance; NeoForge 1.21.1 may or may not expose ItemOverrides.EMPTY - return new WrappingOverridesList(new ItemOverrides(null, null, List.of())); - } - return new WrappingOverridesList(super.getOverrides()); - } - - // return empty transform to prevent double apply in render - @Override - public ItemTransforms getTransforms() { - return this.wrapped != null ? this.wrapped.getTransforms() : ItemTransforms.NO_TRANSFORMS; - } - - @Override - public void resolveParents(Function modelLoader) { - if (this.baseUnbaked != null) { - this.baseUnbaked.resolveParents(modelLoader); - } - } - - @Override - public @Nullable BakedModel bake(ModelBaker baker, Function textureGetter, ModelState rotationContainer) { - // If already baked / no unbaked delegate, return the current wrapped model - if (this.baseUnbaked == null) { - return this.wrapped; - } - BakedModel baked = this.baseUnbaked.bake(baker, textureGetter, rotationContainer); - // drop pre-bake reference after bake - this.baseUnbaked = null; - return this.wrap(baked); - } - -} \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/api/render/ExtendedItemBarProvider.java b/src/main/java/de/dafuqs/spectrum/api/render/ExtendedItemBarProvider.java index b20f84901f..669cac5ece 100644 --- a/src/main/java/de/dafuqs/spectrum/api/render/ExtendedItemBarProvider.java +++ b/src/main/java/de/dafuqs/spectrum/api/render/ExtendedItemBarProvider.java @@ -2,7 +2,7 @@ import net.minecraft.world.entity.player.*; import net.minecraft.world.item.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public interface ExtendedItemBarProvider { diff --git a/src/main/java/de/dafuqs/spectrum/api/render/SlotBackgroundEffectProvider.java b/src/main/java/de/dafuqs/spectrum/api/render/SlotBackgroundEffectProvider.java index d791ea2947..4b6c983ed5 100644 --- a/src/main/java/de/dafuqs/spectrum/api/render/SlotBackgroundEffectProvider.java +++ b/src/main/java/de/dafuqs/spectrum/api/render/SlotBackgroundEffectProvider.java @@ -2,7 +2,7 @@ import net.minecraft.world.entity.player.*; import net.minecraft.world.item.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public interface SlotBackgroundEffectProvider { diff --git a/src/main/java/de/dafuqs/spectrum/api/render/package-info.java b/src/main/java/de/dafuqs/spectrum/api/render/package-info.java index 08aac97129..fea1ec8a13 100644 --- a/src/main/java/de/dafuqs/spectrum/api/render/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/api/render/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.api.render; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/attachment_types/AzureDikeAttachmentType.java b/src/main/java/de/dafuqs/spectrum/attachment_types/AzureDikeAttachmentType.java index 581f470f4e..dd731f614b 100644 --- a/src/main/java/de/dafuqs/spectrum/attachment_types/AzureDikeAttachmentType.java +++ b/src/main/java/de/dafuqs/spectrum/attachment_types/AzureDikeAttachmentType.java @@ -16,7 +16,6 @@ import net.neoforged.neoforge.attachment.*; import net.neoforged.neoforge.network.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; import top.theillusivec4.curios.api.*; import top.theillusivec4.curios.api.type.capability.*; @@ -54,8 +53,6 @@ public class AzureDikeAttachmentType { public static final AttachmentType ATTACHMENT_TYPE = AttachmentType.builder(AzureDikeAttachmentType::new) .serialize(CODEC) - .copyOnDeath() - .copyHandler(COPY_HANDLER) .sync(STREAM_CODEC) .build(); diff --git a/src/main/java/de/dafuqs/spectrum/attachment_types/EverpromiseRibbonAttachmentType.java b/src/main/java/de/dafuqs/spectrum/attachment_types/EverpromiseRibbonAttachmentType.java index bf401a292e..be1553f582 100644 --- a/src/main/java/de/dafuqs/spectrum/attachment_types/EverpromiseRibbonAttachmentType.java +++ b/src/main/java/de/dafuqs/spectrum/attachment_types/EverpromiseRibbonAttachmentType.java @@ -9,7 +9,6 @@ import net.minecraft.world.level.*; import net.neoforged.neoforge.attachment.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/attachment_types/HardcoreDeathAttachmentType.java b/src/main/java/de/dafuqs/spectrum/attachment_types/HardcoreDeathAttachmentType.java index 45b201e392..0bac7ffd43 100644 --- a/src/main/java/de/dafuqs/spectrum/attachment_types/HardcoreDeathAttachmentType.java +++ b/src/main/java/de/dafuqs/spectrum/attachment_types/HardcoreDeathAttachmentType.java @@ -12,7 +12,6 @@ import net.minecraft.world.level.*; import net.neoforged.neoforge.attachment.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/attachment_types/LastKillAttachmentType.java b/src/main/java/de/dafuqs/spectrum/attachment_types/LastKillAttachmentType.java index f1f802ba2e..e39732086a 100644 --- a/src/main/java/de/dafuqs/spectrum/attachment_types/LastKillAttachmentType.java +++ b/src/main/java/de/dafuqs/spectrum/attachment_types/LastKillAttachmentType.java @@ -9,7 +9,6 @@ import net.minecraft.world.level.*; import net.neoforged.neoforge.attachment.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/attachment_types/MiscPlayerDataAttachmentType.java b/src/main/java/de/dafuqs/spectrum/attachment_types/MiscPlayerDataAttachmentType.java index 334432ce9f..ff39b33a8f 100644 --- a/src/main/java/de/dafuqs/spectrum/attachment_types/MiscPlayerDataAttachmentType.java +++ b/src/main/java/de/dafuqs/spectrum/attachment_types/MiscPlayerDataAttachmentType.java @@ -16,7 +16,7 @@ import net.minecraft.world.item.*; import net.neoforged.neoforge.attachment.*; import net.neoforged.neoforge.network.handling.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; @@ -44,7 +44,6 @@ private MiscPlayerDataAttachmentType() { // Sleep private int ticksBeforeSleep = -1, sleepingWindow = -1, sleepInvincibility; - private double lastSyncedSleepPotency = -2; private List sleepAlteringEffects = List.of(); // Sword mechanics @@ -66,14 +65,6 @@ public static MiscPlayerDataAttachmentType ofCodec(int ticksBeforeSleep, int sle public void tick() { tickSleep(); tickSwordMechanics(); - - if (!player.level().isClientSide()) { - double fortitude = player.getAttributeValue(SpectrumEntityAttributes.MENTAL_PRESENCE); - if (lastSyncedSleepPotency != fortitude) { - lastSyncedSleepPotency = fortitude; - SyncMentalPresencePayload.sendMentalPresenceSync((ServerPlayer) player, fortitude); - } - } } private boolean isInModifiedMotionState() { @@ -144,7 +135,6 @@ private void tickSleep() { if (ticksBeforeSleep == 0) { player.startSleeping(player.blockPosition()); - ((PlayerEntityAccessor) player).spectrum$setSleepTimer(0); var world = player.level(); if (!world.isClientSide()) ((ServerLevel) world).updateSleepingPlayerList(); @@ -222,14 +212,6 @@ public static MiscPlayerDataAttachmentType get(Player player) { return data; } - public void setLastSyncedSleepPotency(double lastSyncedSleepPotency) { - this.lastSyncedSleepPotency = lastSyncedSleepPotency; - } - - public double getLastSyncedSleepPotency() { - return lastSyncedSleepPotency; - } - public void setLastGleamingPinTriggerTick(long tick) { this.lastGleamingPinTriggerTick = tick; } diff --git a/src/main/java/de/dafuqs/spectrum/attachment_types/PrimordialFireAttachmentType.java b/src/main/java/de/dafuqs/spectrum/attachment_types/PrimordialFireAttachmentType.java index 10d3eff6f2..f56b780b9f 100644 --- a/src/main/java/de/dafuqs/spectrum/attachment_types/PrimordialFireAttachmentType.java +++ b/src/main/java/de/dafuqs/spectrum/attachment_types/PrimordialFireAttachmentType.java @@ -24,7 +24,6 @@ import net.neoforged.neoforge.common.*; import net.neoforged.neoforge.network.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; import java.util.*; @@ -123,6 +122,7 @@ protected static void serverTick(LivingEntity entity, long primordialFireTicks) } primordialFireTicks -= entity.getFluidHeight(FluidTags.WATER) > 0 ? 3 : 1; + primordialFireTicks = Math.max(0, primordialFireTicks); entity.setData(ATTACHMENT_TYPE, primordialFireTicks); // was on fire, but is not any longer diff --git a/src/main/java/de/dafuqs/spectrum/attachment_types/package-info.java b/src/main/java/de/dafuqs/spectrum/attachment_types/package-info.java index d948227edb..2858c6ea41 100644 --- a/src/main/java/de/dafuqs/spectrum/attachment_types/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/attachment_types/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.attachment_types; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/BedrockAnvilBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/BedrockAnvilBlock.java index dbdf13bcb1..c0017c7a56 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/BedrockAnvilBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/BedrockAnvilBlock.java @@ -12,7 +12,8 @@ import net.minecraft.world.level.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import net.minecraft.world.phys.shapes.*; +import org.jspecify.annotations.*; import java.util.*; @@ -20,6 +21,19 @@ public class BedrockAnvilBlock extends AnvilBlock { public static final MapCodec CODEC = simpleCodec(BedrockAnvilBlock::new); + private static final VoxelShape X_BASE = Block.box(1.0, 0.0, 2.0, 15.0, 4.0, 14.0); + private static final VoxelShape X_LEG1 = Block.box(3.0, 4.0, 4.0, 13.0, 5.0, 12.0); + private static final VoxelShape X_LEG2 = Block.box(4.0, 5.0, 5.0, 12.0, 9.0, 11.0); + private static final VoxelShape X_TOP = Block.box(0.0, 9.0, 1.0, 16.0, 16.0, 15.0); + + private static final VoxelShape Z_BASE = Block.box(2.0, 0.0, 1.0, 14.0, 4.0, 15.0); + private static final VoxelShape Z_LEG1 = Block.box(4.0, 4.0, 3.0, 12.0, 5.0, 13.0); + private static final VoxelShape Z_LEG2 = Block.box(5.0, 5.0, 4.0, 11.0, 9.0, 12.0); + private static final VoxelShape Z_TOP = Block.box(1.0, 9.0, 0.0, 15.0, 16.0, 16.0); + + private static final VoxelShape X_AXIS_AABB = Shapes.or(X_BASE, X_LEG1, X_LEG2, X_TOP); + private static final VoxelShape Z_AXIS_AABB = Shapes.or(Z_BASE, Z_LEG1, Z_LEG2, Z_TOP); + private static final Component TITLE = Component.translatable("container.spectrum.bedrock_anvil"); public BedrockAnvilBlock(Properties settings) { @@ -32,6 +46,12 @@ public BedrockAnvilBlock(Properties settings) { // return CODEC; // } + @Override + protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { + Direction direction = state.getValue(FACING); + return direction.getAxis() == Direction.Axis.X ? X_AXIS_AABB : Z_AXIS_AABB; + } + // Heavier => More damage @Override protected void falling(FallingBlockEntity entity) { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/BismuthBudBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/BismuthBudBlock.java index b77c628947..57b456a491 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/BismuthBudBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/BismuthBudBlock.java @@ -1,6 +1,6 @@ package de.dafuqs.spectrum.blocks; -import de.dafuqs.spectrum.blocks.crystallarieum.*; +import de.dafuqs.spectrum.blocks.gemstone.*; import de.dafuqs.spectrum.networking.s2c_payloads.*; import de.dafuqs.spectrum.particle.effect.*; import net.minecraft.core.*; @@ -12,7 +12,7 @@ import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class BismuthBudBlock extends SpectrumClusterBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/BlockWithTooltip.java b/src/main/java/de/dafuqs/spectrum/blocks/BlockWithTooltip.java index 177838c26a..755355959f 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/BlockWithTooltip.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/BlockWithTooltip.java @@ -4,7 +4,7 @@ import net.minecraft.network.chat.*; import net.minecraft.world.item.*; import net.minecraft.world.level.block.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/FloatBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/FloatBlock.java index 7e823ab475..8c99769bcd 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/FloatBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/FloatBlock.java @@ -3,12 +3,17 @@ import com.mojang.serialization.*; import com.mojang.serialization.codecs.*; import de.dafuqs.spectrum.entity.entity.*; +import de.dafuqs.spectrum.registries.*; import net.minecraft.core.*; import net.minecraft.server.level.*; import net.minecraft.util.*; +import net.minecraft.world.damagesource.*; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.item.*; import net.minecraft.world.level.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; +import net.minecraft.world.level.block.state.properties.*; public class FloatBlock extends FallingBlock { @@ -38,17 +43,11 @@ public void onPlace(BlockState state, Level world, BlockPos blockPos, BlockState world.scheduleTick(blockPos, this, this.getDelayAfterPlace()); } - @Override - public BlockState updateShape(BlockState state, Direction direction, BlockState facingState, LevelAccessor world, BlockPos blockPos, BlockPos facingPos) { - world.scheduleTick(blockPos, this, this.getDelayAfterPlace()); - return super.updateShape(state, direction, facingState, world, blockPos, facingPos); - } - @Override public void tick(BlockState state, ServerLevel world, BlockPos pos, RandomSource random) { if (!world.isClientSide()) { if (gravityMod == 0) { - launch(world, pos); + fall(world, pos, state); return; } @@ -60,14 +59,24 @@ public void tick(BlockState state, ServerLevel world, BlockPos pos, RandomSource } if (world.isEmptyBlock(collisionBlockPos) || isFree(world.getBlockState(collisionBlockPos))) { - launch(world, pos); + fall(world, pos, state); } } } - private static void launch(Level world, BlockPos pos) { - FloatBlockEntity blockEntity = new FloatBlockEntity(world, pos, world.getBlockState(pos)); - world.addFreshEntity(blockEntity); + public static FallingBlockEntity fall(Level level, BlockPos pos, BlockState blockState) { + FloatBlockEntity blockEntity = new FloatBlockEntity(level, pos.getX() + 0.5F, pos.getY(), pos.getZ() + 0.5F, blockState.hasProperty(BlockStateProperties.WATERLOGGED) + ? blockState.setValue(BlockStateProperties.WATERLOGGED, false) + : blockState + ); + level.setBlock(pos, blockState.getFluidState().createLegacyBlock(), 3); + level.addFreshEntity(blockEntity); + return blockEntity; + } + + @Override + public DamageSource getFallDamageSource(Entity entity) { + return SpectrumDamageTypes.floatblock(entity.level()); } } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/FluidLogging.java b/src/main/java/de/dafuqs/spectrum/blocks/FluidLogging.java index 7046bda7c1..ba81c0ff3b 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/FluidLogging.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/FluidLogging.java @@ -14,22 +14,28 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.block.state.properties.*; import net.minecraft.world.level.material.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; +import java.util.function.*; public class FluidLogging { public enum State implements StringRepresentable { - NOT_LOGGED("none", 0), - WATER("water", 0), - LIQUID_CRYSTAL("liquid_crystal", SpectrumFluids.LIQUID_CRYSTAL_LIGHT_LEVEL); + NOT_LOGGED("none", () -> Fluids.EMPTY, 0), + WATER("water", () -> Fluids.WATER, 0), + LAVA("lava", () -> Fluids.LAVA, 15), + LIQUID_CRYSTAL("liquid_crystal", SpectrumFluids.LIQUID_CRYSTAL::get, SpectrumFluids.LIQUID_CRYSTAL_LIGHT_LEVEL), + MIDNIGHT_SOLUTION("midnight_solution", SpectrumFluids.MIDNIGHT_SOLUTION::get, SpectrumFluids.MIDNIGHT_SOLUTION_LIGHT_LEVEL), + DRAGONROT("dragonrot", SpectrumFluids.DRAGONROT::get, SpectrumFluids.DRAGONROT_LIGHT_LEVEL); private final String name; + private final Supplier fluid; private final int luminance; - State(String name, int luminance) { + State(String name, Supplier fluid, int luminance) { this.name = name; + this.fluid = fluid; this.luminance = luminance; } @@ -39,17 +45,8 @@ public String getSerializedName() { } public FluidState getFluidState() { - switch (this) { - case LIQUID_CRYSTAL -> { - return SpectrumFluids.LIQUID_CRYSTAL.get().getSource(false); - } - case WATER -> { - return Fluids.WATER.getSource(false); - } - default -> { - return Fluids.EMPTY.defaultFluidState(); - } - } + Fluid fluid = this.fluid.get(); + return fluid instanceof FlowingFluid flowingFluid ? flowingFluid.getSource(false) : fluid.defaultFluidState(); } public int getLuminance() { @@ -62,15 +59,39 @@ public String toString() { } public void onEntityCollision(BlockState state, Level world, BlockPos pos, Entity entity) { - if (this == State.LIQUID_CRYSTAL) { - SpectrumFluids.LIQUID_CRYSTAL.get().onEntityCollision(state, world, pos, entity); + if(this.fluid.get() instanceof SpectrumFluid spectrumFluid) { + spectrumFluid.onEntityCollision(state, world, pos, entity); } } + + public void updateShape(BlockState state, Direction direction, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + Fluid fluid = this.fluid.get(); + if(fluid == Fluids.EMPTY) { + return; + } + world.scheduleTick(pos, fluid, fluid.getTickDelay(world)); + } + + public FluidLogging.State getStateForPos(Level world, BlockPos blockPos) { + FluidState fluidState = world.getFluidState(blockPos); + if (fluidState.is(FluidTags.WATER) && fluidState.getAmount() == 8) { + return FluidLogging.State.WATER; + } else if (fluidState.getType().equals(Fluids.LAVA.getSource())) { + return FluidLogging.State.LAVA; + } else if (fluidState.getType().equals(SpectrumFluids.LIQUID_CRYSTAL.get().getSource())) { + return FluidLogging.State.LIQUID_CRYSTAL; + } else if (fluidState.getType().equals(SpectrumFluids.MIDNIGHT_SOLUTION.get().getSource())) { + return FluidLogging.State.MIDNIGHT_SOLUTION; + } else if (fluidState.getType().equals(SpectrumFluids.DRAGONROT.get().getSource())) { + return FluidLogging.State.DRAGONROT; + } + return State.NOT_LOGGED; + } } - public static final EnumProperty ANY_INCLUDING_NONE = EnumProperty.create("fluid_logged", State.class); - public static final EnumProperty ANY_EXCLUDING_NONE = EnumProperty.create("fluid_logged", State.class, State.WATER, State.LIQUID_CRYSTAL); - public static final EnumProperty NONE_AND_CRYSTAL = EnumProperty.create("fluid_logged", State.class, State.NOT_LOGGED, State.LIQUID_CRYSTAL); + // public static final EnumProperty ANY = EnumProperty.create("fluid_logged", State.class); + public static final EnumProperty AIR_WATER_LIQUID_CRYSTAL_DRAGONROT = EnumProperty.create("fluid_logged", State.class, State.NOT_LOGGED, State.WATER, State.LIQUID_CRYSTAL, State.DRAGONROT); + public static final EnumProperty WATER_LIQUID_CRYSTAL = EnumProperty.create("fluid_logged", State.class, State.WATER, State.LIQUID_CRYSTAL); public interface SpectrumFluidLoggable extends SpectrumFluidDrainable, SpectrumFluidFillable { @@ -78,20 +99,37 @@ public interface SpectrumFluidLoggable extends SpectrumFluidDrainable, SpectrumF public interface SpectrumFluidFillable extends LiquidBlockContainer { + EnumProperty getFillableFluids(); + @Override default boolean canPlaceLiquid(@Nullable Player player, BlockGetter world, BlockPos pos, BlockState state, Fluid fluid) { - return state.getValue(ANY_INCLUDING_NONE) == State.NOT_LOGGED && (fluid == Fluids.WATER || fluid == SpectrumFluids.LIQUID_CRYSTAL.get()); + Collection v = getFillableFluids().getPossibleValues(); + for(State s : v) { + if(s.fluid.get().getFluidType() == fluid.getFluidType()) { + return true; + } + } + return false; } @Override default boolean placeLiquid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { - if (state.getValue(ANY_INCLUDING_NONE) == State.NOT_LOGGED) { + if (state.getValue(getFillableFluids()) == State.NOT_LOGGED) { if (!world.isClientSide()) { if (fluidState.getType() == Fluids.WATER) { - world.setBlock(pos, state.setValue(ANY_INCLUDING_NONE, State.WATER), Block.UPDATE_ALL); + world.setBlock(pos, state.setValue(getFillableFluids(), State.WATER), Block.UPDATE_ALL); + world.scheduleTick(pos, fluidState.getType(), fluidState.getType().getTickDelay(world)); + } else if (fluidState.getType() == Fluids.LAVA) { + world.setBlock(pos, state.setValue(getFillableFluids(), State.LAVA), Block.UPDATE_ALL); world.scheduleTick(pos, fluidState.getType(), fluidState.getType().getTickDelay(world)); } else if (fluidState.getType() == SpectrumFluids.LIQUID_CRYSTAL.get()) { - world.setBlock(pos, state.setValue(ANY_INCLUDING_NONE, State.LIQUID_CRYSTAL), Block.UPDATE_ALL); + world.setBlock(pos, state.setValue(getFillableFluids(), State.LIQUID_CRYSTAL), Block.UPDATE_ALL); + world.scheduleTick(pos, fluidState.getType(), fluidState.getType().getTickDelay(world)); + } else if (fluidState.getType() == SpectrumFluids.MIDNIGHT_SOLUTION.get()) { + world.setBlock(pos, state.setValue(getFillableFluids(), State.MIDNIGHT_SOLUTION), Block.UPDATE_ALL); + world.scheduleTick(pos, fluidState.getType(), fluidState.getType().getTickDelay(world)); + } else if (fluidState.getType() == SpectrumFluids.DRAGONROT.get()) { + world.setBlock(pos, state.setValue(getFillableFluids(), State.DRAGONROT), Block.UPDATE_ALL); world.scheduleTick(pos, fluidState.getType(), fluidState.getType().getTickDelay(world)); } } @@ -106,25 +144,25 @@ default boolean placeLiquid(LevelAccessor world, BlockPos pos, BlockState state, public interface SpectrumFluidDrainable extends BucketPickup { + EnumProperty getDrainableFluids(); + @Override default ItemStack pickupBlock(@Nullable Player player, LevelAccessor world, BlockPos pos, BlockState state) { - State fluidLog = state.getValue(ANY_INCLUDING_NONE); + State fluidLog = state.getValue(getDrainableFluids()); - if (fluidLog == State.WATER) { - world.setBlock(pos, state.setValue(ANY_INCLUDING_NONE, State.NOT_LOGGED), Block.UPDATE_ALL); - if (!state.canSurvive(world, pos)) { - world.destroyBlock(pos, true); - } - return new ItemStack(Items.WATER_BUCKET); - } else if (fluidLog == State.LIQUID_CRYSTAL) { - world.setBlock(pos, state.setValue(ANY_INCLUDING_NONE, State.NOT_LOGGED), Block.UPDATE_ALL); - if (!state.canSurvive(world, pos)) { - world.destroyBlock(pos, true); - } - return new ItemStack(SpectrumItems.LIQUID_CRYSTAL_BUCKET.get()); + Fluid fluid = fluidLog.fluid.get(); + if(fluid == Fluids.EMPTY) { + return ItemStack.EMPTY; + } + if(!getDrainableFluids().getPossibleValues().contains(State.NOT_LOGGED)) { + return ItemStack.EMPTY; } - return ItemStack.EMPTY; + world.setBlock(pos, state.setValue(getDrainableFluids(), State.NOT_LOGGED), Block.UPDATE_ALL); + if (!state.canSurvive(world, pos)) { + world.destroyBlock(pos, true); + } + return new ItemStack(fluid.getBucket()); } @Override diff --git a/src/main/java/de/dafuqs/spectrum/blocks/InWorldInteractionBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/InWorldInteractionBlock.java index befe3c3658..33ad114de2 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/InWorldInteractionBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/InWorldInteractionBlock.java @@ -72,7 +72,7 @@ public ItemStack inputStack(Level world, BlockPos pos, ItemStack itemStack) { BlockEntity blockEntity = world.getBlockEntity(pos); if (blockEntity instanceof InWorldInteractionBlockEntity inWorldInteractionBlockEntity) { int previousCount = itemStack.getCount(); - ItemStack remainingStack = InventoryHelper.smartAddToInventory(itemStack, inWorldInteractionBlockEntity, null); + ItemStack remainingStack = InventoryHelper.smartAddToInventory(itemStack, inWorldInteractionBlockEntity, Direction.DOWN); if (remainingStack.getCount() != previousCount) { inWorldInteractionBlockEntity.inventoryChanged(); diff --git a/src/main/java/de/dafuqs/spectrum/blocks/InWorldInteractionBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/InWorldInteractionBlockEntity.java index dfd7eb4d48..2163f1e68f 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/InWorldInteractionBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/InWorldInteractionBlockEntity.java @@ -14,7 +14,7 @@ import net.minecraft.world.level.block.entity.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.storage.loot.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public abstract class InWorldInteractionBlockEntity extends BlockEntity implements RandomizableContainer, ImplementedInventory { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/PlacedItemBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/PlacedItemBlock.java index a6f72e7c05..df94664689 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/PlacedItemBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/PlacedItemBlock.java @@ -11,7 +11,7 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.storage.loot.*; import net.minecraft.world.level.storage.loot.parameters.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/PlacedItemBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/PlacedItemBlockEntity.java index cb3e774f9e..b0a42876e2 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/PlacedItemBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/PlacedItemBlockEntity.java @@ -8,14 +8,14 @@ import net.minecraft.world.item.*; import net.minecraft.world.level.block.entity.*; import net.minecraft.world.level.block.state.*; -import javax.annotation.*; +import org.jspecify.annotations.*; import java.util.*; public class PlacedItemBlockEntity extends BlockEntity implements PlayerOwned { protected ItemStack stack = ItemStack.EMPTY; - protected UUID ownerUUID; + protected @Nullable UUID ownerUUID; public PlacedItemBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); @@ -54,7 +54,7 @@ public ItemStack getStack() { } @Override - public UUID getOwnerUUID() { + public @Nullable UUID getOwnerUUID() { return this.ownerUUID; } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/PrimordialFireBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/PrimordialFireBlock.java index 7b94e5ad90..3020750e77 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/PrimordialFireBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/PrimordialFireBlock.java @@ -23,7 +23,7 @@ import net.minecraft.world.level.gameevent.*; import net.minecraft.world.level.pathfinder.*; import net.minecraft.world.phys.shapes.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; import java.util.function.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/TallCropBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/TallCropBlock.java index cdeb3a2552..af561ceac6 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/TallCropBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/TallCropBlock.java @@ -15,7 +15,8 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.block.state.properties.*; import net.minecraft.world.phys.shapes.*; -import org.jspecify.annotations.Nullable; +import net.neoforged.neoforge.common.*; +import org.jspecify.annotations.*; /** * A crop block that is two blocks tall. @@ -86,20 +87,27 @@ private boolean canGrowUp(Level world, BlockPos pos, BlockState state, int age) protected void tryGrow(BlockState state, ServerLevel world, BlockPos pos, RandomSource random, float upperBound) { if (state.getValue(HALF) == DoubleBlockHalf.UPPER) return; + if (!CommonHooks.canCropGrow(world, pos, state, random.nextInt((int)(25.0F / getGrowthSpeed(state, world, pos)) + 1) == 0)) { + return; + } + if (world.getRawBrightness(pos, 0) >= 9) { int age = this.getAge(state); if (age < this.getMaxAge()) { float moisture = getGrowthSpeed(state, world, pos); + // More likely if there's more moisture if (random.nextInt((int) (upperBound / moisture) + 1) == 0) { + BlockState newState = this.getStateForAge(age + 1); if (age >= Block.UPDATE_CLIENTS) { if (world.getBlockState(pos.above()).is(this) || world.getBlockState(pos.above()).canBeReplaced()) { - world.setBlock(pos, this.getStateForAge(age + 1), Block.UPDATE_CLIENTS); + world.setBlock(pos, newState, Block.UPDATE_CLIENTS); world.setBlock(pos.above(), this.withAgeAndHalf(age + 1, DoubleBlockHalf.UPPER), Block.UPDATE_CLIENTS); } } else { - world.setBlock(pos, this.getStateForAge(age + 1), Block.UPDATE_CLIENTS); + world.setBlock(pos, newState, Block.UPDATE_CLIENTS); } + CommonHooks.fireCropGrowPost(world, pos, state); } } } @@ -124,13 +132,12 @@ protected void createBlockStateDefinition(StateDefinition.Builder this.lastSingleBlockAge; + BlockPos belowPos = pos.below(); + if (state.getValue(HALF) == DoubleBlockHalf.UPPER) { + BlockState belowState = world.getBlockState(belowPos); + return belowState.is(this) && belowState.getValue(HALF) == DoubleBlockHalf.LOWER && belowState.getValue(AGE) > this.lastSingleBlockAge; } + return super.canSurvive(state, world, pos); } @Override diff --git a/src/main/java/de/dafuqs/spectrum/blocks/amphora/AmphoraBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/amphora/AmphoraBlock.java index a7d52beaf6..3803bf3c0a 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/amphora/AmphoraBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/amphora/AmphoraBlock.java @@ -16,7 +16,7 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.block.state.properties.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class AmphoraBlock extends BaseEntityBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/amphora/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/amphora/package-info.java index 3432a05955..3785630e18 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/amphora/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/amphora/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.amphora; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/block_flooder/BlockFlooderBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/block_flooder/BlockFlooderBlock.java index 92c9195749..038582db0a 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/block_flooder/BlockFlooderBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/block_flooder/BlockFlooderBlock.java @@ -15,7 +15,7 @@ import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.entity.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/block_flooder/BlockFlooderBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/block_flooder/BlockFlooderBlockEntity.java index d805f108f1..291844287b 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/block_flooder/BlockFlooderBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/block_flooder/BlockFlooderBlockEntity.java @@ -8,7 +8,7 @@ import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.entity.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/block_flooder/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/block_flooder/package-info.java index 8a4fddddd8..075d7ade0e 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/block_flooder/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/block_flooder/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.block_flooder; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/boom/ExplosionWithStack.java b/src/main/java/de/dafuqs/spectrum/blocks/boom/ExplosionWithStack.java index ddd9d8af9a..47887122d0 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/boom/ExplosionWithStack.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/boom/ExplosionWithStack.java @@ -11,7 +11,6 @@ import net.minecraft.tags.*; import net.minecraft.world.damagesource.*; import net.minecraft.world.entity.*; -import net.minecraft.world.entity.monster.*; import net.minecraft.world.item.*; import net.minecraft.world.item.enchantment.*; import net.minecraft.world.level.*; @@ -19,14 +18,13 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.*; import net.neoforged.neoforge.event.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; -import java.util.function.*; public class ExplosionWithStack extends Explosion { - public static final int BASE_EXPLOSION_LEVEL = 3; + public static final int BASE_EXPLOSION_LEVEL = 4; private final ItemStack stack; @@ -91,8 +89,8 @@ public static void explode(ServerLevel level, @Nullable Entity source, ItemStack boolean damagesEntities = SpectrumEnchantmentHelper.hasEnchantment(enchantmentLookup, EnchantmentTags.DAMAGE_EXCLUSIVE, stack); boolean causesFire = enchantments.getLevel(enchantmentLookup.getOrThrow(Enchantments.FLAME)) > 0; - @Nullable DamageSource damageSource = Explosion.getDefaultDamageSource(level, source); - @Nullable ExplosionDamageCalculator damageCalculator = new EnhancedExplosionDamageCalculator(level, damageSource, stack, powerLevel > 0, damagesEntities, Optional.empty(), Optional.empty(), preserveBlockAtExplosionCenter ? Optional.of(BlockPos.containing(pos)) : Optional.empty()); + DamageSource damageSource = Explosion.getDefaultDamageSource(level, source); + ExplosionDamageCalculator damageCalculator = new EnhancedExplosionDamageCalculator(level, damageSource, stack, powerLevel > 0, damagesEntities, Optional.empty(), Optional.empty(), preserveBlockAtExplosionCenter ? Optional.of(BlockPos.containing(pos)) : Optional.empty()); int explosionRadius = BASE_EXPLOSION_LEVEL + powerLevel; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/boom/IncandescentAmalgamBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/boom/IncandescentAmalgamBlock.java index ba59899a0a..caa5458273 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/boom/IncandescentAmalgamBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/boom/IncandescentAmalgamBlock.java @@ -20,7 +20,7 @@ import net.minecraft.world.level.material.*; import net.minecraft.world.phys.*; import net.minecraft.world.phys.shapes.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.function.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/boom/ParametricMiningDeviceBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/boom/ParametricMiningDeviceBlock.java index 33e0ec0fac..de6160a18c 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/boom/ParametricMiningDeviceBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/boom/ParametricMiningDeviceBlock.java @@ -1,17 +1,11 @@ package de.dafuqs.spectrum.blocks.boom; -import appeng.entity.*; import com.mojang.serialization.*; import de.dafuqs.spectrum.blocks.*; import de.dafuqs.spectrum.helpers.*; -import de.dafuqs.spectrum.registries.*; import net.minecraft.core.*; -import net.minecraft.core.particles.*; -import net.minecraft.core.registries.*; import net.minecraft.server.level.*; -import net.minecraft.sounds.*; import net.minecraft.world.*; -import net.minecraft.world.damagesource.*; import net.minecraft.world.entity.item.*; import net.minecraft.world.entity.player.*; import net.minecraft.world.item.*; @@ -23,10 +17,7 @@ import net.minecraft.world.level.block.state.properties.*; import net.minecraft.world.phys.*; import net.minecraft.world.phys.shapes.*; -import net.neoforged.neoforge.event.*; -import org.jspecify.annotations.Nullable; - -import javax.annotation.*; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/boom/ParametricMiningDeviceItem.java b/src/main/java/de/dafuqs/spectrum/blocks/boom/ParametricMiningDeviceItem.java index 75cb64477c..f76ed6cd55 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/boom/ParametricMiningDeviceItem.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/boom/ParametricMiningDeviceItem.java @@ -5,7 +5,6 @@ import de.dafuqs.spectrum.registries.*; import net.minecraft.*; import net.minecraft.core.*; -import net.minecraft.core.component.*; import net.minecraft.network.chat.*; import net.minecraft.resources.*; import net.minecraft.sounds.*; @@ -15,7 +14,6 @@ import net.minecraft.world.item.enchantment.*; import net.minecraft.world.level.*; import net.minecraft.world.level.block.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/boom/ThreatConfluxBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/boom/ThreatConfluxBlock.java index aff0df4c8b..fcce9593c7 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/boom/ThreatConfluxBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/boom/ThreatConfluxBlock.java @@ -10,7 +10,6 @@ import net.minecraft.util.*; import net.minecraft.world.*; import net.minecraft.world.entity.*; -import net.minecraft.world.entity.item.*; import net.minecraft.world.entity.player.*; import net.minecraft.world.item.*; import net.minecraft.world.level.*; @@ -19,11 +18,10 @@ import net.minecraft.world.level.block.state.properties.*; import net.minecraft.world.phys.*; import net.minecraft.world.phys.shapes.*; -import org.jspecify.annotations.NullMarked; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; @NullMarked -public class ThreatConfluxBlock extends PlacedItemBlock implements FluidLogging.SpectrumFluidLoggable { +public class ThreatConfluxBlock extends PlacedItemBlock { public static final MapCodec CODEC = simpleCodec(ThreatConfluxBlock::new); @@ -57,11 +55,10 @@ public boolean explodesWhenBroken() { public static final VoxelShape ARMED_SHAPE = Block.box(0, 0, 0, 16, 0.125, 16); public static final EnumProperty ARMED = EnumProperty.create("armed", ArmedState.class); - public static final EnumProperty LOGGED = FluidLogging.ANY_INCLUDING_NONE; public ThreatConfluxBlock(BlockBehaviour.Properties properties) { super(properties); - registerDefaultState(this.stateDefinition.any().setValue(ARMED, ArmedState.NOT_ARMED).setValue(LOGGED, FluidLogging.State.NOT_LOGGED)); + registerDefaultState(this.stateDefinition.any().setValue(ARMED, ArmedState.NOT_ARMED)); } @Override @@ -119,8 +116,6 @@ public void entityInside(BlockState state, Level level, BlockPos pos, Entity ent level.scheduleTick(pos, this, TICKS_TO_DETONATE); } - state.getValue(LOGGED).onEntityCollision(state, level, pos, entity); - super.entityInside(state, level, pos, entity); } @@ -145,7 +140,7 @@ public void tick(BlockState state, ServerLevel world, BlockPos pos, RandomSource @Override protected void createBlockStateDefinition(StateDefinition.Builder builder) { super.createBlockStateDefinition(builder); - builder.add(ARMED, LOGGED); + builder.add(ARMED); } protected void explode(ServerLevel level, BlockPos pos) { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/boom/ThreatConfluxItem.java b/src/main/java/de/dafuqs/spectrum/blocks/boom/ThreatConfluxItem.java index d8c638ec5a..4b1c746fb0 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/boom/ThreatConfluxItem.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/boom/ThreatConfluxItem.java @@ -9,7 +9,6 @@ import net.minecraft.world.item.*; import net.minecraft.world.item.enchantment.*; import net.minecraft.world.level.block.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/boom/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/boom/package-info.java index 2d0608502d..f71b7f53f3 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/boom/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/boom/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.boom; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/bottomless_bundle/BottomlessBundleBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/bottomless_bundle/BottomlessBundleBlock.java index d732370504..7b6b7780ed 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/bottomless_bundle/BottomlessBundleBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/bottomless_bundle/BottomlessBundleBlock.java @@ -21,7 +21,7 @@ import net.minecraft.world.level.storage.loot.parameters.*; import net.minecraft.world.phys.*; import net.minecraft.world.phys.shapes.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/bottomless_bundle/BottomlessBundleBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/bottomless_bundle/BottomlessBundleBlockEntity.java index d2bbe03541..c9b20904ec 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/bottomless_bundle/BottomlessBundleBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/bottomless_bundle/BottomlessBundleBlockEntity.java @@ -6,7 +6,6 @@ import net.minecraft.world.item.*; import net.minecraft.world.level.block.entity.*; import net.minecraft.world.level.block.state.*; -import javax.annotation.*; /** * Forge-native replacement for the Fabric SingleVariantStorage-based block entity. diff --git a/src/main/java/de/dafuqs/spectrum/blocks/bottomless_bundle/BottomlessBundleItem.java b/src/main/java/de/dafuqs/spectrum/blocks/bottomless_bundle/BottomlessBundleItem.java index 18777008b6..3697118433 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/bottomless_bundle/BottomlessBundleItem.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/bottomless_bundle/BottomlessBundleItem.java @@ -1,15 +1,10 @@ package de.dafuqs.spectrum.blocks.bottomless_bundle; -import com.mojang.blaze3d.vertex.*; import de.dafuqs.spectrum.*; -import de.dafuqs.spectrum.api.render.*; import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.items.tooltip.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.*; -import net.minecraft.client.renderer.*; -import net.minecraft.client.renderer.entity.*; -import net.minecraft.client.resources.model.*; import net.minecraft.core.*; import net.minecraft.core.dispenser.*; import net.minecraft.network.chat.*; @@ -26,8 +21,6 @@ import net.minecraft.world.item.enchantment.*; import net.minecraft.world.level.*; import net.minecraft.world.level.block.*; -import net.neoforged.api.distmarker.*; -import javax.annotation.*; import java.util.*; @@ -269,29 +262,6 @@ protected ItemStack execute(BlockSource pointer, ItemStack stack) { } - @OnlyIn(Dist.CLIENT) - public static class Renderer implements DynamicItemRenderer { - public Renderer() { - } - - @Override - public void render(ItemRenderer renderer, ItemStack stack, ItemDisplayContext mode, boolean leftHanded, PoseStack matrices, MultiBufferSource vertexConsumers, int light, int overlay, BakedModel model) { - // TODO - /*renderer.render(stack, mode, leftHanded, matrices, vertexConsumers, light, overlay, model); - if (mode != ItemDisplayContext.GUI || getStoredAmount(stack) <= 0) - return; - ItemStack bundledStack = BottomlessBundleItem.getTemplateVariant(stack); - Minecraft client = Minecraft.getInstance(); - BakedModel bundledModel = renderer.getModel(bundledStack, client.level, client.player, 0); - - matrices.pushPose(); - matrices.scale(0.5F, 0.5F, 0.5F); - matrices.translate(0.5F, 0.5F, 0.5F); - renderer.render(bundledStack, mode, leftHanded, matrices, vertexConsumers, light, overlay, bundledModel); - matrices.popPose();*/ - } - } - @Override public boolean supportsEnchantment(ItemStack stack, Holder enchantment) { return super.supportsEnchantment(stack, enchantment) || enchantment.is(Enchantments.POWER); diff --git a/src/main/java/de/dafuqs/spectrum/blocks/bottomless_bundle/BottomlessComponent.java b/src/main/java/de/dafuqs/spectrum/blocks/bottomless_bundle/BottomlessComponent.java index 9814fff1cb..7584cba6c7 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/bottomless_bundle/BottomlessComponent.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/bottomless_bundle/BottomlessComponent.java @@ -9,7 +9,7 @@ import net.minecraft.network.codec.*; import net.minecraft.world.item.*; import net.minecraft.world.item.enchantment.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public record BottomlessComponent(BottomlessItemHandler handler) { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/bottomless_bundle/BottomlessItemCapability.java b/src/main/java/de/dafuqs/spectrum/blocks/bottomless_bundle/BottomlessItemCapability.java index 4edc8d0f84..b3962e66ec 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/bottomless_bundle/BottomlessItemCapability.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/bottomless_bundle/BottomlessItemCapability.java @@ -3,7 +3,7 @@ import de.dafuqs.spectrum.registries.*; import net.minecraft.core.*; import net.minecraft.world.item.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public final class BottomlessItemCapability extends BottomlessItemHandler { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/bottomless_bundle/BottomlessItemHandler.java b/src/main/java/de/dafuqs/spectrum/blocks/bottomless_bundle/BottomlessItemHandler.java index 0884996853..9fbc3bf288 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/bottomless_bundle/BottomlessItemHandler.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/bottomless_bundle/BottomlessItemHandler.java @@ -1,14 +1,7 @@ package de.dafuqs.spectrum.blocks.bottomless_bundle; -import de.dafuqs.spectrum.registries.*; -import net.minecraft.core.*; -import net.minecraft.core.component.*; -import net.minecraft.core.registries.*; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.enchantment.*; -import net.neoforged.neoforge.items.IItemHandler; -import javax.annotation.*; +import net.minecraft.world.item.*; +import net.neoforged.neoforge.items.*; import java.util.*; @@ -60,10 +53,7 @@ private long insert(ItemStack insertedVariant, long maxAmount, boolean simulate) long space = capacity - this.count; if (!deletesOverflow && space <= 0L) return 0L; long toInsert = Math.min(space, maxAmount); - if (this.variant.isEmpty()) { - // Lock template to one copy of the item - this.variant = insertedVariant.copyWithCount(1); - } + this.variant = insertedVariant.copyWithCount(1); if(!simulate) { this.count += toInsert; } @@ -135,8 +125,12 @@ public boolean isItemValid(int slot, ItemStack toInsert) { if (toInsert.isEmpty()) return false; if (!toInsert.canFitInsideContainerItems()) return false; - if (!this.locked()) { - if (this.isEmpty()) return true; + if(this.locked()) { + return ItemStack.isSameItemSameComponents(this.variant, toInsert); + } else { + if(this.isEmpty()) { + return true; + } } return ItemStack.isSameItemSameComponents(this.variant, toInsert); } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/bottomless_bundle/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/bottomless_bundle/package-info.java index 2929da16e5..ddcb2fbbef 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/bottomless_bundle/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/bottomless_bundle/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.bottomless_bundle; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/chests/BlackHoleChestBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/chests/BlackHoleChestBlock.java index 3809d0aede..5e79eed9ed 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/chests/BlackHoleChestBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/chests/BlackHoleChestBlock.java @@ -4,14 +4,13 @@ import de.dafuqs.spectrum.registries.*; import net.minecraft.core.*; import net.minecraft.server.level.*; -import net.minecraft.world.entity.player.*; import net.minecraft.world.level.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.entity.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.gameevent.*; import net.minecraft.world.phys.shapes.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class BlackHoleChestBlock extends SpectrumChestBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/chests/BlackHoleChestBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/chests/BlackHoleChestBlockEntity.java index 3f9fe52931..58d613fd1b 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/chests/BlackHoleChestBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/chests/BlackHoleChestBlockEntity.java @@ -28,8 +28,7 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.gameevent.*; import net.minecraft.world.phys.*; -import org.jetbrains.annotations.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; import java.util.stream.*; @@ -191,7 +190,6 @@ private static void searchForNearbyEntities(BlackHoleChestBlockEntity blockEntit } } - @Contract("_, _ -> new") protected static AABB getBoxWithRadius(BlockPos blockPos, int radius) { return AABB.ofSize(Vec3.atCenterOf(blockPos), radius, radius, radius); } @@ -315,7 +313,7 @@ public SoundEvent getCloseSound() { @Override public void writeClientSideData(AbstractContainerMenu menu, RegistryFriendlyByteBuf buffer) { - FilterConfigurable.ExtendedDataWithPos.PACKET_CODEC.encode(buffer, new ExtendedDataWithPos(worldPosition, this)); + FilterConfigurable.ExtendedDataWithPos.STREAM_CODEC.encode(buffer, new ExtendedDataWithPos(worldPosition, this)); } @Override diff --git a/src/main/java/de/dafuqs/spectrum/blocks/chests/BlackHoleChestBlockEntityRenderer.java b/src/main/java/de/dafuqs/spectrum/blocks/chests/BlackHoleChestBlockEntityRenderer.java index 8dffee70f3..e2884284f3 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/chests/BlackHoleChestBlockEntityRenderer.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/chests/BlackHoleChestBlockEntityRenderer.java @@ -14,7 +14,6 @@ import net.minecraft.world.inventory.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; -import javax.annotation.*; @SuppressWarnings({"unused", "FieldCanBeLocal"}) diff --git a/src/main/java/de/dafuqs/spectrum/blocks/chests/CompactingChestBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/chests/CompactingChestBlock.java index 98454cca31..364fa4368b 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/chests/CompactingChestBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/chests/CompactingChestBlock.java @@ -3,12 +3,11 @@ import com.mojang.serialization.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.core.*; -import net.minecraft.world.entity.player.*; import net.minecraft.world.level.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.entity.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class CompactingChestBlock extends SpectrumChestBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/chests/CompactingChestBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/chests/CompactingChestBlockEntity.java index d59221d922..327e4ce46a 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/chests/CompactingChestBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/chests/CompactingChestBlockEntity.java @@ -21,7 +21,7 @@ import net.minecraft.world.level.*; import net.minecraft.world.level.block.state.*; import net.neoforged.neoforge.items.wrapper.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; @@ -221,7 +221,7 @@ private static boolean smartAddToInventory(List itemStacks, List 0) { if (currentStack.isEmpty() && (test || !tryStackExisting)) { - int maxStackCount = currentStack.getMaxStackSize(); + int maxStackCount = additionStack.getMaxStackSize(); int maxAcceptCount = Math.min(additionStack.getCount(), maxStackCount); if (!test) { @@ -233,7 +233,7 @@ private static boolean smartAddToInventory(List itemStacks, List 0) { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/chests/CompactingChestBlockEntityRenderer.java b/src/main/java/de/dafuqs/spectrum/blocks/chests/CompactingChestBlockEntityRenderer.java index 58c3262251..a8133bfa4d 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/chests/CompactingChestBlockEntityRenderer.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/chests/CompactingChestBlockEntityRenderer.java @@ -10,7 +10,6 @@ import net.minecraft.client.resources.model.*; import net.minecraft.world.inventory.*; import net.minecraft.world.level.block.*; -import javax.annotation.*; public class CompactingChestBlockEntityRenderer implements BlockEntityRenderer { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/chests/FabricationChestBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/chests/FabricationChestBlock.java index ebbceaafdc..8196514d79 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/chests/FabricationChestBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/chests/FabricationChestBlock.java @@ -3,13 +3,12 @@ import com.mojang.serialization.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.core.*; -import net.minecraft.world.entity.player.*; import net.minecraft.world.level.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.entity.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.shapes.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class FabricationChestBlock extends SpectrumChestBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/chests/FabricationChestBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/chests/FabricationChestBlockEntity.java index 41d1b85554..7afeafb506 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/chests/FabricationChestBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/chests/FabricationChestBlockEntity.java @@ -15,7 +15,7 @@ import net.minecraft.world.item.crafting.*; import net.minecraft.world.level.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; import java.util.stream.*; @@ -222,7 +222,7 @@ private boolean tryCraft(FabricationChestBlockEntity chest, int index) { } private static boolean isRecipeValid(Recipe recipe) { - return recipe instanceof ShapelessRecipe || recipe instanceof ShapedRecipe; + return recipe instanceof CraftingRecipe; } private boolean isRecipeCraftable(Recipe recipe) { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/chests/FabricationChestBlockEntityRenderer.java b/src/main/java/de/dafuqs/spectrum/blocks/chests/FabricationChestBlockEntityRenderer.java index 67a1d6646c..33b562e8ee 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/chests/FabricationChestBlockEntityRenderer.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/chests/FabricationChestBlockEntityRenderer.java @@ -17,7 +17,6 @@ import net.minecraft.world.level.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; -import javax.annotation.*; @SuppressWarnings({"unused", "FieldCanBeLocal"}) diff --git a/src/main/java/de/dafuqs/spectrum/blocks/chests/HeartboundChestBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/chests/HeartboundChestBlock.java index 360c46a898..f175cec1cc 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/chests/HeartboundChestBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/chests/HeartboundChestBlock.java @@ -11,7 +11,7 @@ import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.entity.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class HeartboundChestBlock extends SpectrumChestBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/chests/HeartboundChestBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/chests/HeartboundChestBlockEntity.java index dcef1622b3..98900a8114 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/chests/HeartboundChestBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/chests/HeartboundChestBlockEntity.java @@ -13,14 +13,14 @@ import net.minecraft.world.level.*; import net.minecraft.world.level.block.entity.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; public class HeartboundChestBlockEntity extends SpectrumChestBlockEntity implements WorldlyContainer, PlayerOwnedWithName { - private UUID ownerUUID; - private String ownerName; + private @Nullable UUID ownerUUID; + private @Nullable String ownerName; private long lastNonOwnerOpenedTick; public HeartboundChestBlockEntity(BlockPos blockPos, BlockState blockState) { @@ -123,12 +123,12 @@ public void saveAdditional(CompoundTag tag, HolderLookup.Provider registryLookup } @Override - public UUID getOwnerUUID() { + public @Nullable UUID getOwnerUUID() { return this.ownerUUID; } @Override - public String getOwnerName() { + public @Nullable String getOwnerName() { return this.ownerName; } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/chests/HeartboundChestBlockEntityRenderer.java b/src/main/java/de/dafuqs/spectrum/blocks/chests/HeartboundChestBlockEntityRenderer.java index de7f99b2f4..ca253440d4 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/chests/HeartboundChestBlockEntityRenderer.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/chests/HeartboundChestBlockEntityRenderer.java @@ -13,7 +13,6 @@ import net.minecraft.world.inventory.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; -import javax.annotation.*; @SuppressWarnings({"unused", "FieldCanBeLocal"}) diff --git a/src/main/java/de/dafuqs/spectrum/blocks/chests/SpectrumChestBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/chests/SpectrumChestBlockEntity.java index 9e0a5eb7fe..bd2ac01e44 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/chests/SpectrumChestBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/chests/SpectrumChestBlockEntity.java @@ -1,7 +1,6 @@ package de.dafuqs.spectrum.blocks.chests; import de.dafuqs.spectrum.api.block.*; -import de.dafuqs.spectrum.blocks.*; import de.dafuqs.spectrum.inventories.*; import net.minecraft.core.*; import net.minecraft.nbt.*; @@ -17,7 +16,7 @@ import net.minecraft.world.level.block.entity.*; import net.minecraft.world.level.block.state.*; import net.neoforged.api.distmarker.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; @OnlyIn(value = Dist.CLIENT, _interface = LidBlockEntity.class) public abstract class SpectrumChestBlockEntity extends RandomizableContainerBlockEntity implements LidBlockEntity, ImplementedInventory { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/chests/SpectrumChestBlockEntityRenderer.java b/src/main/java/de/dafuqs/spectrum/blocks/chests/SpectrumChestBlockEntityRenderer.java index e588c63033..1fde21cdc8 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/chests/SpectrumChestBlockEntityRenderer.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/chests/SpectrumChestBlockEntityRenderer.java @@ -11,7 +11,6 @@ import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.entity.*; import net.minecraft.world.level.block.state.*; -import javax.annotation.*; public class SpectrumChestBlockEntityRenderer implements BlockEntityRenderer { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/chests/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/chests/package-info.java index 0982324f7a..26e1fa9875 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/chests/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/chests/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.chests; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/cinderhearth/CinderhearthBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/cinderhearth/CinderhearthBlock.java deleted file mode 100644 index fe7d554113..0000000000 --- a/src/main/java/de/dafuqs/spectrum/blocks/cinderhearth/CinderhearthBlock.java +++ /dev/null @@ -1,227 +0,0 @@ -package de.dafuqs.spectrum.blocks.cinderhearth; - -import com.klikli_dev.modonomicon.api.multiblock.*; -import com.mojang.serialization.*; -import de.dafuqs.spectrum.blocks.upgrade.*; -import de.dafuqs.spectrum.compat.modonomicon.*; -import de.dafuqs.spectrum.helpers.*; -import de.dafuqs.spectrum.particle.effect.*; -import de.dafuqs.spectrum.progression.*; -import de.dafuqs.spectrum.registries.*; -import net.minecraft.core.*; -import net.minecraft.core.particles.*; -import net.minecraft.server.level.*; -import net.minecraft.sounds.*; -import net.minecraft.util.*; -import net.minecraft.world.*; -import net.minecraft.world.entity.*; -import net.minecraft.world.entity.player.*; -import net.minecraft.world.inventory.*; -import net.minecraft.world.item.*; -import net.minecraft.world.item.context.*; -import net.minecraft.world.level.*; -import net.minecraft.world.level.block.*; -import net.minecraft.world.level.block.entity.*; -import net.minecraft.world.level.block.state.*; -import net.minecraft.world.level.block.state.properties.*; -import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; - -import java.util.*; - -public class CinderhearthBlock extends BaseEntityBlock { - - public static final MapCodec CODEC = simpleCodec(CinderhearthBlock::new); - - public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING; - - // Positions to check on place / destroy to upgrade those blocks upgrade counts - final static List UPGRADE_BLOCK_OFFSETS = List.of( - new Vec3i(1, -1, 2), - new Vec3i(-1, -1, 2), - new Vec3i(1, -1, -2), - new Vec3i(-1, -1, -2), - new Vec3i(2, -1, 1), - new Vec3i(-2, -1, 1), - new Vec3i(2, -1, -1), - new Vec3i(-2, -1, -1) - ); - - public CinderhearthBlock(Properties settings) { - super(settings); - this.registerDefaultState((this.stateDefinition.any()).setValue(FACING, Direction.EAST)); - - Upgradeable.registerUpgradePosOffsets(UPGRADE_BLOCK_OFFSETS); - } - - @Override - protected MapCodec codec() { - return CODEC; - } - - @Override - public @Nullable BlockEntity newBlockEntity(BlockPos pos, BlockState state) { - return new CinderhearthBlockEntity(pos, state); - } - - @Override - public @Nullable BlockEntityTicker getTicker(Level world, BlockState state, BlockEntityType type) { - return world.isClientSide() ? null : createTickerHelper(type, SpectrumBlockEntities.CINDERHEARTH.get(), CinderhearthBlockEntity::serverTick); - } - - @Override - public InteractionResult useWithoutItem(BlockState state, Level world, BlockPos pos, Player player, BlockHitResult hit) { - if (world.isClientSide()) { - verifyStructure(world, pos, null); - return InteractionResult.SUCCESS; - } else { - BlockEntity blockEntity = world.getBlockEntity(pos); - if (blockEntity instanceof CinderhearthBlockEntity cinderhearthBlockEntity) { - cinderhearthBlockEntity.setOwner(player); - if (verifyStructure(world, pos, (ServerPlayer) player) != CinderhearthBlockEntity.CinderHearthStructureType.NONE) { - player.openMenu(cinderhearthBlockEntity); - } - } - return InteractionResult.CONSUME; - } - } - - @Override - public BlockState getStateForPlacement(BlockPlaceContext ctx) { - return this.defaultBlockState().setValue(FACING, ctx.getHorizontalDirection().getOpposite()); - } - - @Override - public void setPlacedBy(Level world, BlockPos pos, BlockState state, LivingEntity placer, ItemStack itemStack) { - BlockEntity blockEntity = world.getBlockEntity(pos); - if (blockEntity instanceof CinderhearthBlockEntity cinderhearthBlockEntity) { - if (placer instanceof Player player) { - cinderhearthBlockEntity.setOwner(player); - } - } - } - - @Override - public void onRemove(BlockState state, Level world, BlockPos pos, BlockState newState, boolean moved) { - if (!state.is(newState.getBlock())) { - BlockEntity blockEntity = world.getBlockEntity(pos); - if (blockEntity instanceof CinderhearthBlockEntity cinderhearthBlockEntity) { - if (world instanceof ServerLevel) { - Containers.dropContents(world, pos, cinderhearthBlockEntity); - } - world.updateNeighbourForOutputSignal(pos, this); - } - super.onRemove(state, world, pos, newState, moved); - } - } - - @Override - public boolean hasAnalogOutputSignal(BlockState state) { - return true; - } - - @Override - public int getAnalogOutputSignal(BlockState state, Level world, BlockPos pos) { - return AbstractContainerMenu.getRedstoneSignalFromBlockEntity(world.getBlockEntity(pos)); - } - - @Override - public RenderShape getRenderShape(BlockState state) { - return RenderShape.MODEL; - } - - @Override - public BlockState rotate(BlockState state, Rotation rotation) { - return state.setValue(FACING, rotation.rotate(state.getValue(FACING))); - } - - @Override - public BlockState mirror(BlockState state, Mirror mirror) { - return state.rotate(mirror.getRotation(state.getValue(FACING))); - } - - @Override - protected void createBlockStateDefinition(StateDefinition.Builder builder) { - builder.add(FACING); - } - - @Override - public void animateTick(BlockState state, Level world, BlockPos pos, RandomSource random) { - BlockEntity blockEntity = world.getBlockEntity(pos); - if (blockEntity instanceof CinderhearthBlockEntity cinderhearthBlockEntity) { - Direction direction = state.getValue(FACING); - Direction.Axis axis = direction.getAxis(); - double d = (double) pos.getX() + 0.5D; - double e = pos.getY() + 0.4; - double f = (double) pos.getZ() + 0.5D; - - var recipe = cinderhearthBlockEntity.getCurrentRecipeHolder(); - if (recipe != null) { - if (random.nextDouble() < 0.1D) { - world.playLocalSound(d, e, f, SoundEvents.FURNACE_FIRE_CRACKLE, SoundSource.BLOCKS, 1.0F, 0.8F, false); - } - - double g = 0.35D; - double h = random.nextDouble() * 0.4D - 0.2D; - double i = axis == Direction.Axis.X ? (double) direction.getStepX() * g : h; - double j = random.nextDouble() * 4.0D / 16.0D; - double k = axis == Direction.Axis.Z ? (double) direction.getStepZ() * g : h; - world.addParticle(ParticleTypes.FLAME, d + i, e + j, f + k, 0.0D, 0.0D, 0.0D); - world.addParticle(ParticleTypes.SMOKE, d + i, e + j, f + k, 0.0D, 0.0D, 0.0D); - - if (random.nextBoolean()) { - double g2 = -3D / 16D; - double h2 = 4D / 16D; - double i2 = axis == Direction.Axis.X ? (double) direction.getStepX() * g2 : h2; - double k2 = axis == Direction.Axis.Z ? (double) direction.getStepZ() * g2 : h2; - world.addParticle(ParticleTypes.CLOUD, d + i2, pos.getY() + 1.1, f + k2, 0.0D, 0.06D, 0.0D); - } - } - if (cinderhearthBlockEntity.structure == CinderhearthBlockEntity.CinderHearthStructureType.WITH_LAVA) { - for (int v = 0; v < 2; v++) { - double g3 = 1.5 - random.nextDouble() * 2.0; - double h3 = 1.5 - random.nextDouble() * 3.0; - double i3 = axis == Direction.Axis.X ? (double) direction.getStepX() * g3 : h3; - double k3 = axis == Direction.Axis.Z ? (double) direction.getStepZ() * g3 : h3; - world.addParticle(ColoredCraftingParticleEffect.ORANGE, d + i3, pos.getY() - 1.2, f + k3, 0.0D, 0.1D, 0.0D); - } - } - } - } - - public static CinderhearthBlockEntity.CinderHearthStructureType verifyStructure(Level world, BlockPos blockPos, @Nullable ServerPlayer serverPlayerEntity) { - Rotation rotation = Support.rotationFromDirection(world.getBlockState(blockPos).getValue(FACING).getOpposite()); - - Multiblock multiblock = SpectrumMultiblocks.get(SpectrumMultiblocks.CINDERHEARTH); - CinderhearthBlockEntity.CinderHearthStructureType completedStructure = CinderhearthBlockEntity.CinderHearthStructureType.NONE; - - if (multiblock.validate(world, blockPos.below(3), rotation)) { - completedStructure = CinderhearthBlockEntity.CinderHearthStructureType.WITH_LAVA; - } else { - multiblock = SpectrumMultiblocks.get(SpectrumMultiblocks.CINDERHEARTH_WITHOUT_LAVA); - if (multiblock.validate(world, blockPos.below(3), rotation)) { - completedStructure = CinderhearthBlockEntity.CinderHearthStructureType.WITHOUT_LAVA; - } - } - - boolean structureValid = completedStructure != CinderhearthBlockEntity.CinderHearthStructureType.NONE; - - if (world.isClientSide()) { - if (!structureValid) { - ModonomiconHelper.renderMultiblock(SpectrumMultiblocks.get(SpectrumMultiblocks.CINDERHEARTH), SpectrumMultiblocks.CINDERHEARTH_TEXT, blockPos.below(4), rotation); - } - } else if (structureValid && serverPlayerEntity != null) { - SpectrumAdvancementCriteria.COMPLETED_MULTIBLOCK.trigger(serverPlayerEntity, multiblock); - } - - return completedStructure; - } - - @Override - public void destroy(LevelAccessor world, BlockPos pos, BlockState state) { - if (world.isClientSide()) { - ModonomiconHelper.clearRenderedMultiblock(SpectrumMultiblocks.get(SpectrumMultiblocks.CINDERHEARTH)); - } - } - -} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/cinderhearth/CinderhearthBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/cinderhearth/CinderhearthBlockEntity.java deleted file mode 100644 index 72147c7300..0000000000 --- a/src/main/java/de/dafuqs/spectrum/blocks/cinderhearth/CinderhearthBlockEntity.java +++ /dev/null @@ -1,596 +0,0 @@ -package de.dafuqs.spectrum.blocks.cinderhearth; - -import de.dafuqs.spectrum.api.block.*; -import de.dafuqs.spectrum.api.energy.*; -import de.dafuqs.spectrum.api.energy.color.*; -import de.dafuqs.spectrum.api.energy.storage.*; -import de.dafuqs.spectrum.api.item.*; -import de.dafuqs.spectrum.api.recipe.*; -import de.dafuqs.spectrum.blocks.*; -import de.dafuqs.spectrum.blocks.upgrade.*; -import de.dafuqs.spectrum.components.*; -import de.dafuqs.spectrum.helpers.*; -import de.dafuqs.spectrum.inventories.*; -import de.dafuqs.spectrum.networking.s2c_payloads.*; -import de.dafuqs.spectrum.progression.*; -import de.dafuqs.spectrum.recipe.cinderhearth.*; -import de.dafuqs.spectrum.registries.*; -import net.minecraft.core.*; -import net.minecraft.core.particles.*; -import net.minecraft.nbt.*; -import net.minecraft.network.*; -import net.minecraft.network.chat.*; -import net.minecraft.network.protocol.*; -import net.minecraft.network.protocol.game.*; -import net.minecraft.server.level.*; -import net.minecraft.sounds.*; -import net.minecraft.world.*; -import net.minecraft.world.entity.player.*; -import net.minecraft.world.inventory.*; -import net.minecraft.world.item.*; -import net.minecraft.world.item.crafting.*; -import net.minecraft.world.level.*; -import net.minecraft.world.level.block.entity.*; -import net.minecraft.world.level.block.state.*; -import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; - -import java.util.*; - -public class CinderhearthBlockEntity extends BaseContainerBlockEntity implements MultiblockCrafter, WorldlyContainer, MenuProvider, InkStorageBlockEntity, StackedContentsCompatible { - - public static final int INVENTORY_SIZE = 11; - public static final int INPUT_SLOT_ID = 0; - public static final int INK_PROVIDER_SLOT_ID = 1; - public static final int EXPERIENCE_STORAGE_ITEM_SLOT_ID = 2; - public static final int FIRST_OUTPUT_SLOT_ID = 3; - public static final int LAST_OUTPUT_SLOT_ID = 10; - public static final int[] OUTPUT_SLOT_IDS = new int[]{3, 4, 5, 6, 7, 8, 9, 10}; - - protected NonNullList inventory; - protected boolean inventoryChanged; - - public static final List USED_INK_COLORS = List.of(InkColors.ORANGE, InkColors.MAGENTA, InkColors.LIGHT_BLUE, InkColors.PURPLE, InkColors.BLACK); - public static final long INK_STORAGE_SIZE = 16 * 64 * 100; // equals 16 stacks of pigment - public static final long INK_COST_PER_TICK = 8; - protected IndividualCappedInkStorage inkStorage; - - private UUID ownerUUID; - private UpgradeHolder upgrades; - private RecipeHolder currentRecipe; // blasting & cinderhearth - private boolean usesEfficiency; - protected boolean canTransferInk; - protected boolean inkDirty; - - protected CinderHearthStructureType structure = CinderHearthStructureType.NONE; - - protected final CraftingDelegate propertyDelegate = new CraftingDelegate(); - - @Override - public int [] getSlotsForFace(Direction side) { - switch (side) { - case UP -> { - return new int[]{INPUT_SLOT_ID}; - } - case DOWN -> { - return OUTPUT_SLOT_IDS; - } - default -> { - return new int[]{INK_PROVIDER_SLOT_ID, EXPERIENCE_STORAGE_ITEM_SLOT_ID}; - } - } - } - - @Override - public boolean canPlaceItemThroughFace(int slot, ItemStack stack, @Nullable Direction dir) { - switch (slot) { - case INK_PROVIDER_SLOT_ID -> { - return stack.getItem() instanceof InkStorageItem inkStorageItem && (inkStorageItem.getDrainability().canDrain(false)); - } - case EXPERIENCE_STORAGE_ITEM_SLOT_ID -> { - return stack.getItem() instanceof ExperienceStorageItem; - } - default -> { - return true; - } - } - } - - @Override - public boolean canTakeItemThroughFace(int slot, ItemStack stack, Direction dir) { - return true; - } - - public enum CinderHearthStructureType { - NONE, - WITH_LAVA, - WITHOUT_LAVA - } - - public CinderhearthBlockEntity(BlockPos pos, BlockState state) { - super(SpectrumBlockEntities.CINDERHEARTH.get(), pos, state); - this.inventory = NonNullList.withSize(INVENTORY_SIZE, ItemStack.EMPTY); - this.inkStorage = new IndividualCappedInkStorage(INK_STORAGE_SIZE, USED_INK_COLORS); - } - - @Override - public void resetUpgrades() { - this.upgrades = null; - this.setChanged(); - } - - @Override - public void calculateUpgrades() { - if (level == null) return; - this.upgrades = Upgradeable.calculateUpgradeMods2(level, worldPosition, Support.rotationFromDirection(level.getBlockState(worldPosition).getValue(CinderhearthBlock.FACING)), 2, 1, 1, this.ownerUUID); - this.updateInClientWorld(); - this.setChanged(); - } - - public void updateInClientWorld() { - if (level instanceof ServerLevel serverWorld) - serverWorld.getChunkSource().blockChanged(worldPosition); - } - - @Override - public @Nullable Packet getUpdatePacket() { - return ClientboundBlockEntityDataPacket.create(this); - } - - // Called when the chunk is first loaded to initialize this be - @Override - public CompoundTag getUpdateTag(HolderLookup.Provider registryLookup) { - CompoundTag nbtCompound = new CompoundTag(); - this.saveAdditional(nbtCompound, registryLookup); - return nbtCompound; - } - - @Override - public UUID getOwnerUUID() { - return this.ownerUUID; - } - - @Override - public void setOwner(Player playerEntity) { - this.ownerUUID = playerEntity.getUUID(); - this.setChanged(); - } - - @Override - protected Component getDefaultName() { - return Component.translatable("block.spectrum.cinderhearth"); - } - - @Override - protected NonNullList getItems() { - return inventory; - } - - @Override - protected void setItems(NonNullList inventory) { - this.inventory = inventory; - } - - @Override - protected AbstractContainerMenu createMenu(int syncId, Inventory playerInventory) { - return new CinderhearthScreenHandler(syncId, playerInventory, this, this.propertyDelegate); - } - - @Override - public void writeClientSideData(AbstractContainerMenu menu, RegistryFriendlyByteBuf buffer) { - buffer.writeBlockPos(this.worldPosition); - } - - @Override - public void loadAdditional(CompoundTag nbt, HolderLookup.Provider registryLookup) { - super.loadAdditional(nbt, registryLookup); - - ContainerHelper.loadAllItems(nbt, this.inventory, registryLookup); - - CodecHelper.fromNbt(InkStorageComponent.CODEC, nbt.get("InkStorage")).ifPresent(storage -> - this.inkStorage = new IndividualCappedInkStorage(storage.maxPerColor(), storage.storedEnergy())); - this.propertyDelegate.craftingTime = nbt.getShort("CraftingTime"); - this.propertyDelegate.craftingTimeTotal = nbt.getShort("CraftingTimeTotal"); - this.usesEfficiency = nbt.getBoolean("UsesEfficiency"); - this.canTransferInk = nbt.getBoolean("Paused"); - this.inventoryChanged = nbt.getBoolean("InventoryChanged"); - if (nbt.contains("Structure", Tag.TAG_ANY_NUMERIC)) { - this.structure = CinderHearthStructureType.values()[nbt.getInt("Structure")]; - } else { - this.structure = CinderHearthStructureType.NONE; - } - this.ownerUUID = PlayerOwnedWithName.readOwnerUUID(nbt); - this.currentRecipe = MultiblockCrafter.getRecipeHolderFromNbt(level, nbt); - if (nbt.contains("Upgrades", Tag.TAG_LIST)) { - this.upgrades = UpgradeHolder.fromNbt(nbt.getList("Upgrades", Tag.TAG_COMPOUND)); - } else { - this.upgrades = new UpgradeHolder(); - } - } - - @Override - public void saveAdditional(CompoundTag nbt, HolderLookup.Provider registryLookup) { - super.saveAdditional(nbt, registryLookup); - ContainerHelper.saveAllItems(nbt, this.inventory, registryLookup); - CodecHelper.writeNbt(nbt, "InkStorage", InkStorageComponent.CODEC, new InkStorageComponent(this.inkStorage)); - nbt.putShort("CraftingTime", (short) this.propertyDelegate.craftingTime); - nbt.putShort("CraftingTimeTotal", (short) this.propertyDelegate.craftingTimeTotal); - nbt.putBoolean("UsesEfficiency", this.usesEfficiency); - nbt.putBoolean("Paused", this.canTransferInk); - nbt.putBoolean("InventoryChanged", this.inventoryChanged); - nbt.putInt("Structure", this.structure.ordinal()); - if (this.upgrades != null) { - nbt.put("Upgrades", this.upgrades.toNbt()); - } - - PlayerOwned.writeOwnerUUID(nbt, this.ownerUUID); - if (this.currentRecipe != null) { - nbt.putString("CurrentRecipe", this.currentRecipe.id().toString()); - } - } - - @SuppressWarnings("unused") - public static void serverTick(Level world, BlockPos blockPos, BlockState blockState, CinderhearthBlockEntity cinderhearthBlockEntity) { - if (cinderhearthBlockEntity.upgrades == null) { - cinderhearthBlockEntity.calculateUpgrades(); - } - cinderhearthBlockEntity.inkDirty = false; - - if (cinderhearthBlockEntity.canTransferInk) { - boolean didSomething = false; - ItemStack stack = cinderhearthBlockEntity.getItem(INK_PROVIDER_SLOT_ID); - if (stack.getItem() instanceof InkStorageItem inkStorageItem) { - InkStorage itemStorage = inkStorageItem.getEnergyStorage(stack); - didSomething = InkStorage.transferInk(itemStorage, cinderhearthBlockEntity.inkStorage) != 0; - if (didSomething) { - inkStorageItem.setEnergyStorage(stack, itemStorage); - } - } - if (didSomething) { - cinderhearthBlockEntity.setChanged(); - cinderhearthBlockEntity.setInkDirty(); - } else { - cinderhearthBlockEntity.canTransferInk = false; - } - } - - if (cinderhearthBlockEntity.inventoryChanged) { - calculateRecipe(world, cinderhearthBlockEntity); - cinderhearthBlockEntity.inventoryChanged = false; - cinderhearthBlockEntity.updateInClientWorld(); - } - - if (cinderhearthBlockEntity.currentRecipe != null) { - if (!canContinue(world, blockPos, cinderhearthBlockEntity)) { - cinderhearthBlockEntity.currentRecipe = null; - cinderhearthBlockEntity.propertyDelegate.craftingTime = 0; - cinderhearthBlockEntity.propertyDelegate.craftingTimeTotal = 0; - cinderhearthBlockEntity.setChanged(); - return; - } - - if (cinderhearthBlockEntity.propertyDelegate.craftingTime == 0) { - var recipe = cinderhearthBlockEntity.currentRecipe; - - cinderhearthBlockEntity.usesEfficiency = cinderhearthBlockEntity.drainInkForUpgradesRequired(cinderhearthBlockEntity, UpgradeType.EFFICIENCY, InkColors.BLACK, false); - - int baseTime = recipe.value() instanceof AbstractCookingRecipe abstractCookingRecipe ? abstractCookingRecipe.getCookingTime() - : recipe.value() instanceof CinderhearthRecipe cinderhearthRecipe ? cinderhearthRecipe.getCraftingTime() - : -1; - if (baseTime >= 0) { - float speedModifier = cinderhearthBlockEntity.drainInkForUpgrades(cinderhearthBlockEntity, UpgradeType.SPEED, InkColors.MAGENTA, cinderhearthBlockEntity.usesEfficiency); - cinderhearthBlockEntity.propertyDelegate.craftingTimeTotal = (int) Math.ceil(baseTime / speedModifier); - } - } - - cinderhearthBlockEntity.propertyDelegate.craftingTime++; - - if (cinderhearthBlockEntity.propertyDelegate.craftingTime == cinderhearthBlockEntity.propertyDelegate.craftingTimeTotal) { - if (cinderhearthBlockEntity.getCurrentRecipe() instanceof CinderhearthRecipe cinderhearthRecipe) { - craftCinderhearthRecipe(world, cinderhearthBlockEntity, cinderhearthRecipe); - } else if (cinderhearthBlockEntity.getCurrentRecipe() instanceof BlastingRecipe blastingRecipe) { - craftBlastingRecipe(world, cinderhearthBlockEntity, blastingRecipe); - } - } - - cinderhearthBlockEntity.setChanged(); - } - } - - private static boolean canContinue(Level world, BlockPos blockPos, CinderhearthBlockEntity cinderhearthBlockEntity) { - if (!canAcceptRecipeOutput(world, cinderhearthBlockEntity.currentRecipe, cinderhearthBlockEntity)) { - return false; - } - - if (cinderhearthBlockEntity.propertyDelegate.craftingTime % 20 == 0) { - if (!checkRecipeRequirements(world, blockPos, cinderhearthBlockEntity)) { - return false; - } - // consume orange ink - return cinderhearthBlockEntity.drainInkForUpgradesRequired(cinderhearthBlockEntity, InkColors.ORANGE, INK_COST_PER_TICK, cinderhearthBlockEntity.usesEfficiency); - } - - return true; - } - - protected static boolean canAcceptRecipeOutput(Level world, RecipeHolder recipe, Container inventory) { - if (recipe != null) { - ItemStack outputStack = recipe.value().getResultItem(world.registryAccess()); - if (outputStack.isEmpty()) { - return true; - } else { - int outputSpaceFound = 0; - for (int slot : OUTPUT_SLOT_IDS) { - ItemStack slotStack = inventory.getItem(slot); - if (slotStack.isEmpty()) { - return true; - } else if (ItemStack.isSameItemSameComponents(slotStack, outputStack)) { - outputSpaceFound += outputStack.getMaxStackSize() - slotStack.getCount(); - if (outputSpaceFound >= outputStack.getCount()) { - return true; - } - } - } - } - } - return false; - } - - private static void calculateRecipe(Level world, CinderhearthBlockEntity cinderhearthBlockEntity) { - var input = new SingleRecipeInput(cinderhearthBlockEntity.getItem(0)); - - // test the cached recipe => faster - if (cinderhearthBlockEntity.getCurrentRecipe() instanceof CinderhearthRecipe recipe) { - if (recipe.matches(input, world)) - return; - } else if (cinderhearthBlockEntity.getCurrentRecipe() instanceof BlastingRecipe recipe) { - if (recipe.matches(input, world)) - return; - } - - cinderhearthBlockEntity.currentRecipe = null; - cinderhearthBlockEntity.propertyDelegate.craftingTime = 0; - cinderhearthBlockEntity.propertyDelegate.craftingTimeTotal = -1; - - // cached recipe did not match => calculate new - ItemStack inputStack = cinderhearthBlockEntity.getItem(0); - if (!inputStack.isEmpty()) { - world.getRecipeManager().getRecipeFor(SpectrumRecipeTypes.CINDERHEARTH, input, world).ifPresentOrElse( - r -> cinderhearthBlockEntity.currentRecipe = r, - () -> world.getRecipeManager().getRecipeFor(RecipeType.BLASTING, input, world).ifPresent( - r -> cinderhearthBlockEntity.currentRecipe = r)); - } - } - - private static boolean checkRecipeRequirements(Level world, BlockPos blockPos, CinderhearthBlockEntity cinderhearthBlockEntity) { - Player lastInteractedPlayer = PlayerOwned.getPlayerIfOnline(world, cinderhearthBlockEntity.ownerUUID); - if (lastInteractedPlayer == null) { - return false; - } - - cinderhearthBlockEntity.structure = CinderhearthBlock.verifyStructure(world, blockPos, null); - if (cinderhearthBlockEntity.structure == CinderHearthStructureType.NONE) { - world.playSound(null, cinderhearthBlockEntity.getBlockPos(), SpectrumSoundEvents.CRAFTING_ABORTED, SoundSource.BLOCKS, 0.9F + world.getRandom().nextFloat() * 0.2F, 0.9F + world.getRandom().nextFloat() * 0.2F); - return false; - } - - if (cinderhearthBlockEntity.getCurrentRecipe() instanceof GatedRecipe gatedRecipe) { - return gatedRecipe.canPlayerCraft(lastInteractedPlayer); - } - return true; - } - - public static void craftBlastingRecipe(Level world, CinderhearthBlockEntity cinderhearth, BlastingRecipe blastingRecipe) { - // calculate outputs - ItemStack inputStack = cinderhearth.getItem(INPUT_SLOT_ID); - float yieldMod = inputStack.is(SpectrumItemTags.NO_CINDERHEARTH_DOUBLING) ? 1.0F : cinderhearth.drainInkForUpgrades(cinderhearth, UpgradeType.YIELD, InkColors.LIGHT_BLUE, cinderhearth.usesEfficiency); - ItemStack output = blastingRecipe.getResultItem(world.registryAccess()).copy(); - List outputs = new ArrayList<>(); - if (yieldMod > 1) { - int outputCount = Support.getIntFromDecimalWithChance(output.getCount() * yieldMod, world.getRandom()); - while (outputCount > 0) { // if the rolled count exceeds the max stack size we need to split them (unstackable items, counts > 64, ...) - int count = Math.min(outputCount, output.getMaxStackSize()); - ItemStack outputStack = output.copy(); - outputStack.setCount(count); - outputs.add(outputStack); - outputCount -= count; - } - } else { - outputs.add(output.copy()); - } - - // craft - craftRecipe(cinderhearth, inputStack, outputs, blastingRecipe.getExperience()); - } - - public static void craftCinderhearthRecipe(Level world, CinderhearthBlockEntity cinderhearth, CinderhearthRecipe cinderhearthRecipe) { - // calculate outputs - ItemStack inputStack = cinderhearth.getItem(INPUT_SLOT_ID); - float yieldMod = inputStack.is(SpectrumItemTags.NO_CINDERHEARTH_DOUBLING) ? 1.0F : cinderhearth.drainInkForUpgrades(cinderhearth, UpgradeType.YIELD, InkColors.LIGHT_BLUE, cinderhearth.usesEfficiency); - List outputs = cinderhearthRecipe.getRolledOutputs(world.getRandom(), yieldMod); - - // craft - craftRecipe(cinderhearth, inputStack, outputs, cinderhearthRecipe.getExperience()); - } - - private static void craftRecipe(CinderhearthBlockEntity cinderhearth, ItemStack inputStack, List outputs, float experience) { - var world = cinderhearth.level; - if (world == null) return; - - NonNullList backupInventory = NonNullList.withSize(INVENTORY_SIZE, ItemStack.EMPTY); - for (int i = 0; i < cinderhearth.inventory.size(); i++) { - backupInventory.set(i, cinderhearth.inventory.get(i)); - } - - boolean couldAdd = InventoryHelper.addToInventory(cinderhearth, outputs, FIRST_OUTPUT_SLOT_ID, LAST_OUTPUT_SLOT_ID + 1); - if (couldAdd) { - ItemStack remainder = inputStack.getCraftingRemainingItem(); - - // use up input ingredient - ItemStack inputStackCopy = inputStack.copy(); - int amountToDecrementInput = cinderhearth.getCurrentRecipe() instanceof CinderhearthRecipe cinderhearthRecipe ? cinderhearthRecipe.getIngredientStacks().getFirst().getCount() : 1; - inputStack.shrink(amountToDecrementInput); - - if (!remainder.isEmpty()) { - boolean remainderAdded = InventoryHelper.addToInventory(cinderhearth, remainder, FIRST_OUTPUT_SLOT_ID, LAST_OUTPUT_SLOT_ID + 1); - if (!remainderAdded && inputStack.isEmpty()) { - cinderhearth.setItem(CinderhearthBlockEntity.INPUT_SLOT_ID, remainder); - } - } - - // effects - playCraftingFinishedEffects(cinderhearth); - - // reset - cinderhearth.propertyDelegate.craftingTime = 0; - cinderhearth.inventoryChanged(); - - // grant experience & advancements - float experienceMod = cinderhearth.drainInkForUpgrades(cinderhearth, UpgradeType.EXPERIENCE, InkColors.PURPLE, cinderhearth.usesEfficiency); - int finalExperience = Support.getIntFromDecimalWithChance(experience * experienceMod, world.getRandom()); - ExperienceStorageItem.addStoredExperience(world.registryAccess(), cinderhearth.getItem(EXPERIENCE_STORAGE_ITEM_SLOT_ID), finalExperience); - cinderhearth.grantPlayerCinderhearthSmeltingAdvancement((ServerLevel) cinderhearth.level, inputStackCopy, outputs, finalExperience); - } else { - cinderhearth.inventory = backupInventory; - - // prevents trying to craft more until the inventory is freed up - cinderhearth.propertyDelegate.craftingTimeTotal = -1; - cinderhearth.currentRecipe = null; - cinderhearth.inventoryChanged = false; - } - } - - public void grantPlayerCinderhearthSmeltingAdvancement(ServerLevel level, ItemStack input, List outputs, int experience) { - ServerPlayer serverPlayerEntity = (ServerPlayer) getOwnerIfOnline(level); - if (serverPlayerEntity != null) { - SpectrumAdvancementCriteria.CINDERHEARTH_SMELTING.trigger(serverPlayerEntity, input, outputs, experience, this.upgrades); - } - } - - public static void playCraftingFinishedEffects(CinderhearthBlockEntity cinderhearthBlockEntity) { - Direction.Axis axis = null; - Direction direction = Direction.UP; - if (!(cinderhearthBlockEntity.level instanceof ServerLevel world)) return; - - for (Map.Entry entry : cinderhearthBlockEntity.upgrades.entrySet()) { - if (entry.getValue() > 1) { - if (axis == null) { - BlockState state = world.getBlockState(cinderhearthBlockEntity.worldPosition); - direction = state.getValue(CinderhearthBlock.FACING); - axis = direction.getAxis(); - } - - double d = (double) cinderhearthBlockEntity.worldPosition.getX() + 0.5D; - double f = (double) cinderhearthBlockEntity.worldPosition.getZ() + 0.5D; - double g2 = -3D / 16D; - double h2 = 4D / 16D; - double i2 = axis == Direction.Axis.X ? (double) direction.getStepX() * g2 : h2; - double k2 = axis == Direction.Axis.Z ? (double) direction.getStepZ() * g2 : h2; - PlayParticleWithRandomOffsetAndVelocityPayload.playParticleWithRandomOffsetAndVelocity(world, - new Vec3(d + i2, cinderhearthBlockEntity.worldPosition.getY() + 1.1, f + k2), - ParticleTypes.CAMPFIRE_COSY_SMOKE, - 3, - new Vec3(0.05D, 0.00D, 0.05D), - new Vec3(0.0D, 0.3D, 0.0D)); - } - } - } - - @Override - public int getContainerSize() { - return INVENTORY_SIZE; - } - - @Override - public boolean isEmpty() { - return this.inventory.isEmpty(); - } - - @Override - public ItemStack getItem(int slot) { - return inventory.get(slot); - } - - @Override - public ItemStack removeItem(int slot, int amount) { - ItemStack removedStack = ContainerHelper.removeItem(this.inventory, slot, amount); - this.inventoryChanged(); - return removedStack; - } - - @Override - public ItemStack removeItemNoUpdate(int slot) { - ItemStack removedStack = ContainerHelper.takeItem(this.inventory, slot); - this.inventoryChanged(); - return removedStack; - } - - @Override - public void setItem(int slot, ItemStack stack) { - this.inventory.set(slot, stack); - if (stack.getCount() > this.getMaxStackSize()) { - stack.setCount(this.getMaxStackSize()); - } - this.inventoryChanged(); - } - - @Override - public boolean stillValid(Player player) { - if (level == null || level.getBlockEntity(this.worldPosition) != this) { - return false; - } else { - return player.distanceToSqr((double) this.worldPosition.getX() + 0.5D, (double) this.worldPosition.getY() + 0.5D, (double) this.worldPosition.getZ() + 0.5D) <= 64.0D; - } - } - - public void inventoryChanged() { - this.inventoryChanged = true; - this.canTransferInk = true; - this.setChanged(); - } - - @Override - public void clearContent() { - this.inventory.clear(); - this.inventoryChanged(); - } - - @Override - public UpgradeHolder getUpgradeHolder() { - return this.upgrades; - } - - @Override - public List getUpgradePosOffsets() { - return CinderhearthBlock.UPGRADE_BLOCK_OFFSETS; - } - - @Override - public IndividualCappedInkStorage getEnergyStorage() { - return this.inkStorage; - } - - @Override - public void setInkDirty() { - this.inkDirty = true; - } - - @Override - public boolean getInkDirty() { - return this.inkDirty; - } - - public RecipeHolder getCurrentRecipeHolder() { - return currentRecipe; - } - - public @Nullable Recipe getCurrentRecipe() { - return currentRecipe == null ? null : currentRecipe.value(); - } - - @Override - public void fillStackedContents(StackedContents finder) { - this.inventory.forEach(finder::accountStack); - } - -} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/cinderhearth/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/cinderhearth/package-info.java deleted file mode 100644 index 578c3b91fe..0000000000 --- a/src/main/java/de/dafuqs/spectrum/blocks/cinderhearth/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@NullMarked -@MethodsReturnNonnullByDefault -@FieldsAreNonnullByDefault -package de.dafuqs.spectrum.blocks.cinderhearth; - -import net.minecraft.*; -import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/conditional/CloakedOreBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/conditional/CloakedOreBlock.java index a8483f7fed..0f349fc6fe 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/conditional/CloakedOreBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/conditional/CloakedOreBlock.java @@ -15,7 +15,7 @@ import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.entity.*; import net.minecraft.world.level.block.state.*; -import org.jetbrains.annotations.*; +import org.jspecify.annotations.*; import java.util.*; @@ -58,6 +58,7 @@ public Tuple getItemCloak() { return new Tuple<>(this.asItem(), cloakBlockState.getBlock().asItem()); } + @Override public int getExpDrop(BlockState state, LevelAccessor level, BlockPos pos, @Nullable BlockEntity blockEntity, @Nullable Entity breaker, ItemStack tool) { if(breaker instanceof Player player && isVisibleTo(player)) { return super.getExpDrop(state, level, pos, blockEntity, breaker, tool); diff --git a/src/main/java/de/dafuqs/spectrum/blocks/conditional/MermaidsBrushBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/conditional/MermaidsBrushBlock.java index de5d763dcc..45a0bc5800 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/conditional/MermaidsBrushBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/conditional/MermaidsBrushBlock.java @@ -20,7 +20,7 @@ import net.minecraft.world.level.block.state.properties.*; import net.minecraft.world.level.material.*; import net.minecraft.world.phys.shapes.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; @@ -29,7 +29,7 @@ public class MermaidsBrushBlock extends BushBlock implements BonemealableBlock, public static final MapCodec CODEC = simpleCodec(MermaidsBrushBlock::new); private static final VoxelShape SHAPE = Block.box(1.0, 0.0, 1.0, 15.0, 16.0, 15.0); - public static final EnumProperty LOGGED = FluidLogging.ANY_EXCLUDING_NONE; + public static final EnumProperty LOGGED = FluidLogging.WATER_LIQUID_CRYSTAL; public static final IntegerProperty AGE = BlockStateProperties.AGE_7; public MermaidsBrushBlock(Properties settings) { @@ -38,6 +38,11 @@ public MermaidsBrushBlock(Properties settings) { RevelationAware.register(this); } + @Override + public EnumProperty getFillableFluids() { + return LOGGED; + } + @Override public MapCodec codec() { return CODEC; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/conditional/MermaidsGemItem.java b/src/main/java/de/dafuqs/spectrum/blocks/conditional/MermaidsGemItem.java index f2f858d929..ac91782214 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/conditional/MermaidsGemItem.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/conditional/MermaidsGemItem.java @@ -17,7 +17,6 @@ import net.neoforged.neoforge.capabilities.*; import net.neoforged.neoforge.fluids.*; import net.neoforged.neoforge.fluids.capability.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/conditional/QuitoxicReedsBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/conditional/QuitoxicReedsBlock.java index 35c11de09a..f413377247 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/conditional/QuitoxicReedsBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/conditional/QuitoxicReedsBlock.java @@ -22,7 +22,7 @@ import net.minecraft.world.level.material.*; import net.minecraft.world.phys.*; import net.minecraft.world.phys.shapes.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; import java.util.concurrent.atomic.*; @@ -31,7 +31,7 @@ public class QuitoxicReedsBlock extends Block implements RevelationAware, FluidL public static final MapCodec CODEC = simpleCodec(QuitoxicReedsBlock::new); - public static final EnumProperty LOGGED = FluidLogging.ANY_INCLUDING_NONE; + public static final EnumProperty LOGGED = FluidLogging.AIR_WATER_LIQUID_CRYSTAL_DRAGONROT; public static final IntegerProperty AGE = BlockStateProperties.AGE_7; // 'always drop' has no cloak and therefore drops normally even when broken 'via the world' @@ -68,6 +68,7 @@ public Map getBlockStateCloaks() { map.put(this.defaultBlockState().setValue(LOGGED, FluidLogging.State.NOT_LOGGED).setValue(AGE, i), Blocks.AIR.defaultBlockState()); map.put(this.defaultBlockState().setValue(LOGGED, FluidLogging.State.WATER).setValue(AGE, i), Blocks.WATER.defaultBlockState()); map.put(this.defaultBlockState().setValue(LOGGED, FluidLogging.State.LIQUID_CRYSTAL).setValue(AGE, i), SpectrumBlocks.LIQUID_CRYSTAL.get().defaultBlockState()); + map.put(this.defaultBlockState().setValue(LOGGED, FluidLogging.State.DRAGONROT).setValue(AGE, i), SpectrumBlocks.DRAGONROT.get().defaultBlockState()); } return map; } @@ -86,28 +87,24 @@ public void tick(BlockState state, ServerLevel world, BlockPos pos, RandomSource @Override public @Nullable BlockState getStateForPlacement(BlockPlaceContext ctx) { - FluidState fluidState = ctx.getLevel().getFluidState(ctx.getClickedPos()); - if (fluidState.is(FluidTags.WATER) && fluidState.getAmount() == 8) { - return super.getStateForPlacement(ctx).setValue(LOGGED, FluidLogging.State.WATER); - } else if (fluidState.getType() == SpectrumFluids.LIQUID_CRYSTAL.get()) { - return super.getStateForPlacement(ctx).setValue(LOGGED, FluidLogging.State.LIQUID_CRYSTAL); - } else { - return super.getStateForPlacement(ctx).setValue(LOGGED, FluidLogging.State.NOT_LOGGED); - } + return getStateForPos(ctx.getLevel(), ctx.getClickedPos()); } @Override public void playerDestroy(Level level, Player player, BlockPos pos, BlockState state, @Nullable BlockEntity blockEntity, ItemStack tool) { // since the quitoxic reeds are stacked and break from bottom to top - // bot the player that broke the other blocks is not propagated we - // have to apply a workaround here by counting the reeds above this - // and dropping that many times loot to account for it - for (int i = 1; i < MAX_GROWTH_HEIGHT_CRYSTAL; i++) { - BlockPos offsetPos = pos.offset(0, i, 0); - if (level.getBlockState(offsetPos).is(this)) { - level.setBlockAndUpdate(offsetPos, level.getBlockState(offsetPos).setValue(ALWAYS_DROP, true)); - } else { - break; + // the player that broke the other blocks is not propagated + // we have to apply a workaround here by using a special "not cloaked" state property + if (this.isVisibleTo(player)) { + int i = 1; + while (true) { + BlockPos offsetPos = pos.offset(0, i, 0); + if (level.getBlockState(offsetPos).is(this)) { + level.setBlockAndUpdate(offsetPos, level.getBlockState(offsetPos).setValue(ALWAYS_DROP, true)); + i++; + } else { + break; + } } } @@ -116,16 +113,12 @@ public void playerDestroy(Level level, Player player, BlockPos pos, BlockState s @Override public BlockState updateShape(BlockState state, Direction direction, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { - FluidLogging.State fluidLog = state.getValue(LOGGED); - if (fluidLog == FluidLogging.State.WATER) { - world.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world)); - } else if (fluidLog == FluidLogging.State.LIQUID_CRYSTAL) { - world.scheduleTick(pos, SpectrumFluids.LIQUID_CRYSTAL.get(), SpectrumFluids.LIQUID_CRYSTAL.get().getTickDelay(world)); - } + state.getValue(LOGGED).updateShape(state, direction, neighborState, world, pos, neighborPos); if (!state.canSurvive(world, pos)) { world.scheduleTick(pos, this, 1); } + return super.updateShape(state, direction, neighborState, world, pos, neighborPos); } @@ -155,7 +148,8 @@ public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random for (height = 1; world.getBlockState(pos.below(height)).is(this); ) height++; - boolean bottomLiquidCrystalLogged = world.getBlockState(pos.below(height - 1)).getValue(LOGGED) == FluidLogging.State.LIQUID_CRYSTAL; + FluidLogging.State loggingState = world.getBlockState(pos.below(height - 1)).getValue(LOGGED); + boolean bottomLiquidCrystalLogged = loggingState == FluidLogging.State.LIQUID_CRYSTAL; // grows taller on liquid crystal if (height < MAX_GROWTH_HEIGHT_WATER || (bottomLiquidCrystalLogged && height < MAX_GROWTH_HEIGHT_CRYSTAL)) { @@ -164,13 +158,18 @@ public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random // consume 1 block close to the reed when growing. // if the quitoxic reeds are growing in liquid crystal: 1/4 chance to consume // search for block it could be planted on. 1 block => 1 quitoxic reed - Optional posToConsumeBlock = searchConsumableBlock(world, pos.below(height), SpectrumBlockTags.QUITOXIC_REEDS_PLANTABLE, random); - if (posToConsumeBlock.isEmpty() || world.getBlockState(posToConsumeBlock.get().above()).getBlock() instanceof QuitoxicReedsBlock) { + Optional posToConsumeBlock = searchConsumableBlock(world, pos.below(height), SpectrumBlockTags.QUITOXIC_REEDS_PLANTABLE, SpectrumBlockTags.QUITOXIC_REEDS_CONSUMABLE, random); + if (posToConsumeBlock.isEmpty()) { return; } if (!bottomLiquidCrystalLogged || random.nextInt(4) == 0) { - world.setBlock(posToConsumeBlock.get(), Blocks.DIRT.defaultBlockState(), 3); + BlockState replacement = switch (loggingState) { + case FluidLogging.State.LIQUID_CRYSTAL -> SpectrumBlocks.SLUSH.get().defaultBlockState(); + case FluidLogging.State.DRAGONROT -> SpectrumBlocks.ROTTEN_GROUND.get().defaultBlockState(); + default -> Blocks.COARSE_DIRT.defaultBlockState(); + }; + world.setBlockAndUpdate(posToConsumeBlock.get(), replacement); world.playSound(null, posToConsumeBlock.get(), SoundEvents.GRAVEL_BREAK, SoundSource.BLOCKS, 1.0F, 1.0F); } @@ -187,32 +186,32 @@ public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random } } - private Optional searchConsumableBlock(Level world, BlockPos origin, TagKey searchTag, RandomSource random) { + private Optional searchConsumableBlock(Level world, BlockPos origin, TagKey continueTag, TagKey searchTag, RandomSource random) { Direction direction = Direction.Plane.HORIZONTAL.getRandomDirection(random); AtomicReference lastFoundPos = new AtomicReference<>(origin); BlockPos.breadthFirstTraversal(origin, MAX_CONSUMABLE_BLOCK_SEARCH_DISTANCE, 100, (pos, blockPosConsumer) -> { - lastFoundPos.set(pos); + if(world.getBlockState(pos).is(searchTag)) { + lastFoundPos.set(pos); + } blockPosConsumer.accept(pos.relative(direction)); blockPosConsumer.accept(pos.relative(Direction.DOWN)); blockPosConsumer.accept(pos.relative(Direction.UP)); }, - pos -> world.getBlockState(pos).is(searchTag) + pos -> world.getBlockState(pos).is(continueTag) ); - if (lastFoundPos.get().equals(origin)) { - return Optional.empty(); - } else { + if (world.getBlockState(lastFoundPos.get()).is(searchTag)) { return Optional.of(lastFoundPos.get()); + } else { + return Optional.empty(); } } - public BlockState getStateForPos(Level world, BlockPos blockPos) { - FluidState fluidState = world.getFluidState(blockPos); - if (fluidState.is(FluidTags.WATER) && fluidState.getAmount() == 8) { - return defaultBlockState().setValue(LOGGED, FluidLogging.State.WATER); - } else if (fluidState.getType().equals(SpectrumFluids.LIQUID_CRYSTAL.get().getSource())) { - return defaultBlockState().setValue(LOGGED, FluidLogging.State.LIQUID_CRYSTAL); + public BlockState getStateForPos(Level world, BlockPos pos) { + FluidLogging.State fluidState = defaultBlockState().getValue(LOGGED).getStateForPos(world, pos); + if(LOGGED.getPossibleValues().contains(fluidState)) { + return defaultBlockState().setValue(LOGGED, fluidState); } return defaultBlockState(); } @@ -251,20 +250,16 @@ private boolean isValidBlockForPlanting(LevelReader world, BlockPos pos) { return false; } BlockState upState = world.getBlockState(pos.above()); - BlockState upState2 = world.getBlockState(pos.above(2)); - if (!upState.is(this)) { - if (!upState.isAir() && !upState2.isAir()) { - return false; - } + if (!upState.is(this) && !upState.isAir()) { + return false; } BlockState state = world.getBlockState(pos); - if (state.is(this)) { + if(state.getBlock() instanceof QuitoxicReedsBlock) { return true; } - FluidState fluidState = world.getFluidState(pos); - return fluidState.getAmount() == 8 && (fluidState.is(FluidTags.WATER) || state.is(SpectrumBlocks.LIQUID_CRYSTAL)); + return fluidState.getAmount() == 8 && (fluidState.is(FluidTags.WATER) || state.is(SpectrumBlocks.LIQUID_CRYSTAL) || state.is(SpectrumBlocks.DRAGONROT)); } private boolean canGrow(LevelReader world, BlockPos pos) { @@ -273,7 +268,7 @@ private boolean canGrow(LevelReader world, BlockPos pos) { return true; } FluidState fluidState = world.getFluidState(pos); - return fluidState.getAmount() == 8 && (fluidState.is(FluidTags.WATER) || state.is(SpectrumBlocks.LIQUID_CRYSTAL)); + return fluidState.getAmount() == 8 && (fluidState.is(FluidTags.WATER) || state.is(SpectrumBlocks.LIQUID_CRYSTAL) || state.is(SpectrumBlocks.DRAGONROT)); } @Override @@ -281,4 +276,14 @@ public float getMaxHorizontalOffset() { return 0.15F; } + @Override + public EnumProperty getFillableFluids() { + return LOGGED; + } + + @Override + public EnumProperty getDrainableFluids() { + return LOGGED; + } + } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/conditional/RadiatingEnderBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/conditional/RadiatingEnderBlock.java index 7aac980b8f..5e0ec96aa6 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/conditional/RadiatingEnderBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/conditional/RadiatingEnderBlock.java @@ -16,7 +16,7 @@ import java.util.*; -public class RadiatingEnderBlock extends SpectrumFacingBlock implements RevelationAware { +public class RadiatingEnderBlock extends SpectrumDirectionalBlock implements RevelationAware { public static final MapCodec CODEC = simpleCodec(RadiatingEnderBlock::new); diff --git a/src/main/java/de/dafuqs/spectrum/blocks/conditional/StuckStormStoneBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/conditional/StuckStormStoneBlock.java index 27adb435fa..2be8375903 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/conditional/StuckStormStoneBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/conditional/StuckStormStoneBlock.java @@ -16,7 +16,7 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.*; import net.minecraft.world.phys.shapes.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/conditional/amaranth/AmaranthBushelBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/conditional/amaranth/AmaranthBushelBlock.java index 68a0b46a07..792a739536 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/conditional/amaranth/AmaranthBushelBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/conditional/amaranth/AmaranthBushelBlock.java @@ -13,7 +13,7 @@ import net.minecraft.world.item.component.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/conditional/amaranth/AmaranthCropBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/conditional/amaranth/AmaranthCropBlock.java index f4d74684a0..7ece2ea3b6 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/conditional/amaranth/AmaranthCropBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/conditional/amaranth/AmaranthCropBlock.java @@ -1,5 +1,6 @@ package de.dafuqs.spectrum.blocks.conditional.amaranth; +import appeng.datagen.providers.tags.*; import com.mojang.serialization.*; import de.dafuqs.revelationary.api.revelations.*; import de.dafuqs.spectrum.blocks.*; @@ -14,7 +15,8 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.block.state.properties.*; import net.minecraft.world.phys.shapes.*; -import org.jspecify.annotations.Nullable; +import net.neoforged.neoforge.common.util.*; +import org.jspecify.annotations.*; import java.util.*; @@ -113,9 +115,4 @@ public VoxelShape getShape(BlockState state, BlockGetter world, BlockPos pos, Co } } - @Override - protected boolean mayPlaceOn(BlockState state, BlockGetter level, BlockPos pos) { - return state.is(SpectrumBlockTags.AMARANTH_PLANTABLE); - } - } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/conditional/amaranth/PottedAmaranthBushelBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/conditional/amaranth/PottedAmaranthBushelBlock.java index 41c76330f5..03bdd34497 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/conditional/amaranth/PottedAmaranthBushelBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/conditional/amaranth/PottedAmaranthBushelBlock.java @@ -7,13 +7,14 @@ import net.minecraft.world.item.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; +import java.util.function.*; public class PottedAmaranthBushelBlock extends FlowerPotBlock implements RevelationAware { - public PottedAmaranthBushelBlock(Block content, Properties settings) { + public PottedAmaranthBushelBlock(AmaranthBushelBlock content, Properties settings) { super(content, settings); RevelationAware.register(this); } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/conditional/amaranth/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/conditional/amaranth/package-info.java index e79fb8398a..3bd4f55ef9 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/conditional/amaranth/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/conditional/amaranth/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.conditional.amaranth; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/conditional/blood_orchid/BloodOrchidBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/conditional/blood_orchid/BloodOrchidBlock.java index 89df81d396..cdb0d19ef4 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/conditional/blood_orchid/BloodOrchidBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/conditional/blood_orchid/BloodOrchidBlock.java @@ -21,7 +21,7 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.block.state.properties.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/conditional/blood_orchid/PottedBloodOrchidBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/conditional/blood_orchid/PottedBloodOrchidBlock.java index 876c883d7b..606febe912 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/conditional/blood_orchid/PottedBloodOrchidBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/conditional/blood_orchid/PottedBloodOrchidBlock.java @@ -6,13 +6,14 @@ import net.minecraft.world.item.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; +import java.util.function.*; public class PottedBloodOrchidBlock extends FlowerPotBlock implements RevelationAware { - public PottedBloodOrchidBlock(Block content, Properties settings) { + public PottedBloodOrchidBlock(BloodOrchidBlock content, Properties settings) { super(content, settings); RevelationAware.register(this); } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/conditional/blood_orchid/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/conditional/blood_orchid/package-info.java index 375bb8fbd2..6f00f8bea8 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/conditional/blood_orchid/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/conditional/blood_orchid/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.conditional.blood_orchid; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/conditional/colored_tree/ColoredFenceBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/conditional/colored_tree/ColoredFenceBlock.java index 645850d616..934a957085 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/conditional/colored_tree/ColoredFenceBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/conditional/colored_tree/ColoredFenceBlock.java @@ -1,9 +1,9 @@ package de.dafuqs.spectrum.blocks.conditional.colored_tree; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.blocks.flammable.*; import it.unimi.dsi.fastutil.objects.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/conditional/colored_tree/ColoredFenceGateBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/conditional/colored_tree/ColoredFenceGateBlock.java index 66438fc490..73aebbb55b 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/conditional/colored_tree/ColoredFenceGateBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/conditional/colored_tree/ColoredFenceGateBlock.java @@ -1,10 +1,10 @@ package de.dafuqs.spectrum.blocks.conditional.colored_tree; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.blocks.flammable.*; import de.dafuqs.spectrum.registries.*; import it.unimi.dsi.fastutil.objects.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/conditional/colored_tree/ColoredLeavesBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/conditional/colored_tree/ColoredLeavesBlock.java index 2daffd8e39..2b2290cbc1 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/conditional/colored_tree/ColoredLeavesBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/conditional/colored_tree/ColoredLeavesBlock.java @@ -3,7 +3,7 @@ import com.mojang.serialization.*; import com.mojang.serialization.codecs.*; import de.dafuqs.revelationary.api.revelations.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.blocks.flammable.*; import de.dafuqs.spectrum.registries.client.*; import it.unimi.dsi.fastutil.objects.*; @@ -12,7 +12,7 @@ import net.minecraft.world.item.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/conditional/colored_tree/ColoredLightBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/conditional/colored_tree/ColoredLightBlock.java index 20ac2c2a16..5b6b93fc64 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/conditional/colored_tree/ColoredLightBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/conditional/colored_tree/ColoredLightBlock.java @@ -1,13 +1,13 @@ package de.dafuqs.spectrum.blocks.conditional.colored_tree; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import it.unimi.dsi.fastutil.objects.*; import net.minecraft.core.*; import net.minecraft.world.level.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.shapes.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/conditional/colored_tree/ColoredLogBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/conditional/colored_tree/ColoredLogBlock.java index 11307f12f4..9a69a11a5e 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/conditional/colored_tree/ColoredLogBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/conditional/colored_tree/ColoredLogBlock.java @@ -2,27 +2,30 @@ import com.mojang.serialization.*; import de.dafuqs.revelationary.api.revelations.*; -import de.dafuqs.spectrum.api.energy.color.*; -import de.dafuqs.spectrum.blocks.flammable.*; +import de.dafuqs.spectrum.api.ink.color.*; +import de.dafuqs.spectrum.blocks.deeper_down.*; import it.unimi.dsi.fastutil.objects.*; import net.minecraft.core.*; import net.minecraft.resources.*; import net.minecraft.util.*; import net.minecraft.world.item.*; +import net.minecraft.world.item.context.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import net.minecraft.world.level.storage.loot.*; +import net.neoforged.neoforge.common.*; +import org.jspecify.annotations.*; import java.util.*; import java.util.function.*; -public class ColoredLogBlock extends FlammableLogBlock implements RevelationAware, ColoredTree { +public class ColoredLogBlock extends StrippingLootPillarBlock implements RevelationAware, ColoredTree { private static final Map LOGS = new Object2ObjectArrayMap<>(); protected final InkColor color; - public ColoredLogBlock(Properties settings, Supplier strippedBlock, InkColor color) { - super(settings, strippedBlock); + public ColoredLogBlock(Properties settings, Supplier strippedBlock, InkColor color, ResourceKey strippingLootTableKey) { + super(settings, strippedBlock, strippingLootTableKey); this.color = color; LOGS.put(color, this); RevelationAware.register(this); @@ -34,6 +37,19 @@ public ColoredLogBlock(Properties settings, Supplier getBlockStateCloaks() { - return Map.of(this.defaultBlockState(), Blocks.STRIPPED_OAK_WOOD.defaultBlockState()); + Map map = new Hashtable<>(); + for (Direction.Axis axis : RotatedPillarBlock.AXIS.getPossibleValues()) { + map.put(this.defaultBlockState().setValue(RotatedPillarBlock.AXIS, axis), Blocks.STRIPPED_OAK_WOOD.defaultBlockState().setValue(RotatedPillarBlock.AXIS, axis)); + } + return map; } @Override diff --git a/src/main/java/de/dafuqs/spectrum/blocks/conditional/colored_tree/ColoredTree.java b/src/main/java/de/dafuqs/spectrum/blocks/conditional/colored_tree/ColoredTree.java index 3d4af9b87f..cfb454f4a4 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/conditional/colored_tree/ColoredTree.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/conditional/colored_tree/ColoredTree.java @@ -1,6 +1,6 @@ package de.dafuqs.spectrum.blocks.conditional.colored_tree; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.resources.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/conditional/colored_tree/ColoredWoodBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/conditional/colored_tree/ColoredWoodBlock.java index f9f70a094c..bbb4bcf360 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/conditional/colored_tree/ColoredWoodBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/conditional/colored_tree/ColoredWoodBlock.java @@ -2,26 +2,30 @@ import com.mojang.serialization.*; import de.dafuqs.revelationary.api.revelations.*; -import de.dafuqs.spectrum.api.energy.color.*; -import de.dafuqs.spectrum.blocks.flammable.*; +import de.dafuqs.spectrum.api.ink.color.*; +import de.dafuqs.spectrum.blocks.deeper_down.*; import it.unimi.dsi.fastutil.objects.*; +import net.minecraft.core.*; import net.minecraft.resources.*; import net.minecraft.util.*; import net.minecraft.world.item.*; +import net.minecraft.world.item.context.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import net.minecraft.world.level.storage.loot.*; +import net.neoforged.neoforge.common.*; +import org.jspecify.annotations.*; import java.util.*; import java.util.function.*; -public class ColoredWoodBlock extends FlammableLogBlock implements RevelationAware, ColoredTree { +public class ColoredWoodBlock extends StrippingLootPillarBlock implements RevelationAware, ColoredTree { private static final Map WOOD = new Object2ObjectArrayMap<>(); protected final InkColor color; - public ColoredWoodBlock(Properties settings, Supplier strippedBlock, InkColor color) { - super(settings, strippedBlock); + public ColoredWoodBlock(Properties settings, Supplier strippedBlock, InkColor color, ResourceKey strippingLootTableKey) { + super(settings, strippedBlock, strippingLootTableKey); this.color = color; WOOD.put(color, this); RevelationAware.register(this); @@ -33,6 +37,20 @@ public ColoredWoodBlock(Properties settings, Supplier getBlockStateCloaks() { - return Map.of(this.defaultBlockState(), Blocks.OAK_WOOD.defaultBlockState()); + Map map = new Hashtable<>(); + for (Direction.Axis axis : RotatedPillarBlock.AXIS.getPossibleValues()) { + map.put(this.defaultBlockState().setValue(RotatedPillarBlock.AXIS, axis), Blocks.OAK_WOOD.defaultBlockState().setValue(RotatedPillarBlock.AXIS, axis)); + } + return map; } @Override diff --git a/src/main/java/de/dafuqs/spectrum/blocks/conditional/colored_tree/ColoredWoodenButtonBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/conditional/colored_tree/ColoredWoodenButtonBlock.java index ed07b22c16..6c591159f3 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/conditional/colored_tree/ColoredWoodenButtonBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/conditional/colored_tree/ColoredWoodenButtonBlock.java @@ -1,10 +1,10 @@ package de.dafuqs.spectrum.blocks.conditional.colored_tree; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.registries.*; import it.unimi.dsi.fastutil.objects.*; import net.minecraft.world.level.block.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/conditional/colored_tree/PottedColoredSaplingBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/conditional/colored_tree/PottedColoredSaplingBlock.java index 808e3e30f6..11ca42f7e0 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/conditional/colored_tree/PottedColoredSaplingBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/conditional/colored_tree/PottedColoredSaplingBlock.java @@ -1,21 +1,22 @@ package de.dafuqs.spectrum.blocks.conditional.colored_tree; import de.dafuqs.revelationary.api.revelations.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import net.minecraft.resources.*; import net.minecraft.util.*; import net.minecraft.world.item.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; +import java.util.function.*; public class PottedColoredSaplingBlock extends FlowerPotBlock implements RevelationAware, ColoredTree { protected final InkColor color; - public PottedColoredSaplingBlock(Block content, Properties settings, InkColor color) { + public PottedColoredSaplingBlock(ColoredSaplingBlock content, Properties settings, InkColor color) { super(content, settings); this.color = color; RevelationAware.register(this); diff --git a/src/main/java/de/dafuqs/spectrum/blocks/conditional/colored_tree/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/conditional/colored_tree/package-info.java index 683aad6493..38e0e07fb9 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/conditional/colored_tree/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/conditional/colored_tree/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.conditional.colored_tree; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/conditional/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/conditional/package-info.java index 401249af1c..203cb55690 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/conditional/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/conditional/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.conditional; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/conditional/resonant_lily/PottedResonantLilyBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/conditional/resonant_lily/PottedResonantLilyBlock.java index 51510988e7..db8d922e76 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/conditional/resonant_lily/PottedResonantLilyBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/conditional/resonant_lily/PottedResonantLilyBlock.java @@ -6,13 +6,14 @@ import net.minecraft.world.item.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; +import java.util.function.*; public class PottedResonantLilyBlock extends FlowerPotBlock implements RevelationAware { - public PottedResonantLilyBlock(Block content, Properties settings) { + public PottedResonantLilyBlock(ResonantLilyBlock content, Properties settings) { super(content, settings); RevelationAware.register(this); } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/conditional/resonant_lily/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/conditional/resonant_lily/package-info.java index 2fc528032a..eaae70eead 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/conditional/resonant_lily/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/conditional/resonant_lily/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.conditional.resonant_lily; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/crystallarieum/CrystallarieumBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/crystallarieum/CrystallarieumBlockEntity.java deleted file mode 100644 index 976fd46369..0000000000 --- a/src/main/java/de/dafuqs/spectrum/blocks/crystallarieum/CrystallarieumBlockEntity.java +++ /dev/null @@ -1,403 +0,0 @@ -package de.dafuqs.spectrum.blocks.crystallarieum; - -import de.dafuqs.spectrum.api.block.*; -import de.dafuqs.spectrum.api.energy.*; -import de.dafuqs.spectrum.api.energy.storage.*; -import de.dafuqs.spectrum.api.fluid.*; -import de.dafuqs.spectrum.blocks.*; -import de.dafuqs.spectrum.components.*; -import de.dafuqs.spectrum.helpers.*; -import de.dafuqs.spectrum.particle.effect.*; -import de.dafuqs.spectrum.progression.*; -import de.dafuqs.spectrum.recipe.crystallarieum.*; -import de.dafuqs.spectrum.registries.*; -import de.dafuqs.spectrum.render.animation.*; -import net.minecraft.core.*; -import net.minecraft.core.particles.*; -import net.minecraft.nbt.*; -import net.minecraft.server.level.*; -import net.minecraft.sounds.*; -import net.minecraft.world.entity.item.*; -import net.minecraft.world.entity.player.*; -import net.minecraft.world.item.*; -import net.minecraft.world.item.crafting.*; -import net.minecraft.world.level.*; -import net.minecraft.world.level.block.state.*; -import net.neoforged.neoforge.fluids.capability.templates.*; -import org.jspecify.annotations.Nullable; - -import java.util.*; - -public class CrystallarieumBlockEntity extends InWorldInteractionBlockEntity implements PlayerOwned, InkStorageBlockEntity, SpectrumFluidTank.Callback { - - private final static FlowAnimator.Factory FACTORY; - - protected final static int CATALYST_SLOT_ID = 0; - protected final static int INK_STORAGE_STACK_SLOT_ID = 1; - protected final static int INVENTORY_SIZE = 2; - - public static final long INK_STORAGE_SIZE = 64 * 64 * 100; - - protected IndividualCappedInkStorage inkStorage; - protected boolean inkDirty; - - @Nullable - protected UUID ownerUUID; - - @Nullable - protected RecipeHolder currentRecipe; - protected CrystallarieumCatalyst currentCatalyst = CrystallarieumCatalyst.EMPTY; - protected FluidTank tank = new SpectrumFluidTank(1000, this); - - // for performance reasons, the crystallarieum only processes recipe logic every 20 ticks - public static final int SECOND = 20; - protected TickLooper tickLooper = new TickLooper(SECOND); - - protected int currentGrowthStageTicks; - protected boolean canWork; - float rotation = 0F; - - protected @Nullable FlowAnimator animator; - protected FlowData _alpha = FlowData.NULL(), _speed = FlowData.NULL(), _bounce = FlowData.NULL(); - - public CrystallarieumBlockEntity(BlockPos pos, BlockState state) { - super(SpectrumBlockEntities.CRYSTALLARIEUM.get(), pos, state, INVENTORY_SIZE); - this.inkStorage = new IndividualCappedInkStorage(INK_STORAGE_SIZE); - this.canWork = true; - } - - @SuppressWarnings("unused") - public static void clientTick(Level world, BlockPos blockPos, BlockState blockState, CrystallarieumBlockEntity crystallarieum) { - if (crystallarieum.animator == null) { - crystallarieum.animator = FACTORY.create(FlowStates.INIT, crystallarieum); - } else { - crystallarieum.updateAnimator(); - } - - if (crystallarieum.canWork && crystallarieum.currentRecipe != null) { - ParticleOptions particleEffect = ColoredSparkleRisingParticleEffect.of(crystallarieum.currentRecipe.value().getInkColor().getColorInt()); - - int amount = 1 + crystallarieum.currentRecipe.value().getInkPerSecond(); - if (Support.getIntFromDecimalWithChance(amount / 80.0, world.getRandom()) > 0) { - double randomX = world.getRandom().nextDouble() * 0.8; - double randomZ = world.getRandom().nextDouble() * 0.8; - world.addAlwaysVisibleParticle(particleEffect, blockPos.getX() + 0.1 + randomX, blockPos.getY() + 1, blockPos.getZ() + 0.1 + randomZ, 0.0D, 0.03D, 0.0D); - } - } - } - - public void updateAnimator() { - if (currentRecipe == null) { - animator.swapState(FlowStates.INACTIVE); - } else { - if (currentRecipe.value().getFluidIngredient().test(tank.getFluid()) && inkStorage.getEnergy(currentRecipe.value().getInkColor()) > 0) { - animator.swapState(FlowStates.ACTIVE); - } else { - animator.swapState(FlowStates.IDLE); - } - } - - animator.tick(); - } - - @SuppressWarnings("unused") - public static void serverTick(Level world, BlockPos blockPos, BlockState blockState, CrystallarieumBlockEntity crystallarieum) { - if (crystallarieum.canWork) { - transferInk(crystallarieum); - - var recipe = crystallarieum.currentRecipe; - if (recipe != null) { - crystallarieum.tickLooper.tick(); - if (crystallarieum.tickLooper.reachedCap()) { - tickRecipe(world, blockPos, crystallarieum, recipe); - crystallarieum.tickLooper.reset(); - } - } - } - } - - /** - * Progress the recipe - * gets called 1/second - */ - private static void tickRecipe(Level world, BlockPos blockPos, CrystallarieumBlockEntity crystallarieum, RecipeHolder recipe) { - if (crystallarieum.currentCatalyst == CrystallarieumCatalyst.EMPTY && !recipe.value().growsWithoutCatalyst()) { - return; - } - - if (crystallarieum.canWork && (!recipe.value().getFluidIngredient().test(crystallarieum.tank.getFluid()) || crystallarieum.inkStorage.getEnergy(recipe.value().getInkColor()) == 0)) { - crystallarieum.canWork = false; - return; - } - - // advance growing - float consumedInkFloat = (recipe.value().getInkPerSecond() * crystallarieum.currentCatalyst.growthAccelerationMod() * crystallarieum.currentCatalyst.inkConsumptionMod()); - int consumedInt = Support.getIntFromDecimalWithChance(consumedInkFloat, world.getRandom()); - if (crystallarieum.inkStorage.drainEnergy(recipe.value().getInkColor(), consumedInt) < consumedInt) { - crystallarieum.canWork = false; - crystallarieum.setInkDirty(); - crystallarieum.updateInClientWorld(); - return; - } - - crystallarieum.setInkDirty(); - crystallarieum.currentGrowthStageTicks += (int) (SECOND * crystallarieum.currentCatalyst.growthAccelerationMod()); - - // check if a catalyst should get used up - if (world.getRandom().nextFloat() < crystallarieum.currentCatalyst.consumeChancePerSecond()) { - ItemStack catalystStack = crystallarieum.getItem(CATALYST_SLOT_ID); - catalystStack.shrink(1); - crystallarieum.updateInClientWorld(); - if (catalystStack.isEmpty()) { - crystallarieum.currentCatalyst = CrystallarieumCatalyst.EMPTY; - if (!recipe.value().growsWithoutCatalyst()) { - crystallarieum.canWork = false; - } - } - } - - // advanced enough? grow! - if (crystallarieum.currentGrowthStageTicks >= recipe.value().getSecondsPerGrowthStage() * SECOND) { - BlockPos topPos = blockPos.above(); - BlockState topState = world.getBlockState(topPos); - Optional nextState = recipe.value().getNextState(recipe, topState); - if (nextState.isPresent()) { - world.setBlockAndUpdate(topPos, nextState.get()); - ServerPlayer owner = (ServerPlayer) crystallarieum.getOwnerIfOnline(world); - if (owner != null) { - SpectrumAdvancementCriteria.CRYSTALLARIEUM_GROWING.trigger(owner, (ServerLevel) world, topPos, crystallarieum.getItem(CATALYST_SLOT_ID)); - } - } else { - crystallarieum.canWork = false; - } - crystallarieum.currentGrowthStageTicks = 0; - } - } - - private static void transferInk(CrystallarieumBlockEntity crystallarieum) { - ItemStack inkStorageStack = crystallarieum.getItem(INK_STORAGE_STACK_SLOT_ID); - if (inkStorageStack.getItem() instanceof InkStorageItem inkStorageItem) { - InkStorage itemInkStorage = inkStorageItem.getEnergyStorage(inkStorageStack); - long transferredAmount = InkStorage.transferInk(itemInkStorage, crystallarieum.inkStorage); - if (transferredAmount > 0) { - inkStorageItem.setEnergyStorage(inkStorageStack, itemInkStorage); - } - } - } - - @Override - public void inventoryChanged() { - if (this.currentRecipe == null || level == null) { - this.currentCatalyst = CrystallarieumCatalyst.EMPTY; - this.canWork = false; - } else { - this.currentCatalyst = this.currentRecipe.value().getCatalyst(getItem(CATALYST_SLOT_ID)); - BlockState topState = this.level.getBlockState(this.worldPosition.above()); - this.canWork = this.currentRecipe.value().getNextState(this.currentRecipe, topState).isPresent() - && (this.currentRecipe.value().growsWithoutCatalyst() || this.currentCatalyst != CrystallarieumCatalyst.EMPTY); - } - super.inventoryChanged(); - } - - @Override - public void loadAdditional(CompoundTag nbt, HolderLookup.Provider registryLookup) { - super.loadAdditional(nbt, registryLookup); - - CodecHelper.fromNbt(InkStorageComponent.CODEC, nbt.get("InkStorage")).ifPresent(storage -> - this.inkStorage = new IndividualCappedInkStorage(storage.maxPerColor(), storage.storedEnergy())); - if (nbt.contains("Looper", Tag.TAG_COMPOUND)) { - this.tickLooper = TickLooper.fromNbt(nbt.getCompound("Looper")); - } - - this.tank.readFromNBT(registryLookup, nbt); - this.canWork = nbt.getBoolean("CanWork"); - this.ownerUUID = PlayerOwnedWithName.readOwnerUUID(nbt); - this.currentCatalyst = CrystallarieumCatalyst.EMPTY; - this.currentRecipe = MultiblockCrafter.getRecipeHolderFromNbt(level, nbt, CrystallarieumRecipe.class); - this.currentGrowthStageTicks = nbt.getInt("CurrentGrowthStageDuration"); - if (this.currentRecipe != null) { - this.currentCatalyst = this.currentRecipe.value().getCatalyst(getItem(CATALYST_SLOT_ID)); - } - } - - @Override - public void saveAdditional(CompoundTag nbt, HolderLookup.Provider registryLookup) { - super.saveAdditional(nbt, registryLookup); - - CodecHelper.writeNbt(nbt, "InkStorage", InkStorageComponent.CODEC, new InkStorageComponent(this.inkStorage)); - nbt.put("Looper", this.tickLooper.toNbt()); - - this.tank.writeToNBT(registryLookup, nbt); - nbt.putBoolean("CanWork", this.canWork); - nbt.putInt("CurrentGrowthStageDuration", this.currentGrowthStageTicks); - PlayerOwned.writeOwnerUUID(nbt, this.ownerUUID); - if (this.currentRecipe != null) { - nbt.putString("CurrentRecipe", this.currentRecipe.id().toString()); - } - } - - @Override - public @Nullable UUID getOwnerUUID() { - return this.ownerUUID; - } - - @Override - public void setOwner(Player playerEntity) { - this.ownerUUID = playerEntity.getUUID(); - setChanged(); - } - - /** - * Searches recipes for a valid one using fluidStack and plants the first block of that recipe on top - * - * @param itemStack stack that is tried to plant on top, if a valid recipe - */ - public void acceptStack(ItemStack itemStack, boolean creative, @Nullable UUID player) { - boolean changed = false; - - if (level == null) return; - if (itemStack.getItem() instanceof InkStorageItem inkStorageItem && inkStorageItem.getDrainability().canDrain(false)) { - ItemStack currentInkStorageStack = getItem(INK_STORAGE_STACK_SLOT_ID); - if (currentInkStorageStack.isEmpty()) { - setItem(INK_STORAGE_STACK_SLOT_ID, itemStack.copy()); - if (!creative) { - itemStack.setCount(0); - } - changed = true; - } - } else if (level.getBlockState(worldPosition.above()).isAir()) { - var recipe = level.getRecipeManager().getRecipeFor(SpectrumRecipeTypes.CRYSTALLARIEUM, new SingleRecipeInput(itemStack), level); - if (recipe.isPresent()) { - if (!creative) { - itemStack.shrink(1); - } - BlockState placedState = recipe.get().value().getGrowthStages().getFirst(); - level.setBlockAndUpdate(worldPosition.above(), placedState); - onTopBlockChange(placedState, recipe.get()); - changed = true; - } - } else if (this.currentRecipe != null) { - ItemStack currentCatalystStack = getItem(CATALYST_SLOT_ID); - if (currentCatalystStack.isEmpty()) { - CrystallarieumCatalyst catalyst = this.currentRecipe.value().getCatalyst(itemStack); - if (catalyst != CrystallarieumCatalyst.EMPTY) { - setItem(CATALYST_SLOT_ID, itemStack.copy()); - if (!creative) { - itemStack.setCount(0); - } - this.currentCatalyst = catalyst; - changed = true; - } - } else if (ItemStack.isSameItemSameComponents(currentCatalystStack, itemStack)) { - InventoryHelper.combineStacks(currentCatalystStack, itemStack); - changed = true; - } - } - - if (changed) { - level.playSound(null, worldPosition, SoundEvents.ITEM_PICKUP, SoundSource.BLOCKS, 0.8F, 0.8F + level.getRandom().nextFloat() * 0.6F); - if (player != null) { - this.ownerUUID = player; - } - inventoryChanged(); - } - } - - public FluidTank getFluidTank() { - return tank; - } - - /** - * Triggered when the block on top of the crystallarieum has changed - * Sets the new recipe matching that block state - * - * @param newState the new block state on top - * @param recipe optionally the matching CrystallarieumRecipe. If null is passed it will be calculated - */ - public void onTopBlockChange(BlockState newState, @Nullable RecipeHolder recipe) { - if (level == null) return; - if (newState.isAir()) { // fast fail - this.currentRecipe = null; - this.canWork = false; - setChanged(); - updateInClientWorld(); - } else { - this.currentRecipe = recipe == null ? CrystallarieumRecipe.getRecipeForState(level, newState) : recipe; - if (this.currentRecipe != null) { - ItemStack catalystStack = getItem(CATALYST_SLOT_ID); - if (!catalystStack.isEmpty()) { - this.currentCatalyst = this.currentRecipe.value().getCatalyst(catalystStack); - if (this.currentCatalyst == CrystallarieumCatalyst.EMPTY) { - ItemEntity itemEntity = new ItemEntity(level, this.getBlockPos().getX() + 0.5, this.getBlockPos().getY() + 1, this.getBlockPos().getZ() + 0.5, catalystStack); - this.setItem(CATALYST_SLOT_ID, ItemStack.EMPTY); - level.addFreshEntity(itemEntity); - } - } - } - - inventoryChanged(); - } - } - - @Override - public IndividualCappedInkStorage getEnergyStorage() { - return this.inkStorage; - } - - @Override - public void setInkDirty() { - this.inkDirty = true; - } - - @Override - public boolean getInkDirty() { - return this.inkDirty; - } - - @Override - public boolean canPlaceItem(int slot, ItemStack stack) { - if (slot == INK_STORAGE_STACK_SLOT_ID) { - return stack.getItem() instanceof InkStorageItem; - } else if (this.currentRecipe != null) { - return this.currentRecipe.value().getCatalyst(stack) != CrystallarieumCatalyst.EMPTY; - } - return false; - } - - static { - var builder = new FlowAnimator.Builder<>(CrystallarieumBlockEntity.class); - - builder.stateInfo(FlowStates.INACTIVE, 30); - builder.stateInfo(FlowStates.ACTIVE, 15); - builder.stateInfo(FlowStates.IDLE, 13); - - builder.handle("alpha", FlowHandlers.FLOAT) - .initial(0.1F) - .forStates(0.1F, FlowStates.INACTIVE) - .forStates(0.4F, FlowStates.IDLE) - .forStates(0.8F, FlowStates.ACTIVE) - .push(); - - builder.handle("speed", FlowHandlers.FLOAT) - .initial(0F) - .forStates(-0.5F, FlowStates.INACTIVE) - .forStates(1F, FlowStates.IDLE) - .forStates(2.5F, FlowStates.ACTIVE) - .push(); - - builder.handle("bounce", FlowHandlers.FLOAT) - .initial(0F) - .forStates(2F, FlowStates.INACTIVE) - .forStates(1F, FlowStates.IDLE) - .forStates(4F, FlowStates.ACTIVE) - .push(); - - FACTORY = builder.build(); - } - - @Override - public void onFluidContentsChanged() { - this.inventoryChanged(); - } - -} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/crystallarieum/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/crystallarieum/package-info.java deleted file mode 100644 index d33b9293b3..0000000000 --- a/src/main/java/de/dafuqs/spectrum/blocks/crystallarieum/package-info.java +++ /dev/null @@ -1,8 +0,0 @@ -@NullMarked -@MethodsReturnNonnullByDefault -@FieldsAreNonnullByDefault -package de.dafuqs.spectrum.blocks.crystallarieum; - -import net.minecraft.FieldsAreNonnullByDefault; -import net.minecraft.MethodsReturnNonnullByDefault; -import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/decay/DecayAwayBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/decay/DecayAwayBlock.java index 0d254f1bc3..1300d34d52 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/decay/DecayAwayBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/decay/DecayAwayBlock.java @@ -13,7 +13,7 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.block.state.properties.*; import net.minecraft.world.level.dimension.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class DecayAwayBlock extends Block { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/decay/DecayBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/decay/DecayBlock.java index 74b8aa02fb..6216d5dc76 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/decay/DecayBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/decay/DecayBlock.java @@ -19,7 +19,7 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.block.state.properties.*; import net.minecraft.world.ticks.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/decay/FadingBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/decay/FadingBlock.java index 3f21a2b918..d823d89da1 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/decay/FadingBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/decay/FadingBlock.java @@ -1,7 +1,6 @@ package de.dafuqs.spectrum.blocks.decay; import com.mojang.serialization.*; -import de.dafuqs.spectrum.*; import de.dafuqs.spectrum.config.*; import de.dafuqs.spectrum.particle.effect.*; import de.dafuqs.spectrum.registries.*; @@ -14,7 +13,7 @@ import net.minecraft.world.item.*; import net.minecraft.world.level.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class FadingBlock extends DecayBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/decay/FailingBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/decay/FailingBlock.java index cdb9393b8e..03384b2191 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/decay/FailingBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/decay/FailingBlock.java @@ -1,7 +1,6 @@ package de.dafuqs.spectrum.blocks.decay; import com.mojang.serialization.*; -import de.dafuqs.spectrum.*; import de.dafuqs.spectrum.config.*; import de.dafuqs.spectrum.particle.effect.*; import de.dafuqs.spectrum.registries.*; @@ -16,7 +15,7 @@ import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.block.state.properties.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class FailingBlock extends DecayBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/decay/ForfeitureBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/decay/ForfeitureBlock.java index a46876c35c..394534b7d5 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/decay/ForfeitureBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/decay/ForfeitureBlock.java @@ -1,7 +1,6 @@ package de.dafuqs.spectrum.blocks.decay; import com.mojang.serialization.*; -import de.dafuqs.spectrum.*; import de.dafuqs.spectrum.config.*; import de.dafuqs.spectrum.particle.effect.*; import de.dafuqs.spectrum.registries.*; @@ -14,7 +13,7 @@ import net.minecraft.world.item.*; import net.minecraft.world.level.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class ForfeitureBlock extends DecayBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/decay/RuinBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/decay/RuinBlock.java index 16d571fc40..624cd8f28c 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/decay/RuinBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/decay/RuinBlock.java @@ -17,9 +17,7 @@ import net.minecraft.world.item.*; import net.minecraft.world.level.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; - -import java.util.*; +import org.jspecify.annotations.*; public class RuinBlock extends DecayBlock { @@ -60,6 +58,9 @@ public void setPlacedBy(Level world, BlockPos pos, BlockState state, @Nullable L if (SpectrumDimensionTags.is(world, SpectrumDimensionTags.RUIN_SAFE)) { return null; } + if(world.dimension() == Level.OVERWORLD && stateToSpreadToPos.getY() == world.getMinBuildHeight() && SpectrumConfig.CONFIG.DimensionPortals.get() == SpectrumConfig.DimensionPortalSetting.PROTECT_LOWEST_OVERWORLD_LEVEL) { + return null; + } if (stateToSpreadTo.is(SpectrumBlockTags.RUIN_SPECIAL_CONVERSIONS)) { return this.defaultBlockState().setValue(CONVERSION, Conversion.SPECIAL); @@ -84,6 +85,10 @@ public BlockState playerWillDestroy(Level level, BlockPos pos, BlockState state, @Override protected void spawnAfterBreak(BlockState state, ServerLevel level, BlockPos pos, ItemStack stack, boolean dropExperience) { + if(SpectrumConfig.CONFIG.DimensionPortals.get() == SpectrumConfig.DimensionPortalSetting.NO_PORTALS) { + return; + } + BlockState portalBlock = shouldCreatePortalFacingUp(level, pos, state); if (portalBlock != null) { level.setBlockAndUpdate(pos, portalBlock); @@ -91,6 +96,10 @@ protected void spawnAfterBreak(BlockState state, ServerLevel level, BlockPos pos } protected @Nullable BlockState shouldCreatePortalFacingUp(Level level, BlockPos pos, BlockState state) { + if(SpectrumConfig.CONFIG.DimensionPortals.get() == SpectrumConfig.DimensionPortalSetting.NO_PORTALS) { + return null; + } + DecayBlock.Conversion conversion = state.getValue(RuinBlock.CONVERSION); if (level.dimension() == Level.NETHER) { if (pos.getY() == level.getMinBuildHeight() + level.dimensionType().logicalHeight() - 1) { // Attempt to match the nether ceiling. Tricky... diff --git a/src/main/java/de/dafuqs/spectrum/blocks/decay/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/decay/package-info.java index 5ae5128204..0d17e7fc25 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/decay/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/decay/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.decay; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/decoration/AlternatePlayerOnlyGlassBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/decoration/AlternatePlayerOnlyGlassBlock.java deleted file mode 100644 index d12513ad2e..0000000000 --- a/src/main/java/de/dafuqs/spectrum/blocks/decoration/AlternatePlayerOnlyGlassBlock.java +++ /dev/null @@ -1,77 +0,0 @@ -package de.dafuqs.spectrum.blocks.decoration; - -import com.mojang.serialization.*; -import net.minecraft.core.*; -import net.minecraft.world.entity.*; -import net.minecraft.world.entity.player.*; -import net.minecraft.world.level.*; -import net.minecraft.world.level.block.*; -import net.minecraft.world.level.block.state.*; -import net.minecraft.world.level.pathfinder.*; -import net.minecraft.world.phys.shapes.*; -import org.jspecify.annotations.Nullable; - -public class AlternatePlayerOnlyGlassBlock extends TransparentBlock { - - private final Block alternateBlock; - - // used for tinted glass to make light not shine through - private final boolean tinted; - - public AlternatePlayerOnlyGlassBlock(BlockBehaviour.Properties settings, Block block, boolean tinted) { - super(settings); - this.alternateBlock = block; - this.tinted = tinted; - } - - @Override - public @Nullable MapCodec codec() { - //TODO: Make the codec - return null; - } - - @Override - public boolean isPathfindable(BlockState state, PathComputationType type) { - return false; - } - - @Override - @Deprecated - public VoxelShape getCollisionShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { - if (context instanceof EntityCollisionContext entityShapeContext) { - Entity entity = entityShapeContext.getEntity(); - if (entity instanceof Player) { - return Shapes.empty(); - } - } - return state.getShape(world, pos); - } - - @Override - public boolean propagatesSkylightDown(BlockState state, BlockGetter world, BlockPos pos) { - return !tinted; - } - - @Override - public int getLightBlock(BlockState state, BlockGetter world, BlockPos pos) { - if (tinted) { - return world.getMaxLightLevel(); - } else { - return super.getLightBlock(state, world, pos); - } - } - - @Override - public boolean skipRendering(BlockState state, BlockState stateFrom, Direction direction) { - if (stateFrom.is(this) || stateFrom.getBlock() == alternateBlock) { - return true; - } - - return super.skipRendering(state, stateFrom, direction); - } - - public Block getAlternateBlock() { - return this.alternateBlock; - } - -} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/decoration/CloverBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/decoration/CloverBlock.java index 2ebf3235c8..9476c3d35f 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/decoration/CloverBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/decoration/CloverBlock.java @@ -10,7 +10,6 @@ import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.shapes.*; -import javax.annotation.*; public class CloverBlock extends BushBlock implements BonemealableBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/decoration/CushionedCarpetBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/decoration/CushionedCarpetBlock.java index fe9f5f4b96..5b4dedf754 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/decoration/CushionedCarpetBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/decoration/CushionedCarpetBlock.java @@ -5,7 +5,6 @@ import net.minecraft.core.*; import net.minecraft.world.entity.*; import net.minecraft.world.level.*; -import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; public class CushionedCarpetBlock extends FlammableCarpetBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/decoration/CushionedDirectionalBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/decoration/CushionedDirectionalBlock.java new file mode 100644 index 0000000000..e0d4965f38 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/blocks/decoration/CushionedDirectionalBlock.java @@ -0,0 +1,25 @@ +package de.dafuqs.spectrum.blocks.decoration; + +import com.mojang.serialization.*; +import net.minecraft.core.*; +import net.minecraft.world.entity.*; +import net.minecraft.world.level.*; +import net.minecraft.world.level.block.state.*; + +public class CushionedDirectionalBlock extends SpectrumDirectionalBlock { + + public static final MapCodec CODEC = simpleCodec(CushionedDirectionalBlock::new); + + public CushionedDirectionalBlock(Properties settings) { + super(settings); + } + + @Override + public MapCodec codec() { + return CODEC; + } + + @Override + public void fallOn(Level world, BlockState state, BlockPos pos, Entity entity, float fallDistance) { + } +} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/decoration/CushionedFacingBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/decoration/CushionedFacingBlock.java deleted file mode 100644 index bb66a6edb1..0000000000 --- a/src/main/java/de/dafuqs/spectrum/blocks/decoration/CushionedFacingBlock.java +++ /dev/null @@ -1,25 +0,0 @@ -package de.dafuqs.spectrum.blocks.decoration; - -import com.mojang.serialization.*; -import net.minecraft.core.*; -import net.minecraft.world.entity.*; -import net.minecraft.world.level.*; -import net.minecraft.world.level.block.state.*; - -public class CushionedFacingBlock extends SpectrumFacingBlock { - - public static final MapCodec CODEC = simpleCodec(CushionedFacingBlock::new); - - public CushionedFacingBlock(Properties settings) { - super(settings); - } - - @Override - public MapCodec codec() { - return CODEC; - } - - @Override - public void fallOn(Level world, BlockState state, BlockPos pos, Entity entity, float fallDistance) { - } -} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/decoration/DecoStoneBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/decoration/DecoStoneBlock.java index 83c124f474..7d70baea67 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/decoration/DecoStoneBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/decoration/DecoStoneBlock.java @@ -13,7 +13,7 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.block.state.properties.*; import net.minecraft.world.phys.shapes.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class DecoStoneBlock extends Block { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/decoration/DiagonalBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/decoration/DiagonalBlock.java index aba8fa64eb..9614f7bc14 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/decoration/DiagonalBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/decoration/DiagonalBlock.java @@ -5,7 +5,7 @@ import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.block.state.properties.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class DiagonalBlock extends Block { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/decoration/EtherealPlatformBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/decoration/EtherealPlatformBlock.java index 2789fb20b8..7c6955bb30 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/decoration/EtherealPlatformBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/decoration/EtherealPlatformBlock.java @@ -2,8 +2,6 @@ import com.mojang.serialization.*; import de.dafuqs.spectrum.particle.*; -import de.dafuqs.spectrum.registries.*; -import net.minecraft.client.*; import net.minecraft.core.*; import net.minecraft.server.level.*; import net.minecraft.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/decoration/FlexLanternBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/decoration/FlexLanternBlock.java index 5341f6532f..e52c4f4ab7 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/decoration/FlexLanternBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/decoration/FlexLanternBlock.java @@ -9,7 +9,7 @@ import net.minecraft.world.level.block.state.properties.*; import net.minecraft.world.level.material.*; import net.minecraft.world.phys.shapes.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class FlexLanternBlock extends DiagonalBlock implements SimpleWaterloggedBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/decoration/GemstoneChimeBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/decoration/GemstoneChimeBlock.java index 182df8e621..db0608fc11 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/decoration/GemstoneChimeBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/decoration/GemstoneChimeBlock.java @@ -10,7 +10,7 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.pathfinder.*; import net.minecraft.world.phys.shapes.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class GemstoneChimeBlock extends Block { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/decoration/GemstoneGlassBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/decoration/GemstoneGlassBlock.java index 628ce0a4cf..9888cea26c 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/decoration/GemstoneGlassBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/decoration/GemstoneGlassBlock.java @@ -8,7 +8,7 @@ import net.minecraft.world.level.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class GemstoneGlassBlock extends TransparentBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/decoration/GemstonePlayerOnlyGlassBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/decoration/GemstonePlayerOnlyGlassBlock.java deleted file mode 100644 index e926c7602b..0000000000 --- a/src/main/java/de/dafuqs/spectrum/blocks/decoration/GemstonePlayerOnlyGlassBlock.java +++ /dev/null @@ -1,49 +0,0 @@ -package de.dafuqs.spectrum.blocks.decoration; - -import com.mojang.serialization.*; -import com.mojang.serialization.codecs.*; -import de.dafuqs.spectrum.api.item.*; -import de.dafuqs.spectrum.registries.*; -import net.minecraft.core.*; -import net.minecraft.world.entity.*; -import net.minecraft.world.entity.player.*; -import net.minecraft.world.level.*; -import net.minecraft.world.level.block.state.*; -import net.minecraft.world.level.pathfinder.*; -import net.minecraft.world.phys.shapes.*; - -public class GemstonePlayerOnlyGlassBlock extends GemstoneGlassBlock { - - public final MapCodec codec; - - public GemstonePlayerOnlyGlassBlock(Properties settings, GemstoneColor gemstoneColor) { - super(settings, gemstoneColor); - this.codec = RecordCodecBuilder.mapCodec(i -> i.group( - propertiesCodec(), - SpectrumRegistries.GEMSTONE_COLOR.byNameCodec().fieldOf("color").forGetter(b -> b.gemstoneColor) - ).apply(i, GemstonePlayerOnlyGlassBlock::new)); - } - - @Override - public MapCodec codec() { - return codec; - } - - @Override - public boolean isPathfindable(BlockState state, PathComputationType type) { - return false; - } - - @Override - @Deprecated - public VoxelShape getCollisionShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { - if (context instanceof EntityCollisionContext entityShapeContext) { - Entity entity = entityShapeContext.getEntity(); - if (entity instanceof Player) { - return Shapes.empty(); - } - } - return state.getShape(world, pos); - } - -} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/decoration/GlowBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/decoration/GlowBlock.java index 6dea23db2d..71e6b9f319 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/decoration/GlowBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/decoration/GlowBlock.java @@ -2,13 +2,13 @@ import com.mojang.serialization.*; import com.mojang.serialization.codecs.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import it.unimi.dsi.fastutil.objects.*; import net.minecraft.core.*; import net.minecraft.world.level.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/decoration/PersistentLightBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/decoration/PersistentLightBlock.java index 5637a06614..136da265a2 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/decoration/PersistentLightBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/decoration/PersistentLightBlock.java @@ -1,6 +1,5 @@ package de.dafuqs.spectrum.blocks.decoration; -import de.dafuqs.spectrum.*; import de.dafuqs.spectrum.config.*; import de.dafuqs.spectrum.items.magic_items.*; import de.dafuqs.spectrum.particle.*; @@ -18,7 +17,6 @@ import net.minecraft.world.phys.*; import net.minecraft.world.phys.shapes.*; import net.neoforged.api.distmarker.*; -import javax.annotation.*; public class PersistentLightBlock extends LightBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/decoration/PigmentBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/decoration/PigmentBlock.java index e6f4c844d1..e255670d1b 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/decoration/PigmentBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/decoration/PigmentBlock.java @@ -2,10 +2,10 @@ import com.mojang.serialization.*; import com.mojang.serialization.codecs.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import it.unimi.dsi.fastutil.objects.*; import net.minecraft.world.level.block.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/decoration/ProjectorBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/decoration/ProjectorBlock.java index 6e92882ff8..7f57fbbf3f 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/decoration/ProjectorBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/decoration/ProjectorBlock.java @@ -10,7 +10,7 @@ import net.minecraft.world.level.block.entity.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.shapes.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class ProjectorBlock extends Block implements EntityBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/decoration/PylonBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/decoration/PylonBlock.java index 2d5412555f..01543794a8 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/decoration/PylonBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/decoration/PylonBlock.java @@ -11,7 +11,7 @@ import net.minecraft.world.level.block.state.properties.*; import net.minecraft.world.level.material.*; import net.minecraft.world.phys.shapes.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/decoration/SemiPermeableGemstoneGlassBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/decoration/SemiPermeableGemstoneGlassBlock.java new file mode 100644 index 0000000000..7fbf999d6d --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/blocks/decoration/SemiPermeableGemstoneGlassBlock.java @@ -0,0 +1,41 @@ +package de.dafuqs.spectrum.blocks.decoration; + +import com.mojang.serialization.*; +import com.mojang.serialization.codecs.*; +import de.dafuqs.spectrum.api.item.*; +import de.dafuqs.spectrum.registries.*; +import net.minecraft.core.*; +import net.minecraft.world.level.*; +import net.minecraft.world.level.block.state.*; +import net.minecraft.world.level.pathfinder.*; +import net.minecraft.world.phys.shapes.*; + +public class SemiPermeableGemstoneGlassBlock extends GemstoneGlassBlock { + + public final MapCodec codec; + + public SemiPermeableGemstoneGlassBlock(Properties settings, GemstoneColor gemstoneColor) { + super(settings, gemstoneColor); + this.codec = RecordCodecBuilder.mapCodec(i -> i.group( + propertiesCodec(), + SpectrumRegistries.GEMSTONE_COLOR.byNameCodec().fieldOf("color").forGetter(b -> b.gemstoneColor) + ).apply(i, SemiPermeableGemstoneGlassBlock::new)); + } + + @Override + public MapCodec codec() { + return codec; + } + + @Override + public boolean isPathfindable(BlockState state, PathComputationType type) { + return false; + } + + @Override + @Deprecated + public VoxelShape getCollisionShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { + return SemiPermeableGlassBlock.isPlayerOrPlayerRiderCollision(context) ? Shapes.empty() : state.getShape(world, pos); + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/decoration/SemiPermeableGlassBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/decoration/SemiPermeableGlassBlock.java new file mode 100644 index 0000000000..7a20f8e2c6 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/blocks/decoration/SemiPermeableGlassBlock.java @@ -0,0 +1,75 @@ +package de.dafuqs.spectrum.blocks.decoration; + +import com.mojang.serialization.*; +import net.minecraft.core.*; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.player.*; +import net.minecraft.world.level.*; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.state.*; +import net.minecraft.world.level.pathfinder.*; +import net.minecraft.world.phys.shapes.*; +import org.jspecify.annotations.*; + +public class SemiPermeableGlassBlock extends TransparentBlock { + + private final Block alternateBlock; + + // used for tinted glass to make light not shine through + private final boolean tinted; + + public SemiPermeableGlassBlock(BlockBehaviour.Properties settings, Block block, boolean tinted) { + super(settings); + this.alternateBlock = block; + this.tinted = tinted; + } + + @Override + public @Nullable MapCodec codec() { + //TODO: Make the codec + return null; + } + + @Override + public boolean isPathfindable(BlockState state, PathComputationType type) { + return false; + } + + @Override + @Deprecated + public VoxelShape getCollisionShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { + return isPlayerOrPlayerRiderCollision(context) ? Shapes.empty() : state.getShape(world, pos); + } + + public static boolean isPlayerOrPlayerRiderCollision(CollisionContext context) { + if (context instanceof EntityCollisionContext entityShapeContext) { + Entity entity = entityShapeContext.getEntity(); + return entity != null && (entity instanceof Player || entity.getFirstPassenger() instanceof Player); + } + return false; + } + + @Override + public boolean propagatesSkylightDown(BlockState state, BlockGetter world, BlockPos pos) { + return !tinted; + } + + @Override + public int getLightBlock(BlockState state, BlockGetter world, BlockPos pos) { + if (tinted) { + return world.getMaxLightLevel(); + } else { + return super.getLightBlock(state, world, pos); + } + } + + @Override + public boolean skipRendering(BlockState state, BlockState stateFrom, Direction direction) { + if (stateFrom.is(this) || stateFrom.getBlock() == alternateBlock) { + return true; + } + + return super.skipRendering(state, stateFrom, direction); + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/decoration/ShimmerstoneLightBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/decoration/ShimmerstoneLightBlock.java index 2fe16f0f09..e86dbb0a11 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/decoration/ShimmerstoneLightBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/decoration/ShimmerstoneLightBlock.java @@ -11,7 +11,7 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.block.state.properties.*; import net.minecraft.world.phys.shapes.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class ShimmerstoneLightBlock extends DirectionalBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/decoration/SpectrumBedBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/decoration/SpectrumBedBlock.java index 6cd0bf7cfa..75174ac885 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/decoration/SpectrumBedBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/decoration/SpectrumBedBlock.java @@ -7,7 +7,7 @@ import net.minecraft.world.level.block.entity.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.shapes.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class SpectrumBedBlock extends BedBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/decoration/SpectrumCounterDirectionalPlacedBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/decoration/SpectrumCounterDirectionalPlacedBlock.java new file mode 100644 index 0000000000..51cd568421 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/blocks/decoration/SpectrumCounterDirectionalPlacedBlock.java @@ -0,0 +1,27 @@ +package de.dafuqs.spectrum.blocks.decoration; + +import com.mojang.serialization.*; +import net.minecraft.core.*; +import net.minecraft.world.item.context.*; +import net.minecraft.world.level.block.state.*; + +public class SpectrumCounterDirectionalPlacedBlock extends SpectrumDirectionalBlock { + + public static final MapCodec CODEC = simpleCodec(SpectrumCounterDirectionalPlacedBlock::new); + + public SpectrumCounterDirectionalPlacedBlock(Properties properties) { + super(properties); + registerDefaultState(this.stateDefinition.any().setValue(FACING, Direction.UP)); + } + + @Override + public MapCodec codec() { + return CODEC; + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + return this.defaultBlockState().setValue(FACING, ctx.getClickedFace().getOpposite()); + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/decoration/SpectrumDirectionalBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/decoration/SpectrumDirectionalBlock.java new file mode 100644 index 0000000000..b719740f1b --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/blocks/decoration/SpectrumDirectionalBlock.java @@ -0,0 +1,43 @@ +package de.dafuqs.spectrum.blocks.decoration; + +import com.mojang.serialization.*; +import net.minecraft.core.*; +import net.minecraft.world.item.context.*; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.state.*; + +public class SpectrumDirectionalBlock extends DirectionalBlock { + + public static final MapCodec CODEC = simpleCodec(SpectrumDirectionalBlock::new); + + public SpectrumDirectionalBlock(Properties properties) { + super(properties); + registerDefaultState(this.stateDefinition.any().setValue(FACING, Direction.UP)); + } + + @Override + public MapCodec codec() { + return CODEC; + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + return this.defaultBlockState().setValue(FACING, ctx.getClickedFace()); + } + + @Override + public BlockState rotate(BlockState state, Rotation rotation) { + return state.setValue(FACING, rotation.rotate(state.getValue(FACING))); + } + + @Override + public BlockState mirror(BlockState state, Mirror mirror) { + return state.rotate(mirror.getRotation(state.getValue(FACING))); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(FACING); + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/decoration/SpectrumFacingBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/decoration/SpectrumFacingBlock.java deleted file mode 100644 index 2d54af4247..0000000000 --- a/src/main/java/de/dafuqs/spectrum/blocks/decoration/SpectrumFacingBlock.java +++ /dev/null @@ -1,45 +0,0 @@ -package de.dafuqs.spectrum.blocks.decoration; - -import com.mojang.serialization.*; -import net.minecraft.core.*; -import net.minecraft.world.item.context.*; -import net.minecraft.world.level.block.*; -import net.minecraft.world.level.block.state.*; - -public class SpectrumFacingBlock extends DirectionalBlock { - - public static final MapCodec CODEC = simpleCodec(SpectrumFacingBlock::new); - - public SpectrumFacingBlock(Properties settings) { - super(settings); - this.registerDefaultState((this.stateDefinition.any()).setValue(DirectionalBlock.FACING, Direction.UP)); - } - - @Override - public MapCodec codec() { - return CODEC; - } - - @Override - public BlockState getStateForPlacement(BlockPlaceContext ctx) { - Direction direction = ctx.getClickedFace(); - BlockState blockState = ctx.getLevel().getBlockState(ctx.getClickedPos().relative(direction.getOpposite())); - return blockState.is(this) && blockState.getValue(FACING) == direction ? this.defaultBlockState().setValue(FACING, direction.getOpposite()) : this.defaultBlockState().setValue(FACING, direction); - } - - @Override - public BlockState rotate(BlockState state, Rotation rotation) { - return state.setValue(FACING, rotation.rotate(state.getValue(FACING))); - } - - @Override - public BlockState mirror(BlockState state, Mirror mirror) { - return state.rotate(mirror.getRotation(state.getValue(FACING))); - } - - @Override - protected void createBlockStateDefinition(StateDefinition.Builder builder) { - builder.add(FACING); - } - -} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/decoration/SpectrumLineFacingBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/decoration/SpectrumLineFacingBlock.java deleted file mode 100644 index 64d72bc988..0000000000 --- a/src/main/java/de/dafuqs/spectrum/blocks/decoration/SpectrumLineFacingBlock.java +++ /dev/null @@ -1,25 +0,0 @@ -package de.dafuqs.spectrum.blocks.decoration; - -import com.mojang.serialization.*; -import net.minecraft.world.item.context.*; -import net.minecraft.world.level.block.state.*; - -public class SpectrumLineFacingBlock extends SpectrumFacingBlock { - - public static final MapCodec CODEC = simpleCodec(SpectrumLineFacingBlock::new); - - public SpectrumLineFacingBlock(Properties settings) { - super(settings); - } - - @Override - public MapCodec codec() { - return CODEC; - } - - @Override - public BlockState getStateForPlacement(BlockPlaceContext ctx) { - return this.defaultBlockState().setValue(FACING, ctx.getNearestLookingDirection()); - } - -} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/decoration/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/decoration/package-info.java index f7eb384a76..fc5dbc9605 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/decoration/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/decoration/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.decoration; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/DragonboneBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/DragonboneBlock.java index 8d86e372dd..a3f210be91 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/DragonboneBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/DragonboneBlock.java @@ -14,7 +14,7 @@ import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.block.state.properties.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; import java.util.function.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/HummingstoneBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/HummingstoneBlock.java index 05064526b5..24205e0b18 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/HummingstoneBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/HummingstoneBlock.java @@ -20,7 +20,7 @@ import net.minecraft.world.level.block.state.properties.*; import net.minecraft.world.level.gameevent.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class HummingstoneBlock extends BaseEntityBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/HummingstoneBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/HummingstoneBlockEntity.java index fd3733a500..1d52df02aa 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/HummingstoneBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/HummingstoneBlockEntity.java @@ -8,7 +8,6 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.gameevent.*; import net.minecraft.world.phys.*; -import javax.annotation.*; public class HummingstoneBlockEntity extends BlockEntity implements HummingstoneEventQueue.Callback { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/PyriteRipperBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/PyriteRipperBlock.java index 63ba493eef..3f44cb9574 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/PyriteRipperBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/PyriteRipperBlock.java @@ -12,11 +12,11 @@ import net.minecraft.world.level.block.state.properties.*; import net.minecraft.world.level.pathfinder.*; import net.minecraft.world.phys.shapes.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; -public class PyriteRipperBlock extends SpectrumFacingBlock { +public class PyriteRipperBlock extends SpectrumDirectionalBlock { public static final MapCodec CODEC = simpleCodec(PyriteRipperBlock::new); diff --git a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/SplinterspawnInfestedBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/SplinterspawnInfestedBlock.java index fe0eafa00d..7ac49b60aa 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/SplinterspawnInfestedBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/SplinterspawnInfestedBlock.java @@ -3,9 +3,7 @@ import com.google.common.collect.*; import com.mojang.serialization.*; import com.mojang.serialization.codecs.*; -import de.dafuqs.spectrum.*; import de.dafuqs.spectrum.config.*; -import de.dafuqs.spectrum.entity.*; import de.dafuqs.spectrum.entity.entity.*; import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.registries.*; @@ -23,7 +21,7 @@ import net.minecraft.world.level.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/StrippingLootBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/StrippingLootBlock.java index fe022bc23f..6a3f66b144 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/StrippingLootBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/StrippingLootBlock.java @@ -8,7 +8,7 @@ import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.storage.loot.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class StrippingLootBlock extends Block implements StrippableDrop { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/StrippingLootPillarBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/StrippingLootPillarBlock.java index 4495d92261..f3205a742f 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/StrippingLootPillarBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/StrippingLootPillarBlock.java @@ -9,7 +9,7 @@ import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.storage.loot.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.function.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/AbyssalVineBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/AbyssalVineBlock.java index ec4097d4f0..f61bbbc87d 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/AbyssalVineBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/AbyssalVineBlock.java @@ -1,7 +1,6 @@ package de.dafuqs.spectrum.blocks.deeper_down.flora; import com.mojang.serialization.*; -import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.core.*; import net.minecraft.server.level.*; @@ -16,7 +15,6 @@ import net.minecraft.world.level.block.state.properties.*; import net.minecraft.world.level.gameevent.*; import net.minecraft.world.phys.*; -import javax.annotation.*; public class AbyssalVineBlock extends TriStateVineBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/BristleSproutsBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/BristleSproutsBlock.java index c4b9216c6f..d76add2440 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/BristleSproutsBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/BristleSproutsBlock.java @@ -13,7 +13,7 @@ import net.minecraft.world.level.pathfinder.*; import net.minecraft.world.phys.*; import net.minecraft.world.phys.shapes.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class BristleSproutsBlock extends BushBlock implements BonemealableBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/DoomBloomBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/DoomBloomBlock.java index 3f39f592c7..ecbbe7105f 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/DoomBloomBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/DoomBloomBlock.java @@ -25,7 +25,7 @@ import net.minecraft.world.phys.*; import net.minecraft.world.phys.shapes.*; import net.neoforged.neoforge.common.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.function.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/GiantMossBallBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/GiantMossBallBlock.java index 2d4e3bc566..19313a9f98 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/GiantMossBallBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/GiantMossBallBlock.java @@ -4,11 +4,9 @@ import net.minecraft.core.*; import net.minecraft.world.entity.*; import net.minecraft.world.level.*; -import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.*; import net.minecraft.world.phys.shapes.*; -import javax.annotation.*; public class GiantMossBallBlock extends MossBallBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/SawbladeHollyBushBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/SawbladeHollyBushBlock.java index 26177cf68f..fec4c8e9e5 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/SawbladeHollyBushBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/SawbladeHollyBushBlock.java @@ -20,7 +20,7 @@ import net.minecraft.world.phys.*; import net.minecraft.world.phys.shapes.*; import net.neoforged.neoforge.common.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class SawbladeHollyBushBlock extends BushBlock implements BonemealableBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/SmallDragonjagBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/SmallDragonjagBlock.java index 165a3ff4ba..3b3098277a 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/SmallDragonjagBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/SmallDragonjagBlock.java @@ -9,7 +9,7 @@ import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.shapes.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/TallDragonjagBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/TallDragonjagBlock.java index 7a1713dc4d..8ccd0ada81 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/TallDragonjagBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/TallDragonjagBlock.java @@ -15,7 +15,7 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.block.state.properties.*; import net.minecraft.world.phys.shapes.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/TriStateVineBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/TriStateVineBlock.java index 63fbf78fcb..e06b7f52bc 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/TriStateVineBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/TriStateVineBlock.java @@ -18,7 +18,7 @@ import net.minecraft.world.phys.*; import net.minecraft.world.phys.shapes.*; import net.neoforged.neoforge.common.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public abstract class TriStateVineBlock extends BushBlock implements BonemealableBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/WeepingGalaFrondsTipBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/WeepingGalaFrondsTipBlock.java index c167049d75..ab69ef26b3 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/WeepingGalaFrondsTipBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/WeepingGalaFrondsTipBlock.java @@ -1,7 +1,6 @@ package de.dafuqs.spectrum.blocks.deeper_down.flora; import com.mojang.serialization.*; -import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.core.*; import net.minecraft.resources.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/package-info.java index 47b3916a80..84ed41da02 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.deeper_down.flora; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/groundcover/AshenBlackslagBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/groundcover/AshenBlackslagBlock.java new file mode 100644 index 0000000000..3226e6a2d7 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/groundcover/AshenBlackslagBlock.java @@ -0,0 +1,11 @@ +package de.dafuqs.spectrum.blocks.deeper_down.groundcover; + +import net.minecraft.world.level.block.*; + +public class AshenBlackslagBlock extends RotatedPillarBlock implements OvergrownBlock { + + public AshenBlackslagBlock(Properties properties) { + super(properties); + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/groundcover/BlackslagVegetationBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/groundcover/BlackslagVegetationBlock.java index f602dbeffa..08ac379432 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/groundcover/BlackslagVegetationBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/groundcover/BlackslagVegetationBlock.java @@ -10,7 +10,7 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.lighting.*; -public class BlackslagVegetationBlock extends SnowyDirtBlock { +public class BlackslagVegetationBlock extends SnowyDirtBlock implements OvergrownBlock { public static final MapCodec CODEC = simpleCodec(BlackslagVegetationBlock::new); diff --git a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/groundcover/OvergrownBlackslagBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/groundcover/OvergrownBlackslagBlock.java new file mode 100644 index 0000000000..40a1dad436 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/groundcover/OvergrownBlackslagBlock.java @@ -0,0 +1,9 @@ +package de.dafuqs.spectrum.blocks.deeper_down.groundcover; + +public class OvergrownBlackslagBlock extends BlackslagVegetationBlock { + + public OvergrownBlackslagBlock(Properties settings) { + super(settings); + } + +} \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/groundcover/OvergrownBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/groundcover/OvergrownBlock.java new file mode 100644 index 0000000000..c2966158a6 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/groundcover/OvergrownBlock.java @@ -0,0 +1,67 @@ +package de.dafuqs.spectrum.blocks.deeper_down.groundcover; + +import com.mojang.serialization.*; +import de.dafuqs.spectrum.registries.*; +import net.minecraft.core.*; +import net.minecraft.core.registries.*; +import net.minecraft.server.level.*; +import net.minecraft.util.*; +import net.minecraft.world.item.*; +import net.minecraft.world.item.context.*; +import net.minecraft.world.level.*; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.state.*; +import net.minecraft.world.level.levelgen.feature.*; +import net.minecraft.world.level.levelgen.feature.configurations.*; +import net.minecraft.world.level.levelgen.placement.*; +import net.neoforged.neoforge.common.*; +import org.jspecify.annotations.*; + +import java.util.*; + +public interface OvergrownBlock extends BonemealableBlock { + + @Override + default Type getType() { + return Type.NEIGHBOR_SPREADER; + } + + @Override + default boolean isValidBonemealTarget(LevelReader level, BlockPos pos, BlockState state) { + return level.getBlockState(pos.above()).isAir() && !level.getBiome(pos).value().getGenerationSettings().getFlowerFeatures().isEmpty(); + } + + @Override + default boolean isBonemealSuccess(Level level, RandomSource p_221276_, BlockPos pos, BlockState state) { + return true; + } + + @Override + default void performBonemeal(ServerLevel level, RandomSource random, BlockPos pos, BlockState state) { + BlockPos blockpos = pos.above(); + + outer: + for(int i = 0; i < 128; ++i) { + BlockPos offsetPos = blockpos; + + for(int j = 0; j < i / 16; ++j) { + offsetPos = offsetPos.offset(random.nextInt(3) - 1, (random.nextInt(3) - 1) * random.nextInt(3) / 2, random.nextInt(3) - 1); + if (!(level.getBlockState(offsetPos.below()).getBlock() instanceof OvergrownBlock) || level.getBlockState(offsetPos).isCollisionShapeFullBlock(level, offsetPos)) { + continue outer; + } + } + + BlockState offsetState = level.getBlockState(offsetPos); + if (offsetState.isAir()) { + Holder holder; + List> list = level.getBiome(offsetPos).value().getGenerationSettings().getFlowerFeatures(); + if (list.isEmpty()) { + continue; + } + holder = ((RandomPatchConfiguration) list.get(random.nextInt(list.size())).config()).feature(); + holder.value().place(level, level.getChunkSource().getGenerator(), random, offsetPos); + } + } + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/groundcover/OvergrownSlushBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/groundcover/OvergrownSlushBlock.java index 72612ee7e2..c801a06c0b 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/groundcover/OvergrownSlushBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/groundcover/OvergrownSlushBlock.java @@ -3,18 +3,25 @@ import com.mojang.serialization.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.core.*; +import net.minecraft.core.registries.*; +import net.minecraft.data.worldgen.placement.*; import net.minecraft.server.level.*; import net.minecraft.util.*; import net.minecraft.world.item.*; import net.minecraft.world.item.context.*; import net.minecraft.world.level.*; +import net.minecraft.world.level.biome.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; -import net.minecraft.world.level.lighting.*; +import net.minecraft.world.level.levelgen.feature.*; +import net.minecraft.world.level.levelgen.feature.configurations.*; +import net.minecraft.world.level.levelgen.placement.*; import net.neoforged.neoforge.common.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; -public class OvergrownSlushBlock extends BlackslagVegetationBlock { +import java.util.*; + +public class OvergrownSlushBlock extends BlackslagVegetationBlock implements OvergrownBlock { public OvergrownSlushBlock(Properties settings) { super(settings); diff --git a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/groundcover/SlushBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/groundcover/SlushBlock.java index 3ebccd9618..d522ac95f1 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/groundcover/SlushBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/groundcover/SlushBlock.java @@ -12,7 +12,7 @@ import net.minecraft.world.level.block.state.*; import net.neoforged.neoforge.common.*; import net.neoforged.neoforge.common.util.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class SlushBlock extends RotatedPillarBlock implements BonemealableBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/groundcover/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/groundcover/package-info.java index c326c5364c..66f5c5513c 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/groundcover/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/groundcover/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.deeper_down.groundcover; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/package-info.java index b8ea99c934..8a314928d8 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/package-info.java @@ -3,6 +3,5 @@ @FieldsAreNonnullByDefault package de.dafuqs.spectrum.blocks.deeper_down; -import net.minecraft.FieldsAreNonnullByDefault; -import net.minecraft.MethodsReturnNonnullByDefault; -import org.jspecify.annotations.NullMarked; +import net.minecraft.*; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/enchanter/EnchanterBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/enchanter/EnchanterBlock.java index d250639a52..bf46be8758 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/enchanter/EnchanterBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/enchanter/EnchanterBlock.java @@ -20,7 +20,7 @@ import net.minecraft.world.level.block.entity.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/enchanter/EnchanterBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/enchanter/EnchanterBlockEntity.java index 668b7168a8..5eb0b33485 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/enchanter/EnchanterBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/enchanter/EnchanterBlockEntity.java @@ -21,8 +21,6 @@ import net.minecraft.core.*; import net.minecraft.core.component.*; import net.minecraft.nbt.*; -import net.minecraft.network.protocol.*; -import net.minecraft.network.protocol.game.*; import net.minecraft.server.level.*; import net.minecraft.sounds.*; import net.minecraft.stats.*; @@ -34,15 +32,13 @@ import net.minecraft.world.item.crafting.*; import net.minecraft.world.item.enchantment.*; import net.minecraft.world.level.*; -import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.entity.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.*; import net.neoforged.api.distmarker.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; -import java.util.stream.*; public class EnchanterBlockEntity extends InWorldInteractionBlockEntity implements MultiblockCrafter, WorldlyContainer { @@ -127,110 +123,110 @@ public static void clientTick(Level world, BlockPos blockPos, BlockState blockSt } @SuppressWarnings("unused") - public static void serverTick(Level world, BlockPos blockPos, BlockState blockState, EnchanterBlockEntity enchanterBlockEntity) { - if (enchanterBlockEntity.upgrades == null) { - enchanterBlockEntity.calculateUpgrades(); + public static void serverTick(Level level, BlockPos pos, BlockState state, EnchanterBlockEntity enchanter) { + if (enchanter.upgrades == null) { + enchanter.calculateUpgrades(level); } - if (enchanterBlockEntity.inventoryChanged) { - calculateCurrentRecipe(world, enchanterBlockEntity); + if (enchanter.inventoryChanged) { + calculateCurrentRecipe(level, enchanter); // if no default recipe found => check in-code recipe for enchanting the center item with enchanted books - if (enchanterBlockEntity.currentRecipe == null) { - if (isValidCenterEnchantingSetup(enchanterBlockEntity)) { - int requiredExperience = getRequiredExperienceToEnchantCenterItem(enchanterBlockEntity); + if (enchanter.currentRecipe == null) { + if (isValidCenterEnchantingSetup(enchanter)) { + int requiredExperience = getRequiredExperienceToEnchantCenterItem(enchanter); if (requiredExperience > 0) { - enchanterBlockEntity.currentItemProcessingTime = requiredExperience * REQUIRED_TICKS_FOR_EACH_EXPERIENCE_POINT; + enchanter.currentItemProcessingTime = requiredExperience * REQUIRED_TICKS_FOR_EACH_EXPERIENCE_POINT; } else { - enchanterBlockEntity.currentItemProcessingTime = -1; + enchanter.currentItemProcessingTime = -1; } } else { - enchanterBlockEntity.currentItemProcessingTime = -1; + enchanter.currentItemProcessingTime = -1; } - enchanterBlockEntity.updateInClientWorld(); + enchanter.updateInClientWorld(); } - enchanterBlockEntity.inventoryChanged = false; + enchanter.inventoryChanged = false; } boolean craftingSuccess = false; - if (enchanterBlockEntity.currentRecipe != null || enchanterBlockEntity.currentItemProcessingTime > 1) { - if (enchanterBlockEntity.craftingTime % 60 == 1) { - if (!checkRecipeRequirements(world, blockPos, enchanterBlockEntity)) { - enchanterBlockEntity.craftingTime = 0; - PlayBlockBoundSoundInstancePayload.sendCancelBlockBoundSoundInstance((ServerLevel) enchanterBlockEntity.getLevel(), enchanterBlockEntity.worldPosition); + if (enchanter.currentRecipe != null || enchanter.currentItemProcessingTime > 1) { + if (enchanter.craftingTime % 60 == 1) { + if (!checkRecipeRequirements(level, pos, enchanter)) { + enchanter.craftingTime = 0; + PlayBlockBoundSoundInstancePayload.sendCancelBlockBoundSoundInstance((ServerLevel) enchanter.getLevel(), enchanter.worldPosition); return; } } - if (enchanterBlockEntity.craftingTime == 1) { - PlayBlockBoundSoundInstancePayload.sendPlayBlockBoundSoundInstance(SpectrumSoundEvents.ENCHANTER_WORKING, (ServerLevel) enchanterBlockEntity.getLevel(), enchanterBlockEntity.worldPosition, Integer.MAX_VALUE); + if (enchanter.craftingTime == 1) { + PlayBlockBoundSoundInstancePayload.sendPlayBlockBoundSoundInstance(SpectrumSoundEvents.ENCHANTER_WORKING, (ServerLevel) enchanter.getLevel(), enchanter.worldPosition, Integer.MAX_VALUE); } - var recipe = enchanterBlockEntity.currentRecipe == null ? null : enchanterBlockEntity.currentRecipe.value(); + var recipe = enchanter.currentRecipe == null ? null : enchanter.currentRecipe.value(); if (recipe instanceof EnchanterRecipe enchanterRecipe) { - enchanterBlockEntity.craftingTime++; + enchanter.craftingTime++; // looks cooler this way - if (enchanterBlockEntity.craftingTime == enchanterBlockEntity.craftingTimeTotal - 20) { - enchanterBlockEntity.doItemBowlOrbs(world); - } else if (enchanterBlockEntity.craftingTime == enchanterBlockEntity.craftingTimeTotal) { - playCraftingFinishedEffects(enchanterBlockEntity); - craftEnchanterRecipe(world, enchanterBlockEntity, enchanterRecipe); + if (enchanter.craftingTime == enchanter.craftingTimeTotal - 20) { + enchanter.doItemBowlOrbs(level); + } else if (enchanter.craftingTime == enchanter.craftingTimeTotal) { + playCraftingFinishedEffects(enchanter); + craftEnchanterRecipe(level, enchanter, enchanterRecipe); craftingSuccess = true; } - enchanterBlockEntity.setChanged(); + enchanter.setChanged(); } else if (recipe instanceof EnchantmentUpgradeRecipe enchantmentUpgradeRecipe) { - enchanterBlockEntity.currentItemProcessingTime++; - if (enchanterBlockEntity.currentItemProcessingTime == REQUIRED_TICKS_FOR_EACH_EXPERIENCE_POINT) { - enchanterBlockEntity.currentItemProcessingTime = 0; + enchanter.currentItemProcessingTime++; + if (enchanter.currentItemProcessingTime == REQUIRED_TICKS_FOR_EACH_EXPERIENCE_POINT) { + enchanter.currentItemProcessingTime = 0; - int consumedItems = tickEnchantmentUpgradeRecipe(world, enchanterBlockEntity, enchanterBlockEntity.craftingTimeTotal - enchanterBlockEntity.craftingTime); + int consumedItems = tickEnchantmentUpgradeRecipe(level, enchanter, enchanter.craftingTimeTotal - enchanter.craftingTime); if (consumedItems == 0) { - enchanterBlockEntity.inventoryChanged(); + enchanter.inventoryChanged(); } else { - enchanterBlockEntity.craftingTime += consumedItems; - if (enchanterBlockEntity.craftingTime >= enchanterBlockEntity.craftingTimeTotal) { - playCraftingFinishedEffects(enchanterBlockEntity); - enchanterBlockEntity.craftEnchantmentUpgradeRecipe(world, enchantmentUpgradeRecipe); - PlayBlockBoundSoundInstancePayload.sendCancelBlockBoundSoundInstance((ServerLevel) enchanterBlockEntity.getLevel(), enchanterBlockEntity.worldPosition); + enchanter.craftingTime += consumedItems; + if (enchanter.craftingTime >= enchanter.craftingTimeTotal) { + playCraftingFinishedEffects(enchanter); + enchanter.craftEnchantmentUpgradeRecipe(level, enchantmentUpgradeRecipe); + PlayBlockBoundSoundInstancePayload.sendCancelBlockBoundSoundInstance((ServerLevel) enchanter.getLevel(), enchanter.worldPosition); craftingSuccess = true; } } } - enchanterBlockEntity.setChanged(); - } else if (enchanterBlockEntity.currentItemProcessingTime > -1) { - int speedTicks = Support.getIntFromDecimalWithChance(enchanterBlockEntity.upgrades.getEffectiveValue(UpgradeType.SPEED), world.getRandom()); - enchanterBlockEntity.craftingTime += speedTicks; - if (world.getGameTime() % REQUIRED_TICKS_FOR_EACH_EXPERIENCE_POINT == 0) { + enchanter.setChanged(); + } else if (enchanter.currentItemProcessingTime > -1) { + int speedTicks = Support.getIntFromDecimalWithChance(enchanter.upgrades.getEffectiveValue(UpgradeType.SPEED), level.getRandom()); + enchanter.craftingTime += speedTicks; + if (level.getGameTime() % REQUIRED_TICKS_FOR_EACH_EXPERIENCE_POINT == 0) { // in-code recipe for item + books => enchanted item - boolean drained = enchanterBlockEntity.drainExperience(speedTicks); + boolean drained = enchanter.drainExperience(speedTicks); if (!drained) { - enchanterBlockEntity.currentItemProcessingTime = -1; - enchanterBlockEntity.updateInClientWorld(); - PlayBlockBoundSoundInstancePayload.sendCancelBlockBoundSoundInstance((ServerLevel) enchanterBlockEntity.getLevel(), enchanterBlockEntity.worldPosition); + enchanter.currentItemProcessingTime = -1; + enchanter.updateInClientWorld(); + PlayBlockBoundSoundInstancePayload.sendCancelBlockBoundSoundInstance((ServerLevel) enchanter.getLevel(), enchanter.worldPosition); } } - if (enchanterBlockEntity.currentItemProcessingTime > 0 && enchanterBlockEntity.craftingTime >= enchanterBlockEntity.currentItemProcessingTime) { - playCraftingFinishedEffects(enchanterBlockEntity); - enchantCenterItem(enchanterBlockEntity); + if (enchanter.currentItemProcessingTime > 0 && enchanter.craftingTime >= enchanter.currentItemProcessingTime) { + playCraftingFinishedEffects(enchanter); + enchantCenterItem(enchanter); - enchanterBlockEntity.currentItemProcessingTime = -1; - enchanterBlockEntity.craftingTime = 0; - enchanterBlockEntity.updateInClientWorld(); - PlayBlockBoundSoundInstancePayload.sendCancelBlockBoundSoundInstance((ServerLevel) enchanterBlockEntity.getLevel(), enchanterBlockEntity.worldPosition); + enchanter.currentItemProcessingTime = -1; + enchanter.craftingTime = 0; + enchanter.updateInClientWorld(); + PlayBlockBoundSoundInstancePayload.sendCancelBlockBoundSoundInstance((ServerLevel) enchanter.getLevel(), enchanter.worldPosition); craftingSuccess = true; } - enchanterBlockEntity.setChanged(); + enchanter.setChanged(); } if (craftingSuccess) { - enchanterBlockEntity.currentItemProcessingTime = -1; - enchanterBlockEntity.craftingTime = 0; - enchanterBlockEntity.inventoryChanged(); + enchanter.currentItemProcessingTime = -1; + enchanter.craftingTime = 0; + enchanter.inventoryChanged(); } } } @@ -551,7 +547,7 @@ public void craftEnchantmentUpgradeRecipe(Level world, EnchantmentUpgradeRecipe var curLevel = resultStack.get(DataComponents.STORED_ENCHANTMENTS).getLevel(upgrade.getEnchantment()); var targetLevel = Math.min(curLevel + 1, upgrade.getLevelCap()); - var xpCost = upgrade.getXPScaling().apply(curLevel); + var xpCost = upgrade.getRequiredXPForSourceLevel(curLevel); drainExperience(xpCost); @@ -571,7 +567,7 @@ public void craftEnchantmentUpgradeRecipe(Level world, EnchantmentUpgradeRecipe // update the item amount if chain upgrading if (recipeMatches(this, level)) { - craftingTimeTotal = upgrade.getItemScaling().apply(targetLevel); + craftingTimeTotal = upgrade.getRequiredItemCountForSourceLevel(targetLevel); } else { currentRecipe = null; } @@ -621,7 +617,7 @@ private static void calculateCurrentRecipe(Level world, EnchanterBlockEntity enc enchanter.currentItemProcessingTime = 0; var level = enchanter.items.get(0).get(DataComponents.STORED_ENCHANTMENTS).getLevel(upgrade.value().getEnchantment()); - enchanter.craftingTimeTotal = upgrade.value().getItemScaling().apply(level); + enchanter.craftingTimeTotal = upgrade.value().getRequiredItemCountForSourceLevel(level); EnchanterInventory testInventory = new EnchanterInventory(); testInventory.setItem(0, enchanter.virtualInventory.getItem(0)); @@ -823,15 +819,8 @@ public void setOwner(Player playerEntity) { setChanged(); } - // UPGRADEABLE - @Override - public void resetUpgrades() { - this.upgrades = null; - this.setChanged(); - } - @Override - public void calculateUpgrades() { + public void calculateUpgrades(Level level) { this.upgrades = Upgradeable.calculateUpgradeMods4(level, worldPosition, 3, 0, this.ownerUUID); this.setChanged(); } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/enchanter/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/enchanter/package-info.java index b0c57adda8..9c628ff516 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/enchanter/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/enchanter/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.enchanter; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/end_portal/CrackedEndPortalFrameBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/end_portal/CrackedEndPortalFrameBlock.java index a604679e6d..5518967579 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/end_portal/CrackedEndPortalFrameBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/end_portal/CrackedEndPortalFrameBlock.java @@ -162,5 +162,4 @@ public int getRedstonePower() { } } - } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/end_portal/EndPortalShaper.java b/src/main/java/de/dafuqs/spectrum/blocks/end_portal/EndPortalShaper.java index e6d3fb2748..90c271e70d 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/end_portal/EndPortalShaper.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/end_portal/EndPortalShaper.java @@ -1,6 +1,5 @@ package de.dafuqs.spectrum.blocks.end_portal; -import de.dafuqs.spectrum.*; import de.dafuqs.spectrum.config.*; import net.minecraft.core.*; import net.minecraft.world.level.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/end_portal/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/end_portal/package-info.java index 883074d640..d160cef385 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/end_portal/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/end_portal/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.end_portal; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/ender/EnderDropperBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/ender/EnderDropperBlock.java index b9556fe37f..45fcddda3d 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/ender/EnderDropperBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/ender/EnderDropperBlock.java @@ -20,7 +20,7 @@ import net.minecraft.world.phys.*; import net.neoforged.neoforge.capabilities.*; import net.neoforged.neoforge.items.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class EnderDropperBlock extends DispenserBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/ender/EnderDropperBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/ender/EnderDropperBlockEntity.java index 6c65320d9a..1af978d1eb 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/ender/EnderDropperBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/ender/EnderDropperBlockEntity.java @@ -14,14 +14,14 @@ import net.minecraft.world.level.block.entity.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.storage.loot.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; public class EnderDropperBlockEntity extends DispenserBlockEntity implements PlayerOwnedWithName { - private UUID ownerUUID; - private String ownerName; + private @Nullable UUID ownerUUID; + private @Nullable String ownerName; public EnderDropperBlockEntity(BlockPos blockPos, BlockState blockState) { super(SpectrumBlockEntities.ENDER_DROPPER.get(), blockPos, blockState); @@ -117,12 +117,12 @@ private Optional getInventory() { } @Override - public UUID getOwnerUUID() { + public @Nullable UUID getOwnerUUID() { return this.ownerUUID; } @Override - public String getOwnerName() { + public @Nullable String getOwnerName() { return this.ownerName; } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/ender/EnderHopperBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/ender/EnderHopperBlock.java index 021a52492c..247a43db2f 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/ender/EnderHopperBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/ender/EnderHopperBlock.java @@ -20,7 +20,7 @@ import net.minecraft.world.level.pathfinder.*; import net.minecraft.world.phys.*; import net.minecraft.world.phys.shapes.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import static net.minecraft.world.level.block.HopperBlock.*; @@ -136,7 +136,7 @@ public InteractionResult useWithoutItem(BlockState state, Level world, BlockPos player.awardStat(Stats.OPEN_ENDERCHEST); PiglinAi.angerNearbyPiglins(player, true); } else { - player.displayClientMessage(Component.translatable("block.spectrum.ender_hopper_with_owner", enderHopperBlockEntity.getOwnerName()), true); + player.displayClientMessage(Component.translatable("block.spectrum.ender_hopper.owner", enderHopperBlockEntity.getOwnerName()), true); } } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/ender/EnderHopperBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/ender/EnderHopperBlockEntity.java index 35ec3b4741..69988ff3a1 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/ender/EnderHopperBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/ender/EnderHopperBlockEntity.java @@ -17,7 +17,7 @@ import net.minecraft.world.phys.shapes.*; import net.neoforged.neoforge.capabilities.*; import net.neoforged.neoforge.items.*; -import javax.annotation.*; +import org.jspecify.annotations.*; import java.util.*; import java.util.stream.*; @@ -28,8 +28,8 @@ public class EnderHopperBlockEntity extends BlockEntity implements PlayerOwnedWi private final VoxelShape ABOVE_SHAPE = Block.box(0.0D, 16.0D, 0.0D, 16.0D, 32.0D, 16.0D); private final VoxelShape INPUT_AREA_SHAPE = Shapes.or(INSIDE_SHAPE, ABOVE_SHAPE); - private UUID ownerUUID; - private String ownerName; + private @Nullable UUID ownerUUID; + private @Nullable String ownerName; private int transferCooldown; @@ -65,7 +65,7 @@ public static void serverTick(Level world, BlockPos pos, BlockState state, Ender } public static List getInputItemEntities(Level world, EnderHopperBlockEntity enderHopperBlockEntity) { - return enderHopperBlockEntity.getInputAreaShape().toAabbs().stream().flatMap((box) -> world.getEntitiesOfClass(ItemEntity.class, box.move(enderHopperBlockEntity.getHopperX() - 0.5D, enderHopperBlockEntity.getHopperY() - 0.5D, enderHopperBlockEntity.getHopperZ() - 0.5D), EntitySelector.ENTITY_STILL_ALIVE).stream()).collect(Collectors.toList()); + return enderHopperBlockEntity.getInputAreaShape().toAabbs().stream().flatMap((box) -> world.getEntitiesOfClass(ItemEntity.class, box.move(enderHopperBlockEntity.getHopperX() - 0.5D, enderHopperBlockEntity.getHopperY() - 0.5D, enderHopperBlockEntity.getHopperZ() - 0.5D), EntitySelector.ENTITY_STILL_ALIVE).stream()).toList(); } private static void insertIntoEnderChest(EnderHopperBlockEntity enderHopperBlockEntity, IItemHandlerModifiable itemHandler) { @@ -188,12 +188,12 @@ private boolean needsCooldown() { } @Override - public UUID getOwnerUUID() { + public @Nullable UUID getOwnerUUID() { return this.ownerUUID; } @Override - public String getOwnerName() { + public @Nullable String getOwnerName() { return this.ownerName; } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/ender/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/ender/package-info.java index 169433074a..94d41e32d2 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/ender/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/ender/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.ender; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/energy/ColorPickerBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/energy/ColorPickerBlock.java deleted file mode 100644 index 42bd1b6e35..0000000000 --- a/src/main/java/de/dafuqs/spectrum/blocks/energy/ColorPickerBlock.java +++ /dev/null @@ -1,127 +0,0 @@ -package de.dafuqs.spectrum.blocks.energy; - -import com.mojang.serialization.*; -import de.dafuqs.spectrum.helpers.*; -import de.dafuqs.spectrum.registries.*; -import net.minecraft.*; -import net.minecraft.core.*; -import net.minecraft.network.chat.*; -import net.minecraft.util.*; -import net.minecraft.world.*; -import net.minecraft.world.entity.player.*; -import net.minecraft.world.item.*; -import net.minecraft.world.item.context.*; -import net.minecraft.world.level.*; -import net.minecraft.world.level.block.*; -import net.minecraft.world.level.block.entity.*; -import net.minecraft.world.level.block.state.*; -import net.minecraft.world.level.pathfinder.*; -import net.minecraft.world.phys.*; -import net.minecraft.world.phys.shapes.*; -import org.jspecify.annotations.Nullable; - -import java.util.*; - -public class ColorPickerBlock extends HorizontalDirectionalBlock implements EntityBlock { - - public static final MapCodec CODEC = simpleCodec(ColorPickerBlock::new); - - protected static final VoxelShape SHAPE = Block.box(1.0D, 0.0D, 1.0D, 15.0D, 13.0D, 15.0D); - - public ColorPickerBlock(Properties settings) { - super(settings); - } - - @Override - public MapCodec codec() { - return CODEC; - } - - @Override - public RenderShape getRenderShape(BlockState state) { - return RenderShape.MODEL; - } - - @Override - public void appendHoverText(ItemStack stack, Item.TooltipContext context, List tooltip, TooltipFlag type) { - super.appendHoverText(stack, context, tooltip, type); - tooltip.add(Component.translatable("block.spectrum.color_picker.tooltip").withStyle(ChatFormatting.GRAY)); - } - - @Override - public VoxelShape getShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { - return SHAPE; - } - - @Override - public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { - return new ColorPickerBlockEntity(pos, state); - } - - @Override - public boolean isPathfindable(BlockState state, PathComputationType type) { - return false; - } - - @Override - protected void createBlockStateDefinition(StateDefinition.Builder builder) { - builder.add(FACING); - } - - @Override - public BlockState getStateForPlacement(BlockPlaceContext ctx) { - return this.defaultBlockState().setValue(FACING, ctx.getHorizontalDirection().getOpposite()); - } - - @Override - public @Nullable BlockEntityTicker getTicker(Level world, BlockState state, BlockEntityType type) { - return world.isClientSide() ? null : Support.checkType(type, SpectrumBlockEntities.COLOR_PICKER.get(), ColorPickerBlockEntity::tick); - } - - @Override - public InteractionResult useWithoutItem(BlockState state, Level world, BlockPos pos, Player player, BlockHitResult hit) { - if (world.isClientSide()) { - return InteractionResult.SUCCESS; - } else { - this.openScreen(world, pos, player); - return InteractionResult.CONSUME; - } - } - - protected void openScreen(Level world, BlockPos pos, Player player) { - BlockEntity blockEntity = world.getBlockEntity(pos); - if (blockEntity instanceof ColorPickerBlockEntity colorPickerBlockEntity) { - colorPickerBlockEntity.setOwner(player); - player.openMenu(colorPickerBlockEntity); - } - } - - @Override - public boolean hasAnalogOutputSignal(BlockState state) { - return true; - } - - @Override - public int getAnalogOutputSignal(BlockState state, Level world, BlockPos pos) { - if (world.getBlockEntity(pos) instanceof ColorPickerBlockEntity blockEntity) { - int i = 0; - float f = 0.0f; - for (int j = 0; j < blockEntity.inventory.size(); ++j) { - ItemStack itemStack = blockEntity.inventory.get(j); - if (itemStack.isEmpty()) continue; - f += (float) itemStack.getCount() / (float) itemStack.getMaxStackSize(); - ++i; - } - return Mth.floor(f / (float) blockEntity.inventory.size() * 14.0f) + (i > 0 ? 1 : 0); - } - - return 0; - } - - @Override - public void onRemove(BlockState state, Level world, BlockPos pos, BlockState newState, boolean moved) { - Containers.dropContentsOnDestroy(state, newState, world, pos); - super.onRemove(state, world, pos, newState, moved); - } - -} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/energy/ColorPickerBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/energy/ColorPickerBlockEntity.java deleted file mode 100644 index acdb0e5b00..0000000000 --- a/src/main/java/de/dafuqs/spectrum/blocks/energy/ColorPickerBlockEntity.java +++ /dev/null @@ -1,322 +0,0 @@ -package de.dafuqs.spectrum.blocks.energy; - -import de.dafuqs.spectrum.api.block.*; -import de.dafuqs.spectrum.api.energy.*; -import de.dafuqs.spectrum.api.energy.color.*; -import de.dafuqs.spectrum.api.energy.storage.*; -import de.dafuqs.spectrum.components.*; -import de.dafuqs.spectrum.config.*; -import de.dafuqs.spectrum.helpers.*; -import de.dafuqs.spectrum.inventories.*; -import de.dafuqs.spectrum.networking.s2c_payloads.*; -import de.dafuqs.spectrum.particle.effect.*; -import de.dafuqs.spectrum.progression.*; -import de.dafuqs.spectrum.recipe.color_picker.*; -import de.dafuqs.spectrum.registries.*; -import net.minecraft.core.*; -import net.minecraft.nbt.*; -import net.minecraft.network.*; -import net.minecraft.network.chat.*; -import net.minecraft.network.protocol.*; -import net.minecraft.network.protocol.game.*; -import net.minecraft.server.level.*; -import net.minecraft.sounds.*; -import net.minecraft.world.*; -import net.minecraft.world.entity.player.*; -import net.minecraft.world.inventory.*; -import net.minecraft.world.item.*; -import net.minecraft.world.item.crafting.*; -import net.minecraft.world.level.*; -import net.minecraft.world.level.block.*; -import net.minecraft.world.level.block.entity.*; -import net.minecraft.world.level.block.state.*; -import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; - -import java.util.*; - -public class ColorPickerBlockEntity extends RandomizableContainerBlockEntity implements PlayerOwned, InkStorageBlockEntity, MenuProvider { - - public static final int INVENTORY_SIZE = 2; // input & output slots - public static final int INPUT_SLOT_ID = 0; - public static final int OUTPUT_SLOT_ID = 1; - public static final long TICKS_PER_CONVERSION = 5; - public static final long STORAGE_AMOUNT = 64 * 64 * 64 * 100; - - protected NonNullList inventory; - protected TotalCappedInkStorage inkStorage; - protected boolean paused; - protected boolean inkDirty; - protected @Nullable InkConvertingRecipe cachedRecipe; - protected Optional> selectedColor = Optional.empty(); - private UUID ownerUUID; - - public ColorPickerBlockEntity(BlockPos blockPos, BlockState blockState) { - super(SpectrumBlockEntities.COLOR_PICKER.get(), blockPos, blockState); - - this.inventory = NonNullList.withSize(INVENTORY_SIZE, ItemStack.EMPTY); - this.inkStorage = new TotalCappedInkStorage(STORAGE_AMOUNT, Map.of()); - } - - @SuppressWarnings("unused") - public static void tick(Level world, BlockPos pos, BlockState state, ColorPickerBlockEntity blockEntity) { - if (!world.isClientSide()) { - blockEntity.inkDirty = false; - if (!blockEntity.paused) { - boolean convertedPigment = false; - boolean shouldPause = true; - if (world.getGameTime() % TICKS_PER_CONVERSION == 0) { - convertedPigment = blockEntity.tryConvertPigmentToEnergy((ServerLevel) world); - } else { - shouldPause = false; - } - boolean filledContainer = blockEntity.tryFillInkContainer(); // that's an OR - - if (convertedPigment || filledContainer) { - blockEntity.updateInClientWorld(); - blockEntity.setInkDirty(); - blockEntity.setChanged(); - } else if (shouldPause) { - blockEntity.paused = true; - } - } - } - } - - @Override - public void loadAdditional(CompoundTag nbt, HolderLookup.Provider registryLookup) { - super.loadAdditional(nbt, registryLookup); - this.inventory = NonNullList.withSize(this.getContainerSize(), ItemStack.EMPTY); - if (!this.tryLoadLootTable(nbt)) { - ContainerHelper.loadAllItems(nbt, this.inventory, registryLookup); - } - CodecHelper.fromNbt(InkStorageComponent.CODEC, nbt.get("InkStorage")).ifPresent(storage -> this.inkStorage = new TotalCappedInkStorage(storage.maxEnergyTotal(), storage.storedEnergy())); - this.ownerUUID = PlayerOwnedWithName.readOwnerUUID(nbt); - if (nbt.contains("SelectedColor", Tag.TAG_STRING)) { - this.selectedColor = Optional.of(SpectrumRegistries.INK_COLOR.wrapAsHolder(InkColor.ofIdString(nbt.getString("SelectedColor")).get())); - } else { - this.selectedColor = Optional.empty(); - } - } - - @Override - protected void saveAdditional(CompoundTag nbt, HolderLookup.Provider registryLookup) { - super.saveAdditional(nbt, registryLookup); - if (!this.trySaveLootTable(nbt)) { - ContainerHelper.saveAllItems(nbt, this.inventory, registryLookup); - } - CodecHelper.writeNbt(nbt, "InkStorage", InkStorageComponent.CODEC, new InkStorageComponent(this.inkStorage)); - PlayerOwned.writeOwnerUUID(nbt, this.ownerUUID); - this.selectedColor.ifPresent(color -> nbt.putString("SelectedColor", color.getRegisteredName())); - } - - @Override - protected Component getDefaultName() { - return Component.translatable("block.spectrum.color_picker"); - } - - @Override - protected AbstractContainerMenu createMenu(int syncId, Inventory playerInventory) { - return new ColorPickerScreenHandler(syncId, playerInventory, playerInventory.player.level().getBlockEntity(new ColorPickerScreenHandler.ScreenOpeningData(this.worldPosition, this.selectedColor).pos(), SpectrumBlockEntities.COLOR_PICKER.get()).orElseThrow(), new ColorPickerScreenHandler.ScreenOpeningData(this.worldPosition, this.selectedColor).inkColor()); - } - - @Override - public void writeClientSideData(AbstractContainerMenu menu, RegistryFriendlyByteBuf buffer) { - ColorPickerScreenHandler.ScreenOpeningData.PACKET_CODEC.encode(buffer, new ColorPickerScreenHandler.ScreenOpeningData(this.worldPosition, this.selectedColor)); - } - - @Override - public UUID getOwnerUUID() { - return this.ownerUUID; - } - - @Override - public void setOwner(Player playerEntity) { - this.ownerUUID = playerEntity.getUUID(); - setChanged(); - } - - @Override - public TotalCappedInkStorage getEnergyStorage() { - return inkStorage; - } - - @Override - public void setInkDirty() { - this.inkDirty = true; - } - - @Override - public boolean getInkDirty() { - return inkDirty; - } - - @Override - protected NonNullList getItems() { - return this.inventory; - } - - @Override - protected void setItems(NonNullList list) { - this.inventory = list; - this.paused = false; - updateInClientWorld(); - } - - @Override - public ItemStack removeItem(int slot, int amount) { - ItemStack itemStack = super.removeItem(slot, amount); - this.paused = false; - updateInClientWorld(); - return itemStack; - } - - @Override - public ItemStack removeItemNoUpdate(int slot) { - ItemStack itemStack = super.removeItemNoUpdate(slot); - this.paused = false; - updateInClientWorld(); - return itemStack; - } - - @Override - public void setItem(int slot, ItemStack stack) { - super.setItem(slot, stack); - this.paused = false; - updateInClientWorld(); - } - - @Override - public int getContainerSize() { - return INVENTORY_SIZE; - } - - protected boolean tryConvertPigmentToEnergy(ServerLevel world) { - InkConvertingRecipe recipe = getInkConvertingRecipe(world); - if (recipe != null) { - InkColor inkColor = recipe.getInkColor(); - long amount = recipe.getInkAmount(); - if (amount <= this.inkStorage.getRoom(inkColor)) { - inventory.get(INPUT_SLOT_ID).shrink(1); - this.inkStorage.addEnergy(inkColor, amount); - - if (SpectrumConfig.CONFIG.BlockSoundVolume.get() > 0) { - world.playSound(null, worldPosition, SpectrumSoundEvents.COLOR_PICKER_PROCESSING, SoundSource.BLOCKS, SpectrumConfig.CONFIG.BlockSoundVolume.get().floatValue() / 3F, 1.0F); - } - PlayParticleWithRandomOffsetAndVelocityPayload.playParticleWithRandomOffsetAndVelocity(world, - new Vec3(worldPosition.getX() + 0.5, worldPosition.getY() + 0.7, worldPosition.getZ() + 0.5), - ColoredFluidRisingParticleEffect.of(inkColor.getColorInt()), - 5, - new Vec3(0.22, 0.0, 0.22), - new Vec3(0.0, 0.1, 0.0) - ); - - return true; - } - } - return false; - } - - protected @Nullable InkConvertingRecipe getInkConvertingRecipe(Level world) { - // is the current stack empty? - ItemStack inputStack = inventory.get(INPUT_SLOT_ID); - if (inputStack.isEmpty()) { - this.cachedRecipe = null; - return null; - } - - // does the cached recipe match? - if (this.cachedRecipe != null) { - if (this.cachedRecipe.getIngredients().get(INPUT_SLOT_ID).test(inputStack)) { - return this.cachedRecipe; - } - } - - // search matching recipe - Optional> recipe = world.getRecipeManager().getRecipeFor(SpectrumRecipeTypes.INK_CONVERTING, new SingleRecipeInput(inventory.get(INPUT_SLOT_ID)), world); - if (recipe.isPresent()) { - this.cachedRecipe = recipe.get().value(); - return this.cachedRecipe; - } else { - this.cachedRecipe = null; - return null; - } - } - - protected boolean tryFillInkContainer() { - long transferredAmount = 0; - - ItemStack stack = inventory.get(OUTPUT_SLOT_ID); - if (stack.getItem() instanceof InkStorageItem inkStorageItem) { - InkStorage itemStorage = inkStorageItem.getEnergyStorage(stack); - - ServerPlayer owner = null; - if (getOwnerIfOnline(this.getLevel()) instanceof ServerPlayer serverPlayerEntity) { - owner = serverPlayerEntity; - } - - if (this.selectedColor.isEmpty()) { - for (InkColor color : InkColors.all()) { - transferredAmount += tryTransferInk(owner, stack, itemStorage, color); - } - } else { - transferredAmount = tryTransferInk(owner, stack, itemStorage, this.selectedColor.get().value()); - } - - if (transferredAmount > 0) { - inkStorageItem.setEnergyStorage(stack, itemStorage); - } - } - - return transferredAmount > 0; - } - - private long tryTransferInk(ServerPlayer owner, ItemStack stack, InkStorage itemStorage, InkColor color) { - long amount = InkStorage.transferInk(this.inkStorage, itemStorage, color); - if (amount > 0 && owner != null) { - SpectrumAdvancementCriteria.INK_CONTAINER_INTERACTION.trigger(owner, stack, itemStorage, color, amount); - } - return amount; - } - - public void setSelectedColor(Optional> inkColor) { - this.selectedColor = inkColor; - this.paused = false; - this.setChanged(); - } - - public Optional> getSelectedColor() { - return this.selectedColor; - } - - // Called when the chunk is first loaded to initialize this be - @Override - public CompoundTag getUpdateTag(HolderLookup.Provider registryLookup) { - CompoundTag nbtCompound = new CompoundTag(); - this.saveAdditional(nbtCompound, registryLookup); - return nbtCompound; - } - - @Override - public @Nullable Packet getUpdatePacket() { - return ClientboundBlockEntityDataPacket.create(this); - } - - public void updateInClientWorld() { - if (level != null) { - level.sendBlockUpdated(worldPosition, level.getBlockState(worldPosition), level.getBlockState(worldPosition), Block.UPDATE_INVISIBLE); - } - } - - @Override - public boolean canPlaceItem(int slot, ItemStack stack) { - if (slot == INPUT_SLOT_ID) { - return InkConvertingRecipe.isInput(stack.getItem()); - } - if (slot == OUTPUT_SLOT_ID) { - return stack.getItem() instanceof InkStorageItem; - } - return true; - } - -} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/energy/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/energy/package-info.java deleted file mode 100644 index 651a7ad5b3..0000000000 --- a/src/main/java/de/dafuqs/spectrum/blocks/energy/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@NullMarked -@MethodsReturnNonnullByDefault -@FieldsAreNonnullByDefault -package de.dafuqs.spectrum.blocks.energy; - -import net.minecraft.*; -import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/farming/SpectrumFarmlandBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/farming/SpectrumFarmlandBlock.java index 9f18b8627d..78f2708f92 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/farming/SpectrumFarmlandBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/farming/SpectrumFarmlandBlock.java @@ -10,7 +10,8 @@ import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.gameevent.*; -import org.jspecify.annotations.Nullable; +import net.neoforged.neoforge.common.*; +import org.jspecify.annotations.*; public class SpectrumFarmlandBlock extends FarmBlock { @@ -68,17 +69,18 @@ public void setBare(@Nullable Entity entity, BlockState state, Level world, Bloc } public static boolean shouldMaintainFarmland(BlockGetter world, BlockPos pos) { - Block block = world.getBlockState(pos.above()).getBlock(); - return block instanceof CropBlock || block instanceof StemBlock || block instanceof AttachedStemBlock; + return world.getBlockState(pos.above()).is(BlockTags.MAINTAINS_FARMLAND); } - protected boolean isNearWater(LevelReader world, BlockPos pos) { - for (BlockPos testPos : BlockPos.betweenClosed(pos.offset(-4, 0, -4), pos.offset(4, 1, 4))) { - if (world.getFluidState(testPos).is(FluidTags.WATER)) { + protected boolean isNearWater(LevelReader level, BlockPos pos) { + BlockState state = level.getBlockState(pos); + for (BlockPos blockpos : BlockPos.betweenClosed(pos.offset(-4, 0, -4), pos.offset(4, 1, 4))) { + if (state.canBeHydrated(level, pos, level.getFluidState(blockpos), blockpos)) { return true; } } - return false; + + return FarmlandWaterManager.hasBlockWaterTicket(level, pos); } } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/farming/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/farming/package-info.java index 2b952f51ce..b88f19a7a7 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/farming/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/farming/package-info.java @@ -3,6 +3,5 @@ @FieldsAreNonnullByDefault package de.dafuqs.spectrum.blocks.farming; -import net.minecraft.FieldsAreNonnullByDefault; -import net.minecraft.MethodsReturnNonnullByDefault; -import org.jspecify.annotations.NullMarked; +import net.minecraft.*; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableBlock.java index 236a399c30..fc40196352 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableBlock.java @@ -4,7 +4,6 @@ import net.minecraft.world.level.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; -import javax.annotation.*; public class FlammableBlock extends Block { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableCarpetBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableCarpetBlock.java index cb3a3bd76d..d8479f405e 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableCarpetBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableCarpetBlock.java @@ -4,7 +4,6 @@ import net.minecraft.world.level.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; -import javax.annotation.*; public class FlammableCarpetBlock extends CarpetBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableFenceBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableFenceBlock.java index b13139354c..4db41824fd 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableFenceBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableFenceBlock.java @@ -1,10 +1,9 @@ package de.dafuqs.spectrum.blocks.flammable; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.world.level.BlockGetter; +import net.minecraft.core.*; +import net.minecraft.world.level.*; import net.minecraft.world.level.block.*; -import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.*; public class FlammableFenceBlock extends FenceBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableFenceGateBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableFenceGateBlock.java index 8609f0ff03..37ce67514f 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableFenceGateBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableFenceGateBlock.java @@ -1,10 +1,9 @@ package de.dafuqs.spectrum.blocks.flammable; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.world.level.BlockGetter; +import net.minecraft.core.*; +import net.minecraft.world.level.*; import net.minecraft.world.level.block.*; -import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.block.state.properties.*; public class FlammableFenceGateBlock extends FenceGateBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableFlowerBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableFlowerBlock.java index 07523c5ad1..a4e4341c2f 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableFlowerBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableFlowerBlock.java @@ -5,7 +5,6 @@ import net.minecraft.world.level.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; -import javax.annotation.*; public class FlammableFlowerBlock extends FlowerBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableLeavesBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableLeavesBlock.java index 64fbdf0e5c..2820863c2a 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableLeavesBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableLeavesBlock.java @@ -4,7 +4,6 @@ import net.minecraft.world.level.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; -import javax.annotation.*; public class FlammableLeavesBlock extends LeavesBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableLogBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableLogBlock.java index 2a18aa7dd9..93ba99e487 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableLogBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableLogBlock.java @@ -7,7 +7,7 @@ import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; import net.neoforged.neoforge.common.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.function.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammablePlankBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammablePlankBlock.java index 1ae8b5cf60..86fb8febb9 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammablePlankBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammablePlankBlock.java @@ -4,7 +4,6 @@ import net.minecraft.world.level.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; -import javax.annotation.*; public class FlammablePlankBlock extends Block { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableRedstoneLampBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableRedstoneLampBlock.java index 976661bc0d..ed1fa61685 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableRedstoneLampBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableRedstoneLampBlock.java @@ -4,7 +4,6 @@ import net.minecraft.world.level.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; -import javax.annotation.*; public class FlammableRedstoneLampBlock extends RedstoneLampBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableRotatedPillarBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableRotatedPillarBlock.java index 37747ee4fe..59bfdb7952 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableRotatedPillarBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableRotatedPillarBlock.java @@ -1,13 +1,11 @@ package de.dafuqs.spectrum.blocks.flammable; -import com.mojang.serialization.MapCodec; +import com.mojang.serialization.*; import net.minecraft.core.*; import net.minecraft.world.level.*; -import net.minecraft.world.level.block.RotatedPillarBlock; -import net.minecraft.world.level.block.state.BlockState; -import org.jspecify.annotations.Nullable; - -import javax.annotation.*; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.state.*; +import org.jspecify.annotations.*; public class FlammableRotatedPillarBlock extends RotatedPillarBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableSlabBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableSlabBlock.java index 723a7cf880..39899796a6 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableSlabBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableSlabBlock.java @@ -1,10 +1,9 @@ package de.dafuqs.spectrum.blocks.flammable; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.world.level.BlockGetter; +import net.minecraft.core.*; +import net.minecraft.world.level.*; import net.minecraft.world.level.block.*; -import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.*; public class FlammableSlabBlock extends SlabBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableStairBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableStairBlock.java index 9b971b90aa..61a8565fe5 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableStairBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/flammable/FlammableStairBlock.java @@ -1,10 +1,9 @@ package de.dafuqs.spectrum.blocks.flammable; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.world.level.BlockGetter; +import net.minecraft.core.*; +import net.minecraft.world.level.*; import net.minecraft.world.level.block.*; -import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.*; public class FlammableStairBlock extends StairBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/flammable/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/flammable/package-info.java index 7f647523a7..84d35790d1 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/flammable/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/flammable/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.flammable; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/fluid/DragonrotFluid.java b/src/main/java/de/dafuqs/spectrum/blocks/fluid/DragonrotFluid.java index 08a6d22f25..eb1a1bd9f4 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/fluid/DragonrotFluid.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/fluid/DragonrotFluid.java @@ -19,7 +19,6 @@ import net.minecraft.world.level.block.state.properties.*; import net.minecraft.world.level.material.*; import net.neoforged.neoforge.fluids.*; -import javax.annotation.*; public abstract class DragonrotFluid extends SpectrumFluid { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/fluid/DragonrotFluidBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/fluid/DragonrotFluidBlock.java index acb437ffae..8aeba74317 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/fluid/DragonrotFluidBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/fluid/DragonrotFluidBlock.java @@ -12,7 +12,7 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.material.*; import net.minecraft.world.level.pathfinder.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class DragonrotFluidBlock extends SpectrumFluidBlock { @@ -55,12 +55,10 @@ public boolean isPathfindable(BlockState state, PathComputationType type) { return SpectrumBlocks.SLUSH.get().defaultBlockState(); } else if (otherState.is(FluidTags.LAVA)) { return Blocks.TERRACOTTA.defaultBlockState(); - } else if (otherState.is(SpectrumFluidTags.SLUDGE)) { - return direction == Direction.DOWN ? SpectrumBlocks.BLACKSLAG.get().defaultBlockState() : SpectrumBlocks.COBBLED_BLACKSLAG.get().defaultBlockState(); } else if (otherState.is(SpectrumFluidTags.LIQUID_CRYSTAL)) { return Blocks.TUFF.defaultBlockState(); } else if (otherState.is(SpectrumFluidTags.MIDNIGHT_SOLUTION)) { - return SpectrumBlocks.ROTTEN_GROUND.get().defaultBlockState(); + return Blocks.MUD.defaultBlockState(); } return null; } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/fluid/LiquidCrystalFluid.java b/src/main/java/de/dafuqs/spectrum/blocks/fluid/LiquidCrystalFluid.java index f33278f335..a2be88501f 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/fluid/LiquidCrystalFluid.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/fluid/LiquidCrystalFluid.java @@ -20,7 +20,6 @@ import net.minecraft.world.level.block.state.properties.*; import net.minecraft.world.level.material.*; import net.neoforged.neoforge.fluids.*; -import javax.annotation.*; public abstract class LiquidCrystalFluid extends SpectrumFluid { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/fluid/LiquidCrystalFluidBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/fluid/LiquidCrystalFluidBlock.java index f7002d636d..36bee52395 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/fluid/LiquidCrystalFluidBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/fluid/LiquidCrystalFluidBlock.java @@ -11,7 +11,7 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.material.*; import net.minecraft.world.level.pathfinder.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class LiquidCrystalFluidBlock extends SpectrumFluidBlock { @@ -51,11 +51,9 @@ public void animateTick(BlockState state, Level world, BlockPos pos, RandomSourc @Override public @Nullable BlockState handleFluidCollision(Level world, FluidState state, FluidState otherState, Direction direction) { if (otherState.is(FluidTags.WATER)) { - return state.isSource() && direction != Direction.DOWN ? SpectrumBlocks.FROSTBITE_CRYSTAL.get().defaultBlockState() : Blocks.CALCITE.defaultBlockState(); + return state.isSource() && direction != Direction.DOWN ? SpectrumBlocks.FROSTBITE_CRYSTAL.get().defaultBlockState() : Blocks.CLAY.defaultBlockState(); } else if (otherState.is(FluidTags.LAVA)) { - return state.isSource() && direction != Direction.DOWN ? SpectrumBlocks.BLAZING_CRYSTAL.get().defaultBlockState() : Blocks.COBBLED_DEEPSLATE.defaultBlockState(); - } else if (otherState.is(SpectrumFluidTags.SLUDGE)) { - return Blocks.CLAY.defaultBlockState(); + return state.isSource() && direction != Direction.DOWN ? SpectrumBlocks.BLAZING_CRYSTAL.get().defaultBlockState() : Blocks.CALCITE.defaultBlockState(); } return null; } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/fluid/MidnightSolutionFluid.java b/src/main/java/de/dafuqs/spectrum/blocks/fluid/MidnightSolutionFluid.java index 66526a550c..ea8244bf17 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/fluid/MidnightSolutionFluid.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/fluid/MidnightSolutionFluid.java @@ -27,7 +27,6 @@ import net.minecraft.world.level.material.*; import net.minecraft.world.phys.*; import net.neoforged.neoforge.fluids.*; -import javax.annotation.*; public abstract class MidnightSolutionFluid extends SpectrumFluid { @@ -159,7 +158,8 @@ private static void disenchantItemAndSpawnXP(Level world, ItemEntity itemEntity) if (!enchantments.isEmpty()) { int randomEnchantmentIndex = world.getRandom().nextInt(enchantments.size()); Object2IntMap.Entry> entryToRemove = enchantments.entrySet().stream().toList().get(randomEnchantmentIndex); - Tuple result = SpectrumEnchantmentHelper.removeEnchantments(itemStack, entryToRemove.getKey()); + // we copy the stack and call `setItem` so the clients get updated + Tuple result = SpectrumEnchantmentHelper.removeEnchantments(itemStack.copy(), entryToRemove.getKey()); if (result.getB() > 0) { spawnXP(world, itemEntity, EnchanterBlockEntity.getEnchantingPrice(itemStack, entryToRemove.getKey(), entryToRemove.getIntValue())); @@ -179,12 +179,15 @@ private static void disenchantItemAndSpawnXP(Level world, ItemEntity itemEntity) spawnXP(world, itemEntity, EnchanterBlockEntity.getEnchantingPrice(boundItem.getDefaultInstance(), entryToRemove.getKey(), entryToRemove.getIntValue())); ItemEnchantments targetEnchants = builder.toImmutable(); + // we copy the stack and call `setItem` so the clients get updated + ItemStack newStack = itemStack.copy(); if (targetEnchants.isEmpty()) { - itemStack.remove(SpectrumDataComponentTypes.CANVAS_ENCHANTMENTS); - itemStack.remove(SpectrumDataComponentTypes.BOUND_ITEM); + newStack.remove(SpectrumDataComponentTypes.CANVAS_ENCHANTMENTS); + newStack.remove(SpectrumDataComponentTypes.BOUND_ITEM); } else { - itemStack.set(SpectrumDataComponentTypes.CANVAS_ENCHANTMENTS, targetEnchants); + newStack.set(SpectrumDataComponentTypes.CANVAS_ENCHANTMENTS, targetEnchants); } + itemEntity.setItem(newStack); itemEntity.setDefaultPickUpDelay(); } } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/fluid/MidnightSolutionFluidBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/fluid/MidnightSolutionFluidBlock.java index a07f1076e0..d76d6621a2 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/fluid/MidnightSolutionFluidBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/fluid/MidnightSolutionFluidBlock.java @@ -14,7 +14,7 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.material.*; import net.minecraft.world.level.pathfinder.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class MidnightSolutionFluidBlock extends SpectrumFluidBlock { @@ -111,7 +111,6 @@ public boolean shouldSpreadLiquid(Level world, BlockPos pos, BlockState state) { @Override public @Nullable BlockState handleFluidCollision(Level world, FluidState state, FluidState otherState, Direction direction) { if (otherState.is(FluidTags.LAVA)) return Blocks.BLACKSTONE.defaultBlockState(); - if (otherState.is(SpectrumFluidTags.SLUDGE)) return SpectrumBlocks.BLACK_SLUDGE.get().defaultBlockState(); return null; } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/fluid/SludgeFluid.java b/src/main/java/de/dafuqs/spectrum/blocks/fluid/SludgeFluid.java deleted file mode 100644 index 4b0d09be25..0000000000 --- a/src/main/java/de/dafuqs/spectrum/blocks/fluid/SludgeFluid.java +++ /dev/null @@ -1,157 +0,0 @@ -package de.dafuqs.spectrum.blocks.fluid; - -import de.dafuqs.spectrum.particle.*; -import de.dafuqs.spectrum.recipe.fluid_converting.*; -import de.dafuqs.spectrum.registries.*; -import net.minecraft.core.*; -import net.minecraft.core.particles.*; -import net.minecraft.sounds.*; -import net.minecraft.util.*; -import net.minecraft.world.effect.*; -import net.minecraft.world.entity.*; -import net.minecraft.world.item.*; -import net.minecraft.world.item.crafting.*; -import net.minecraft.world.level.*; -import net.minecraft.world.level.block.state.*; -import net.minecraft.world.level.block.state.properties.*; -import net.minecraft.world.level.material.*; -import net.minecraft.world.level.pathfinder.*; -import net.neoforged.neoforge.fluids.*; -import javax.annotation.*; - -public abstract class SludgeFluid extends SpectrumFluid { - - @Override - public FluidType getFluidType() { - return SpectrumFluids.SLUDGE_TYPE.get(); - } - - @Override - public Fluid getSource() { - return SpectrumFluids.SLUDGE.get(); - } - - @Override - public Fluid getFlowing() { - return SpectrumFluids.FLOWING_SLUDGE.get(); - } - - @Override - public Item getBucket() { - return SpectrumItems.SLUDGE_BUCKET.get(); - } - - @Override - protected BlockState createLegacyBlock(FluidState fluidState) { - return SpectrumBlocks.SLUDGE.get().defaultBlockState().setValue(BlockStateProperties.LEVEL, getLegacyLevel(fluidState)); - } - - @Override - public boolean isSame(Fluid fluid) { - return fluid == SpectrumFluids.SLUDGE.get() || fluid == SpectrumFluids.FLOWING_SLUDGE.get(); - } - - @Override - protected boolean canConvertToSource(Level level) { - return level.getGameRules().getBoolean(SpectrumGameRules.RULE_SLUDGE_SOURCE_CONVERSION); - } - - @Override - public void animateTick(Level world, BlockPos pos, FluidState state, RandomSource random) { - BlockPos topPos = pos.above(); - BlockState topState = world.getBlockState(topPos); - if (topState.isAir() && !topState.isSolidRender(world, topPos) && random.nextInt(1000) == 0) { - world.playLocalSound(pos.getX(), pos.getY(), pos.getZ(), SpectrumSoundEvents.SLUDGE_AMBIENT, SoundSource.BLOCKS, 0.2F + random.nextFloat() * 0.2F, 0.9F + random.nextFloat() * 0.15F, false); - } - } - - @Override - protected int getSlopeFindDistance(LevelReader worldView) { - return 1; - } - - @Override - protected int getDropOff(LevelReader worldView) { - return 3; - } - - @Override - public int getTickDelay(LevelReader worldView) { - return 50; - } - - @Override - public ParticleOptions getDripParticle() { - return SpectrumParticleTypes.DRIPPING_SLUDGE; - } - - @Override - public ParticleOptions getSplashParticle() { - return SpectrumParticleTypes.SLUDGE_SPLASH; - } - - @Override - public RecipeType getDippingRecipeType() { - return SpectrumRecipeTypes.SLUDGE_CONVERTING; - } - - /** - * Entities colliding with sludge will get a slowness effect - * and losing their breath far quicker - */ - @Override - public void onEntityCollision(BlockState state, Level world, BlockPos pos, Entity entity) { - super.onEntityCollision(state, world, pos, entity); - - if (!world.isClientSide() && entity instanceof LivingEntity livingEntity) { - // the entity is hurt at air == -20 and then reset to air = 0 - // this way the entity loses its breath way faster, but gets damaged just as slow afterwards - if (livingEntity.isEyeInFluidType(SpectrumFluids.SLUDGE_TYPE.get()) && world.getGameTime() % 2 == 0 && livingEntity.getAirSupply() > 0) { - livingEntity.setAirSupply(livingEntity.getAirSupply() - 1); - } - - // just check every 20 ticks for performance - if (world.getGameTime() % 20 == 0) { - MobEffectInstance slownessInstance = livingEntity.getEffect(MobEffects.MOVEMENT_SLOWDOWN); - if (slownessInstance == null || slownessInstance.getDuration() < 20) { - MobEffectInstance newSlownessInstance = new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 60, 3); - livingEntity.addEffect(newSlownessInstance); - } - } - } - } - - public static class FlowingSludge extends SludgeFluid { - - @Override - protected void createFluidStateDefinition(StateDefinition.Builder builder) { - super.createFluidStateDefinition(builder); - builder.add(LEVEL); - } - - @Override - public int getAmount(FluidState fluidState) { - return fluidState.getValue(LEVEL); - } - - @Override - public boolean isSource(FluidState fluidState) { - return false; - } - - } - - public static class StillSludge extends SludgeFluid { - - @Override - public int getAmount(FluidState fluidState) { - return 8; - } - - @Override - public boolean isSource(FluidState fluidState) { - return true; - } - - } -} \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/blocks/fluid/SludgeFluidBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/fluid/SludgeFluidBlock.java deleted file mode 100644 index d25072becb..0000000000 --- a/src/main/java/de/dafuqs/spectrum/blocks/fluid/SludgeFluidBlock.java +++ /dev/null @@ -1,61 +0,0 @@ -package de.dafuqs.spectrum.blocks.fluid; - -import de.dafuqs.spectrum.particle.*; -import net.minecraft.core.*; -import net.minecraft.core.particles.*; -import net.minecraft.tags.*; -import net.minecraft.util.*; -import net.minecraft.world.level.*; -import net.minecraft.world.level.block.*; -import net.minecraft.world.level.block.state.*; -import net.minecraft.world.level.material.*; -import net.minecraft.world.level.pathfinder.*; -import org.jspecify.annotations.Nullable; - -public class SludgeFluidBlock extends SpectrumFluidBlock { - - public SludgeFluidBlock(SpectrumFluid fluid, BlockState ultrawarmReplacementBlockState, Properties settings) { - super(fluid, ultrawarmReplacementBlockState, settings); - } - -// @Override -// public MapCodec getCodec() { -// //TODO: Make the codec -// return null; -// } - - @Override - public SimpleParticleType getSplashParticle() { - return SpectrumParticleTypes.SLUDGE_SPLASH; - } - - @Override - public Tuple getFishingParticles() { - return new Tuple<>(SpectrumParticleTypes.SLUDGE_POP, SpectrumParticleTypes.SLUDGE_FISHING); - } - - @Override - public void animateTick(BlockState state, Level world, BlockPos pos, RandomSource random) { - super.animateTick(state, world, pos, random); - if (!world.getBlockState(pos.above()).isRedstoneConductor(world, pos.above()) && random.nextFloat() < 0.03F) { - world.addParticle(SpectrumParticleTypes.SLUDGE_POP, pos.getX() + random.nextDouble(), pos.getY() + 1, pos.getZ() + random.nextDouble(), 0, random.nextDouble() * 0.1, 0); - } - } - - @Override - public boolean isPathfindable(BlockState state, PathComputationType type) { - return true; - } - - @Override - public @Nullable BlockState handleFluidCollision(Level world, FluidState state, FluidState otherState, Direction direction) { - if (otherState.is(FluidTags.WATER)) { - return direction == Direction.DOWN ? Blocks.COARSE_DIRT.defaultBlockState() : Blocks.DIRT.defaultBlockState(); - } - if (otherState.is(FluidTags.LAVA)) { - return Blocks.MUD.defaultBlockState(); - } - return null; - } - -} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/fluid/SpectrumCauldronBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/fluid/SpectrumCauldronBlock.java index c44d93024d..632d2c54f2 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/fluid/SpectrumCauldronBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/fluid/SpectrumCauldronBlock.java @@ -7,19 +7,14 @@ import net.minecraft.world.level.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; -import net.minecraft.world.level.block.state.properties.*; -import net.minecraft.world.level.gameevent.*; -import net.minecraft.world.level.material.*; -import net.minecraft.world.phys.shapes.*; -import net.neoforged.neoforge.fluids.*; import java.util.function.*; public class SpectrumCauldronBlock extends AbstractCauldronBlock { - protected final Supplier fluidType; + protected final Supplier fluidType; - public SpectrumCauldronBlock(Supplier fluidType, CauldronInteraction.InteractionMap interactions, BlockBehaviour.Properties properties) { + public SpectrumCauldronBlock(Supplier fluidType, CauldronInteraction.InteractionMap interactions, BlockBehaviour.Properties properties) { super(properties, interactions); this.fluidType = fluidType; } @@ -37,11 +32,11 @@ public boolean isFull(BlockState p_153511_) { @Override protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) { if (this.isEntityInsideContent(state, pos, entity)) { - entity.clearFire(); + this.getFluidType().onEntityCollision(state, level, pos, entity); } } - protected FluidType getFluidType() { + protected SpectrumFluid getFluidType() { return fluidType.get(); } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/fluid/SpectrumFluid.java b/src/main/java/de/dafuqs/spectrum/blocks/fluid/SpectrumFluid.java index 5691d3c781..0a5269c81e 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/fluid/SpectrumFluid.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/fluid/SpectrumFluid.java @@ -17,7 +17,7 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.material.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/fluid/SpectrumFluidBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/fluid/SpectrumFluidBlock.java index 4b13ebe460..fab9993758 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/fluid/SpectrumFluidBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/fluid/SpectrumFluidBlock.java @@ -10,7 +10,7 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.material.*; import net.minecraft.world.level.pathfinder.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public abstract class SpectrumFluidBlock extends LiquidBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/fluid/SpectrumFluidType.java b/src/main/java/de/dafuqs/spectrum/blocks/fluid/SpectrumFluidType.java new file mode 100644 index 0000000000..bb936fe6d2 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/blocks/fluid/SpectrumFluidType.java @@ -0,0 +1,31 @@ +package de.dafuqs.spectrum.blocks.fluid; + +import net.minecraft.core.*; +import net.minecraft.world.level.*; +import net.minecraft.world.level.material.*; +import net.neoforged.neoforge.fluids.*; + +public abstract class SpectrumFluidType extends FluidType { + + protected final boolean isVaporized; + protected final GameRules.Key isInfiniteGameRule; + + public SpectrumFluidType(boolean isVaporized, GameRules.Key isInfiniteGameRule, Properties properties) { + super(properties); + this.isVaporized = isVaporized; + this.isInfiniteGameRule = isInfiniteGameRule; + } + + public boolean isVaporizedOnPlacement(Level level, BlockPos pos, FluidStack stack) { + return isVaporized && level.dimensionType().ultraWarm(); + } + + @Override + public boolean canConvertToSource(FluidState state, LevelReader reader, BlockPos pos) { + if (reader instanceof Level level) { + return level.getGameRules().getBoolean(this.isInfiniteGameRule); + } + return super.canConvertToSource(state, reader, pos); + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/fluid/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/fluid/package-info.java index e879c1f6bf..e2387daa5f 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/fluid/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/fluid/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.fluid; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/fusion_shrine/FusionShrineBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/fusion_shrine/FusionShrineBlock.java index 25645cc314..8e8bd408a9 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/fusion_shrine/FusionShrineBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/fusion_shrine/FusionShrineBlock.java @@ -32,7 +32,7 @@ import net.neoforged.neoforge.fluids.*; import net.neoforged.neoforge.fluids.capability.*; import net.neoforged.neoforge.fluids.capability.templates.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/fusion_shrine/FusionShrineBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/fusion_shrine/FusionShrineBlockEntity.java index 590c449924..f76365c018 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/fusion_shrine/FusionShrineBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/fusion_shrine/FusionShrineBlockEntity.java @@ -2,8 +2,8 @@ import de.dafuqs.spectrum.api.block.*; import de.dafuqs.spectrum.api.color.*; -import de.dafuqs.spectrum.api.energy.color.*; import de.dafuqs.spectrum.api.fluid.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.api.recipe.*; import de.dafuqs.spectrum.blocks.*; import de.dafuqs.spectrum.blocks.upgrade.*; @@ -30,7 +30,7 @@ import net.neoforged.neoforge.fluids.*; import net.neoforged.neoforge.fluids.capability.*; import net.neoforged.neoforge.fluids.capability.templates.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; @@ -65,7 +65,7 @@ public static void clientTick(Level world, BlockPos blockPos, BlockState blockSt if (!randomStack.isEmpty()) { Optional optionalItemColor = ColorRegistry.ITEM_COLORS.getInkColor(randomStack.getItem()); if (optionalItemColor.isPresent()) { - ParticleOptions particleEffect = ColoredCraftingParticleEffect.of(optionalItemColor.get().getColorInt()); + ParticleOptions particleEffect = ColoredCraftingParticleEffect.of(optionalItemColor.get().getColorARGB()); int particleAmount = (int) StrictMath.ceil(randomStack.getCount() / 8.0F); for (int i = 0; i < particleAmount; i++) { @@ -85,7 +85,7 @@ public void spawnCraftingParticles() { Fluid fluid = this.getTank().getFluid().getFluid(); Optional optionalFluidColor = ColorRegistry.FLUID_COLORS.getInkColor(fluid); if (optionalFluidColor.isPresent()) { - ParticleOptions particleEffect = ColoredFluidRisingParticleEffect.of(optionalFluidColor.get().getColorInt()); + ParticleOptions particleEffect = ColoredFluidRisingParticleEffect.of(optionalFluidColor.get().getColorARGB()); float randomX = 0.1F + level.getRandom().nextFloat() * 0.8F; float randomZ = 0.1F + level.getRandom().nextFloat() * 0.8F; @@ -103,74 +103,74 @@ public void scatterContents(Level world) { } @SuppressWarnings("unused") - public static void serverTick(Level world, BlockPos blockPos, BlockState blockState, FusionShrineBlockEntity fusionShrineBlockEntity) { - if (fusionShrineBlockEntity.upgrades == null) { - fusionShrineBlockEntity.calculateUpgrades(); + public static void serverTick(Level level, BlockPos pos, BlockState state, FusionShrineBlockEntity fusionShrine) { + if (fusionShrine.upgrades == null) { + fusionShrine.calculateUpgrades(level); } - if (fusionShrineBlockEntity.inventoryChanged) { - var previousRecipe = fusionShrineBlockEntity.currentRecipe; - fusionShrineBlockEntity.currentRecipe = calculateRecipe(world, fusionShrineBlockEntity); + if (fusionShrine.inventoryChanged) { + var previousRecipe = fusionShrine.currentRecipe; + fusionShrine.currentRecipe = calculateRecipe(level, fusionShrine); - if (!Objects.equals(fusionShrineBlockEntity.currentRecipe, previousRecipe)) { - fusionShrineBlockEntity.craftingTime = 0; - if (fusionShrineBlockEntity.currentRecipe == null) { - PlayBlockBoundSoundInstancePayload.sendCancelBlockBoundSoundInstance((ServerLevel) world, fusionShrineBlockEntity.worldPosition); + if (!Objects.equals(fusionShrine.currentRecipe, previousRecipe)) { + fusionShrine.craftingTime = 0; + if (fusionShrine.currentRecipe == null) { + PlayBlockBoundSoundInstancePayload.sendCancelBlockBoundSoundInstance((ServerLevel) level, fusionShrine.worldPosition); } else { - fusionShrineBlockEntity.craftingTimeTotal = (int) Math.ceil(fusionShrineBlockEntity.currentRecipe.value().getCraftingTime() / fusionShrineBlockEntity.upgrades.getEffectiveValue(Upgradeable.UpgradeType.SPEED)); + fusionShrine.craftingTimeTotal = (int) Math.ceil(fusionShrine.currentRecipe.value().getCraftingTime() / fusionShrine.upgrades.getEffectiveValue(Upgradeable.UpgradeType.SPEED)); } - fusionShrineBlockEntity.updateInClientWorld(); + fusionShrine.updateInClientWorld(); } - fusionShrineBlockEntity.inventoryChanged = false; + fusionShrine.inventoryChanged = false; } - var recipe = fusionShrineBlockEntity.currentRecipe; + var recipe = fusionShrine.currentRecipe; if (recipe == null) { return; } // check the crafting conditions from time to time // good for performance because of the many checks - if (fusionShrineBlockEntity.craftingTime % 60 == 0) { - Player lastInteractedPlayer = fusionShrineBlockEntity.getOwnerIfOnline(world); + if (fusionShrine.craftingTime % 60 == 0) { + Player lastInteractedPlayer = fusionShrine.getOwnerIfOnline(level); - boolean recipeConditionsMet = recipe.value().canPlayerCraft(lastInteractedPlayer) && recipe.value().areConditionMetCurrently((ServerLevel) world, blockPos); - boolean structureComplete = FusionShrineBlock.verifyStructure(world, blockPos, null); - boolean structureCompleteWithSky = FusionShrineBlock.verifySkyAccess((ServerLevel) world, blockPos) && structureComplete; + boolean recipeConditionsMet = recipe.value().canPlayerCraft(lastInteractedPlayer) && recipe.value().areConditionMetCurrently((ServerLevel) level, pos); + boolean structureComplete = FusionShrineBlock.verifyStructure(level, pos, null); + boolean structureCompleteWithSky = FusionShrineBlock.verifySkyAccess((ServerLevel) level, pos) && structureComplete; if (!recipeConditionsMet || !structureCompleteWithSky) { if (!structureCompleteWithSky) { - fusionShrineBlockEntity.scatterContents(world); + fusionShrine.scatterContents(level); } - fusionShrineBlockEntity.craftingTime = 0; + fusionShrine.craftingTime = 0; return; } } // advance crafting - ++fusionShrineBlockEntity.craftingTime; + ++fusionShrine.craftingTime; - if (fusionShrineBlockEntity.craftingTime == 1 && fusionShrineBlockEntity.craftingTimeTotal > 1) { - PlayBlockBoundSoundInstancePayload.sendPlayBlockBoundSoundInstance(SpectrumSoundEvents.FUSION_SHRINE_CRAFTING, (ServerLevel) world, fusionShrineBlockEntity.getBlockPos(), fusionShrineBlockEntity.craftingTimeTotal - fusionShrineBlockEntity.craftingTime); + if (fusionShrine.craftingTime == 1 && fusionShrine.craftingTimeTotal > 1) { + PlayBlockBoundSoundInstancePayload.sendPlayBlockBoundSoundInstance(SpectrumSoundEvents.FUSION_SHRINE_CRAFTING, (ServerLevel) level, fusionShrine.getBlockPos(), fusionShrine.craftingTimeTotal - fusionShrine.craftingTime); } // craft when enough ticks have passed - FusionShrineRecipeWorldEffect effect = recipe.value().getWorldEffectForTick(fusionShrineBlockEntity.craftingTime, fusionShrineBlockEntity.craftingTimeTotal); - if (fusionShrineBlockEntity.craftingTime == fusionShrineBlockEntity.craftingTimeTotal) { - craft(world, blockPos, fusionShrineBlockEntity, recipe); - fusionShrineBlockEntity.inventoryChanged(); + WorldEffect effect = recipe.value().getWorldEffectForTick(fusionShrine.craftingTime, fusionShrine.craftingTimeTotal); + if (fusionShrine.craftingTime == fusionShrine.craftingTimeTotal) { + craft(level, pos, fusionShrine, recipe); + fusionShrine.inventoryChanged(); } else { - PlayFusionCraftingInProgressParticlePayload.sendPlayFusionCraftingInProgressParticles((ServerLevel) world, blockPos); + PlayFusionCraftingInProgressParticlePayload.sendPlayFusionCraftingInProgressParticles((ServerLevel) level, pos); } // play the current crafting effect if (effect != null) { - effect.trigger((ServerLevel) world, blockPos); + effect.trigger((ServerLevel) level, pos); } - fusionShrineBlockEntity.setChanged(); + fusionShrine.setChanged(); } private static @Nullable RecipeHolder calculateRecipe(Level world, FusionShrineBlockEntity fusionShrineBlockEntity) { @@ -279,15 +279,8 @@ public void setOwner(Player playerEntity) { setChanged(); } - // UPGRADEABLE @Override - public void resetUpgrades() { - this.upgrades = null; - this.setChanged(); - } - - @Override - public void calculateUpgrades() { + public void calculateUpgrades(Level level) { this.upgrades = Upgradeable.calculateUpgradeMods4(level, worldPosition, 2, 0, this.ownerUUID); this.setChanged(); } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/fusion_shrine/FusionShrineBlockEntityRenderer.java b/src/main/java/de/dafuqs/spectrum/blocks/fusion_shrine/FusionShrineBlockEntityRenderer.java index 21038da2fb..e47cd8d8f5 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/fusion_shrine/FusionShrineBlockEntityRenderer.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/fusion_shrine/FusionShrineBlockEntityRenderer.java @@ -12,7 +12,6 @@ import net.neoforged.neoforge.client.extensions.common.*; import net.neoforged.neoforge.client.textures.*; import net.neoforged.neoforge.fluids.*; -import javax.annotation.*; import org.joml.Math; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/fusion_shrine/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/fusion_shrine/package-info.java index 600e035554..6b4a1467d7 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/fusion_shrine/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/fusion_shrine/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.fusion_shrine; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/gemstone/SpectrumBuddingBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/gemstone/SpectrumBuddingBlock.java index 5c4973a28a..81cdb43048 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/gemstone/SpectrumBuddingBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/gemstone/SpectrumBuddingBlock.java @@ -8,7 +8,7 @@ import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.material.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class SpectrumBuddingBlock extends SpectrumGemstoneBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/crystallarieum/SpectrumClusterBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/gemstone/SpectrumClusterBlock.java similarity index 94% rename from src/main/java/de/dafuqs/spectrum/blocks/crystallarieum/SpectrumClusterBlock.java rename to src/main/java/de/dafuqs/spectrum/blocks/gemstone/SpectrumClusterBlock.java index 0f434d9aef..60d44f699b 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/crystallarieum/SpectrumClusterBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/gemstone/SpectrumClusterBlock.java @@ -1,4 +1,4 @@ -package de.dafuqs.spectrum.blocks.crystallarieum; +package de.dafuqs.spectrum.blocks.gemstone; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/gemstone/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/gemstone/package-info.java index 2c314ef1cf..5d27d6dba1 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/gemstone/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/gemstone/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.gemstone; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/geology/AzuriteBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/geology/AzuriteBlock.java index 75f5869f01..8b15229886 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/geology/AzuriteBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/geology/AzuriteBlock.java @@ -3,15 +3,19 @@ import com.mojang.serialization.*; import de.dafuqs.spectrum.api.block.*; import de.dafuqs.spectrum.blocks.decoration.*; +import de.dafuqs.spectrum.helpers.*; +import de.dafuqs.spectrum.particle.*; import de.dafuqs.spectrum.sound.*; import net.minecraft.core.*; import net.minecraft.util.*; +import net.minecraft.world.entity.player.*; import net.minecraft.world.level.*; import net.minecraft.world.level.block.state.*; +import net.minecraft.world.phys.*; import net.neoforged.api.distmarker.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; -public class AzuriteBlock extends SpectrumFacingBlock implements AzureAuraEmitting { +public class AzuriteBlock extends SpectrumDirectionalBlock implements AzureAuraEmitting { public AzuriteBlock(Properties properties) { super(properties); @@ -30,4 +34,13 @@ public void animateTick(BlockState state, Level world, BlockPos pos, RandomSourc BlockAuraSoundInstance.addToExistingInstanceOrCreateNewOne(world, pos); } + @Override + public BlockState playerWillDestroy(Level world, BlockPos pos, BlockState state, Player player) { + if (world.isClientSide()) { + onBreak(world, pos); + } + + return super.playerWillDestroy(world, pos, state, player); + } + } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/geology/AzuriteOreBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/geology/AzuriteOreBlock.java index b2e5fe96f2..4a7ecf267c 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/geology/AzuriteOreBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/geology/AzuriteOreBlock.java @@ -50,14 +50,11 @@ public void stepOn(Level world, BlockPos pos, BlockState state, Entity entity) { @Override public BlockState playerWillDestroy(Level world, BlockPos pos, BlockState state, Player player) { - super.playerWillDestroy(world, pos, state, player); - if (world.isClientSide() && this.isVisibleTo(player)) { - ParticleHelper.playTriangulatedParticle(world, SpectrumParticleTypes.AZURE_AURA, 1, false, Vec3.ZERO, 0, true, Vec3.atCenterOf(pos), new Vec3(0, 0.08D + world.getRandom().nextDouble() * 0.04, 0)); - ParticleHelper.playParticleAroundBlockSides(world, SpectrumParticleTypes.AZURE_MOTE_SMALL, pos, Direction.values(), 3, Vec3.ZERO); + onBreak(world, pos); } - return state; + return super.playerWillDestroy(world, pos, state, player); } @Override diff --git a/src/main/java/de/dafuqs/spectrum/blocks/geology/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/geology/package-info.java index 8ddf2d3920..b5dba8bdac 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/geology/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/geology/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.geology; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/idols/AoEStatusEffectIdolBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/idols/AoEStatusEffectIdolBlock.java index 41cace17e7..8dd3e6dd07 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/idols/AoEStatusEffectIdolBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/idols/AoEStatusEffectIdolBlock.java @@ -10,7 +10,7 @@ import net.minecraft.world.item.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/idols/BonemealingIdolBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/idols/BonemealingIdolBlock.java index bdab80ac29..ac45f9bf8c 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/idols/BonemealingIdolBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/idols/BonemealingIdolBlock.java @@ -9,7 +9,7 @@ import net.minecraft.world.item.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/idols/EntitySummoningIdolBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/idols/EntitySummoningIdolBlock.java index 629cb55275..69b2010226 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/idols/EntitySummoningIdolBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/idols/EntitySummoningIdolBlock.java @@ -8,7 +8,7 @@ import net.minecraft.world.entity.*; import net.minecraft.world.item.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/idols/ExplosionIdolBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/idols/ExplosionIdolBlock.java index 6a314e0878..26e78a7540 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/idols/ExplosionIdolBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/idols/ExplosionIdolBlock.java @@ -9,7 +9,7 @@ import net.minecraft.world.item.*; import net.minecraft.world.level.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/idols/FallDamageNegatingIdolBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/idols/FallDamageNegatingIdolBlock.java index 1f6eb741ad..3be693e069 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/idols/FallDamageNegatingIdolBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/idols/FallDamageNegatingIdolBlock.java @@ -9,7 +9,7 @@ import net.minecraft.world.item.*; import net.minecraft.world.level.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/idols/FeedingIdolBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/idols/FeedingIdolBlock.java index 3dd66632ab..0f73a7c0d9 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/idols/FeedingIdolBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/idols/FeedingIdolBlock.java @@ -13,7 +13,7 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.gameevent.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/idols/FirestarterIdolBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/idols/FirestarterIdolBlock.java index 38869dc5a8..62e299bd35 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/idols/FirestarterIdolBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/idols/FirestarterIdolBlock.java @@ -17,7 +17,7 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.block.state.properties.*; import net.minecraft.world.level.gameevent.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/idols/FreezingIdolBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/idols/FreezingIdolBlock.java index 5ecd5c5ca8..c01c616071 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/idols/FreezingIdolBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/idols/FreezingIdolBlock.java @@ -11,7 +11,7 @@ import net.minecraft.world.item.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/idols/IdolBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/idols/IdolBlock.java index c6ac69793e..479358debe 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/idols/IdolBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/idols/IdolBlock.java @@ -18,7 +18,7 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.block.state.properties.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/idols/InsomniaIdolBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/idols/InsomniaIdolBlock.java index 20910a0467..3ecc0080de 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/idols/InsomniaIdolBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/idols/InsomniaIdolBlock.java @@ -13,7 +13,7 @@ import net.minecraft.world.entity.monster.*; import net.minecraft.world.item.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/idols/KnockbackIdolBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/idols/KnockbackIdolBlock.java index ae56dc43e0..9ddae713a8 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/idols/KnockbackIdolBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/idols/KnockbackIdolBlock.java @@ -8,7 +8,7 @@ import net.minecraft.world.entity.*; import net.minecraft.world.item.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/idols/LineTeleportingIdolBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/idols/LineTeleportingIdolBlock.java index 5b4b994cc8..a71b32da4f 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/idols/LineTeleportingIdolBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/idols/LineTeleportingIdolBlock.java @@ -9,7 +9,7 @@ import net.minecraft.world.item.*; import net.minecraft.world.level.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/idols/MilkingIdolBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/idols/MilkingIdolBlock.java index 29e57a4334..a46a835bc0 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/idols/MilkingIdolBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/idols/MilkingIdolBlock.java @@ -16,7 +16,7 @@ import net.minecraft.world.item.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/idols/PiglinTradeIdolBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/idols/PiglinTradeIdolBlock.java index 88f36a6c4a..172b52f915 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/idols/PiglinTradeIdolBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/idols/PiglinTradeIdolBlock.java @@ -14,7 +14,7 @@ import net.minecraft.world.level.storage.loot.*; import net.minecraft.world.level.storage.loot.parameters.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/idols/ProjectileIdolBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/idols/ProjectileIdolBlock.java index d8d009d925..74ccb15448 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/idols/ProjectileIdolBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/idols/ProjectileIdolBlock.java @@ -13,7 +13,7 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.*; import net.minecraft.world.phys.shapes.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/idols/RandomTeleportingIdolBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/idols/RandomTeleportingIdolBlock.java index ffb35c3b47..d9828b27d9 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/idols/RandomTeleportingIdolBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/idols/RandomTeleportingIdolBlock.java @@ -10,7 +10,7 @@ import net.minecraft.world.entity.*; import net.minecraft.world.item.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/idols/ShearingIdolBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/idols/ShearingIdolBlock.java index e63f047cc6..b4650c5c25 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/idols/ShearingIdolBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/idols/ShearingIdolBlock.java @@ -10,7 +10,7 @@ import net.minecraft.world.item.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/idols/SilverfishInsertingIdolBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/idols/SilverfishInsertingIdolBlock.java index a571a2496e..256009c778 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/idols/SilverfishInsertingIdolBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/idols/SilverfishInsertingIdolBlock.java @@ -9,7 +9,7 @@ import net.minecraft.world.item.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/idols/SlimeSizingIdolBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/idols/SlimeSizingIdolBlock.java index 7f1bc40b1b..7763815c56 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/idols/SlimeSizingIdolBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/idols/SlimeSizingIdolBlock.java @@ -13,7 +13,7 @@ import net.minecraft.world.item.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/idols/StatusEffectIdolBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/idols/StatusEffectIdolBlock.java index 05ffb790f5..5639ee9f6d 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/idols/StatusEffectIdolBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/idols/StatusEffectIdolBlock.java @@ -9,7 +9,7 @@ import net.minecraft.world.entity.*; import net.minecraft.world.item.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/idols/VillagerConvertingIdolBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/idols/VillagerConvertingIdolBlock.java index c5f92805b4..35c54ce8e7 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/idols/VillagerConvertingIdolBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/idols/VillagerConvertingIdolBlock.java @@ -11,7 +11,7 @@ import net.minecraft.world.entity.npc.*; import net.minecraft.world.item.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/idols/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/idols/package-info.java index 09b9a875de..ae0de17291 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/idols/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/idols/package-info.java @@ -3,6 +3,5 @@ @FieldsAreNonnullByDefault package de.dafuqs.spectrum.blocks.idols; -import net.minecraft.FieldsAreNonnullByDefault; -import net.minecraft.MethodsReturnNonnullByDefault; -import org.jspecify.annotations.NullMarked; +import net.minecraft.*; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/ink/BaseInkBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/ink/BaseInkBlock.java new file mode 100644 index 0000000000..d2d012b041 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/blocks/ink/BaseInkBlock.java @@ -0,0 +1,109 @@ +package de.dafuqs.spectrum.blocks.ink; + +import de.dafuqs.spectrum.helpers.*; +import net.minecraft.core.*; +import net.minecraft.util.*; +import net.minecraft.world.*; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.player.*; +import net.minecraft.world.item.*; +import net.minecraft.world.item.context.*; +import net.minecraft.world.level.*; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.entity.*; +import net.minecraft.world.level.block.state.*; +import net.minecraft.world.level.pathfinder.*; +import net.minecraft.world.phys.*; +import net.minecraft.world.phys.shapes.*; +import org.jspecify.annotations.*; + +public abstract class BaseInkBlock extends HorizontalDirectionalBlock implements EntityBlock { + + protected static final VoxelShape SHAPE = Block.box(1.0D, 0.0D, 1.0D, 15.0D, 13.0D, 15.0D); + + public BaseInkBlock(Properties settings) { + super(settings); + } + + @Override + public RenderShape getRenderShape(BlockState state) { + return RenderShape.MODEL; + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { + return SHAPE; + } + + @Override + public boolean isPathfindable(BlockState state, PathComputationType type) { + return false; + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(FACING); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + return this.defaultBlockState().setValue(FACING, ctx.getHorizontalDirection().getOpposite()); + } + + @Override + public InteractionResult useWithoutItem(BlockState state, Level world, BlockPos pos, Player player, BlockHitResult hit) { + if (world.isClientSide()) { + return InteractionResult.SUCCESS; + } else { + BlockEntity blockEntity = world.getBlockEntity(pos); + if (blockEntity instanceof BaseInkBlockEntity inkBlockEntity) { + inkBlockEntity.setOwner(player); + player.openMenu(inkBlockEntity); + } + return InteractionResult.CONSUME; + } + } + + @Override + public void setPlacedBy(Level world, BlockPos pos, BlockState state, LivingEntity placer, ItemStack itemStack) { + BlockEntity blockEntity = world.getBlockEntity(pos); + if (blockEntity instanceof BaseInkBlockEntity inkBlockEntity) { + if (placer instanceof Player player) { + inkBlockEntity.setOwner(player); + } + } + } + + @Override + public boolean hasAnalogOutputSignal(BlockState state) { + return true; + } + + @Override + public int getAnalogOutputSignal(BlockState state, Level world, BlockPos pos) { + if (world.getBlockEntity(pos) instanceof BaseInkBlockEntity blockEntity) { + int i = 0; + float f = 0.0f; + for (int j = 0; j < blockEntity.inventory.size(); ++j) { + ItemStack itemStack = blockEntity.inventory.get(j); + if (itemStack.isEmpty()) continue; + f += (float) itemStack.getCount() / (float) itemStack.getMaxStackSize(); + ++i; + } + return Mth.floor(f / (float) blockEntity.inventory.size() * 14.0f) + (i > 0 ? 1 : 0); + } + + return 0; + } + + @Override + public void onRemove(BlockState state, Level world, BlockPos pos, BlockState newState, boolean moved) { + Containers.dropContentsOnDestroy(state, newState, world, pos); + super.onRemove(state, world, pos, newState, moved); + } + + protected static @Nullable BlockEntityTicker createInkBlockTicker(Level level, BlockEntityType serverType, BlockEntityType> clientType) { + return level.isClientSide ? null : Support.checkType(serverType, clientType, BaseInkBlockEntity::serverTick); + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/ink/BaseInkBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/ink/BaseInkBlockEntity.java new file mode 100644 index 0000000000..5bb5de0632 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/blocks/ink/BaseInkBlockEntity.java @@ -0,0 +1,217 @@ +package de.dafuqs.spectrum.blocks.ink; + +import de.dafuqs.spectrum.api.block.*; +import de.dafuqs.spectrum.api.ink.*; +import de.dafuqs.spectrum.api.ink.capability.*; +import de.dafuqs.spectrum.api.ink.color.*; +import de.dafuqs.spectrum.api.ink.storage.*; +import de.dafuqs.spectrum.blocks.ink.gen.*; +import de.dafuqs.spectrum.inventories.*; +import de.dafuqs.spectrum.registries.*; +import net.minecraft.core.*; +import net.minecraft.nbt.*; +import net.minecraft.network.*; +import net.minecraft.network.protocol.*; +import net.minecraft.network.protocol.game.*; +import net.minecraft.world.*; +import net.minecraft.world.entity.player.*; +import net.minecraft.world.inventory.*; +import net.minecraft.world.item.*; +import net.minecraft.world.level.*; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.entity.*; +import net.minecraft.world.level.block.state.*; +import org.jspecify.annotations.*; + +import java.util.*; + +public abstract class BaseInkBlockEntity extends BaseContainerBlockEntity implements PlayerOwned, InkStorageBlockEntity, MenuProvider { + + public NonNullList inventory; + + protected T inkStorage; + protected boolean inkDirty; + + public static final int NO_INK_SLOT_ID = -1; + public final int inkSlotId; + + protected boolean paused; + protected Optional> selectedColor = Optional.empty(); + private @Nullable UUID ownerUUID; + + public BaseInkBlockEntity(BlockEntityType blockEntityType, BlockPos blockPos, BlockState blockState, T inkStorage, int inventorySize, int inkSlotId) { + super(blockEntityType, blockPos, blockState); + this.inkStorage = inkStorage; + this.inventory = NonNullList.withSize(inventorySize, ItemStack.EMPTY); + this.inkSlotId = inkSlotId; + } + + @Override + public T getInkStorage() { + return inkStorage; + } + + public InkCapability getInkCapability() { + return getLevel().getCapability(InkCapabilities.BLOCK, getBlockPos()); + } + + @Override + public void loadAdditional(CompoundTag nbt, HolderLookup.Provider registryLookup) { + super.loadAdditional(nbt, registryLookup); + if(!this.inventory.isEmpty()) { + this.inventory = NonNullList.withSize(this.getContainerSize(), ItemStack.EMPTY); + ContainerHelper.loadAllItems(nbt, this.inventory, registryLookup); + } + this.ownerUUID = PlayerOwnedWithName.readOwnerUUID(nbt); + if (nbt.contains("selected_color", Tag.TAG_STRING)) { + this.selectedColor = Optional.of(SpectrumRegistries.INK_COLOR.wrapAsHolder(InkColor.ofIdString(nbt.getString("selected_color")).get())); + } else { + this.selectedColor = Optional.empty(); + } + } + + @Override + protected void saveAdditional(CompoundTag nbt, HolderLookup.Provider registryLookup) { + super.saveAdditional(nbt, registryLookup); + if(!this.inventory.isEmpty()) { + ContainerHelper.saveAllItems(nbt, this.inventory, registryLookup); + } + PlayerOwned.writeOwnerUUID(nbt, this.ownerUUID); + this.selectedColor.ifPresent(color -> nbt.putString("selected_color", color.getRegisteredName())); + } + + @Override + public @Nullable UUID getOwnerUUID() { + return this.ownerUUID; + } + + @Override + public void setOwner(Player playerEntity) { + this.ownerUUID = playerEntity.getUUID(); + setChanged(); + } + + @Override + public void setChanged() { + super.setChanged(); + this.paused = false; + if (this.level != null && !this.level.isClientSide) { + updateInClientWorld(); + } + } + + @Override + public void setInkDirty() { + this.setChanged(); + this.inkDirty = true; + } + + @Override + public boolean getInkDirty() { + return inkDirty; + } + + @Override + protected NonNullList getItems() { + return this.inventory; + } + + @Override + protected void setItems(NonNullList list) { + this.inventory = list; + setChanged(); + } + + @Override + public ItemStack removeItem(int slot, int amount) { + ItemStack itemStack = super.removeItem(slot, amount); + setChanged(); + return itemStack; + } + + @Override + public ItemStack removeItemNoUpdate(int slot) { + ItemStack itemStack = super.removeItemNoUpdate(slot); + setChanged(); + return itemStack; + } + + @Override + public void setItem(int slot, ItemStack stack) { + super.setItem(slot, stack); + setChanged(); + } + + @Override + public int getContainerSize() { + return this.inventory.size(); + } + + protected void equalizeInkContainer(int slotId) { + ItemStack slotStack = inventory.get(slotId); + InkCapability inkCapability = slotStack.getCapability(InkCapabilities.ITEM, null); + if (inkCapability != null) { + InkCapability blockCapability = getInkCapability(); + InkTransferHelper.equalizeInk(blockCapability, inkCapability, this.selectedColor.map(Holder::value).orElse(null)); + } + } + + public void setSelectedColor(Optional> inkColor) { + this.selectedColor = inkColor; + this.setChanged(); + } + + public Optional> getSelectedColor() { + return this.selectedColor; + } + + // Called when the chunk is first loaded to initialize this be + @Override + public CompoundTag getUpdateTag(HolderLookup.Provider registryLookup) { + CompoundTag nbtCompound = new CompoundTag(); + this.saveAdditional(nbtCompound, registryLookup); + return nbtCompound; + } + + @Nullable + @Override + public Packet getUpdatePacket() { + return ClientboundBlockEntityDataPacket.create(this); + } + + public void updateInClientWorld() { + if (level != null) { + level.sendBlockUpdated(worldPosition, level.getBlockState(worldPosition), level.getBlockState(worldPosition), Block.UPDATE_INVISIBLE); + } + } + + @SuppressWarnings("unused") + public static> void serverTick(Level level, BlockPos pos, BlockState state, T blockEntity) { + if (blockEntity.paused && !blockEntity.inkDirty) { + return; + } + blockEntity.inkDirty = false; + + if(blockEntity.inkSlotId != NO_INK_SLOT_ID) { + blockEntity.equalizeInkContainer(blockEntity.inkSlotId); + } + + if (blockEntity.shouldTickLogic(level)) { + if(blockEntity.tickLogic(level)) { + blockEntity.setInkDirty(); + } else { + blockEntity.paused = true; + } + } + } + + @Override + public void writeClientSideData(AbstractContainerMenu menu, RegistryFriendlyByteBuf buffer) { + BaseInkScreenHandler.ScreenOpeningData.STREAM_CODEC.encode(buffer, new BaseInkScreenHandler.ScreenOpeningData(this.worldPosition, this.selectedColor)); + } + + public abstract boolean shouldTickLogic(Level world); + + public abstract boolean tickLogic(Level level); + +} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/energy/CrystalApothecaryBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/ink/CrystalApothecaryBlock.java similarity index 97% rename from src/main/java/de/dafuqs/spectrum/blocks/energy/CrystalApothecaryBlock.java rename to src/main/java/de/dafuqs/spectrum/blocks/ink/CrystalApothecaryBlock.java index 9d26698240..e42bd4fd6d 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/energy/CrystalApothecaryBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/ink/CrystalApothecaryBlock.java @@ -1,4 +1,4 @@ -package de.dafuqs.spectrum.blocks.energy; +package de.dafuqs.spectrum.blocks.ink; import com.mojang.serialization.*; import de.dafuqs.spectrum.registries.*; @@ -18,7 +18,7 @@ import net.minecraft.world.level.gameevent.*; import net.minecraft.world.level.pathfinder.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/energy/CrystalApothecaryBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/ink/CrystalApothecaryBlockEntity.java similarity index 95% rename from src/main/java/de/dafuqs/spectrum/blocks/energy/CrystalApothecaryBlockEntity.java rename to src/main/java/de/dafuqs/spectrum/blocks/ink/CrystalApothecaryBlockEntity.java index 7cded15138..ed0429f28d 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/energy/CrystalApothecaryBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/ink/CrystalApothecaryBlockEntity.java @@ -1,4 +1,4 @@ -package de.dafuqs.spectrum.blocks.energy; +package de.dafuqs.spectrum.blocks.ink; import de.dafuqs.spectrum.api.block.*; import de.dafuqs.spectrum.data_loaders.*; @@ -25,10 +25,8 @@ import net.minecraft.world.level.storage.loot.*; import net.minecraft.world.level.storage.loot.parameters.*; import net.minecraft.world.phys.*; -import javax.annotation.*; import java.util.*; -import java.util.function.*; import java.util.stream.*; public class CrystalApothecaryBlockEntity extends RandomizableContainerBlockEntity implements PlayerOwnedWithName, BlockPosEventQueue.Callback { @@ -36,19 +34,15 @@ public class CrystalApothecaryBlockEntity extends RandomizableContainerBlockEnti private static final int RANGE = 12; private static final ItemStack HARVEST_ITEMSTACK = ItemStack.EMPTY; - private final BlockPosEventQueue blockPosEventTransferListener; - protected long compensationWorldTime; - private NonNullList inventory; - private boolean listenerPaused; + private final BlockPosEventQueue blockPosEventTransferListener = new BlockPosEventQueue(new BlockPositionSource(this.worldPosition), RANGE, this); + protected long compensationWorldTime = -1; + private NonNullList inventory = NonNullList.withSize(27, ItemStack.EMPTY); + private boolean listenerPaused = false; private UUID ownerUUID; private String ownerName; public CrystalApothecaryBlockEntity(BlockPos blockPos, BlockState blockState) { super(SpectrumBlockEntities.CRYSTAL_APOTHECARY.get(), blockPos, blockState); - this.blockPosEventTransferListener = new BlockPosEventQueue(new BlockPositionSource(this.worldPosition), RANGE, this); - this.inventory = NonNullList.withSize(27, ItemStack.EMPTY); - this.listenerPaused = false; - this.compensationWorldTime = -1; } @SuppressWarnings("unused") diff --git a/src/main/java/de/dafuqs/spectrum/blocks/ink/gen/ColorPickerBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/ink/gen/ColorPickerBlock.java new file mode 100644 index 0000000000..816733c541 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/blocks/ink/gen/ColorPickerBlock.java @@ -0,0 +1,47 @@ +package de.dafuqs.spectrum.blocks.ink.gen; + +import com.mojang.serialization.*; +import de.dafuqs.spectrum.blocks.ink.*; +import de.dafuqs.spectrum.helpers.*; +import de.dafuqs.spectrum.registries.*; +import net.minecraft.*; +import net.minecraft.core.*; +import net.minecraft.network.chat.*; +import net.minecraft.world.item.*; +import net.minecraft.world.level.*; +import net.minecraft.world.level.block.entity.*; +import net.minecraft.world.level.block.state.*; +import org.jspecify.annotations.*; + +import java.util.*; + +public class ColorPickerBlock extends BaseInkBlock { + + public static final MapCodec CODEC = simpleCodec(ColorPickerBlock::new); + + public ColorPickerBlock(Properties settings) { + super(settings); + } + + @Override + public MapCodec codec() { + return CODEC; + } + + @Override + public void appendHoverText(ItemStack stack, Item.TooltipContext context, List tooltip, TooltipFlag type) { + super.appendHoverText(stack, context, tooltip, type); + tooltip.add(Component.translatable("block.spectrum.color_picker.tooltip").withStyle(ChatFormatting.GRAY)); + } + + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new ColorPickerBlockEntity(pos, state); + } + + @Override + public @Nullable BlockEntityTicker getTicker(Level level, BlockState state, BlockEntityType blockEntityType) { + return createInkBlockTicker(level, blockEntityType, SpectrumBlockEntities.COLOR_PICKER.get()); + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/ink/gen/ColorPickerBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/ink/gen/ColorPickerBlockEntity.java new file mode 100644 index 0000000000..257318dccb --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/blocks/ink/gen/ColorPickerBlockEntity.java @@ -0,0 +1,115 @@ +package de.dafuqs.spectrum.blocks.ink.gen; + +import de.dafuqs.spectrum.api.ink.color.*; +import de.dafuqs.spectrum.api.ink.storage.*; +import de.dafuqs.spectrum.config.*; +import de.dafuqs.spectrum.inventories.*; +import de.dafuqs.spectrum.networking.s2c_payloads.*; +import de.dafuqs.spectrum.particle.effect.*; +import de.dafuqs.spectrum.recipe.color_picker.*; +import de.dafuqs.spectrum.registries.*; +import net.minecraft.core.*; +import net.minecraft.network.*; +import net.minecraft.network.chat.*; +import net.minecraft.server.level.*; +import net.minecraft.sounds.*; +import net.minecraft.world.*; +import net.minecraft.world.entity.player.*; +import net.minecraft.world.inventory.*; +import net.minecraft.world.item.*; +import net.minecraft.world.item.crafting.*; +import net.minecraft.world.level.*; +import net.minecraft.world.level.block.state.*; +import net.minecraft.world.phys.*; +import org.jspecify.annotations.*; + +import java.util.*; + +public class ColorPickerBlockEntity extends InkGeneratorBlockEntity implements MenuProvider { + + public static final int INPUT_SLOT_ID = 1; + + public static final long TICKS_PER_CONVERSION = 5; + protected @Nullable RecipeHolder cachedRecipe; + + public ColorPickerBlockEntity(BlockPos blockPos, BlockState blockState) { + super(SpectrumBlockEntities.COLOR_PICKER.get(), blockPos, blockState, 3, 2); + } + + @Override + public boolean shouldTickLogic(Level level) { + return level.getGameTime() % TICKS_PER_CONVERSION == 0; + } + + @Override + public boolean tickLogic(Level level) { + return tryConvertPigmentToEnergy((ServerLevel) level); + } + + @Override + protected Component getDefaultName() { + return Component.translatable("block.spectrum.color_picker"); + } + + @Override + protected AbstractContainerMenu createMenu(int syncId, Inventory playerInventory) { + return new ColorPickerScreenHandler(syncId, playerInventory, this, this.selectedColor); + } + + @Override + public void writeClientSideData(AbstractContainerMenu menu, RegistryFriendlyByteBuf buffer) { + ColorPickerScreenHandler.ScreenOpeningData.STREAM_CODEC.encode(buffer, new ColorPickerScreenHandler.ScreenOpeningData(this.worldPosition, this.selectedColor)); + } + + protected boolean tryConvertPigmentToEnergy(ServerLevel world) { + InkConvertingRecipe recipe = getInkConvertingRecipe(world); + if (recipe != null) { + InkColor inkColor = recipe.getInkColor(); + long amount = recipe.getInkAmount(); + if (amount <= this.inkStorage.getRoom(inkColor)) { + inventory.get(INPUT_SLOT_ID).shrink(1); + this.inkStorage.addEnergy(inkColor, amount); + + if (SpectrumConfig.CONFIG.BlockSoundVolume.get() > 0) { + level.playSound(null, worldPosition, SpectrumSoundEvents.COLOR_PICKER_PROCESSING, SoundSource.BLOCKS, SpectrumConfig.CONFIG.BlockSoundVolume.get().floatValue() / 3F, 1.0F); + } + PlayParticleWithRandomOffsetAndVelocityPayload.playParticleWithRandomOffsetAndVelocity(world, + new Vec3(worldPosition.getX() + 0.5, worldPosition.getY() + 0.7, worldPosition.getZ() + 0.5), + ColoredFluidRisingParticleEffect.of(inkColor.getColorARGB()), + 5, + new Vec3(0.22, 0.0, 0.22), + new Vec3(0.0, 0.1, 0.0) + ); + + setChanged(); + + return true; + } + } + return false; + } + + protected @Nullable InkConvertingRecipe getInkConvertingRecipe(Level world) { + // is the current stack empty? + ItemStack inputStack = inventory.get(INPUT_SLOT_ID); + + // search matching recipe + Optional> recipe = world.getRecipeManager().getRecipeFor(SpectrumRecipeTypes.INK_CONVERTING, new SingleRecipeInput(inputStack), world, cachedRecipe); + if (recipe.isPresent()) { + this.cachedRecipe = recipe.get(); + return this.cachedRecipe.value(); + } else { + this.cachedRecipe = null; + return null; + } + } + + @Override + public boolean canPlaceItem(int slot, ItemStack stack) { + if (slot == INPUT_SLOT_ID) { + return InkConvertingRecipe.isInput(stack.getItem()); + } + return super.canPlaceItem(slot, stack); + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/energy/ColorPickerBlockEntityRenderer.java b/src/main/java/de/dafuqs/spectrum/blocks/ink/gen/ColorPickerBlockEntityRenderer.java similarity index 97% rename from src/main/java/de/dafuqs/spectrum/blocks/energy/ColorPickerBlockEntityRenderer.java rename to src/main/java/de/dafuqs/spectrum/blocks/ink/gen/ColorPickerBlockEntityRenderer.java index e31901b717..1ac8244543 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/energy/ColorPickerBlockEntityRenderer.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/ink/gen/ColorPickerBlockEntityRenderer.java @@ -1,4 +1,4 @@ -package de.dafuqs.spectrum.blocks.energy; +package de.dafuqs.spectrum.blocks.ink.gen; import com.mojang.blaze3d.vertex.*; import com.mojang.math.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/ink/gen/DaydreamerBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/ink/gen/DaydreamerBlock.java new file mode 100644 index 0000000000..4194605a49 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/blocks/ink/gen/DaydreamerBlock.java @@ -0,0 +1,46 @@ +package de.dafuqs.spectrum.blocks.ink.gen; + +import com.mojang.serialization.*; +import de.dafuqs.spectrum.blocks.ink.*; +import de.dafuqs.spectrum.registries.*; +import net.minecraft.*; +import net.minecraft.core.*; +import net.minecraft.network.chat.*; +import net.minecraft.world.item.*; +import net.minecraft.world.level.*; +import net.minecraft.world.level.block.entity.*; +import net.minecraft.world.level.block.state.*; +import org.jspecify.annotations.Nullable; + +import java.util.*; + +public class DaydreamerBlock extends BaseInkBlock { + + public static final MapCodec CODEC = BlockBehaviour.simpleCodec(DaydreamerBlock::new); + + public DaydreamerBlock(BlockBehaviour.Properties settings) { + super(settings); + } + + @Override + public MapCodec codec() { + return CODEC; + } + + @Override + public void appendHoverText(ItemStack stack, Item.TooltipContext context, List tooltip, TooltipFlag type) { + super.appendHoverText(stack, context, tooltip, type); + tooltip.add(Component.translatable("block.spectrum.daydreamer.tooltip").withStyle(ChatFormatting.GRAY)); + } + + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new DaydreamerBlockEntity(pos, state); + } + + @Override + public @Nullable BlockEntityTicker getTicker(Level level, BlockState state, BlockEntityType blockEntityType) { + return createInkBlockTicker(level, blockEntityType, SpectrumBlockEntities.DAYDREAMER.get()); + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/ink/gen/DaydreamerBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/ink/gen/DaydreamerBlockEntity.java new file mode 100644 index 0000000000..d03e0e574d --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/blocks/ink/gen/DaydreamerBlockEntity.java @@ -0,0 +1,101 @@ +package de.dafuqs.spectrum.blocks.ink.gen; + +import de.dafuqs.spectrum.api.ink.*; +import de.dafuqs.spectrum.api.ink.color.*; +import de.dafuqs.spectrum.registries.*; +import net.minecraft.core.*; +import net.minecraft.network.chat.*; +import net.minecraft.world.level.*; +import net.minecraft.world.level.block.state.*; + +import java.util.*; + +// produces roughly ~10k Ink / ingame day +public class DaydreamerBlockEntity extends InkGeneratorBlockEntity { + + public DaydreamerBlockEntity(BlockPos blockPos, BlockState blockState) { + super(SpectrumBlockEntities.DAYDREAMER.get(), blockPos, blockState, 3, 1); + } + + @Override + protected Component getDefaultName() { + return Component.translatable("block.spectrum.daydreamer"); + } + + @Override + public boolean tickLogic(Level level) { + List generatedEnergy = generateInk(level, 16.0F); + for(InkAmount inkAmount : generatedEnergy) { + this.inkStorage.addEnergy(inkAmount.color(), inkAmount.amount()); + } + return true; + } + + public static List generateInk(Level level, float multiplier) { + boolean raining = level.isRaining(); + boolean thundering = level.isThundering(); + + float rain = raining ? 1f : 0f; + float storm = thundering ? 1f : 0f; + + float timeOfDay = level.getTimeOfDay(1f); + float sunrise = ease(cosine(timeOfDay, 0.75f, 0.15f)); // sunrise peak + float noon = ease(cosine(timeOfDay, 0.0f, 0.3f) + cosine(timeOfDay, 1.0f, 0.3f)); // noon peak + float sunset = ease(cosine(timeOfDay, 0.25f, 0.15f)); // sunset peak + float midnight = ease(cosine(timeOfDay, 0.5f, 0.3f)); // midnight peak + + Map weights = new HashMap<>(); + + // Thunder exclusive + weights.put(InkColors.BLACK, thundering ? 1f + midnight * 3f + storm * 6f : 0f); + + // Rain exclusive + weights.put(InkColors.BROWN, (raining || thundering) ? 1f + rain * 2f + storm * 2f : 0f); + + // Weather independent colors + // partially suppressed with active weather + float weatherWeight = 1.0F; + if (raining) weatherWeight *= 0.25f; + if (thundering) weatherWeight *= 0.25f; + + // sunrise + weights.put(InkColors.MAGENTA, (sunrise * 3) * weatherWeight); + weights.put(InkColors.ORANGE, (midnight * 0.25f + sunrise * 3) * weatherWeight); + weights.put(InkColors.LIME, (sunrise * 4f + noon * 0.5f) * weatherWeight); + + // noon + weights.put(InkColors.GREEN, (sunrise * 0.5f + noon * 2.0f) * weatherWeight); + weights.put(InkColors.LIGHT_BLUE, (noon * 2.0f + rain) * weatherWeight); + weights.put(InkColors.CYAN, (noon * 2.0f - rain) * weatherWeight); + + // sunset + weights.put(InkColors.YELLOW, (noon * 0.25f + sunset * 4f) * weatherWeight); + weights.put(InkColors.RED, (sunset * 5f) * weatherWeight); + weights.put(InkColors.PINK, (sunset * 4f + midnight * 0.5f) * weatherWeight); + + // night + weights.put(InkColors.PURPLE, (sunset * 2 + midnight * 0.75f) * weatherWeight); + weights.put(InkColors.BLUE, (midnight * 2f) * weatherWeight); + + // build output + List result = new ArrayList<>(); + for (var e : weights.entrySet()) { + float w = e.getValue(); + if (w <= 0f) continue; + result.add(new InkAmount(e.getKey(), (long) (w * multiplier))); + } + + return result; + } + + private static float cosine(float x, float center, float width) { + float d = Math.abs(x - center); + if (d > width) return 0f; + return (float) ((Math.cos(Math.PI * d / width) + 1) * 0.5); + } + + private static float ease(float x) { + return x * x * (3 - 2 * x); + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/ink/gen/InkGeneratorBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/ink/gen/InkGeneratorBlockEntity.java new file mode 100644 index 0000000000..ba2bcdb422 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/blocks/ink/gen/InkGeneratorBlockEntity.java @@ -0,0 +1,62 @@ +package de.dafuqs.spectrum.blocks.ink.gen; + +import de.dafuqs.spectrum.api.ink.capability.*; +import de.dafuqs.spectrum.api.ink.storage.*; +import de.dafuqs.spectrum.blocks.ink.*; +import de.dafuqs.spectrum.components.*; +import de.dafuqs.spectrum.helpers.*; +import de.dafuqs.spectrum.inventories.*; +import net.minecraft.core.*; +import net.minecraft.nbt.*; +import net.minecraft.network.*; +import net.minecraft.world.*; +import net.minecraft.world.entity.player.*; +import net.minecraft.world.inventory.*; +import net.minecraft.world.item.*; +import net.minecraft.world.level.*; +import net.minecraft.world.level.block.entity.*; +import net.minecraft.world.level.block.state.*; + +import java.util.*; + +public abstract class InkGeneratorBlockEntity extends BaseInkBlockEntity implements MenuProvider { + + public static final int INK_SLOT_ID = 0; + public static final long RUN_LOGIC_EVERY_X_TICKS = 20; + + public InkGeneratorBlockEntity(BlockEntityType blockEntityType, BlockPos blockPos, BlockState blockState, int tier, int inventorySize) { + super(blockEntityType, blockPos, blockState, new TotalCappedInkStorage((long) Math.pow(256, tier), Map.of()), inventorySize, INK_SLOT_ID); + } + + @Override + public void loadAdditional(CompoundTag nbt, HolderLookup.Provider registryLookup) { + super.loadAdditional(nbt, registryLookup); + CodecHelper.fromNbt(InkStorageComponent.CODEC, nbt.get("ink_storage")).ifPresent(storage -> this.inkStorage = new TotalCappedInkStorage(storage.maxEnergyTotal(), storage.storedEnergy())); + } + + @Override + protected void saveAdditional(CompoundTag nbt, HolderLookup.Provider registryLookup) { + super.saveAdditional(nbt, registryLookup); + CodecHelper.writeNbt(nbt, "ink_storage", InkStorageComponent.CODEC, new InkStorageComponent(this.inkStorage)); + } + + @Override + protected AbstractContainerMenu createMenu(int syncId, Inventory playerInventory) { + return new InkStorageScreenHandler(syncId, playerInventory, this, this.selectedColor); + } + + public boolean shouldTickLogic(Level world) { + return world.getGameTime() % RUN_LOGIC_EVERY_X_TICKS == 0; + } + + public abstract boolean tickLogic(Level level); + + @Override + public boolean canPlaceItem(int slot, ItemStack stack) { + if (slot == INK_SLOT_ID) { + return stack.getCapability(InkCapabilities.ITEM) != null; + } + return true; + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/ink/gen/TwillBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/ink/gen/TwillBlock.java new file mode 100644 index 0000000000..e8c6793752 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/blocks/ink/gen/TwillBlock.java @@ -0,0 +1,48 @@ +package de.dafuqs.spectrum.blocks.ink.gen; + +import com.mojang.serialization.*; +import de.dafuqs.spectrum.blocks.ink.*; +import de.dafuqs.spectrum.registries.*; +import net.minecraft.*; +import net.minecraft.core.*; +import net.minecraft.network.chat.*; +import net.minecraft.world.item.*; +import net.minecraft.world.level.*; +import net.minecraft.world.level.block.entity.*; +import net.minecraft.world.level.block.state.*; +import org.jspecify.annotations.Nullable; + +import javax.annotation.*; +import java.util.*; + +public class TwillBlock extends BaseInkBlock { + + public static final MapCodec CODEC = simpleCodec(TwillBlock::new); + + public TwillBlock(Properties settings) { + super(settings); + } + + @Override + public MapCodec codec() { + return CODEC; + } + + @Override + public void appendHoverText(ItemStack stack, Item.TooltipContext context, List tooltip, TooltipFlag type) { + super.appendHoverText(stack, context, tooltip, type); + tooltip.add(Component.translatable("block.spectrum.twill.tooltip").withStyle(ChatFormatting.GRAY)); + tooltip.add(Component.translatable("block.spectrum.twill.tooltip2").withStyle(ChatFormatting.GRAY)); + } + + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new TwillBlockEntity(pos, state); + } + + @Override + public @Nullable BlockEntityTicker getTicker(Level level, BlockState state, BlockEntityType blockEntityType) { + return createInkBlockTicker(level, blockEntityType, SpectrumBlockEntities.TWILL.get()); + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/ink/gen/TwillBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/ink/gen/TwillBlockEntity.java new file mode 100644 index 0000000000..c471efd219 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/blocks/ink/gen/TwillBlockEntity.java @@ -0,0 +1,59 @@ +package de.dafuqs.spectrum.blocks.ink.gen; + +import de.dafuqs.spectrum.api.ink.color.*; +import de.dafuqs.spectrum.blocks.conditional.colored_tree.*; +import de.dafuqs.spectrum.config.*; +import de.dafuqs.spectrum.networking.s2c_payloads.*; +import de.dafuqs.spectrum.particle.effect.*; +import de.dafuqs.spectrum.registries.*; +import net.minecraft.core.*; +import net.minecraft.network.chat.*; +import net.minecraft.server.level.*; +import net.minecraft.sounds.*; +import net.minecraft.util.*; +import net.minecraft.world.level.*; +import net.minecraft.world.level.block.state.*; +import net.minecraft.world.phys.*; + +public class TwillBlockEntity extends InkGeneratorBlockEntity { + + public static final int MAX_BLOCK_CHECK_DISTANCE_HORIZONTAL = 16; + public static final int MAX_BLOCK_CHECK_DISTANCE_UP = 6; + public static final long GENERATED_INK_PER_VALID_BLOCK = (long) Math.pow(2, 2); + + public TwillBlockEntity(BlockPos blockPos, BlockState blockState) { + super(SpectrumBlockEntities.TWILL.get(), blockPos, blockState, 1, 1); + } + + @Override + protected Component getDefaultName() { + return Component.translatable("block.spectrum.twill"); + } + + + @Override + public boolean tickLogic(Level level) { + RandomSource random = level.getRandom(); + BlockPos posToTest = this.worldPosition.offset(random.nextIntBetweenInclusive(-MAX_BLOCK_CHECK_DISTANCE_HORIZONTAL, MAX_BLOCK_CHECK_DISTANCE_HORIZONTAL), random.nextInt(MAX_BLOCK_CHECK_DISTANCE_UP), random.nextIntBetweenInclusive(-MAX_BLOCK_CHECK_DISTANCE_HORIZONTAL, MAX_BLOCK_CHECK_DISTANCE_HORIZONTAL)); + BlockState stateToTest = level.getBlockState(posToTest); + + if(stateToTest.getBlock() instanceof ColoredLeavesBlock coloredLeavesBlock) { + InkColor inkColor = coloredLeavesBlock.getColor(); + this.inkStorage.addEnergy(inkColor, GENERATED_INK_PER_VALID_BLOCK); + + if (SpectrumConfig.CONFIG.BlockSoundVolume.get() > 0) { + level.playSound(null, worldPosition, SpectrumSoundEvents.COLOR_PICKER_PROCESSING, SoundSource.BLOCKS, SpectrumConfig.CONFIG.BlockSoundVolume.get().floatValue() / 3F, 1.0F); + } + PlayParticleWithRandomOffsetAndVelocityPayload.playParticleWithRandomOffsetAndVelocity((ServerLevel) level, + new Vec3(worldPosition.getX() + 0.5, worldPosition.getY() + 0.7, worldPosition.getZ() + 0.5), + ColoredFluidRisingParticleEffect.of(inkColor.getColorARGB()), + 5, + new Vec3(0.22, 0.0, 0.22), + new Vec3(0.0, 0.1, 0.0) + ); + return true; + } + return false; + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/ink/gen/VantaclastBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/ink/gen/VantaclastBlock.java new file mode 100644 index 0000000000..07849e876e --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/blocks/ink/gen/VantaclastBlock.java @@ -0,0 +1,48 @@ +package de.dafuqs.spectrum.blocks.ink.gen; + +import com.mojang.serialization.*; +import de.dafuqs.spectrum.blocks.ink.*; +import de.dafuqs.spectrum.registries.*; +import net.minecraft.*; +import net.minecraft.core.*; +import net.minecraft.network.chat.*; +import net.minecraft.world.item.*; +import net.minecraft.world.level.*; +import net.minecraft.world.level.block.entity.*; +import net.minecraft.world.level.block.state.*; +import org.jspecify.annotations.Nullable; + +import javax.annotation.*; +import java.util.*; + +public class VantaclastBlock extends BaseInkBlock { + + public static final MapCodec CODEC = simpleCodec(VantaclastBlock::new); + + public VantaclastBlock(Properties settings) { + super(settings); + } + + @Override + public MapCodec codec() { + return CODEC; + } + + @Override + public void appendHoverText(ItemStack stack, Item.TooltipContext context, List tooltip, TooltipFlag type) { + super.appendHoverText(stack, context, tooltip, type); + tooltip.add(Component.translatable("block.spectrum.vantaclast.tooltip").withStyle(ChatFormatting.GRAY)); + tooltip.add(Component.translatable("block.spectrum.vantaclast.tooltip2").withStyle(ChatFormatting.GRAY)); + } + + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new VantaclastBlockEntity(pos, state); + } + + @Override + public @Nullable BlockEntityTicker getTicker(Level level, BlockState state, BlockEntityType blockEntityType) { + return createInkBlockTicker(level, blockEntityType, SpectrumBlockEntities.VANTACLAST.get()); + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/ink/gen/VantaclastBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/ink/gen/VantaclastBlockEntity.java new file mode 100644 index 0000000000..03203b3890 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/blocks/ink/gen/VantaclastBlockEntity.java @@ -0,0 +1,63 @@ +package de.dafuqs.spectrum.blocks.ink.gen; + +import de.dafuqs.spectrum.api.ink.color.*; +import de.dafuqs.spectrum.blocks.conditional.colored_tree.*; +import de.dafuqs.spectrum.config.*; +import de.dafuqs.spectrum.networking.s2c_payloads.*; +import de.dafuqs.spectrum.particle.effect.*; +import de.dafuqs.spectrum.registries.*; +import net.minecraft.core.*; +import net.minecraft.network.chat.*; +import net.minecraft.server.level.*; +import net.minecraft.sounds.*; +import net.minecraft.util.*; +import net.minecraft.world.level.*; +import net.minecraft.world.level.block.state.*; +import net.minecraft.world.level.gameevent.*; +import net.minecraft.world.phys.*; + +public class VantaclastBlockEntity extends InkGeneratorBlockEntity { + + public static final int MAX_BLOCK_CHECK_DISTANCE_HORIZONTAL = 16; + public static final int MAX_BLOCK_CHECK_DISTANCE_UP = 6; + public static final long GENERATED_INK_PER_VALID_BLOCK = (long) Math.pow(2, 16); + + public VantaclastBlockEntity(BlockPos blockPos, BlockState blockState) { + super(SpectrumBlockEntities.VANTACLAST.get(), blockPos, blockState, 3, 1); + } + + @Override + protected Component getDefaultName() { + return Component.translatable("block.spectrum.vantaclast"); + } + + @Override + public boolean tickLogic(Level level) { + RandomSource random = level.getRandom(); + BlockPos posToTest = this.worldPosition.offset(random.nextIntBetweenInclusive(-MAX_BLOCK_CHECK_DISTANCE_HORIZONTAL, MAX_BLOCK_CHECK_DISTANCE_HORIZONTAL), random.nextInt(MAX_BLOCK_CHECK_DISTANCE_UP), random.nextIntBetweenInclusive(-MAX_BLOCK_CHECK_DISTANCE_HORIZONTAL, MAX_BLOCK_CHECK_DISTANCE_HORIZONTAL)); + BlockState statetoTest = level.getBlockState(posToTest); + + if(statetoTest.getBlock() instanceof ColoredLeavesBlock coloredLeavesBlock) { + InkColor inkColor = coloredLeavesBlock.getColor(); + this.inkStorage.addEnergy(inkColor, GENERATED_INK_PER_VALID_BLOCK); + + if (SpectrumConfig.CONFIG.BlockSoundVolume.get() > 0) { + level.playSound(null, worldPosition, SpectrumSoundEvents.COLOR_PICKER_PROCESSING, SoundSource.BLOCKS, SpectrumConfig.CONFIG.BlockSoundVolume.get().floatValue() / 3F, 1.0F); + } + + ColorTransmissionPayload.playColorTransmissionParticle( + (ServerLevel) level, + new ColoredTransmission( + new Vec3(posToTest.getX() + 0.5D, posToTest.getY() + 0.5D, posToTest.getZ() + 0.5D), + new BlockPositionSource(worldPosition), 8, + inkColor.getColorARGB()) + ); + + level.setBlockAndUpdate(posToTest, SpectrumBlocks.BLACK_MATERIA.get().defaultBlockState()); + + return true; + } + return false; + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/ink/gen/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/ink/gen/package-info.java new file mode 100644 index 0000000000..d35170bb79 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/blocks/ink/gen/package-info.java @@ -0,0 +1,7 @@ +@NullMarked +@MethodsReturnNonnullByDefault +@FieldsAreNonnullByDefault +package de.dafuqs.spectrum.blocks.energy; + +import net.minecraft.*; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/ink/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/ink/package-info.java new file mode 100644 index 0000000000..fc2cb17dc9 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/blocks/ink/package-info.java @@ -0,0 +1,7 @@ +@NullMarked +@MethodsReturnNonnullByDefault +@FieldsAreNonnullByDefault +package de.dafuqs.spectrum.blocks.ink; + +import net.minecraft.*; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/ink/sink/CinderhearthBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/ink/sink/CinderhearthBlock.java new file mode 100644 index 0000000000..0de5c65f94 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/blocks/ink/sink/CinderhearthBlock.java @@ -0,0 +1,186 @@ +package de.dafuqs.spectrum.blocks.ink.sink; + +import com.klikli_dev.modonomicon.api.multiblock.*; +import com.mojang.serialization.*; +import de.dafuqs.spectrum.blocks.ink.*; +import de.dafuqs.spectrum.blocks.upgrade.*; +import de.dafuqs.spectrum.compat.modonomicon.*; +import de.dafuqs.spectrum.helpers.*; +import de.dafuqs.spectrum.particle.effect.*; +import de.dafuqs.spectrum.progression.*; +import de.dafuqs.spectrum.registries.*; +import net.minecraft.core.*; +import net.minecraft.core.particles.*; +import net.minecraft.server.level.*; +import net.minecraft.sounds.*; +import net.minecraft.util.*; +import net.minecraft.world.*; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.player.*; +import net.minecraft.world.inventory.*; +import net.minecraft.world.item.*; +import net.minecraft.world.item.context.*; +import net.minecraft.world.level.*; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.entity.*; +import net.minecraft.world.level.block.state.*; +import net.minecraft.world.level.block.state.properties.*; +import net.minecraft.world.phys.*; +import org.jspecify.annotations.*; + +import java.util.*; + +public class CinderhearthBlock extends BaseInkBlock { + + public static final MapCodec CODEC = simpleCodec(CinderhearthBlock::new); + + public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING; + + // Positions to check on place / destroy to upgrade those blocks upgrade counts + final static List UPGRADE_BLOCK_OFFSETS = List.of( + new Vec3i(1, -1, 2), + new Vec3i(-1, -1, 2), + new Vec3i(1, -1, -2), + new Vec3i(-1, -1, -2), + new Vec3i(2, -1, 1), + new Vec3i(-2, -1, 1), + new Vec3i(2, -1, -1), + new Vec3i(-2, -1, -1) + ); + + public CinderhearthBlock(Properties settings) { + super(settings); + this.registerDefaultState((this.stateDefinition.any()).setValue(FACING, Direction.EAST)); + + Upgradeable.registerUpgradePosOffsets(UPGRADE_BLOCK_OFFSETS); + } + + @Override + protected MapCodec codec() { + return CODEC; + } + + @Override + public @Nullable BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new CinderhearthBlockEntity(pos, state); + } + + @Override + public @Nullable BlockEntityTicker getTicker(Level level, BlockState state, BlockEntityType blockEntityType) { + return createInkBlockTicker(level, blockEntityType, SpectrumBlockEntities.CINDERHEARTH.get()); + } + + @Override + public InteractionResult useWithoutItem(BlockState state, Level world, BlockPos pos, Player player, BlockHitResult hit) { + if (world.isClientSide()) { + verifyStructure(world, pos, null); + return InteractionResult.SUCCESS; + } + + if (verifyStructure(world, pos, (ServerPlayer) player) == CinderhearthBlockEntity.CinderHearthStructureType.NONE) { + return InteractionResult.CONSUME; + } + + return super.useWithoutItem(state, world, pos, player, hit); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + return this.defaultBlockState().setValue(FACING, ctx.getHorizontalDirection().getOpposite()); + } + + @Override + public BlockState rotate(BlockState state, Rotation rotation) { + return state.setValue(FACING, rotation.rotate(state.getValue(FACING))); + } + + @Override + public BlockState mirror(BlockState state, Mirror mirror) { + return state.rotate(mirror.getRotation(state.getValue(FACING))); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(FACING); + } + + @Override + public void animateTick(BlockState state, Level world, BlockPos pos, RandomSource random) { + BlockEntity blockEntity = world.getBlockEntity(pos); + if (blockEntity instanceof CinderhearthBlockEntity cinderhearthBlockEntity) { + Direction direction = state.getValue(FACING); + Direction.Axis axis = direction.getAxis(); + double d = (double) pos.getX() + 0.5D; + double e = pos.getY() + 0.4; + double f = (double) pos.getZ() + 0.5D; + + var recipe = cinderhearthBlockEntity.getCurrentRecipe(); + if (recipe != null) { + if (random.nextDouble() < 0.1D) { + world.playLocalSound(d, e, f, SoundEvents.FURNACE_FIRE_CRACKLE, SoundSource.BLOCKS, 1.0F, 0.8F, false); + } + + double g = 0.35D; + double h = random.nextDouble() * 0.4D - 0.2D; + double i = axis == Direction.Axis.X ? (double) direction.getStepX() * g : h; + double j = random.nextDouble() * 4.0D / 16.0D; + double k = axis == Direction.Axis.Z ? (double) direction.getStepZ() * g : h; + world.addParticle(ParticleTypes.FLAME, d + i, e + j, f + k, 0.0D, 0.0D, 0.0D); + world.addParticle(ParticleTypes.SMOKE, d + i, e + j, f + k, 0.0D, 0.0D, 0.0D); + + if (random.nextBoolean()) { + double g2 = -3D / 16D; + double h2 = 4D / 16D; + double i2 = axis == Direction.Axis.X ? (double) direction.getStepX() * g2 : h2; + double k2 = axis == Direction.Axis.Z ? (double) direction.getStepZ() * g2 : h2; + world.addParticle(ParticleTypes.CLOUD, d + i2, pos.getY() + 1.1, f + k2, 0.0D, 0.06D, 0.0D); + } + } + if (cinderhearthBlockEntity.structure == CinderhearthBlockEntity.CinderHearthStructureType.WITH_LAVA) { + for (int v = 0; v < 2; v++) { + double g3 = 1.5 - random.nextDouble() * 2.0; + double h3 = 1.5 - random.nextDouble() * 3.0; + double i3 = axis == Direction.Axis.X ? (double) direction.getStepX() * g3 : h3; + double k3 = axis == Direction.Axis.Z ? (double) direction.getStepZ() * g3 : h3; + world.addParticle(ColoredCraftingParticleEffect.ORANGE, d + i3, pos.getY() - 1.2, f + k3, 0.0D, 0.1D, 0.0D); + } + } + } + } + + public static CinderhearthBlockEntity.CinderHearthStructureType verifyStructure(Level world, BlockPos blockPos, @Nullable ServerPlayer serverPlayerEntity) { + Rotation rotation = Support.rotationFromDirection(world.getBlockState(blockPos).getValue(FACING).getOpposite()); + + Multiblock multiblock = SpectrumMultiblocks.get(SpectrumMultiblocks.CINDERHEARTH); + CinderhearthBlockEntity.CinderHearthStructureType completedStructure = CinderhearthBlockEntity.CinderHearthStructureType.NONE; + + if (multiblock.validate(world, blockPos.below(3), rotation)) { + completedStructure = CinderhearthBlockEntity.CinderHearthStructureType.WITH_LAVA; + } else { + multiblock = SpectrumMultiblocks.get(SpectrumMultiblocks.CINDERHEARTH_WITHOUT_LAVA); + if (multiblock.validate(world, blockPos.below(3), rotation)) { + completedStructure = CinderhearthBlockEntity.CinderHearthStructureType.WITHOUT_LAVA; + } + } + + boolean structureValid = completedStructure != CinderhearthBlockEntity.CinderHearthStructureType.NONE; + + if (world.isClientSide()) { + if (!structureValid) { + ModonomiconHelper.renderMultiblock(SpectrumMultiblocks.get(SpectrumMultiblocks.CINDERHEARTH), SpectrumMultiblocks.CINDERHEARTH_TEXT, blockPos.below(4), rotation); + } + } else if (structureValid && serverPlayerEntity != null) { + SpectrumAdvancementCriteria.COMPLETED_MULTIBLOCK.trigger(serverPlayerEntity, multiblock); + } + + return completedStructure; + } + + @Override + public void destroy(LevelAccessor world, BlockPos pos, BlockState state) { + if (world.isClientSide()) { + ModonomiconHelper.clearRenderedMultiblock(SpectrumMultiblocks.get(SpectrumMultiblocks.CINDERHEARTH)); + } + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/ink/sink/CinderhearthBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/ink/sink/CinderhearthBlockEntity.java new file mode 100644 index 0000000000..17b9e49172 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/blocks/ink/sink/CinderhearthBlockEntity.java @@ -0,0 +1,441 @@ +package de.dafuqs.spectrum.blocks.ink.sink; + +import de.dafuqs.spectrum.api.block.*; +import de.dafuqs.spectrum.api.ink.*; +import de.dafuqs.spectrum.api.ink.capability.*; +import de.dafuqs.spectrum.api.ink.color.*; +import de.dafuqs.spectrum.api.ink.storage.*; +import de.dafuqs.spectrum.api.item.*; +import de.dafuqs.spectrum.api.recipe.*; +import de.dafuqs.spectrum.blocks.*; +import de.dafuqs.spectrum.blocks.upgrade.*; +import de.dafuqs.spectrum.components.*; +import de.dafuqs.spectrum.helpers.*; +import de.dafuqs.spectrum.inventories.*; +import de.dafuqs.spectrum.networking.s2c_payloads.*; +import de.dafuqs.spectrum.progression.*; +import de.dafuqs.spectrum.recipe.cinderhearth.*; +import de.dafuqs.spectrum.registries.*; +import net.minecraft.core.*; +import net.minecraft.core.particles.*; +import net.minecraft.nbt.*; +import net.minecraft.network.*; +import net.minecraft.network.chat.*; +import net.minecraft.network.protocol.*; +import net.minecraft.network.protocol.game.*; +import net.minecraft.server.level.*; +import net.minecraft.sounds.*; +import net.minecraft.world.*; +import net.minecraft.world.entity.player.*; +import net.minecraft.world.inventory.*; +import net.minecraft.world.item.*; +import net.minecraft.world.item.crafting.*; +import net.minecraft.world.level.*; +import net.minecraft.world.level.block.entity.*; +import net.minecraft.world.level.block.state.*; +import net.minecraft.world.phys.*; +import org.jspecify.annotations.*; + +import java.util.*; + +public class CinderhearthBlockEntity extends InkSinkBlockEntity implements MultiblockCrafter, WorldlyContainer, MenuProvider, InkStorageBlockEntity, StackedContentsCompatible { + + public static final int INVENTORY_SIZE = 11; + public static final int INPUT_SLOT_ID = 0; + public static final int INK_PROVIDER_SLOT_ID = 1; + public static final int EXPERIENCE_STORAGE_ITEM_SLOT_ID = 2; + public static final int FIRST_OUTPUT_SLOT_ID = 3; + public static final int LAST_OUTPUT_SLOT_ID = 10; + public static final int[] OUTPUT_SLOT_IDS = new int[]{3, 4, 5, 6, 7, 8, 9, 10}; + + public static final List USED_INK_COLORS = List.of(InkColors.ORANGE, InkColors.MAGENTA, InkColors.LIGHT_BLUE, InkColors.PURPLE, InkColors.BLACK); + public static final long INK_COST_PER_TICK = 8; + + private UpgradeHolder upgrades; + private @Nullable RecipeHolder currentRecipe; // blasting & cinderhearth + private boolean usesEfficiency; + protected CinderHearthStructureType structure = CinderHearthStructureType.NONE; + + protected final CraftingDelegate propertyDelegate = new CraftingDelegate(); + + @Override + public int [] getSlotsForFace(Direction side) { + switch (side) { + case UP -> { + return new int[]{INPUT_SLOT_ID}; + } + case DOWN -> { + return OUTPUT_SLOT_IDS; + } + default -> { + return new int[]{INK_PROVIDER_SLOT_ID, EXPERIENCE_STORAGE_ITEM_SLOT_ID}; + } + } + } + + @Override + public boolean canPlaceItemThroughFace(int slot, ItemStack stack, @Nullable Direction dir) { + switch (slot) { + case INK_PROVIDER_SLOT_ID -> { + return stack.getItem() instanceof InkStorageItem inkStorageItem && (inkStorageItem.canDrain(false)); + } + case EXPERIENCE_STORAGE_ITEM_SLOT_ID -> { + return stack.getItem() instanceof ExperienceStorageItem; + } + default -> { + return true; + } + } + } + + @Override + public boolean canTakeItemThroughFace(int slot, ItemStack stack, Direction dir) { + return true; + } + + public enum CinderHearthStructureType { + NONE, + WITH_LAVA, + WITHOUT_LAVA + } + + public CinderhearthBlockEntity(BlockPos pos, BlockState state) { + super(SpectrumBlockEntities.CINDERHEARTH.get(), pos, state, 2, INVENTORY_SIZE, INK_PROVIDER_SLOT_ID, USED_INK_COLORS); + } + + @Override + public void calculateUpgrades(Level level) { + this.upgrades = Upgradeable.calculateUpgradeMods2(level, worldPosition, Support.rotationFromDirection(level.getBlockState(worldPosition).getValue(CinderhearthBlock.FACING)), 2, 1, 1, getOwnerUUID()); + this.setChanged(); + } + + @Override + protected Component getDefaultName() { + return Component.translatable("block.spectrum.cinderhearth"); + } + + @Override + protected AbstractContainerMenu createMenu(int syncId, Inventory playerInventory) { + return new CinderhearthScreenHandler(syncId, playerInventory, this, this.propertyDelegate); + } + + @Override + public void writeClientSideData(AbstractContainerMenu menu, RegistryFriendlyByteBuf buffer) { + buffer.writeBlockPos(this.worldPosition); + } + + @Override + public void loadAdditional(CompoundTag nbt, HolderLookup.Provider registryLookup) { + super.loadAdditional(nbt, registryLookup); + + this.propertyDelegate.craftingTime = nbt.getShort("CraftingTime"); + this.propertyDelegate.craftingTimeTotal = nbt.getShort("CraftingTimeTotal"); + this.usesEfficiency = nbt.getBoolean("UsesEfficiency"); + if (nbt.contains("Structure", Tag.TAG_ANY_NUMERIC)) { + this.structure = CinderHearthStructureType.values()[nbt.getInt("Structure")]; + } else { + this.structure = CinderHearthStructureType.NONE; + } + this.currentRecipe = MultiblockCrafter.getRecipeHolderFromNbt(level, nbt); + if (nbt.contains("Upgrades", Tag.TAG_LIST)) { + this.upgrades = UpgradeHolder.fromNbt(nbt.getList("Upgrades", Tag.TAG_COMPOUND)); + } else { + this.upgrades = new UpgradeHolder(); + } + } + + @Override + public void saveAdditional(CompoundTag nbt, HolderLookup.Provider registryLookup) { + super.saveAdditional(nbt, registryLookup); + nbt.putShort("CraftingTime", (short) this.propertyDelegate.craftingTime); + nbt.putShort("CraftingTimeTotal", (short) this.propertyDelegate.craftingTimeTotal); + nbt.putBoolean("UsesEfficiency", this.usesEfficiency); + nbt.putInt("Structure", this.structure.ordinal()); + if (this.upgrades != null) { + nbt.put("Upgrades", this.upgrades.toNbt()); + } + if (this.currentRecipe != null) { + nbt.putString("CurrentRecipe", this.currentRecipe.id().toString()); + } + } + + + @Override + public boolean shouldTickLogic(Level world) { + return true; + } + + @Override + public boolean tickLogic(Level level) { + if (this.upgrades == null) { + this.calculateUpgrades(level); + } + + calculateRecipe(level, this); + if (this.currentRecipe == null) { + return false; + } + + if (!canContinue(level)) { + this.currentRecipe = null; + this.propertyDelegate.craftingTime = 0; + this.propertyDelegate.craftingTimeTotal = 0; + this.setChanged(); + return false; + } + + if (this.propertyDelegate.craftingTime == 0) { + Recipe recipe = this.currentRecipe.value(); + this.usesEfficiency = this.drainInkForUpgradesRequired(this, UpgradeType.EFFICIENCY, InkColors.BLACK, false); + int baseTime = recipe instanceof AbstractCookingRecipe abstractCookingRecipe + ? abstractCookingRecipe.getCookingTime() + : recipe instanceof CinderhearthRecipe cinderhearthRecipe + ? cinderhearthRecipe.getCraftingTime() + : -1; + if (baseTime >= 0) { + float speedModifier = this.drainInkForUpgrades(this, UpgradeType.SPEED, InkColors.MAGENTA, this.usesEfficiency); + this.propertyDelegate.craftingTimeTotal = (int) Math.ceil(baseTime / speedModifier); + } + } + + this.propertyDelegate.craftingTime++; + + if (this.propertyDelegate.craftingTime == this.propertyDelegate.craftingTimeTotal) { + if (this.getCurrentRecipe() instanceof CinderhearthRecipe cinderhearthRecipe) { + craftCinderhearthRecipe(level, this, cinderhearthRecipe); + } else if (this.getCurrentRecipe() instanceof BlastingRecipe blastingRecipe) { + craftBlastingRecipe(level, this, blastingRecipe); + } + } + + this.setChanged(); + return true; + } + + private boolean canContinue(Level world) { + if (!canAcceptRecipeOutput(world, this.currentRecipe)) { + return false; + } + + if (this.propertyDelegate.craftingTime % 20 == 0) { + if (!checkRecipeRequirements(world, this)) { + return false; + } + // consume orange ink + return this.drainInkForUpgradesRequired(this, InkColors.ORANGE, INK_COST_PER_TICK, this.usesEfficiency); + } + + return true; + } + + protected boolean canAcceptRecipeOutput(Level world, RecipeHolder recipe) { + ItemStack outputStack = recipe.value().getResultItem(world.registryAccess()); + if (outputStack.isEmpty()) { + return true; + } else { + int outputSpaceFound = 0; + for (int slot : OUTPUT_SLOT_IDS) { + ItemStack slotStack = this.getItem(slot); + if (slotStack.isEmpty()) { + return true; + } else if (ItemStack.isSameItemSameComponents(slotStack, outputStack)) { + outputSpaceFound += outputStack.getMaxStackSize() - slotStack.getCount(); + if (outputSpaceFound >= outputStack.getCount()) { + return true; + } + } + } + } + return false; + } + + private static void calculateRecipe(Level world, CinderhearthBlockEntity cinderhearthBlockEntity) { + ItemStack inputStack = cinderhearthBlockEntity.getItem(0); + if (inputStack.isEmpty()) { + cinderhearthBlockEntity.currentRecipe = null; + cinderhearthBlockEntity.propertyDelegate.craftingTime = 0; + cinderhearthBlockEntity.propertyDelegate.craftingTimeTotal = -1; + cinderhearthBlockEntity.updateInClientWorld(); + return; + } + + SingleRecipeInput input = new SingleRecipeInput(cinderhearthBlockEntity.getItem(0)); + + // test the cached recipe => faster + if (cinderhearthBlockEntity.getCurrentRecipe() instanceof CinderhearthRecipe recipe) { + if (recipe.matches(input, world)) + return; + } else if (cinderhearthBlockEntity.getCurrentRecipe() instanceof BlastingRecipe recipe) { + if (recipe.matches(input, world)) + return; + } + + cinderhearthBlockEntity.currentRecipe = null; + cinderhearthBlockEntity.propertyDelegate.craftingTime = 0; + cinderhearthBlockEntity.propertyDelegate.craftingTimeTotal = -1; + + // cached recipe did not match => search for new matching one + world.getRecipeManager() + .getRecipeFor(SpectrumRecipeTypes.CINDERHEARTH, input, world) + .ifPresentOrElse(r -> cinderhearthBlockEntity.currentRecipe = r, () -> world.getRecipeManager().getRecipeFor(RecipeType.BLASTING, input, world) + .ifPresent(r -> cinderhearthBlockEntity.currentRecipe = r)); + cinderhearthBlockEntity.updateInClientWorld(); + } + + private static boolean checkRecipeRequirements(Level world, CinderhearthBlockEntity cinderhearthBlockEntity) { + cinderhearthBlockEntity.structure = CinderhearthBlock.verifyStructure(world, cinderhearthBlockEntity.getBlockPos(), null); + if (cinderhearthBlockEntity.structure == CinderHearthStructureType.NONE) { + world.playSound(null, cinderhearthBlockEntity.getBlockPos(), SpectrumSoundEvents.CRAFTING_ABORTED, SoundSource.BLOCKS, 0.9F + world.getRandom().nextFloat() * 0.2F, 0.9F + world.getRandom().nextFloat() * 0.2F); + return false; + } + + if (cinderhearthBlockEntity.getCurrentRecipe() instanceof GatedRecipe gatedRecipe) { + Player lastInteractedPlayer = cinderhearthBlockEntity.getOwnerIfOnline(world); + if (lastInteractedPlayer == null) { + return false; + } + return gatedRecipe.canPlayerCraft(lastInteractedPlayer); + } + return true; + } + + public static void craftBlastingRecipe(Level world, CinderhearthBlockEntity cinderhearth, BlastingRecipe blastingRecipe) { + // calculate outputs + ItemStack inputStack = cinderhearth.getItem(INPUT_SLOT_ID); + float yieldMod = inputStack.is(SpectrumItemTags.NO_CINDERHEARTH_DOUBLING) ? 1.0F : cinderhearth.drainInkForUpgrades(cinderhearth, UpgradeType.YIELD, InkColors.LIGHT_BLUE, cinderhearth.usesEfficiency); + ItemStack output = blastingRecipe.getResultItem(world.registryAccess()).copy(); + List outputs = new ArrayList<>(); + if (yieldMod > 1) { + int outputCount = Support.getIntFromDecimalWithChance(output.getCount() * yieldMod, world.getRandom()); + while (outputCount > 0) { // if the rolled count exceeds the max stack size we need to split them (unstackable items, counts > 64, ...) + int count = Math.min(outputCount, output.getMaxStackSize()); + ItemStack outputStack = output.copy(); + outputStack.setCount(count); + outputs.add(outputStack); + outputCount -= count; + } + } else { + outputs.add(output.copy()); + } + + // craft + craftRecipe(cinderhearth, inputStack, outputs, blastingRecipe.getExperience()); + } + + public static void craftCinderhearthRecipe(Level world, CinderhearthBlockEntity cinderhearth, CinderhearthRecipe cinderhearthRecipe) { + // calculate outputs + ItemStack inputStack = cinderhearth.getItem(INPUT_SLOT_ID); + float yieldMod = inputStack.is(SpectrumItemTags.NO_CINDERHEARTH_DOUBLING) ? 1.0F : cinderhearth.drainInkForUpgrades(cinderhearth, UpgradeType.YIELD, InkColors.LIGHT_BLUE, cinderhearth.usesEfficiency); + List outputs = cinderhearthRecipe.getRolledOutputs(world.getRandom(), yieldMod); + + // craft + craftRecipe(cinderhearth, inputStack, outputs, cinderhearthRecipe.getExperience()); + } + + private static void craftRecipe(CinderhearthBlockEntity cinderhearth, ItemStack inputStack, List outputs, float experience) { + var world = cinderhearth.level; + if (world == null) return; + + NonNullList backupInventory = NonNullList.withSize(INVENTORY_SIZE, ItemStack.EMPTY); + for (int i = 0; i < cinderhearth.inventory.size(); i++) { + backupInventory.set(i, cinderhearth.inventory.get(i)); + } + + boolean couldAdd = InventoryHelper.addToInventory(cinderhearth, outputs, FIRST_OUTPUT_SLOT_ID, LAST_OUTPUT_SLOT_ID + 1); + if (couldAdd) { + ItemStack remainder = inputStack.getCraftingRemainingItem(); + remainder.setCount(inputStack.getCount()); + + // use up input ingredient + ItemStack inputStackCopy = inputStack.copy(); + int amountToDecrementInput = cinderhearth.getCurrentRecipe() instanceof CinderhearthRecipe cinderhearthRecipe ? cinderhearthRecipe.getIngredientStacks().getFirst().getCount() : 1; + inputStack.shrink(amountToDecrementInput); + + if (!remainder.isEmpty()) { + boolean remainderAdded = InventoryHelper.addToInventory(cinderhearth, remainder, FIRST_OUTPUT_SLOT_ID, LAST_OUTPUT_SLOT_ID + 1); + if (!remainderAdded && inputStack.isEmpty()) { + cinderhearth.setItem(CinderhearthBlockEntity.INPUT_SLOT_ID, remainder); + } + } + + // effects + playCraftingFinishedEffects(cinderhearth); + + // reset + cinderhearth.propertyDelegate.craftingTime = 0; + + // grant experience & advancements + float experienceMod = cinderhearth.drainInkForUpgrades(cinderhearth, UpgradeType.EXPERIENCE, InkColors.PURPLE, cinderhearth.usesEfficiency); + int finalExperience = Support.getIntFromDecimalWithChance(experience * experienceMod, world.getRandom()); + ExperienceStorageItem.addStoredExperience(world.registryAccess(), cinderhearth.getItem(EXPERIENCE_STORAGE_ITEM_SLOT_ID), finalExperience); + cinderhearth.grantPlayerCinderhearthSmeltingAdvancement((ServerLevel) cinderhearth.level, inputStackCopy, outputs, finalExperience); + } else { + cinderhearth.inventory = backupInventory; + + // prevents trying to craft more until the inventory is freed up + cinderhearth.propertyDelegate.craftingTimeTotal = -1; + cinderhearth.currentRecipe = null; + } + } + + public void grantPlayerCinderhearthSmeltingAdvancement(ServerLevel level, ItemStack input, List outputs, int experience) { + ServerPlayer serverPlayerEntity = (ServerPlayer) getOwnerIfOnline(level); + if (serverPlayerEntity != null) { + SpectrumAdvancementCriteria.CINDERHEARTH_SMELTING.trigger(serverPlayerEntity, input, outputs, experience, this.upgrades); + } + } + + public static void playCraftingFinishedEffects(CinderhearthBlockEntity cinderhearthBlockEntity) { + Direction.Axis axis = null; + Direction direction = Direction.UP; + if (!(cinderhearthBlockEntity.level instanceof ServerLevel world)) return; + + for (Map.Entry entry : cinderhearthBlockEntity.upgrades.entrySet()) { + if (entry.getValue() > 1) { + if (axis == null) { + BlockState state = world.getBlockState(cinderhearthBlockEntity.worldPosition); + direction = state.getValue(CinderhearthBlock.FACING); + axis = direction.getAxis(); + } + + double d = (double) cinderhearthBlockEntity.worldPosition.getX() + 0.5D; + double f = (double) cinderhearthBlockEntity.worldPosition.getZ() + 0.5D; + double g2 = -3D / 16D; + double h2 = 4D / 16D; + double i2 = axis == Direction.Axis.X ? (double) direction.getStepX() * g2 : h2; + double k2 = axis == Direction.Axis.Z ? (double) direction.getStepZ() * g2 : h2; + PlayParticleWithRandomOffsetAndVelocityPayload.playParticleWithRandomOffsetAndVelocity(world, + new Vec3(d + i2, cinderhearthBlockEntity.worldPosition.getY() + 1.1, f + k2), + ParticleTypes.CAMPFIRE_COSY_SMOKE, + 3, + new Vec3(0.05D, 0.00D, 0.05D), + new Vec3(0.0D, 0.3D, 0.0D)); + } + } + } + + @Override + public UpgradeHolder getUpgradeHolder() { + return this.upgrades; + } + + @Override + public List getUpgradePosOffsets() { + return CinderhearthBlock.UPGRADE_BLOCK_OFFSETS; + } + + @Override + public IndividualCappedInkStorage getInkStorage() { + return this.inkStorage; + } + + public @Nullable Recipe getCurrentRecipe() { + return currentRecipe == null ? null : currentRecipe.value(); + } + + @Override + public void fillStackedContents(StackedContents finder) { + this.inventory.forEach(finder::accountStack); + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/crystallarieum/CrystallarieumBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/ink/sink/CrystallarieumBlock.java similarity index 83% rename from src/main/java/de/dafuqs/spectrum/blocks/crystallarieum/CrystallarieumBlock.java rename to src/main/java/de/dafuqs/spectrum/blocks/ink/sink/CrystallarieumBlock.java index 2457b70273..eff9bfb025 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/crystallarieum/CrystallarieumBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/ink/sink/CrystallarieumBlock.java @@ -1,12 +1,9 @@ -package de.dafuqs.spectrum.blocks.crystallarieum; +package de.dafuqs.spectrum.blocks.ink.sink; import com.mojang.serialization.*; -import de.dafuqs.spectrum.api.energy.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.api.render.*; import de.dafuqs.spectrum.blocks.*; -import de.dafuqs.spectrum.blocks.fusion_shrine.*; -import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.core.*; import net.minecraft.network.chat.*; @@ -21,7 +18,7 @@ import net.minecraft.world.phys.*; import net.neoforged.neoforge.fluids.*; import net.neoforged.neoforge.fluids.capability.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; @@ -68,11 +65,10 @@ public void fallOn(Level world, BlockState state, BlockPos pos, Entity entity, f ItemStack stack = itemEntity.getItem(); Optional fluidHandler = FluidUtil.getFluidHandler(stack); - if (fluidHandler.isPresent()) { - FluidStack transferredStack = FluidUtil.tryFluidTransfer(crystallarieumBlockEntity.tank, fluidHandler.get(), 1000, true); - if(!transferredStack.isEmpty()) { - var containerItem = fluidHandler.get().getContainer(); + FluidStack transferredFluid = FluidUtil.tryFluidTransfer(crystallarieumBlockEntity.tank, fluidHandler.get(), 1000, true); + if(!transferredFluid.isEmpty()) { + ItemStack containerItem = fluidHandler.get().getContainer(); itemEntity.setItem(containerItem); return; } @@ -103,16 +99,8 @@ public ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level if (FluidUtil.interactWithFluidHandler(player, hand, crystallarieumBlockEntity.tank)) { crystallarieumBlockEntity.updateInClientWorld(); return ItemInteractionResult.CONSUME; - } - - // hand is full and inventory is empty: add - // hand is full and inventory already contains item: exchange them - else if (stack.getItem() instanceof InkStorageItem inkStorageItem) { - if (inkStorageItem.getDrainability().canDrain(false) && exchangeStack(world, pos, player, hand, stack, crystallarieumBlockEntity, CrystallarieumBlockEntity.INK_STORAGE_STACK_SLOT_ID)) { - crystallarieumBlockEntity.setOwner(player); - } } else { - if (exchangeStack(world, pos, player, hand, stack, crystallarieumBlockEntity, CrystallarieumBlockEntity.CATALYST_SLOT_ID)) { + if (exchangeStack(world, pos, player, hand, stack, crystallarieumBlockEntity, CrystallarieumBlockEntity.ADDITIVE_SLOT_ID)) { crystallarieumBlockEntity.setOwner(player); } } @@ -145,6 +133,6 @@ public SlotEffect backgroundType(@Nullable Player player, ItemStack stack) { @Override public int getBackgroundColor(@Nullable Player player, ItemStack stack, float tickDelta) { var color = stack.getOrDefault(SpectrumDataComponentTypes.INK_COLOR, InkColors.WHITE); - return color.getColorInt(); + return color.getColorARGB(); } } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/ink/sink/CrystallarieumBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/ink/sink/CrystallarieumBlockEntity.java new file mode 100644 index 0000000000..f15ba6c748 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/blocks/ink/sink/CrystallarieumBlockEntity.java @@ -0,0 +1,393 @@ +package de.dafuqs.spectrum.blocks.ink.sink; + +import de.dafuqs.spectrum.api.block.*; +import de.dafuqs.spectrum.api.fluid.*; +import de.dafuqs.spectrum.api.ink.storage.*; +import de.dafuqs.spectrum.blocks.*; +import de.dafuqs.spectrum.components.*; +import de.dafuqs.spectrum.helpers.*; +import de.dafuqs.spectrum.particle.effect.*; +import de.dafuqs.spectrum.progression.*; +import de.dafuqs.spectrum.recipe.crystallarieum.*; +import de.dafuqs.spectrum.registries.*; +import de.dafuqs.spectrum.render.animation.*; +import net.minecraft.core.*; +import net.minecraft.core.particles.*; +import net.minecraft.nbt.*; +import net.minecraft.server.level.*; +import net.minecraft.sounds.*; +import net.minecraft.world.entity.item.*; +import net.minecraft.world.entity.player.*; +import net.minecraft.world.item.*; +import net.minecraft.world.item.crafting.*; +import net.minecraft.world.level.*; +import net.minecraft.world.level.block.state.*; +import net.neoforged.neoforge.fluids.capability.templates.*; +import org.jspecify.annotations.*; + +import java.util.*; + +public class CrystallarieumBlockEntity extends InWorldInteractionBlockEntity implements PlayerOwned, InkStorageBlockEntity, SpectrumFluidTank.Callback { + + private final static FlowAnimator.Factory FACTORY; + + protected final static int INVENTORY_SIZE = 1; + protected final static int ADDITIVE_SLOT_ID = 0; + + public static final long INK_STORAGE_SIZE = 64 * 64 * 100; + + protected IndividualCappedInkStorage inkStorage = new IndividualCappedInkStorage(INK_STORAGE_SIZE); + protected boolean inkDirty; + + @Nullable + protected UUID ownerUUID; + + @Nullable + protected RecipeHolder currentRecipe; + protected CrystallarieumAdditive currentAdditive = CrystallarieumAdditive.EMPTY; + protected FluidTank tank = new SpectrumFluidTank(1000, this); + + // for performance reasons, the crystallarieum only processes recipe logic every 20 ticks + public static final int SECOND = 20; + protected TickLooper tickLooper = new TickLooper(SECOND); + + protected int currentGrowthStageTicks; + protected boolean canWork = true; + protected float rotation = 0F; + + protected @Nullable FlowAnimator animator; + protected FlowData _alpha = FlowData.NULL(), _speed = FlowData.NULL(), _bounce = FlowData.NULL(); + + public CrystallarieumBlockEntity(BlockPos pos, BlockState state) { + super(SpectrumBlockEntities.CRYSTALLARIEUM.get(), pos, state, INVENTORY_SIZE); + } + + @SuppressWarnings("unused") + public static void clientTick(Level world, BlockPos blockPos, BlockState blockState, CrystallarieumBlockEntity crystallarieum) { + if (crystallarieum.animator == null) { + crystallarieum.animator = FACTORY.create(FlowStates.INIT, crystallarieum); + } else { + crystallarieum.updateAnimator(); + } + + if (crystallarieum.canWork && crystallarieum.currentRecipe != null) { + ParticleOptions particleEffect = ColoredSparkleRisingParticleEffect.of(crystallarieum.currentRecipe.value().getInkColor().getColorARGB()); + + int amount = 1 + crystallarieum.currentRecipe.value().getInkCostTier(); + if (Support.getIntFromDecimalWithChance(amount / 20.0, world.getRandom()) > 0) { + double randomX = world.getRandom().nextDouble() * 0.8; + double randomZ = world.getRandom().nextDouble() * 0.8; + world.addAlwaysVisibleParticle(particleEffect, blockPos.getX() + 0.1 + randomX, blockPos.getY() + 1, blockPos.getZ() + 0.1 + randomZ, 0.0D, 0.03D, 0.0D); + } + } + } + + public void updateAnimator() { + if (currentRecipe == null) { + animator.swapState(FlowStates.INACTIVE); + } else { + if (currentRecipe.value().getFluid().test(tank.getFluid()) && inkStorage.getEnergy(currentRecipe.value().getInkColor()) > 0) { + animator.swapState(FlowStates.ACTIVE); + } else { + animator.swapState(FlowStates.IDLE); + } + } + + animator.tick(); + } + + @SuppressWarnings("unused") + public static void serverTick(Level world, BlockPos blockPos, BlockState blockState, CrystallarieumBlockEntity crystallarieum) { + if (!crystallarieum.canWork) { + return; + } + + RecipeHolder recipe = crystallarieum.currentRecipe; + if (recipe == null) { + return; + } + + crystallarieum.tickLooper.tick(); + if (crystallarieum.tickLooper.reachedCap()) { + tickRecipe(world, blockPos, crystallarieum, recipe); + crystallarieum.tickLooper.reset(); + } + } + + /** + * Progress the recipe + * gets called 1/second + */ + private static void tickRecipe(Level level, BlockPos pos, CrystallarieumBlockEntity crystallarieum, RecipeHolder recipe) { + if (crystallarieum.currentAdditive == CrystallarieumAdditive.EMPTY && !recipe.value().growsWithoutAdditive()) { + crystallarieum.canWork = false; + return; + } + + if (!recipe.value().getFluid().test(crystallarieum.tank.getFluid())) { + crystallarieum.canWork = false; + return; + } + + // advance growing + int inkCostBase = recipe.value().getInkCost(); + if(inkCostBase > 0) { + float consumedInkFloat = inkCostBase * crystallarieum.currentAdditive.growthAccelerationMod() * crystallarieum.currentAdditive.inkConsumptionMod(); + int inkToConsume = Support.getIntFromDecimalWithChance(consumedInkFloat, level.getRandom()); + if (crystallarieum.inkStorage.drainEnergy(recipe.value().getInkColor(), inkToConsume) < inkToConsume) { + crystallarieum.canWork = false; + crystallarieum.setInkDirty(); + crystallarieum.updateInClientWorld(); + return; + } + crystallarieum.setInkDirty(); + } + + crystallarieum.currentGrowthStageTicks += (int) (SECOND * crystallarieum.currentAdditive.growthAccelerationMod()); + + // check if a catalyst should get used up + if (level.getRandom().nextFloat() < crystallarieum.currentAdditive.consumeChancePerSecond()) { + ItemStack additive = crystallarieum.getItem(ADDITIVE_SLOT_ID); + additive.shrink(1); + crystallarieum.updateInClientWorld(); + if (additive.isEmpty()) { + crystallarieum.currentAdditive = CrystallarieumAdditive.EMPTY; + if (!recipe.value().growsWithoutAdditive()) { + crystallarieum.canWork = false; + } + } + } + + // advanced enough? grow! + if (crystallarieum.currentGrowthStageTicks >= recipe.value().getSecondsPerGrowthStage() * SECOND) { + BlockPos topPos = pos.above(); + BlockState topState = level.getBlockState(topPos); + Optional nextState = recipe.value().getNextState(recipe, topState); + if (nextState.isPresent()) { + level.setBlockAndUpdate(topPos, nextState.get()); + ServerPlayer owner = (ServerPlayer) crystallarieum.getOwnerIfOnline(level); + if (owner != null) { + SpectrumAdvancementCriteria.CRYSTALLARIEUM_GROWING.trigger(owner, (ServerLevel) level, topPos, crystallarieum.getItem(ADDITIVE_SLOT_ID)); + } + } else { + crystallarieum.canWork = false; + } + crystallarieum.currentGrowthStageTicks = 0; + } + } + + @Override + public void inventoryChanged() { + if (this.currentRecipe == null || level == null) { + this.currentAdditive = CrystallarieumAdditive.EMPTY; + this.canWork = false; + this.currentGrowthStageTicks = 0; + this.tickLooper.reset(); + } else { + this.currentAdditive = this.currentRecipe.value().getAdditive(getItem(ADDITIVE_SLOT_ID)); + BlockState topState = this.level.getBlockState(this.worldPosition.above()); + this.canWork = this.currentRecipe.value().getNextState(this.currentRecipe, topState).isPresent() + && (this.currentRecipe.value().growsWithoutAdditive() || this.currentAdditive != CrystallarieumAdditive.EMPTY); + } + super.inventoryChanged(); + } + + @Override + public void loadAdditional(CompoundTag nbt, HolderLookup.Provider registryLookup) { + super.loadAdditional(nbt, registryLookup); + + CodecHelper.fromNbt(InkStorageComponent.CODEC, nbt.get("InkStorage")).ifPresent(storage -> + this.inkStorage = new IndividualCappedInkStorage(storage.maxPerColor(), storage.storedEnergy())); + if (nbt.contains("Looper", Tag.TAG_COMPOUND)) { + this.tickLooper = TickLooper.fromNbt(nbt.getCompound("Looper")); + } + + this.tank.readFromNBT(registryLookup, nbt); + this.canWork = nbt.getBoolean("CanWork"); + this.ownerUUID = PlayerOwnedWithName.readOwnerUUID(nbt); + this.currentAdditive = CrystallarieumAdditive.EMPTY; + this.currentRecipe = MultiblockCrafter.getRecipeHolderFromNbt(level, nbt, CrystallarieumRecipe.class); + this.currentGrowthStageTicks = nbt.getInt("CurrentGrowthStageDuration"); + if (this.currentRecipe != null) { + this.currentAdditive = this.currentRecipe.value().getAdditive(getItem(ADDITIVE_SLOT_ID)); + } + } + + @Override + public void saveAdditional(CompoundTag nbt, HolderLookup.Provider registryLookup) { + super.saveAdditional(nbt, registryLookup); + + CodecHelper.writeNbt(nbt, "InkStorage", InkStorageComponent.CODEC, new InkStorageComponent(this.inkStorage)); + nbt.put("Looper", this.tickLooper.toNbt()); + + this.tank.writeToNBT(registryLookup, nbt); + nbt.putBoolean("CanWork", this.canWork); + nbt.putInt("CurrentGrowthStageDuration", this.currentGrowthStageTicks); + PlayerOwned.writeOwnerUUID(nbt, this.ownerUUID); + if (this.currentRecipe != null) { + nbt.putString("CurrentRecipe", this.currentRecipe.id().toString()); + } + } + + @Override + public @Nullable UUID getOwnerUUID() { + return this.ownerUUID; + } + + @Override + public void setOwner(Player playerEntity) { + this.ownerUUID = playerEntity.getUUID(); + setChanged(); + } + + /** + * Searches recipes for a valid one using inkAmount and plants the first block of that recipe on top + * + * @param itemStack stack that is tried to plant on top, if a valid recipe + */ + public void acceptStack(ItemStack itemStack, boolean creative, @Nullable UUID player) { + boolean changed = false; + + if (level == null) return; + + if (level.getBlockState(worldPosition.above()).isAir()) { + var recipe = level.getRecipeManager().getRecipeFor(SpectrumRecipeTypes.CRYSTALLARIEUM, new SingleRecipeInput(itemStack), level); + if (recipe.isPresent()) { + if (!creative) { + itemStack.shrink(1); + } + BlockState placedState = recipe.get().value().getGrowthStages().getFirst(); + level.setBlockAndUpdate(worldPosition.above(), placedState); + onTopBlockChange(placedState, recipe.get()); + changed = true; + } + } else if (this.currentRecipe != null) { + ItemStack currentCatalystStack = getItem(ADDITIVE_SLOT_ID); + if (currentCatalystStack.isEmpty()) { + CrystallarieumAdditive catalyst = this.currentRecipe.value().getAdditive(itemStack); + if (catalyst != CrystallarieumAdditive.EMPTY) { + setItem(ADDITIVE_SLOT_ID, itemStack.copy()); + if (!creative) { + itemStack.setCount(0); + } + this.currentAdditive = catalyst; + changed = true; + } + } else if (ItemStack.isSameItemSameComponents(currentCatalystStack, itemStack)) { + InventoryHelper.combineStacks(currentCatalystStack, itemStack); + changed = true; + } + } + + if (changed) { + level.playSound(null, worldPosition, SoundEvents.ITEM_PICKUP, SoundSource.BLOCKS, 0.8F, 0.8F + level.getRandom().nextFloat() * 0.6F); + if (player != null) { + this.ownerUUID = player; + } + inventoryChanged(); + } + } + + public FluidTank getFluidTank() { + return tank; + } + + /** + * Triggered when the block on top of the crystallarieum has changed + * Sets the new recipe matching that block state + * + * @param newState the new block state on top + * @param recipe optionally the matching CrystallarieumRecipe. If null is passed it will be calculated + */ + public void onTopBlockChange(BlockState newState, @Nullable RecipeHolder recipe) { + if (level == null) return; + if (newState.isAir()) { // fast fail + this.currentRecipe = null; + this.canWork = false; + setChanged(); + updateInClientWorld(); + } else { + this.currentRecipe = recipe == null ? CrystallarieumRecipe.getRecipeForState(level, newState) : recipe; + if (this.currentRecipe != null) { + ItemStack catalystStack = getItem(ADDITIVE_SLOT_ID); + if (!catalystStack.isEmpty()) { + this.currentAdditive = this.currentRecipe.value().getAdditive(catalystStack); + if (this.currentAdditive == CrystallarieumAdditive.EMPTY) { + ItemEntity itemEntity = new ItemEntity(level, this.getBlockPos().getX() + 0.5, this.getBlockPos().getY() + 1, this.getBlockPos().getZ() + 0.5, catalystStack); + this.setItem(ADDITIVE_SLOT_ID, ItemStack.EMPTY); + level.addFreshEntity(itemEntity); + } + } + } + + inventoryChanged(); + } + } + + @Override + public IndividualCappedInkStorage getInkStorage() { + return this.inkStorage; + } + + @Override + public void setInkDirty() { + setChanged(); + this.inkDirty = true; + } + + @Override + public void setChanged() { + super.setChanged(); + this.canWork = true; + } + + @Override + public boolean getInkDirty() { + return this.inkDirty; + } + + @Override + public boolean canPlaceItem(int slot, ItemStack stack) { + if (this.currentRecipe != null) { + return this.currentRecipe.value().getAdditive(stack) != CrystallarieumAdditive.EMPTY; + } + return false; + } + + static { + var builder = new FlowAnimator.Builder<>(CrystallarieumBlockEntity.class); + + builder.stateInfo(FlowStates.INACTIVE, 30); + builder.stateInfo(FlowStates.ACTIVE, 15); + builder.stateInfo(FlowStates.IDLE, 13); + + builder.handle("alpha", FlowHandlers.FLOAT) + .initial(0.1F) + .forStates(0.1F, FlowStates.INACTIVE) + .forStates(0.4F, FlowStates.IDLE) + .forStates(0.8F, FlowStates.ACTIVE) + .push(); + + builder.handle("speed", FlowHandlers.FLOAT) + .initial(0F) + .forStates(-0.5F, FlowStates.INACTIVE) + .forStates(1F, FlowStates.IDLE) + .forStates(2.5F, FlowStates.ACTIVE) + .push(); + + builder.handle("bounce", FlowHandlers.FLOAT) + .initial(0F) + .forStates(2F, FlowStates.INACTIVE) + .forStates(1F, FlowStates.IDLE) + .forStates(4F, FlowStates.ACTIVE) + .push(); + + FACTORY = builder.build(); + } + + @Override + public void onFluidContentsChanged() { + this.inventoryChanged(); + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/crystallarieum/CrystallarieumBlockEntityRenderer.java b/src/main/java/de/dafuqs/spectrum/blocks/ink/sink/CrystallarieumBlockEntityRenderer.java similarity index 76% rename from src/main/java/de/dafuqs/spectrum/blocks/crystallarieum/CrystallarieumBlockEntityRenderer.java rename to src/main/java/de/dafuqs/spectrum/blocks/ink/sink/CrystallarieumBlockEntityRenderer.java index 50613ba1fd..ffc51bc5aa 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/crystallarieum/CrystallarieumBlockEntityRenderer.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/ink/sink/CrystallarieumBlockEntityRenderer.java @@ -1,9 +1,9 @@ -package de.dafuqs.spectrum.blocks.crystallarieum; +package de.dafuqs.spectrum.blocks.ink.sink; import com.mojang.blaze3d.vertex.*; import com.mojang.math.*; import de.dafuqs.spectrum.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.render.*; import net.minecraft.client.*; import net.minecraft.client.model.geom.*; @@ -20,7 +20,6 @@ import net.neoforged.neoforge.client.extensions.common.*; import net.neoforged.neoforge.client.textures.*; import net.neoforged.neoforge.fluids.*; -import javax.annotation.*; public class CrystallarieumBlockEntityRenderer implements BlockEntityRenderer { @@ -77,7 +76,7 @@ public void render(CrystallarieumBlockEntity crystal, float tickDelta, PoseStack } - ItemStack catalystStack = crystal.getItem(CrystallarieumBlockEntity.CATALYST_SLOT_ID); + ItemStack catalystStack = crystal.getItem(CrystallarieumBlockEntity.ADDITIVE_SLOT_ID); if (catalystStack.isEmpty()) return; @@ -95,14 +94,14 @@ private void renderHalo(CrystallarieumBlockEntity crystal, float tickDelta, Pose if (crystal.currentRecipe != null) { ink = crystal.currentRecipe.value().getInkColor(); - active.render(matrices, vertices, LightTexture.FULL_BRIGHT, overlay, ink.getColorInt()); + active.render(matrices, vertices, LightTexture.FULL_BRIGHT, overlay, ink.getColorARGB()); } else { inactive.render(matrices, vertices, light, overlay); } crystal.rotation += crystal._speed.get(); matrices.mulPose(Axis.YP.rotationDegrees(crystal.rotation)); - var argb = FastColor.ARGB32.color(Math.round(crystal._alpha.get() * 255), ink.getColorInt()); + var argb = FastColor.ARGB32.color(Math.round(crystal._alpha.get() * 255), ink.getColorARGB()); halo.y = (float) (-9 - bounce); matrices.mulPose(Axis.YP.rotationDegrees(-crystal.rotation * 2)); echo.y = (float) (0.5 - (bounce / 3)); @@ -110,16 +109,6 @@ private void renderHalo(CrystallarieumBlockEntity crystal, float tickDelta, Pose upperecho.y = (float) (-0.5 - (bounce / 3)); halo.render(matrices, vertices, LightTexture.FULL_BRIGHT, overlay, argb); - //Fairly lazily placed ink storage. Due to be removed once ink update happens - ItemStack inkStorageStack = crystal.getItem(CrystallarieumBlockEntity.INK_STORAGE_STACK_SLOT_ID); - if (!inkStorageStack.isEmpty()) { - matrices.scale(0.65F, 0.65F, 0.65F); - matrices.mulPose(Axis.XP.rotationDegrees(180)); - matrices.translate(0, 0.975 + bounce / 3, 0); - Minecraft.getInstance().getItemRenderer().renderStatic(inkStorageStack, ItemDisplayContext.GROUND, light, overlay, matrices, vertexConsumers, crystal.getLevel(), 0); - - } - matrices.popPose(); } @@ -155,21 +144,14 @@ public int getViewDistance() { public static LayerDefinition getTexturedModelData() { MeshDefinition modelData = new MeshDefinition(); PartDefinition modelPartData = modelData.getRoot(); - PartDefinition active = modelPartData.addOrReplaceChild("active", CubeListBuilder.create().texOffs(40, 34).addBox(-5.0F, -3.0F, -5.0F, 10.0F, 4.0F, 10.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 22.0F, 0.0F)); - - PartDefinition inactive = modelPartData.addOrReplaceChild("inactive", CubeListBuilder.create().texOffs(80, 34).addBox(-5.0F, -3.0F, -5.0F, 10.0F, 4.0F, 10.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 22.0F, 0.0F)); - + modelPartData.addOrReplaceChild("active", CubeListBuilder.create().texOffs(40, 34).addBox(-5.0F, -3.0F, -5.0F, 10.0F, 4.0F, 10.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 22.0F, 0.0F)); + modelPartData.addOrReplaceChild("inactive", CubeListBuilder.create().texOffs(80, 34).addBox(-5.0F, -3.0F, -5.0F, 10.0F, 4.0F, 10.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 22.0F, 0.0F)); PartDefinition halo = modelPartData.addOrReplaceChild("halo", CubeListBuilder.create().texOffs(77, 48).addBox(-8.5F, 1.0F, -8.5F, 17.0F, 0.0F, 17.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, -9.0F, 0.0F)); - - PartDefinition diamond_r1 = halo.addOrReplaceChild("diamond_r1", CubeListBuilder.create().texOffs(80, 65).addBox(-7.5F, 0.0F, -7.5F, 15.0F, 0.0F, 15.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 1.0F, 0.0F, 0.0F, -0.7854F, 0.0F)); - + halo.addOrReplaceChild("diamond_r1", CubeListBuilder.create().texOffs(80, 65).addBox(-7.5F, 0.0F, -7.5F, 15.0F, 0.0F, 15.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 1.0F, 0.0F, 0.0F, -0.7854F, 0.0F)); PartDefinition echo = halo.addOrReplaceChild("echo", CubeListBuilder.create(), PartPose.offset(0.0F, 0.5F, 0.0F)); - - PartDefinition echoring_r1 = echo.addOrReplaceChild("echoring_r1", CubeListBuilder.create().texOffs(80, 80).addBox(-7.5F, 0.0F, -7.5F, 15.0F, 0.0F, 15.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.0F, -0.7854F, 0.0F)); - + echo.addOrReplaceChild("echoring_r1", CubeListBuilder.create().texOffs(80, 80).addBox(-7.5F, 0.0F, -7.5F, 15.0F, 0.0F, 15.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.0F, -0.7854F, 0.0F)); PartDefinition upperecho = echo.addOrReplaceChild("upperecho", CubeListBuilder.create(), PartPose.offset(0.0F, -0.5F, 0.0F)); - - PartDefinition echoring_r2 = upperecho.addOrReplaceChild("echoring_r2", CubeListBuilder.create().texOffs(80, 95).addBox(-7.5F, 0.0F, -7.5F, 15.0F, 0.0F, 15.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.0F, -0.7854F, 0.0F)); + upperecho.addOrReplaceChild("echoring_r2", CubeListBuilder.create().texOffs(80, 95).addBox(-7.5F, 0.0F, -7.5F, 15.0F, 0.0F, 15.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.0F, -0.7854F, 0.0F)); return LayerDefinition.create(modelData, 128, 128); } } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/ink/sink/InkSinkBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/ink/sink/InkSinkBlockEntity.java new file mode 100644 index 0000000000..56a8c5f693 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/blocks/ink/sink/InkSinkBlockEntity.java @@ -0,0 +1,50 @@ +package de.dafuqs.spectrum.blocks.ink.sink; + +import de.dafuqs.spectrum.api.ink.capability.*; +import de.dafuqs.spectrum.api.ink.color.*; +import de.dafuqs.spectrum.api.ink.storage.*; +import de.dafuqs.spectrum.blocks.ink.*; +import de.dafuqs.spectrum.components.*; +import de.dafuqs.spectrum.helpers.*; +import de.dafuqs.spectrum.inventories.*; +import net.minecraft.core.*; +import net.minecraft.nbt.*; +import net.minecraft.network.*; +import net.minecraft.world.*; +import net.minecraft.world.entity.player.*; +import net.minecraft.world.inventory.*; +import net.minecraft.world.item.*; +import net.minecraft.world.level.*; +import net.minecraft.world.level.block.entity.*; +import net.minecraft.world.level.block.state.*; + +import java.util.*; + +public abstract class InkSinkBlockEntity extends BaseInkBlockEntity implements MenuProvider { + + public InkSinkBlockEntity(BlockEntityType blockEntityType, BlockPos blockPos, BlockState blockState, int tier, int inventorySize, int inkSlotId) { + super(blockEntityType, blockPos, blockState, new IndividualCappedInkStorage((long) Math.pow(256, tier)), inventorySize, inkSlotId); + } + + public InkSinkBlockEntity(BlockEntityType blockEntityType, BlockPos blockPos, BlockState blockState, int tier, int inventorySize, int inkSlotId, List usedInkColors) { + super(blockEntityType, blockPos, blockState, new IndividualCappedInkStorage((long) Math.pow(256, tier), usedInkColors), inventorySize, inkSlotId); + } + + @Override + public void loadAdditional(CompoundTag nbt, HolderLookup.Provider registryLookup) { + super.loadAdditional(nbt, registryLookup); + CodecHelper.fromNbt(InkStorageComponent.CODEC, nbt.get("ink_storage")).ifPresent(storage -> this.inkStorage = new IndividualCappedInkStorage(storage.maxPerColor(), storage.storedEnergy())); + } + + @Override + protected void saveAdditional(CompoundTag nbt, HolderLookup.Provider registryLookup) { + super.saveAdditional(nbt, registryLookup); + CodecHelper.writeNbt(nbt, "ink_storage", InkStorageComponent.CODEC, new InkStorageComponent(this.inkStorage)); + } + + @Override + public void writeClientSideData(AbstractContainerMenu menu, RegistryFriendlyByteBuf buffer) { + BaseInkScreenHandler.ScreenOpeningData.STREAM_CODEC.encode(buffer, new BaseInkScreenHandler.ScreenOpeningData(this.worldPosition, this.selectedColor)); + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/ink/sink/TintingStationBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/ink/sink/TintingStationBlock.java new file mode 100644 index 0000000000..e5b297bde9 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/blocks/ink/sink/TintingStationBlock.java @@ -0,0 +1,76 @@ +package de.dafuqs.spectrum.blocks.ink.sink; + +import com.mojang.serialization.*; +import de.dafuqs.spectrum.blocks.ink.*; +import de.dafuqs.spectrum.helpers.*; +import de.dafuqs.spectrum.registries.*; +import net.minecraft.*; +import net.minecraft.core.*; +import net.minecraft.network.chat.*; +import net.minecraft.world.item.*; +import net.minecraft.world.item.context.*; +import net.minecraft.world.level.*; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.entity.*; +import net.minecraft.world.level.block.state.*; +import net.minecraft.world.level.block.state.properties.*; +import net.minecraft.world.phys.shapes.*; +import org.jspecify.annotations.*; + +import java.util.*; + +public class TintingStationBlock extends BaseInkBlock { + + public static final MapCodec CODEC = simpleCodec(TintingStationBlock::new); + public static final BooleanProperty SHORT = BlockStateProperties.SHORT; + + protected static final VoxelShape SHAPE = Block.box(1.0D, 0.0D, 1.0D, 16.0D, 13.0D, 15.0D); + protected static final VoxelShape SHAPE_SHORT = Block.box(1.0D, 0.0D, 1.0D, 15.0D, 4.0D, 15.0D); + + public TintingStationBlock(Properties settings) { + super(settings); + registerDefaultState(getStateDefinition().any().setValue(FACING, Direction.NORTH).setValue(SHORT, false)); + } + + @Override + public MapCodec codec() { + return CODEC; + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { + return state.getValue(SHORT) ? SHAPE_SHORT : SHAPE; + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(SHORT); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + BlockState state = super.getStateForPlacement(ctx); + if(ctx.getPlayer() != null) { + state = state.setValue(SHORT, ctx.getPlayer().isShiftKeyDown()); + } + return state; + } + + @Override + public void appendHoverText(ItemStack stack, Item.TooltipContext context, List tooltip, TooltipFlag type) { + super.appendHoverText(stack, context, tooltip, type); + tooltip.add(Component.translatable("block.spectrum.tinting_station.tooltip").withStyle(ChatFormatting.GRAY)); + } + + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new TintingStationBlockEntity(pos, state); + } + + @Override + public @Nullable BlockEntityTicker getTicker(Level level, BlockState state, BlockEntityType blockEntityType) { + return createInkBlockTicker(level, blockEntityType, SpectrumBlockEntities.TINTING_STATION.get()); + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/ink/sink/TintingStationBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/ink/sink/TintingStationBlockEntity.java new file mode 100644 index 0000000000..7af64abbe5 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/blocks/ink/sink/TintingStationBlockEntity.java @@ -0,0 +1,195 @@ +package de.dafuqs.spectrum.blocks.ink.sink; + +import de.dafuqs.spectrum.api.ink.color.*; +import de.dafuqs.spectrum.api.ink.storage.*; +import de.dafuqs.spectrum.blocks.ink.*; +import de.dafuqs.spectrum.blocks.ink.gen.*; +import de.dafuqs.spectrum.components.*; +import de.dafuqs.spectrum.config.*; +import de.dafuqs.spectrum.helpers.*; +import de.dafuqs.spectrum.inventories.*; +import de.dafuqs.spectrum.networking.s2c_payloads.*; +import de.dafuqs.spectrum.particle.effect.*; +import de.dafuqs.spectrum.registries.*; +import net.minecraft.core.*; +import net.minecraft.core.component.*; +import net.minecraft.nbt.*; +import net.minecraft.network.*; +import net.minecraft.network.chat.*; +import net.minecraft.server.level.*; +import net.minecraft.sounds.*; +import net.minecraft.tags.*; +import net.minecraft.util.*; +import net.minecraft.world.*; +import net.minecraft.world.entity.player.*; +import net.minecraft.world.inventory.*; +import net.minecraft.world.item.*; +import net.minecraft.world.item.alchemy.*; +import net.minecraft.world.item.component.*; +import net.minecraft.world.level.*; +import net.minecraft.world.level.block.state.*; +import net.minecraft.world.phys.*; + +import java.util.*; + +public class TintingStationBlockEntity extends InkSinkBlockEntity implements MenuProvider { + + public static final int INPUT_SLOT_ID = 0; + public static final int OUTPUT_SLOT_ID = 1; + + public static final long TICKS_PER_CONVERSION = 5; + public static final long ITEM_COLORING_COST = 10; + + public TintingStationBlockEntity(BlockPos blockPos, BlockState blockState) { + super(SpectrumBlockEntities.TINTING_STATION.get(), blockPos, blockState, 4, 2, INPUT_SLOT_ID); + } + + public boolean shouldTickLogic(Level world) { + return world.getGameTime() % TICKS_PER_CONVERSION == 0; + } + + public boolean tickLogic(Level level) { + ItemStack input = this.getItem(INPUT_SLOT_ID); + if (!input.isEmpty()) { + Optional> inkColorHolder = this.getSelectedColor(); + InkStorage inkStorage = this.getInkStorage(); + + if (inkColorHolder.isPresent()) { + InkColor selectedInkColor = inkColorHolder.get().value(); + if (inkStorage.getEnergy(selectedInkColor) >= ITEM_COLORING_COST) { + ItemStack output = this.getItem(OUTPUT_SLOT_ID); + if (output.getCount() < output.getMaxStackSize()) { + ItemStack resultStack = this.colorStack(input, selectedInkColor); + if (resultStack.isEmpty()) { + resultStack = tintStack(input, selectedInkColor); + } + if (resultStack.isEmpty()) { + resultStack = tintPotion(input, selectedInkColor); + } + + if (!resultStack.isEmpty()) { + if (output.isEmpty()) { + input.shrink(1); + this.setItem(OUTPUT_SLOT_ID, resultStack); + } else if (ItemStack.isSameItemSameComponents(output, resultStack)) { + input.shrink(1); + output.grow(1); + } + + inkStorage.addEnergy(selectedInkColor, -ITEM_COLORING_COST); + + if (SpectrumConfig.CONFIG.BlockSoundVolume.get() > 0) { + level.playSound(null, this.getBlockPos(), SpectrumSoundEvents.COLOR_PICKER_PROCESSING, SoundSource.BLOCKS, SpectrumConfig.CONFIG.BlockSoundVolume.get().floatValue() / 3F, 1.0F); + + PlayParticleWithRandomOffsetAndVelocityPayload.playParticleWithRandomOffsetAndVelocity((ServerLevel) this.getLevel(), + new Vec3(this.getBlockPos().getX() + 0.5, this.getBlockPos().getY() + 0.7, this.getBlockPos().getZ() + 0.5), + ColoredFluidRisingParticleEffect.of(selectedInkColor.getColorARGB()), + 5, + new Vec3(0.22, 0.0, 0.22), + new Vec3(0.0, 0.1, 0.0) + ); + } + return true; + } + } + } + } + } + return false; + } + + // Cleaned up version of net.minecraft.world.item.component.DyedItemColor + // modified to work with InkColor + protected static ItemStack tintStack(ItemStack stack, InkColor inkColor) { + if (!stack.is(ItemTags.DYEABLE)) { + return ItemStack.EMPTY; + } + + ItemStack result = stack.copyWithCount(1); + int i = 0; + int j = 0; + int k = 0; + int prevMax = 0; + int i1 = 0; + DyedItemColor dyeditemcolor = result.get(DataComponents.DYED_COLOR); + if (dyeditemcolor != null) { + int prevRed = FastColor.ARGB32.red(dyeditemcolor.rgb()); + int prevGreen = FastColor.ARGB32.green(dyeditemcolor.rgb()); + int prevBlue = FastColor.ARGB32.blue(dyeditemcolor.rgb()); + prevMax += Math.max(prevRed, Math.max(prevGreen, prevBlue)); + i += prevRed; + j += prevGreen; + k += prevBlue; + i1++; + } + + int j3 = inkColor.getColorARGB(); + int i2 = FastColor.ARGB32.red(j3); + int j2 = FastColor.ARGB32.green(j3); + int k2 = FastColor.ARGB32.blue(j3); + prevMax += Math.max(i2, Math.max(j2, k2)); + i += i2; + j += j2; + k += k2; + i1++; + + int finalRed = i / i1; + int finalGreen = j / i1; + int finalBlue = k / i1; + float f = (float)prevMax / (float)i1; + float f1 = (float)Math.max(finalRed, Math.max(finalGreen, finalBlue)); + finalRed = (int)((float)finalRed * f / f1); + finalGreen = (int)((float)finalGreen * f / f1); + finalBlue = (int)((float)finalBlue * f / f1); + int finalColor = FastColor.ARGB32.color(0, finalRed, finalGreen, finalBlue); + boolean flag = dyeditemcolor == null || dyeditemcolor.showInTooltip(); + result.set(DataComponents.DYED_COLOR, new DyedItemColor(finalColor, flag)); + return result; + } + + protected static ItemStack tintPotion(ItemStack stack, InkColor inkColor) { + PotionContents pc = stack.get(DataComponents.POTION_CONTENTS); + if(pc == null) { + return ItemStack.EMPTY; + } + int newColor = inkColor.getColorARGB(); + if(pc.customColor().isPresent() && pc.customColor().get() == newColor) { + return ItemStack.EMPTY; + } + + ItemStack result = stack.copyWithCount(1); + PotionContents newContents = new PotionContents(pc.potion(), Optional.of(newColor), pc.customEffects()); + result.set(DataComponents.POTION_CONTENTS, newContents); + return result; + } + + public ItemStack colorStack(ItemStack stack, InkColor inkColor) { + Item resultItem = VariantHelper.getColoredItem(stack, inkColor); + if(resultItem == null) { + return ItemStack.EMPTY; + } + + ItemStack resultStack = resultItem.getDefaultInstance(); + resultStack.applyComponents(stack.getComponents()); + return resultStack; + } + + @Override + protected Component getDefaultName() { + return Component.translatable("block.spectrum.tinting_station"); + } + + @Override + protected AbstractContainerMenu createMenu(int syncId, Inventory playerInventory) { + return new TintingStationScreenHandler(syncId, playerInventory, this, this.selectedColor); + } + + @Override + public boolean canPlaceItem(int slot, ItemStack stack) { + if (slot == OUTPUT_SLOT_ID) { + return stack.getItem() instanceof InkStorageItem; + } + return true; + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/ink/sink/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/ink/sink/package-info.java new file mode 100644 index 0000000000..09c1bef428 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/blocks/ink/sink/package-info.java @@ -0,0 +1,7 @@ +@NullMarked +@MethodsReturnNonnullByDefault +@FieldsAreNonnullByDefault +package de.dafuqs.spectrum.blocks.ink.sink; + +import net.minecraft.*; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/item_bowl/ItemBowlBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/item_bowl/ItemBowlBlock.java index 9c6f651baa..0c3f2e6e16 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/item_bowl/ItemBowlBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/item_bowl/ItemBowlBlock.java @@ -2,8 +2,6 @@ import com.mojang.serialization.*; import de.dafuqs.spectrum.blocks.*; -import de.dafuqs.spectrum.blocks.enchanter.*; -import de.dafuqs.spectrum.blocks.spirit_instiller.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.core.*; import net.minecraft.world.*; @@ -15,7 +13,7 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.*; import net.minecraft.world.phys.shapes.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/item_bowl/ItemBowlBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/item_bowl/ItemBowlBlockEntity.java index 17385969f2..588078c441 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/item_bowl/ItemBowlBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/item_bowl/ItemBowlBlockEntity.java @@ -1,9 +1,8 @@ package de.dafuqs.spectrum.blocks.item_bowl; import de.dafuqs.spectrum.api.color.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.blocks.*; -import de.dafuqs.spectrum.blocks.spirit_instiller.*; import de.dafuqs.spectrum.config.*; import de.dafuqs.spectrum.events.*; import de.dafuqs.spectrum.helpers.*; @@ -18,10 +17,8 @@ import net.minecraft.world.entity.item.*; import net.minecraft.world.item.*; import net.minecraft.world.level.*; -import net.minecraft.world.level.block.entity.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.*; -import javax.annotation.*; import java.util.*; @@ -55,7 +52,7 @@ public static void spawnRisingParticles(Level world, BlockPos blockPos, ItemStac if (amount > 0) { Optional optionalItemColor = ColorRegistry.ITEM_COLORS.getInkColor(itemStack.getItem()); if (optionalItemColor.isPresent()) { - ParticleOptions particleEffect = ColoredSparkleRisingParticleEffect.of(optionalItemColor.get().getColorInt()); + ParticleOptions particleEffect = ColoredSparkleRisingParticleEffect.of(optionalItemColor.get().getColorARGB()); for (int i = 0; i < amount; i++) { float randomX = 0.1F + world.getRandom().nextFloat() * 0.8F; @@ -74,12 +71,13 @@ public int decrementBowlStack(Vec3 orbTargetPos, int amount, boolean doEffects) int decrementAmount = Math.min(amount, storedStack.getCount()); ItemStack remainder = storedStack.getCraftingRemainingItem(); + remainder.setCount(decrementAmount); + if (!remainder.isEmpty()) { if (storedStack.getCount() == 1) { setItem(0, remainder); } else { getItem(0).shrink(decrementAmount); - remainder.setCount(decrementAmount); ItemEntity itemEntity = new ItemEntity(level, worldPosition.getX() + 0.5, worldPosition.getY() + 1, worldPosition.getZ() + 0.5, remainder); itemEntity.push(0, 0.1, 0); @@ -104,7 +102,7 @@ public void spawnOrbParticles(Vec3 orbTargetPos) { ItemStack storedStack = this.getItem(0); if (!storedStack.isEmpty() && level != null) { InkColor itemColor = ColorRegistry.ITEM_COLORS.getInkColor(storedStack.getItem(), InkColors.PURPLE); - ParticleOptions sparkleRisingParticleEffect = ColoredSparkleRisingParticleEffect.of(itemColor.getColorInt()); + ParticleOptions sparkleRisingParticleEffect = ColoredSparkleRisingParticleEffect.of(itemColor.getColorARGB()); if (this.getLevel() instanceof ServerLevel serverWorld) { PlayParticleWithRandomOffsetAndVelocityPayload.playParticleWithRandomOffsetAndVelocity((ServerLevel) level, @@ -112,7 +110,7 @@ public void spawnOrbParticles(Vec3 orbTargetPos) { sparkleRisingParticleEffect, 50, new Vec3(0.4, 0.2, 0.4), new Vec3(0.06, 0.16, 0.06)); - ColorTransmissionPayload.playColorTransmissionParticle(serverWorld, new ColoredTransmission(new Vec3(this.worldPosition.getX() + 0.5D, this.worldPosition.getY() + 1.0D, this.worldPosition.getZ() + 0.5D), new ExactPositionSource(orbTargetPos), 20, itemColor.getColorInt())); + ColorTransmissionPayload.playColorTransmissionParticle(serverWorld, new ColoredTransmission(new Vec3(this.worldPosition.getX() + 0.5D, this.worldPosition.getY() + 1.0D, this.worldPosition.getZ() + 0.5D), new ExactPositionSource(orbTargetPos), 20, itemColor.getColorARGB())); } else if (this.getLevel().isClientSide()) { for (int i = 0; i < 50; i++) { float randomOffsetX = worldPosition.getX() + 0.3F + level.getRandom().nextFloat() * 0.6F; @@ -127,7 +125,7 @@ public void spawnOrbParticles(Vec3 orbTargetPos) { randomVelocityX, randomVelocityY, randomVelocityZ); } - ParticleOptions sphereParticleEffect = new ColoredTransmissionParticleEffect(new ExactPositionSource(orbTargetPos), 20, itemColor.getColorInt()); + ParticleOptions sphereParticleEffect = new ColoredTransmissionParticleEffect(new ExactPositionSource(orbTargetPos), 20, itemColor.getColorARGB()); this.getLevel().addParticle(sphereParticleEffect, this.worldPosition.getX() + 0.5D, this.worldPosition.getY() + 1.0D, this.worldPosition.getZ() + 0.5D, (orbTargetPos.x() - this.worldPosition.getX()) * 0.045, 0, (orbTargetPos.z() - this.worldPosition.getZ()) * 0.045); } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/item_bowl/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/item_bowl/package-info.java index 3244635911..9ac23977d9 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/item_bowl/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/item_bowl/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.item_bowl; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/item_roundel/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/item_roundel/package-info.java index 398f3b2304..09a496910b 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/item_roundel/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/item_roundel/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.item_roundel; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/JadeVine.java b/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/JadeVine.java index 832da42726..a3e636b1f0 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/JadeVine.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/JadeVine.java @@ -13,7 +13,6 @@ import net.minecraft.world.level.block.state.properties.*; import net.minecraft.world.phys.*; import net.minecraft.world.phys.shapes.*; -import javax.annotation.*; public interface JadeVine { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/JadeVineBulbBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/JadeVineBulbBlock.java index 13ada8c10a..b932871079 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/JadeVineBulbBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/JadeVineBulbBlock.java @@ -13,7 +13,6 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.block.state.properties.*; import net.minecraft.world.phys.shapes.*; -import javax.annotation.*; public class JadeVineBulbBlock extends Block implements JadeVine, NaturesStaffTriggered { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/JadeVinePetalBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/JadeVinePetalBlock.java index 56aae4a1bc..269ec6afdc 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/JadeVinePetalBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/JadeVinePetalBlock.java @@ -6,7 +6,6 @@ import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.shapes.*; -import javax.annotation.*; public class JadeVinePetalBlock extends Block { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/JadeVinePlantBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/JadeVinePlantBlock.java index 3df36bf25e..0c2b99387e 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/JadeVinePlantBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/JadeVinePlantBlock.java @@ -22,8 +22,7 @@ import net.minecraft.world.level.storage.loot.parameters.*; import net.minecraft.world.phys.*; import net.minecraft.world.phys.shapes.*; -import org.jetbrains.annotations.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; @@ -226,13 +225,11 @@ public enum JadeVinesPlantPart implements StringRepresentable { MIDDLE, TIP; - @Contract(pure = true) public String toString() { return this.getSerializedName(); } @Override - @Contract(pure = true) public String getSerializedName() { return this == BASE ? "base" : this == MIDDLE ? "middle" : "tip"; } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/JadeVineRootsBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/JadeVineRootsBlock.java index afd013f67e..5657312280 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/JadeVineRootsBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/JadeVineRootsBlock.java @@ -16,7 +16,7 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.block.state.properties.*; import net.minecraft.world.phys.shapes.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class JadeVineRootsBlock extends BaseEntityBlock implements JadeVine, NaturesStaffTriggered { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/JadeVineRootsBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/JadeVineRootsBlockEntity.java index c3d3a25744..aff73c4f71 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/JadeVineRootsBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/JadeVineRootsBlockEntity.java @@ -12,7 +12,7 @@ import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.entity.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class JadeVineRootsBlockEntity extends BlockEntity { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/JadeiteLotusFlowerBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/JadeiteLotusFlowerBlock.java index 1fd8372fc9..d0c52ff30e 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/JadeiteLotusFlowerBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/JadeiteLotusFlowerBlock.java @@ -11,9 +11,8 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.block.state.properties.*; import net.minecraft.world.phys.shapes.*; -import javax.annotation.*; -public class JadeiteLotusFlowerBlock extends SpectrumFacingBlock { +public class JadeiteLotusFlowerBlock extends SpectrumDirectionalBlock { protected static final VoxelShape SHAPE_UP = Block.box(0, 0, 0, 16, 8, 16); protected static final VoxelShape SHAPE_DOWN = Block.box(0, 8, 0, 16, 16, 16); diff --git a/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/JadeiteLotusStemBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/JadeiteLotusStemBlock.java index d961816e28..fd6505bb51 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/JadeiteLotusStemBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/JadeiteLotusStemBlock.java @@ -18,7 +18,7 @@ import net.minecraft.world.level.gameevent.*; import net.minecraft.world.phys.*; import net.neoforged.neoforge.common.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class JadeiteLotusStemBlock extends BushBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/NephriteBlossomLeavesBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/NephriteBlossomLeavesBlock.java index 6f05135ae4..9f8f72a012 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/NephriteBlossomLeavesBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/NephriteBlossomLeavesBlock.java @@ -55,7 +55,7 @@ public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random int age = state.getValue(AGE); int leafSum = 0; - if (state.getValue(PERSISTENT) || random.nextFloat() > 0.1F) { + if (state.getValue(PERSISTENT) || random.nextFloat() > 0.2F) { super.randomTick(state, world, pos, random); return; } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/NephriteBlossomStemBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/NephriteBlossomStemBlock.java index 9c04339659..c1a53869f9 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/NephriteBlossomStemBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/NephriteBlossomStemBlock.java @@ -18,7 +18,7 @@ import net.minecraft.world.level.gameevent.*; import net.minecraft.world.phys.*; import net.neoforged.neoforge.common.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class NephriteBlossomStemBlock extends BushBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/package-info.java index e3b261346c..67c50bef8f 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/jade_vines/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.jade_vines; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/lava_sponge/WetLavaSpongeItem.java b/src/main/java/de/dafuqs/spectrum/blocks/lava_sponge/WetLavaSpongeItem.java index 490695b9d3..835a31d6ca 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/lava_sponge/WetLavaSpongeItem.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/lava_sponge/WetLavaSpongeItem.java @@ -8,7 +8,6 @@ import net.minecraft.world.item.*; import net.minecraft.world.level.*; import net.minecraft.world.level.block.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/lava_sponge/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/lava_sponge/package-info.java index 2a44665b82..04e14062b8 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/lava_sponge/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/lava_sponge/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.lava_sponge; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/memory/MemoryBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/memory/MemoryBlock.java index bdd3b54024..c2d1645173 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/memory/MemoryBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/memory/MemoryBlock.java @@ -16,7 +16,7 @@ import net.minecraft.world.level.storage.loot.*; import net.minecraft.world.level.storage.loot.parameters.*; import net.minecraft.world.phys.shapes.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/memory/MemoryBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/memory/MemoryBlockEntity.java index 5b9f8ef555..e07de1d4b1 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/memory/MemoryBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/memory/MemoryBlockEntity.java @@ -24,8 +24,7 @@ import net.minecraft.world.level.block.entity.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.block.state.properties.*; -import org.jetbrains.annotations.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; @@ -42,7 +41,6 @@ public MemoryBlockEntity(BlockPos pos, BlockState state) { super(SpectrumBlockEntities.MEMORY.get(), pos, state); } - @Contract("_ -> new") public static Tuple getEggColorsForEntity(EntityType entityType) { SpawnEggItem spawnEggItem = SpawnEggItem.byId(entityType); if (spawnEggItem != null) { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/memory/MemoryItem.java b/src/main/java/de/dafuqs/spectrum/blocks/memory/MemoryItem.java index 72020fe0da..e05d7b73ff 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/memory/MemoryItem.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/memory/MemoryItem.java @@ -16,7 +16,7 @@ import net.minecraft.world.item.CreativeModeTab.*; import net.minecraft.world.item.component.*; import net.minecraft.world.level.block.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/memory/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/memory/package-info.java index 6578dff3e8..b7045812a7 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/memory/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/memory/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.memory; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/mob_head/SpectrumSkullBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/mob_head/SpectrumSkullBlock.java index 126c35d47e..512c8e65ae 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/mob_head/SpectrumSkullBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/mob_head/SpectrumSkullBlock.java @@ -16,8 +16,7 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.block.state.pattern.*; import net.minecraft.world.level.block.state.predicate.*; -import org.jetbrains.annotations.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; import java.util.function.*; @@ -129,7 +128,6 @@ public static Optional getSkullType(EntityType entityType) { return Optional.empty(); } - @Contract(pure = true) public static Collection getMobHeads() { return MOB_HEADS.values(); } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/mob_head/SpectrumSkullType.java b/src/main/java/de/dafuqs/spectrum/blocks/mob_head/SpectrumSkullType.java index 1d255ac8f4..6ec2f6f669 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/mob_head/SpectrumSkullType.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/mob_head/SpectrumSkullType.java @@ -1,14 +1,12 @@ package de.dafuqs.spectrum.blocks.mob_head; import com.mojang.serialization.*; -import de.dafuqs.spectrum.entity.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.resources.*; import net.minecraft.sounds.*; import net.minecraft.util.*; import net.minecraft.world.entity.*; import net.minecraft.world.level.block.*; -import javax.annotation.*; import java.util.*; import java.util.function.*; @@ -142,7 +140,9 @@ public enum SpectrumSkullType implements SkullBlock.Type { MONSTROSITY(SpectrumEntityTypes.MONSTROSITY, SpectrumSoundEvents.ENTITY_MONSTROSITY_AMBIENT.getLocation()), PRESERVATION_TURRET(SpectrumEntityTypes.PRESERVATION_TURRET, SpectrumSoundEvents.ENTITY_PRESERVATION_TURRET_AMBIENT.getLocation()), MARROW(SpectrumEntityTypes.MARROW, SpectrumSoundEvents.ENTITY_MARROW_AMBIENT.getLocation()), - SPLINTERSPAWN(SpectrumEntityTypes.SPLINTERSPAWN, SpectrumSoundEvents.ENTITY_SPLINTERSPAWN_AMBIENT.getLocation()); + SPLINTERSPAWN(SpectrumEntityTypes.SPLINTERSPAWN, SpectrumSoundEvents.ENTITY_SPLINTERSPAWN_AMBIENT.getLocation()), + KOI(SpectrumEntityTypes.KOI, SpectrumSoundEvents.ENTITY_KOI_AMBIENT.getLocation()), + CRAWFISH(SpectrumEntityTypes.CRAWFISH, SpectrumSoundEvents.ENTITY_CRAWFISH_AMBIENT.getLocation()); public static final Codec CODEC = StringRepresentable.fromEnum(SpectrumSkullType::values); diff --git a/src/main/java/de/dafuqs/spectrum/blocks/mob_head/SpectrumWallSkullBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/mob_head/SpectrumWallSkullBlock.java index ed6142c6c7..f97b541b6f 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/mob_head/SpectrumWallSkullBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/mob_head/SpectrumWallSkullBlock.java @@ -8,8 +8,7 @@ import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.entity.*; import net.minecraft.world.level.block.state.*; -import org.jetbrains.annotations.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; @@ -38,7 +37,6 @@ public MapCodec codec() { return SpectrumWallSkullBlock.MOB_WALL_HEADS.get(skullType); } - @Contract(pure = true) public static Collection getMobWallHeads() { return SpectrumWallSkullBlock.MOB_WALL_HEADS.values(); } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/mob_head/client/SpectrumSkullBlockEntityRenderer.java b/src/main/java/de/dafuqs/spectrum/blocks/mob_head/client/SpectrumSkullBlockEntityRenderer.java index 3475d5198a..d37a44e1f8 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/mob_head/client/SpectrumSkullBlockEntityRenderer.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/mob_head/client/SpectrumSkullBlockEntityRenderer.java @@ -3,7 +3,7 @@ import com.google.common.collect.*; import com.mojang.blaze3d.vertex.*; import de.dafuqs.spectrum.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.blocks.mob_head.*; import de.dafuqs.spectrum.blocks.mob_head.client.models.*; import de.dafuqs.spectrum.entity.render.*; @@ -17,7 +17,7 @@ import net.minecraft.util.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; @@ -159,22 +159,22 @@ public static Map(new EggLayingWoolyPigHeadModel(modelLoader.bakeLayer(SpectrumModelLayerLocations.EGG_LAYING_WOOLY_PIG_HEAD)), EggLayingWoolyPigEntityRenderer.TEXTURE))); builder.put(SpectrumSkullType.ERASER, List.of(new Tuple<>(new SpiderHeadModel(modelLoader.bakeLayer(SpectrumModelLayerLocations.ERASER_HEAD)), SpectrumCommon.locate("textures/entity/eraser/eraser_combined.png")))); builder.put(SpectrumSkullType.KINDLING, List.of(new Tuple<>(new KindlingHeadModel(modelLoader.bakeLayer(SpectrumModelLayerLocations.KINDLING_HEAD)), SpectrumCommon.locate("textures/entity/kindling/kindling.png")))); - builder.put(SpectrumSkullType.LIZARD_BLACK, List.of(new Tuple<>(new LizardHeadModel(modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD), modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD_FRILLS), InkColors.BLACK.getColorInt()), LizardHeadModel.HEAD_TEXTURE))); - builder.put(SpectrumSkullType.LIZARD_BLUE, List.of(new Tuple<>(new LizardHeadModel(modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD), modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD_FRILLS), InkColors.BLUE.getColorInt()), LizardHeadModel.HEAD_TEXTURE))); - builder.put(SpectrumSkullType.LIZARD_BROWN, List.of(new Tuple<>(new LizardHeadModel(modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD), modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD_FRILLS), InkColors.BROWN.getColorInt()), LizardHeadModel.HEAD_TEXTURE))); - builder.put(SpectrumSkullType.LIZARD_CYAN, List.of(new Tuple<>(new LizardHeadModel(modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD), modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD_FRILLS), InkColors.CYAN.getColorInt()), LizardHeadModel.HEAD_TEXTURE))); - builder.put(SpectrumSkullType.LIZARD_GRAY, List.of(new Tuple<>(new LizardHeadModel(modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD), modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD_FRILLS), InkColors.GRAY.getColorInt()), LizardHeadModel.HEAD_TEXTURE))); - builder.put(SpectrumSkullType.LIZARD_GREEN, List.of(new Tuple<>(new LizardHeadModel(modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD), modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD_FRILLS), InkColors.GREEN.getColorInt()), LizardHeadModel.HEAD_TEXTURE))); - builder.put(SpectrumSkullType.LIZARD_LIGHT_BLUE, List.of(new Tuple<>(new LizardHeadModel(modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD), modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD_FRILLS), InkColors.LIGHT_BLUE.getColorInt()), LizardHeadModel.HEAD_TEXTURE))); - builder.put(SpectrumSkullType.LIZARD_LIGHT_GRAY, List.of(new Tuple<>(new LizardHeadModel(modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD), modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD_FRILLS), InkColors.LIGHT_GRAY.getColorInt()), LizardHeadModel.HEAD_TEXTURE))); - builder.put(SpectrumSkullType.LIZARD_LIME, List.of(new Tuple<>(new LizardHeadModel(modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD), modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD_FRILLS), InkColors.LIME.getColorInt()), LizardHeadModel.HEAD_TEXTURE))); - builder.put(SpectrumSkullType.LIZARD_MAGENTA, List.of(new Tuple<>(new LizardHeadModel(modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD), modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD_FRILLS), InkColors.MAGENTA.getColorInt()), LizardHeadModel.HEAD_TEXTURE))); - builder.put(SpectrumSkullType.LIZARD_ORANGE, List.of(new Tuple<>(new LizardHeadModel(modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD), modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD_FRILLS), InkColors.ORANGE.getColorInt()), LizardHeadModel.HEAD_TEXTURE))); - builder.put(SpectrumSkullType.LIZARD_PINK, List.of(new Tuple<>(new LizardHeadModel(modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD), modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD_FRILLS), InkColors.PINK.getColorInt()), LizardHeadModel.HEAD_TEXTURE))); - builder.put(SpectrumSkullType.LIZARD_PURPLE, List.of(new Tuple<>(new LizardHeadModel(modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD), modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD_FRILLS), InkColors.PURPLE.getColorInt()), LizardHeadModel.HEAD_TEXTURE))); - builder.put(SpectrumSkullType.LIZARD_RED, List.of(new Tuple<>(new LizardHeadModel(modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD), modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD_FRILLS), InkColors.RED.getColorInt()), LizardHeadModel.HEAD_TEXTURE))); - builder.put(SpectrumSkullType.LIZARD_WHITE, List.of(new Tuple<>(new LizardHeadModel(modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD), modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD_FRILLS), InkColors.WHITE.getColorInt()), LizardHeadModel.HEAD_TEXTURE))); - builder.put(SpectrumSkullType.LIZARD_YELLOW, List.of(new Tuple<>(new LizardHeadModel(modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD), modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD_FRILLS), InkColors.YELLOW.getColorInt()), LizardHeadModel.HEAD_TEXTURE))); + builder.put(SpectrumSkullType.LIZARD_BLACK, List.of(new Tuple<>(new LizardHeadModel(modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD), modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD_FRILLS), InkColors.BLACK.getColorARGB()), LizardHeadModel.HEAD_TEXTURE))); + builder.put(SpectrumSkullType.LIZARD_BLUE, List.of(new Tuple<>(new LizardHeadModel(modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD), modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD_FRILLS), InkColors.BLUE.getColorARGB()), LizardHeadModel.HEAD_TEXTURE))); + builder.put(SpectrumSkullType.LIZARD_BROWN, List.of(new Tuple<>(new LizardHeadModel(modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD), modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD_FRILLS), InkColors.BROWN.getColorARGB()), LizardHeadModel.HEAD_TEXTURE))); + builder.put(SpectrumSkullType.LIZARD_CYAN, List.of(new Tuple<>(new LizardHeadModel(modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD), modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD_FRILLS), InkColors.CYAN.getColorARGB()), LizardHeadModel.HEAD_TEXTURE))); + builder.put(SpectrumSkullType.LIZARD_GRAY, List.of(new Tuple<>(new LizardHeadModel(modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD), modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD_FRILLS), InkColors.GRAY.getColorARGB()), LizardHeadModel.HEAD_TEXTURE))); + builder.put(SpectrumSkullType.LIZARD_GREEN, List.of(new Tuple<>(new LizardHeadModel(modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD), modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD_FRILLS), InkColors.GREEN.getColorARGB()), LizardHeadModel.HEAD_TEXTURE))); + builder.put(SpectrumSkullType.LIZARD_LIGHT_BLUE, List.of(new Tuple<>(new LizardHeadModel(modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD), modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD_FRILLS), InkColors.LIGHT_BLUE.getColorARGB()), LizardHeadModel.HEAD_TEXTURE))); + builder.put(SpectrumSkullType.LIZARD_LIGHT_GRAY, List.of(new Tuple<>(new LizardHeadModel(modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD), modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD_FRILLS), InkColors.LIGHT_GRAY.getColorARGB()), LizardHeadModel.HEAD_TEXTURE))); + builder.put(SpectrumSkullType.LIZARD_LIME, List.of(new Tuple<>(new LizardHeadModel(modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD), modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD_FRILLS), InkColors.LIME.getColorARGB()), LizardHeadModel.HEAD_TEXTURE))); + builder.put(SpectrumSkullType.LIZARD_MAGENTA, List.of(new Tuple<>(new LizardHeadModel(modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD), modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD_FRILLS), InkColors.MAGENTA.getColorARGB()), LizardHeadModel.HEAD_TEXTURE))); + builder.put(SpectrumSkullType.LIZARD_ORANGE, List.of(new Tuple<>(new LizardHeadModel(modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD), modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD_FRILLS), InkColors.ORANGE.getColorARGB()), LizardHeadModel.HEAD_TEXTURE))); + builder.put(SpectrumSkullType.LIZARD_PINK, List.of(new Tuple<>(new LizardHeadModel(modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD), modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD_FRILLS), InkColors.PINK.getColorARGB()), LizardHeadModel.HEAD_TEXTURE))); + builder.put(SpectrumSkullType.LIZARD_PURPLE, List.of(new Tuple<>(new LizardHeadModel(modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD), modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD_FRILLS), InkColors.PURPLE.getColorARGB()), LizardHeadModel.HEAD_TEXTURE))); + builder.put(SpectrumSkullType.LIZARD_RED, List.of(new Tuple<>(new LizardHeadModel(modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD), modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD_FRILLS), InkColors.RED.getColorARGB()), LizardHeadModel.HEAD_TEXTURE))); + builder.put(SpectrumSkullType.LIZARD_WHITE, List.of(new Tuple<>(new LizardHeadModel(modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD), modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD_FRILLS), InkColors.WHITE.getColorARGB()), LizardHeadModel.HEAD_TEXTURE))); + builder.put(SpectrumSkullType.LIZARD_YELLOW, List.of(new Tuple<>(new LizardHeadModel(modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD), modelLoader.bakeLayer(SpectrumModelLayerLocations.LIZARD_HEAD_FRILLS), InkColors.YELLOW.getColorARGB()), LizardHeadModel.HEAD_TEXTURE))); builder.put(SpectrumSkullType.MONSTROSITY, List.of(new Tuple<>(new MonstrosityHeadModel(modelLoader.bakeLayer(SpectrumModelLayerLocations.MONSTROSITY_HEAD)), PreservationTurretEntityRenderer.TEXTURE))); builder.put(SpectrumSkullType.PRESERVATION_TURRET, List.of(new Tuple<>(new PreservationTurretHeadModel(modelLoader.bakeLayer(SpectrumModelLayerLocations.PRESERVATION_TURRET_HEAD)), PreservationTurretEntityRenderer.TEXTURE))); builder.put(SpectrumSkullType.MARROW, List.of( @@ -182,6 +182,8 @@ public static Map(new StrayHeadModel(modelLoader.bakeLayer(SpectrumModelLayerLocations.MARROW_HEAD_OVERLAY)), MarrowRenderer.MARROW_CLOTHES_LOCATION) )); builder.put(SpectrumSkullType.SPLINTERSPAWN, List.of(new Tuple<>(new SilverfishHeadModel(modelLoader.bakeLayer(SpectrumModelLayerLocations.SPLINTERSPAWN_HEAD)), SpectrumCommon.locate("textures/entity/splinterspawn/splinterspawn.png")))); + builder.put(SpectrumSkullType.KOI, List.of(new Tuple<>(new SilverfishHeadModel(modelLoader.bakeLayer(SpectrumModelLayerLocations.KOI_HEAD)), SpectrumCommon.locate("textures/entity/koi/koi.png")))); + builder.put(SpectrumSkullType.CRAWFISH, List.of(new Tuple<>(new SilverfishHeadModel(modelLoader.bakeLayer(SpectrumModelLayerLocations.CRAWFISH_HEAD)), SpectrumCommon.locate("textures/entity/crawfish/crawfish.png")))); return builder.build(); } @@ -198,9 +200,7 @@ public void render(SpectrumSkullBlockEntity spectrumSkullBlockEntity, float tick yaw *= blockState.getValue(SkullBlock.ROTATION); } SpectrumSkullType skullType = SpectrumSkullBlock.getSkullType(spectrumSkullBlockEntity.getBlockState().getBlock()); - renderModels(tickDelta, poseStack, vertexConsumerProvider, light, skullType, direction, yaw); - } public static void renderModels(float tickDelta, PoseStack poseStack, MultiBufferSource vertexConsumerProvider, int light, SpectrumSkullType skullType, @Nullable Direction direction, float yaw) { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/mob_head/client/models/CrawfishHeadModel.java b/src/main/java/de/dafuqs/spectrum/blocks/mob_head/client/models/CrawfishHeadModel.java new file mode 100644 index 0000000000..09c4744279 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/blocks/mob_head/client/models/CrawfishHeadModel.java @@ -0,0 +1,29 @@ +package de.dafuqs.spectrum.blocks.mob_head.client.models; + +import de.dafuqs.spectrum.blocks.mob_head.client.*; +import net.minecraft.client.model.geom.*; +import net.minecraft.client.model.geom.builders.*; + + +public class CrawfishHeadModel extends SpectrumSkullModel { + + public CrawfishHeadModel(ModelPart root) { + super(root); + } + + public static LayerDefinition getTexturedModelData() { + MeshDefinition meshdefinition = new MeshDefinition(); + PartDefinition partdefinition = meshdefinition.getRoot(); + + PartDefinition head = partdefinition.addOrReplaceChild("head", CubeListBuilder.create().texOffs(12, 9).addBox(-1.0F, -2.0F, -1.0F, 2.0F, 2.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.ZERO); + + PartDefinition whiskers = head.addOrReplaceChild("whiskers", CubeListBuilder.create(), PartPose.offset(1.65F, -1.25F, -0.5F)); + whiskers.addOrReplaceChild("whisker_left_r1", CubeListBuilder.create().texOffs(0, 9).addBox(-0.865F, -2.0945F, -1.25F, 2.0F, 5.0F, 4.0F, new CubeDeformation(-1.0F)) + .texOffs(0, 9).mirror().addBox(-2.235F, -2.0945F, -1.25F, 2.0F, 5.0F, 4.0F, new CubeDeformation(-1.0F)).mirror(false), PartPose.offsetAndRotation(-1.1F, -2.0F, -2.1F, 0.2618F, 0.0F, 0.0F)); + whiskers.addOrReplaceChild("whisker_base_right_r1", CubeListBuilder.create().texOffs(8, 19).mirror().addBox(0.0F, -2.0F, -1.0F, 2.0F, 2.0F, 2.0F, new CubeDeformation(-0.75F)).mirror(false) + .texOffs(8, 19).addBox(1.3F, -2.0F, -1.0F, 2.0F, 2.0F, 2.0F, new CubeDeformation(-0.75F)), PartPose.offsetAndRotation(-3.3F, 0.0F, 0.0F, 0.2618F, 0.0F, 0.0F)); + + return LayerDefinition.create(meshdefinition, 32, 32); + } + +} \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/blocks/mob_head/client/models/KoiHeadModel.java b/src/main/java/de/dafuqs/spectrum/blocks/mob_head/client/models/KoiHeadModel.java new file mode 100644 index 0000000000..9588adab96 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/blocks/mob_head/client/models/KoiHeadModel.java @@ -0,0 +1,31 @@ +package de.dafuqs.spectrum.blocks.mob_head.client.models; + +import de.dafuqs.spectrum.blocks.mob_head.client.*; +import net.minecraft.client.model.geom.*; +import net.minecraft.client.model.geom.builders.*; + + +public class KoiHeadModel extends SpectrumSkullModel { + + public KoiHeadModel(ModelPart root) { + super(root); + } + + public static LayerDefinition getTexturedModelData() { + MeshDefinition meshdefinition = new MeshDefinition(); + PartDefinition partdefinition = meshdefinition.getRoot(); + + PartDefinition head = partdefinition.addOrReplaceChild("head", CubeListBuilder.create().texOffs(10, 8).addBox(-1.0F, -2.0F, -2.75F, 2.0F, 3.0F, 3.0F, new CubeDeformation(0.25F)), PartPose.offset(0.0F, -2.0F, 0.0F)); + PartDefinition whiskers = head.addOrReplaceChild("whiskers", CubeListBuilder.create(), PartPose.offset(0.0F, 1.0F, 4.25F)); + whiskers.addOrReplaceChild("whisker_right_r1", CubeListBuilder.create().texOffs(0, 0).addBox(-1.135F, -1.0945F, -1.25F, 2.0F, 4.0F, 4.0F, new CubeDeformation(-1.0F)), PartPose.offsetAndRotation(-1.15F, -1.0F, -7.0F, 0.0F, 0.0F, 0.3491F)); + whiskers.addOrReplaceChild("whisker_left_r1", CubeListBuilder.create().texOffs(0, 0).addBox(-0.865F, -1.0945F, -1.25F, 2.0F, 4.0F, 4.0F, new CubeDeformation(-1.0F)), PartPose.offsetAndRotation(1.15F, -1.0F, -7.0F, 0.0F, 0.0F, -0.3491F)); + + PartDefinition body_front = head.addOrReplaceChild("body_front", CubeListBuilder.create().texOffs(0, 8).addBox(-1.0F, -3.0F, -3.5F, 2.0F, 3.0F, 3.0F, new CubeDeformation(0.5F)), PartPose.offset(0.0F, 1.0F, 3.75F)); + PartDefinition frontfin = body_front.addOrReplaceChild("frontfin", CubeListBuilder.create(), PartPose.offset(3.5F, 1.75F, 0.25F)); + frontfin.addOrReplaceChild("frontfin_right_r1", CubeListBuilder.create().texOffs(6, 20).addBox(-0.0972F, -0.6039F, -0.5F, 0.0F, 3.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.9204F, -1.6188F, -3.5F, 0.0F, 0.0F, 0.48F)); + frontfin.addOrReplaceChild("frontfin_left_r1", CubeListBuilder.create().texOffs(6, 20).addBox(0.0972F, -0.6039F, -0.5F, 0.0F, 3.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-2.0796F, -1.6188F, -3.5F, 0.0F, 0.0F, -0.48F)); + + return LayerDefinition.create(meshdefinition, 32, 32); + } + +} \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/blocks/mob_head/client/models/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/mob_head/client/models/package-info.java index 6a5ac2e5e3..4b00efeb4d 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/mob_head/client/models/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/mob_head/client/models/package-info.java @@ -3,6 +3,5 @@ @FieldsAreNonnullByDefault package de.dafuqs.spectrum.blocks.mob_head.client.models; -import net.minecraft.FieldsAreNonnullByDefault; -import net.minecraft.MethodsReturnNonnullByDefault; -import org.jspecify.annotations.NullMarked; +import net.minecraft.*; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/mob_head/client/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/mob_head/client/package-info.java index 91ac740ad4..d21b9c9e83 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/mob_head/client/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/mob_head/client/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.mob_head.client; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/mob_head/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/mob_head/package-info.java index 46a248855f..b6a451031d 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/mob_head/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/mob_head/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.mob_head; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/package-info.java index 0ed5ac687b..7a885b48d3 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/particle_spawner/AbstractParticleSpawnerBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/particle_spawner/AbstractParticleSpawnerBlock.java index a927651f80..672e5b8f74 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/particle_spawner/AbstractParticleSpawnerBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/particle_spawner/AbstractParticleSpawnerBlock.java @@ -10,7 +10,7 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.*; import net.minecraft.world.phys.shapes.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public abstract class AbstractParticleSpawnerBlock extends BaseEntityBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/particle_spawner/ParticleSpawnerBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/particle_spawner/ParticleSpawnerBlockEntity.java index 306c8c7f02..f164f3e9cd 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/particle_spawner/ParticleSpawnerBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/particle_spawner/ParticleSpawnerBlockEntity.java @@ -17,7 +17,7 @@ import net.minecraft.world.level.block.entity.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class ParticleSpawnerBlockEntity extends BlockEntity implements MenuProvider { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/particle_spawner/ParticleSpawnerConfiguration.java b/src/main/java/de/dafuqs/spectrum/blocks/particle_spawner/ParticleSpawnerConfiguration.java index 8458c6f792..221f6e5f9f 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/particle_spawner/ParticleSpawnerConfiguration.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/particle_spawner/ParticleSpawnerConfiguration.java @@ -12,7 +12,6 @@ import net.minecraft.util.*; import net.minecraft.world.level.*; import net.minecraft.world.phys.*; -import javax.annotation.*; import org.joml.*; public record ParticleSpawnerConfiguration( diff --git a/src/main/java/de/dafuqs/spectrum/blocks/particle_spawner/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/particle_spawner/package-info.java index 9014821fbf..a816f0b221 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/particle_spawner/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/particle_spawner/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.particle_spawner; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/PastelNetwork.java b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/PastelNetwork.java index f9abf601ef..a05329c84e 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/PastelNetwork.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/PastelNetwork.java @@ -8,6 +8,7 @@ import org.jgrapht.graph.*; import java.util.*; +import java.util.function.*; import java.util.stream.*; public class PastelNetwork { @@ -17,12 +18,6 @@ public class PastelNetwork { protected final UUID uuid; protected final int color; - public enum NodePriority { - GENERIC, - MODERATE, - HIGH - } - public PastelNetwork(W level, UUID uuid, int color) { this.level = level; this.uuid = uuid; @@ -60,10 +55,6 @@ public boolean hasEdge(BlockPos pos1, BlockPos pos2) { return graph.containsEdge(pos1, pos2); } - public boolean removeEdge(PastelNodeBlockEntity node, PastelNodeBlockEntity parent) { - return graph.removeEdge(node.getBlockPos(), parent.getBlockPos()) != null; - } - public UUID getUUID() { return this.uuid; } @@ -110,12 +101,12 @@ public CompoundTag graphToNbt() { .mapToInt(vertices::indexOf) .filter(v -> v != currentVertex) .boxed() - .collect(Collectors.toList()); + .collect(Collectors.toCollection(ArrayList::new)); if (edgeIndexes.isEmpty()) continue; - edgeIndexes.add(0, vertices.indexOf(vertex)); + edgeIndexes.addFirst(vertices.indexOf(vertex)); graphStorage.putIntArray("EdgeIndexes" + i, edgeIndexes); } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/PastelTransmission.java b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/PastelTransmission.java index bed128347c..588636a2a0 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/PastelTransmission.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/PastelTransmission.java @@ -3,14 +3,14 @@ import com.mojang.serialization.*; import com.mojang.serialization.codecs.*; import de.dafuqs.spectrum.blocks.pastel_network.nodes.*; -import de.dafuqs.spectrum.blocks.pastel_network.payloads.PastelPayload; +import de.dafuqs.spectrum.blocks.pastel_network.payloads.*; import de.dafuqs.spectrum.helpers.*; import net.minecraft.core.*; import net.minecraft.network.*; import net.minecraft.network.codec.*; import net.minecraft.server.level.*; import net.minecraft.world.level.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; @@ -79,7 +79,7 @@ private void arriveAtDestination() { } BlockPos destinationPos = nodePositions.getLast(); - @Nullable PastelNodeBlockEntity destinationNode = this.network.getLoadedNodeAt(destinationPos); + PastelNodeBlockEntity destinationNode = this.network.getLoadedNodeAt(destinationPos); Level level = this.network.getLevel(); payload.arriveAtDestination(level, destinationPos, destinationNode); } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/PastelTransmissionLogic.java b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/PastelTransmissionLogic.java index a3c13a131f..b030d70617 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/PastelTransmissionLogic.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/PastelTransmissionLogic.java @@ -2,33 +2,33 @@ import de.dafuqs.spectrum.blocks.pastel_network.nodes.*; import de.dafuqs.spectrum.blocks.pastel_network.payloads.*; -import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.networking.s2c_payloads.*; +import de.dafuqs.spectrum.registries.*; +import it.unimi.dsi.fastutil.objects.*; import net.minecraft.core.*; -import net.minecraft.util.*; -import net.minecraft.world.item.*; -import net.neoforged.neoforge.items.*; +import net.minecraft.resources.*; +import net.neoforged.neoforge.registries.*; import org.jgrapht.*; -import org.jgrapht.Graph; import org.jgrapht.alg.interfaces.*; import org.jgrapht.alg.shortestpath.*; import org.jgrapht.graph.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; import java.util.function.*; -@SuppressWarnings("UnstableApiUsage") public class PastelTransmissionLogic { - private enum TransferMode { + public enum TransferMode { PUSH, PULL, PUSH_PULL } - public static final int DEFAULT_MAX_TRANSFER_AMOUNT = 1; + public static final int DEFAULT_MAX_TRANSFER_COUNT_MULTIPLIER = 1; public static final int DEFAULT_TRANSFER_TICKS_PER_NODE = 30; + public static final int DEFAULT_TRANSFER_COOLDOWN_TICKS = 20; + private final ServerPastelNetwork network; private DijkstraShortestPath dijkstra; @@ -44,7 +44,11 @@ public void invalidateCache() { this.pathCache = new HashMap<>(); } - public @Nullable GraphPath getPath(Graph graph, PastelNodeBlockEntity source, PastelNodeBlockEntity destination) { + public @Nullable GraphPath getPath(PastelNodeBlockEntity source, PastelNodeBlockEntity destination) { + return this.getPath(this.network.getGraph(), source, destination); + } + + protected @Nullable GraphPath getPath(Graph graph, PastelNodeBlockEntity source, PastelNodeBlockEntity destination) { if (this.dijkstra == null) { this.dijkstra = new DijkstraShortestPath<>(graph); } @@ -71,119 +75,46 @@ public void invalidateCache() { return path; } - public void tick(PastelNetwork.NodePriority priority) { - transferBetween(PastelNodeType.SENDER, PastelNodeType.GATHER, TransferMode.PUSH_PULL, priority); - transferBetween(PastelNodeType.PROVIDER, PastelNodeType.GATHER, TransferMode.PULL, priority); - transferBetween(PastelNodeType.STORAGE, PastelNodeType.GATHER, TransferMode.PULL, priority); - transferBetween(PastelNodeType.SENDER, PastelNodeType.STORAGE, TransferMode.PUSH, priority); - } - - private void transferBetween(PastelNodeType sourceType, PastelNodeType destinationType, TransferMode transferMode, PastelNetwork.NodePriority priority) { - for (PastelNodeBlockEntity sourceNode : this.network.getLoadedNodes(sourceType, priority)) { - if (!sourceNode.canTransfer()) { - continue; - } - - IItemHandler sourceStorage = sourceNode.getConnectedStorage(); - if (sourceStorage != null) { - tryTransferToType(sourceNode, sourceStorage, destinationType, transferMode); + public void tick(boolean longTick) { + for(Map.Entry, PastelPayloadType> payloadType : SpectrumRegistries.PASTEL_PAYLOAD_TYPE.entrySet()) { + if(longTick || payloadType.getValue().runsEveryTick()) { + payloadType.getValue().tick(this); } } } - private void tryTransferToType(PastelNodeBlockEntity sourceNode, IItemHandler sourceStorage, PastelNodeType type, TransferMode transferMode) { - for (PastelNodeBlockEntity destinationNode : this.network.getLoadedNodes(type, PastelNetwork.NodePriority.GENERIC)) { - if (!destinationNode.canTransfer()) { - continue; - } - - IItemHandler destinationStorage = destinationNode.getConnectedStorage(); - if (destinationStorage != null) { - boolean success = transferBetween(sourceNode, sourceStorage, destinationNode, destinationStorage, transferMode); - if (success && transferMode != TransferMode.PULL) { - return; - } + private Set getLoadedNodes(@Nullable PastelNodeType type) { + if(type == null) { + Set set = new ObjectArraySet<>(); + for(Set e : this.network.loadedNodes.values()) { + set.addAll(e); } + return set; } + return this.network.getLoadedNodes(type); } - private boolean transferBetween(PastelNodeBlockEntity sourceNode, IItemHandler sourceStorage, PastelNodeBlockEntity destinationNode, IItemHandler destinationStorage, TransferMode transferMode) { - // check how much room is in the target inventory - long totalAvailableStorage = -destinationNode.getItemCountUnderway(); - for (int d = 0; d < destinationStorage.getSlots(); d++) { - ItemStack stack = destinationStorage.getStackInSlot(d); - - if (stack.isEmpty()) { - totalAvailableStorage += destinationStorage.getSlotLimit(d); - } else { - totalAvailableStorage += Math.min(destinationStorage.getSlotLimit(d), stack.getMaxStackSize()) - stack.getCount(); - } - } - - if (totalAvailableStorage <= 0) - return false; - - Predicate filter = sourceNode.getTransferFilterTo(destinationNode); - Map proposals = new HashMap<>(); - for (int s = 0; s < sourceStorage.getSlots(); s++) { - ItemStack stack = sourceStorage.extractItem(s, DEFAULT_MAX_TRANSFER_AMOUNT, true); - - if (stack.isEmpty()) - continue; - if (!filter.test(stack)) - continue; - - proposals.put(stack, proposals.getOrDefault(stack, 0L) + stack.getCount()); - } - - for (Map.Entry proposal : proposals.entrySet()) { - ItemStack stack = proposal.getKey(); - long proposedAmount = Math.min(Math.min(proposal.getValue(), sourceNode.getMaxTransferredAmount()), totalAvailableStorage); - if (proposedAmount == 0) - continue; - - ItemStack proposedStack = stack.copyWithCount((int) proposedAmount); - int simulatedAmount = (int) (proposedAmount - ItemHandlerHelper.insertItemStacked(destinationStorage, proposedStack, true).getCount()); - if(simulatedAmount == 0) { - continue; - } - Tuple> matchingStacks = InventoryHelper.getStackCountInInventory(proposedStack, sourceStorage, simulatedAmount); - - if (matchingStacks.getA() == 0) - continue; - - Optional transmission = createTransmissionOnValidPath(sourceNode, destinationNode, new ItemPastelPayload(proposedStack.copyWithCount(simulatedAmount)), sourceNode.getTransferTime()); - if (transmission.isPresent()) { - int extracted = 0; - for (int i = 0; i < sourceStorage.getSlots(); i++) { - if (ItemStack.isSameItemSameComponents(proposedStack, sourceStorage.getStackInSlot(i))) - extracted += sourceStorage.extractItem(i, simulatedAmount - extracted, false).getCount(); - if (extracted == simulatedAmount) - break; + public Set getLoadedNodes(DeferredHolder payloadType, @Nullable PastelNodeType nodeType) { + Set nodes = new HashSet<>(); + var loaded = this.getLoadedNodes(nodeType); + for(PastelNodeBlockEntity entity : loaded) { + for(Supplier typeSupplier : entity.getSupportedPayloads()) { + if(typeSupplier.get().equals(payloadType.get())) { + nodes.add(entity); + break; } - - PastelTransmission trans = transmission.get(); - int travelTime = trans.getTransmissionDuration(); - this.network.addTransmission(trans, travelTime); - PastelTransmissionPayload.sendPastelTransmissionParticle(this.network, trans.getTransmissionDuration(), transmission.get()); - - destinationNode.markTransferred(transferMode != TransferMode.PUSH); - sourceNode.markTransferred(transferMode != TransferMode.PULL); - - destinationNode.addItemCountUnderway(simulatedAmount); - return true; } } - return false; + return nodes; } - public Optional createTransmissionOnValidPath(PastelNodeBlockEntity source, PastelNodeBlockEntity destination, PastelPayload payload, int vertexTime) { - GraphPath graphPath = getPath(this.network.getGraph(), source, destination); - if (graphPath != null) { - PastelNodeStatusUpdatePayload.sendPastelNodeStatusUpdate(List.of(source), true); - return Optional.of(new PastelTransmission(graphPath.getVertexList(), payload, vertexTime)); - } - return Optional.empty(); + public void addTransmission(PastelNodeBlockEntity sourceNode, PastelNodeBlockEntity destinationNode, PastelTransmissionLogic.TransferMode transferMode, PastelTransmission transmission) { + PastelNodeStatusUpdatePayload.sendPastelNodeStatusUpdate(List.of(sourceNode), true); + destinationNode.markTransferred(transferMode != PastelTransmissionLogic.TransferMode.PUSH); + sourceNode.markTransferred(transferMode != PastelTransmissionLogic.TransferMode.PULL); + + network.addTransmission(transmission, transmission.getTransmissionDuration()); + PastelTransmissionPayload.sendPastelTransmissionParticle(network, transmission.getTransmissionDuration(), transmission); } } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/ServerPastelNetwork.java b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/ServerPastelNetwork.java index f8d2fe9a09..22d75b6f72 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/ServerPastelNetwork.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/ServerPastelNetwork.java @@ -15,11 +15,10 @@ import net.minecraft.world.level.block.entity.*; import org.jgrapht.alg.connectivity.*; import org.jgrapht.graph.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; import java.util.concurrent.*; -import java.util.stream.*; public class ServerPastelNetwork extends PastelNetwork { @@ -31,8 +30,6 @@ public class ServerPastelNetwork extends PastelNetwork { ).apply(i, ServerPastelNetwork::new)); protected final Map> loadedNodes = new ConcurrentHashMap<>(); - protected final Set priorityNodes = new HashSet<>(); - protected final Set highPriorityNodes = new HashSet<>(); // new transfers are checked for every 10 ticks private final TickLooper transferLooper; @@ -62,43 +59,18 @@ public ServerPastelNetwork(ServerLevel world, UUID uuid, int color, TickLooper t } } - private boolean addLoadedNode(PastelNodeBlockEntity node) { + public boolean addLoadedNode(PastelNodeBlockEntity node) { return !this.loadedNodes.get(node.getNodeType()).add(node); } - public void initializeNode(PastelNodeBlockEntity node) { - var type = this.loadedNodes.get(node.getNodeType()); - if (!type.contains(node)) { - type.add(node); - addPriorityNode(node); - } - } - - private void addPriorityNode(PastelNodeBlockEntity node) { - switch (node.getPriority()) { - case MODERATE -> priorityNodes.add(node); - case HIGH -> highPriorityNodes.add(node); - } - } - - public void updateNodePriority(PastelNodeBlockEntity node, NodePriority oldPriority) { - removePriorityNode(node, oldPriority); - addPriorityNode(node); - } - @Override public String getNodeDebugText() { return super.getNodeDebugText() + - " - Prov: " + - getLoadedNodes(PastelNodeType.PROVIDER).size() + - " - Send: " + - getLoadedNodes(PastelNodeType.SENDER).size() + - " - Gath: " + - getLoadedNodes(PastelNodeType.GATHER).size() + - " - Stor: " + - getLoadedNodes(PastelNodeType.STORAGE).size() + - " - Conn: " + - getLoadedNodes(PastelNodeType.CONNECTION).size(); + " - Prov: " + getLoadedNodes(PastelNodeType.PROVIDER).size() + + " - Send: " + getLoadedNodes(PastelNodeType.SENDER).size() + + " - Gath: " + getLoadedNodes(PastelNodeType.GATHER).size() + + " - Stor: " + getLoadedNodes(PastelNodeType.STORAGE).size() + + " - Conn: " + getLoadedNodes(PastelNodeType.CONNECTION).size(); } @Override @@ -107,6 +79,8 @@ public String toString() { for (PastelNodeType type : PastelNodeType.values()) { builder.append("-").append(getLoadedNodes(type).size()); } + builder.append(": ").append(transmissions.size()).append(" active transmission(s)"); + return builder.toString(); } @@ -125,29 +99,8 @@ public String toString() { return null; } - private void removePriorityNode(PastelNodeBlockEntity node, NodePriority priority) { - switch (priority) { - case MODERATE -> priorityNodes.remove(node); - case HIGH -> highPriorityNodes.remove(node); - } - } - public Set getLoadedNodes(PastelNodeType type) { - return getLoadedNodes(type, NodePriority.GENERIC); - } - - public Set getLoadedNodes(PastelNodeType type, NodePriority priority) { - var nodeType = this.loadedNodes.get(type); - - if (priority == NodePriority.MODERATE) { - return nodeType.stream().filter(priorityNodes::contains).collect(Collectors.toSet()); - } - - if (priority == NodePriority.HIGH) { - return nodeType.stream().filter(highPriorityNodes::contains).collect(Collectors.toSet()); - } - - return nodeType; + return this.loadedNodes.get(type); } protected void addNode(PastelNodeBlockEntity node) { @@ -156,12 +109,11 @@ protected void addNode(PastelNodeBlockEntity node) { loadedNodes.get(node.getNodeType()).add(node); } else { - if (addLoadedNode(node)) + if (addLoadedNode(node)) { return; - + } this.graph.addVertex(node.getBlockPos()); } - addPriorityNode(node); node.setNetworkUUID(this.getUUID()); } @@ -306,7 +258,6 @@ protected void removeNode(PastelNodeBlockEntity node, NodeRemovalReason reason) graph.removeVertex(node.getBlockPos()); this.loadedNodes.get(node.getNodeType()).remove(node); - removePriorityNode(node, node.getPriority()); if (reason.checksForNetworkSplit) { checkForNetworkSplit(node.getBlockPos()); @@ -351,25 +302,16 @@ public void markDirty(BlockPos syncPos) { protected void tick() { this.transmissions.tick(); - var priority = NodePriority.GENERIC; - - if (transferLooper.getTick() % 5 == 0) { - priority = NodePriority.MODERATE; - } else if (transferLooper.getTick() % 2 == 0) { - priority = NodePriority.HIGH; - } - + this.transferLooper.tick(); var cap = transferLooper.reachedCap(); - if (cap || priority != NodePriority.GENERIC) { - if (cap) { - this.transferLooper.reset(); - } - try { - this.transmissionLogic.tick(priority); - } catch (Exception e) { - // hmmmmmm. Block getting unloaded / new one placed while logic is running? - } + if (cap) { + this.transferLooper.reset(); + } + try { + this.transmissionLogic.tick(cap); + } catch (Exception e) { + // hmmmmmm. Block getting unloaded / new one placed while logic is running? } tickNodeEffects(); } @@ -381,7 +323,6 @@ public Map getTransmissions() { private void tickNodeEffects() { List nodeSync = new ArrayList<>(); - for (Map.Entry transPair : transmissions) { PastelTransmission transmission = transPair.getKey(); int remainingTravelTime = transPair.getValue(); @@ -415,4 +356,10 @@ public void addTransmission(PastelTransmission transmission, int travelTime) { this.transmissions.put(transmission, travelTime); } + public void abortAllTransmissions() { + this.transmissions.map().keySet() + .forEach(pastelTransmission -> pastelTransmission.getPayload() + .arriveAtDestination(level, pastelTransmission.getStartPos(), null)); + } + } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/ServerPastelNetworkManager.java b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/ServerPastelNetworkManager.java index e1062bfbbf..083a016053 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/ServerPastelNetworkManager.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/ServerPastelNetworkManager.java @@ -7,7 +7,6 @@ import net.minecraft.nbt.*; import net.minecraft.server.level.*; import net.minecraft.world.level.saveddata.*; -import javax.annotation.*; import java.util.*; @@ -141,6 +140,7 @@ public void removeNetwork(UUID uuid) { } } if (foundNetwork != null) { + foundNetwork.abortAllTransmissions(); this.networks.remove(foundNetwork); PastelNetworkRemovedPayload.send(foundNetwork); } @@ -151,7 +151,7 @@ public void removeNode(PastelNodeBlockEntity node, NodeRemovalReason reason) { if (optional.isPresent()) { ServerPastelNetwork network = optional.get(); - if (network.size() == 1) { + if (network.size() <= 1) { this.removeNetwork(network.getUUID()); } else { network.removeNode(node, reason); diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/package-info.java index 32a4382825..f7e65ae8bf 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/network/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.pastel_network.network; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBases.java b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBases.java new file mode 100644 index 0000000000..14c3447bf6 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBases.java @@ -0,0 +1,29 @@ +package de.dafuqs.spectrum.blocks.pastel_network.nodes; + +import de.dafuqs.spectrum.*; +import net.minecraft.client.resources.model.*; +import net.minecraft.resources.*; +import net.neoforged.api.distmarker.*; + +public class PastelNodeBases { + + public record PastelNodeBase(ResourceLocation location) { + + @OnlyIn(Dist.CLIENT) + public ModelResourceLocation getModelLocation() { + return ModelResourceLocation.standalone(location); + } + + } + + public static final ResourceLocation BASE_LOCATION = SpectrumCommon.locate("technical/pastel_item_base"); + public static final ResourceLocation FLUID_LOCATION = SpectrumCommon.locate("technical/pastel_fluid_base"); + public static final ResourceLocation INK_LOCATION = SpectrumCommon.locate("technical/pastel_ink_base"); + public static final ResourceLocation OMNI_LOCATION = SpectrumCommon.locate("technical/pastel_omni_base"); + + public static final PastelNodeBase ITEM = new PastelNodeBase(BASE_LOCATION); + public static final PastelNodeBase FLUID = new PastelNodeBase(FLUID_LOCATION); + public static final PastelNodeBase INK = new PastelNodeBase(INK_LOCATION); + public static final PastelNodeBase OMNI = new PastelNodeBase(OMNI_LOCATION); + +} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBlock.java index b891eb6991..ce04fab26d 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBlock.java @@ -1,9 +1,9 @@ package de.dafuqs.spectrum.blocks.pastel_network.nodes; import com.mojang.serialization.*; -import com.mojang.serialization.codecs.*; import de.dafuqs.revelationary.api.advancements.*; import de.dafuqs.spectrum.api.block.*; +import de.dafuqs.spectrum.api.pastel_network.*; import de.dafuqs.spectrum.blocks.decoration.*; import de.dafuqs.spectrum.blocks.pastel_network.*; import de.dafuqs.spectrum.blocks.pastel_network.network.*; @@ -28,11 +28,12 @@ import net.minecraft.world.level.block.state.properties.*; import net.minecraft.world.phys.*; import net.minecraft.world.phys.shapes.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; +import java.util.function.*; -public class PastelNodeBlock extends SpectrumFacingBlock implements EntityBlock, ColorableBlock { +public class PastelNodeBlock extends SpectrumDirectionalBlock implements EntityBlock, ColorableBlock { /*public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(i -> i.group( propertiesCodec(), @@ -52,10 +53,16 @@ public class PastelNodeBlock extends SpectrumFacingBlock implements EntityBlock, }}; protected final PastelNodeType pastelNodeType; + protected final PastelNodeBases.PastelNodeBase base; + protected final Set> supportedPayloads; + protected final List tooltips; - public PastelNodeBlock(Properties settings, PastelNodeType pastelNodeType) { + public PastelNodeBlock(Properties settings, PastelNodeType pastelNodeType, PastelNodeBases.PastelNodeBase base, Set> supportedPayloads, List tooltips) { super(settings.lightLevel(s -> s.getValue(LIT) ? 13 : 0)); this.pastelNodeType = pastelNodeType; + this.base = base; + this.supportedPayloads = supportedPayloads; + this.tooltips = tooltips; registerDefaultState(defaultBlockState().setValue(LIT, false).setValue(REDSTONE_EMITTING, false)); } @@ -83,9 +90,9 @@ public void onRemove(BlockState state, Level world, BlockPos pos, BlockState new PastelNodeBlockEntity blockEntity = getBlockEntity(world, pos); if (blockEntity != null) { blockEntity.onBroken(); - blockEntity.getOuterRing().ifPresent(r -> popResource(world, pos, r.upgradeItem.getDefaultInstance())); - blockEntity.getInnerRing().ifPresent(r -> popResource(world, pos, r.upgradeItem.getDefaultInstance())); - blockEntity.getRedstoneRing().ifPresent(r -> popResource(world, pos, r.upgradeItem.getDefaultInstance())); + blockEntity.getOuterRing().ifPresent(r -> popResource(world, pos, r.upgradeItem.value().getDefaultInstance())); + blockEntity.getInnerRing().ifPresent(r -> popResource(world, pos, r.upgradeItem.value().getDefaultInstance())); + blockEntity.getRedstoneRing().ifPresent(r -> popResource(world, pos, r.upgradeItem.value().getDefaultInstance())); } } super.onRemove(state, world, pos, newState, moved); @@ -116,7 +123,7 @@ public void setPlacedBy(Level world, BlockPos pos, BlockState state, @Nullable L @Override public void appendHoverText(ItemStack stack, Item.TooltipContext context, List tooltip, TooltipFlag type) { super.appendHoverText(stack, context, tooltip, type); - tooltip.addAll(this.pastelNodeType.getTooltips()); + tooltip.addAll(this.tooltips); tooltip.add(Component.translatable("block.spectrum.pastel_network_nodes.tooltip.range", PastelNodeBlockEntity.RANGE).withStyle(ChatFormatting.GRAY)); } @@ -132,15 +139,15 @@ public BlockState updateShape(BlockState state, Direction direction, BlockState } @Override - public ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { - @Nullable PastelNodeBlockEntity blockEntity = getBlockEntity(world, pos); + public ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { + PastelNodeBlockEntity blockEntity = getBlockEntity(level, pos); if (blockEntity == null) { - return super.useItemOn(stack, state, world, pos, player, hand, hit); + return super.useItemOn(stack, state, level, pos, player, hand, hit); } if (player.isShiftKeyDown() && stack.isEmpty()) { if (AdvancementHelper.hasAdvancement(player, SpectrumAdvancements.PASTEL_NODE_UPGRADING)) { - if (!world.isClientSide()) { + if (!level.isClientSide()) { var removed = blockEntity.tryRemoveUpgrade(); if (!removed.isEmpty()) { if (!player.getAbilities().instabuild) { @@ -151,14 +158,19 @@ public ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level blockEntity.updateInClientWorld(); } } - return ItemInteractionResult.sidedSuccess(world.isClientSide()); + return ItemInteractionResult.sidedSuccess(level.isClientSide()); } return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; - } else if (player.isCreative() && stack.is(SpectrumItems.PAINTBRUSH)) { - sendDebugMessage(world, pos, player, blockEntity); - return ItemInteractionResult.sidedSuccess(world.isClientSide()); - } else if (AdvancementHelper.hasAdvancement(player, SpectrumAdvancements.PASTEL_NODE_UPGRADING) && stack.is(SpectrumItemTags.PASTEL_NODE_UPGRADES)) { - if (!world.isClientSide() && blockEntity.tryInteractRings(stack, pastelNodeType)) { + } + + if (player.isCreative() && stack.is(SpectrumItems.PAINTBRUSH)) { + sendDebugMessage(level, pos, player, blockEntity); + return ItemInteractionResult.sidedSuccess(level.isClientSide()); + } + + Holder.@Nullable Reference upgradeSignature = PastelUpgradeSignature.of(level, stack.getItem()); + if (AdvancementHelper.hasAdvancement(player, SpectrumAdvancements.PASTEL_NODE_UPGRADING) && upgradeSignature != null) { + if (!level.isClientSide() && blockEntity.applyUpgrade(upgradeSignature)) { SpectrumAdvancementCriteria.PASTEL_NODE_UPGRADING.trigger((ServerPlayer) player, stack); if (!player.getAbilities().instabuild) stack.shrink(1); @@ -167,18 +179,22 @@ public ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level blockEntity.updateInClientWorld(); } - world.playLocalSound(pos, SpectrumSoundEvents.MEDIUM_CRYSTAL_RING, SoundSource.BLOCKS, 0.25F, 0.9F + world.getRandom().nextFloat() * 0.2F, true); - return ItemInteractionResult.sidedSuccess(world.isClientSide()); - } else if (tryColorUsingStackInHand(stack, world, pos, player, hand)) { - return ItemInteractionResult.sidedSuccess(world.isClientSide()); - } else if (this.pastelNodeType.usesFilters()) { - if (!world.isClientSide()) { + level.playLocalSound(pos, SpectrumSoundEvents.MEDIUM_CRYSTAL_RING, SoundSource.BLOCKS, 0.25F, 0.9F + level.getRandom().nextFloat() * 0.2F, true); + return ItemInteractionResult.sidedSuccess(level.isClientSide()); + } + + if (tryColorUsingStackInHand(stack, level, pos, player, hand)) { + return ItemInteractionResult.sidedSuccess(level.isClientSide()); + } + + if (this.pastelNodeType.usesFilters()) { + if (!level.isClientSide()) { player.openMenu(blockEntity); } - return ItemInteractionResult.sidedSuccess(world.isClientSide()); + return ItemInteractionResult.sidedSuccess(level.isClientSide()); } - return super.useItemOn(stack, state, world, pos, player, hand, hit); + return super.useItemOn(stack, state, level, pos, player, hand, hit); } @Override diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBlockEntity.java index fb6ea42605..7218bde40b 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBlockEntity.java @@ -6,6 +6,7 @@ import de.dafuqs.spectrum.api.pastel_network.*; import de.dafuqs.spectrum.blocks.pastel_network.*; import de.dafuqs.spectrum.blocks.pastel_network.network.*; +import de.dafuqs.spectrum.blocks.pastel_network.payloads.*; import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.inventories.*; import de.dafuqs.spectrum.networking.s2c_payloads.*; @@ -32,13 +33,12 @@ import net.minecraft.world.level.block.entity.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.block.state.properties.*; -import net.neoforged.neoforge.capabilities.*; -import net.neoforged.neoforge.items.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; import java.util.Optional; import java.util.function.Predicate; +import java.util.function.Supplier; public class PastelNodeBlockEntity extends BlockEntity implements FilterConfigurable, MenuProvider, PastelUpgradeable { @@ -49,29 +49,27 @@ public class PastelNodeBlockEntity extends BlockEntity implements FilterConfigur protected UUID nodeId = UUID.randomUUID(); protected Optional networkUUID = Optional.empty(); - protected Optional outerRing, innerRing, redstoneRing; + protected Optional> outerRing, innerRing, redstoneRing; protected Optional color = Optional.empty(); - // TODO: move these to ServerPastelNetwork? protected long lastTransferTick = 0; - protected final long cachedRedstonePowerTick = 0; + protected long cachedRedstonePowerTick = 0; protected boolean cachedUnpowered = true; - protected PastelNetwork.NodePriority priority = PastelNetwork.NodePriority.GENERIC; - protected long itemCountUnderway = 0; - + protected Map, Long> activeTransfers = new Object2LongArrayMap<>(); // upgrade impl stuff - protected boolean lit, triggerTransfer, triggered, waiting, lamp, sensor, updated; - protected int transferCount = PastelTransmissionLogic.DEFAULT_MAX_TRANSFER_AMOUNT; - protected int transferTime = PastelTransmissionLogic.DEFAULT_TRANSFER_TICKS_PER_NODE; + protected boolean lit, triggerTransfer, triggered, waiting, lamp, sensor, upgradesInitialized; + protected int transferCountMultiplier = PastelTransmissionLogic.DEFAULT_MAX_TRANSFER_COUNT_MULTIPLIER; + protected int transferDurationTicks = PastelTransmissionLogic.DEFAULT_TRANSFER_TICKS_PER_NODE; + protected int transferCooldownTicks = PastelTransmissionLogic.DEFAULT_TRANSFER_COOLDOWN_TICKS; protected int filterSlotRows = DEFAULT_FILTER_SLOT_ROWS; - protected boolean isInitialized = false; + protected boolean networkInitialized = false; private final List filterItems; float rotationTarget, crystalRotation, lastRotationTarget, heightTarget, crystalHeight, lastHeightTarget, alphaTarget, ringAlpha, lastAlphaTarget; long creationStamp = -1, interpTicks, interpLength = -1, spinTicks; - private @Nullable ConnectionState connectionState; + private ConnectionState connectionState = ConnectionState.DISCONNECTED; private final Object2BooleanMap> filteredTags; private boolean allTagsDeny = true; @@ -85,28 +83,19 @@ public PastelNodeBlockEntity(BlockPos blockPos, BlockState blockState) { this.redstoneRing = Optional.empty(); } - public @Nullable IItemHandler getConnectedStorage() { - BlockState state = this.getBlockState(); - if (!(state.getBlock() instanceof PastelNodeBlock)) { - return null; - } - Direction direction = state.getValue(PastelNodeBlock.FACING); - return level.getCapability(Capabilities.ItemHandler.BLOCK, this.getBlockPos().relative(direction.getOpposite()), direction); - } - - public static void tick(Level world, BlockPos pos, BlockState state, PastelNodeBlockEntity node) { - if (!node.isInitialized && !world.isClientSide()) { // kinda onLoad()? - node.getServerNetwork().ifPresent(network -> network.initializeNode(node)); - node.isInitialized = true; + public static void tick(Level level, BlockPos pos, BlockState state, PastelNodeBlockEntity node) { + if (!node.networkInitialized && !level.isClientSide()) { // kinda onLoad()? + node.getServerNetwork().ifPresent(network -> network.addLoadedNode(node)); + node.networkInitialized = true; } - if (node.lamp && state.getValue(BlockStateProperties.LIT) != node.canTransfer()) { - world.setBlockAndUpdate(pos, state.setValue(BlockStateProperties.LIT, node.cachedUnpowered)); + if (node.lamp && state.getValue(BlockStateProperties.LIT) != node.isEnabled()) { + level.setBlockAndUpdate(pos, state.setValue(BlockStateProperties.LIT, node.cachedUnpowered)); } //Trigger transfer logic needs to be ticked here if (node.triggerTransfer) { - var powered = world.hasNeighborSignal(pos); + var powered = level.hasNeighborSignal(pos); if (node.waiting && !powered) { node.waiting = false; @@ -117,11 +106,11 @@ public static void tick(Level world, BlockPos pos, BlockState state, PastelNodeB } } - if (world.isClientSide()) { + if (level.isClientSide()) { if (node.networkUUID.isEmpty()) { node.changeConnectionState(ConnectionState.DISCONNECTED); node.interpLength = 17; - } else if (!node.canTransfer()) { + } else if (!node.isEnabled()) { node.changeConnectionState(ConnectionState.INACTIVE); node.interpLength = 21; } else if (node.spinTicks > 0) { @@ -137,9 +126,9 @@ public static void tick(Level world, BlockPos pos, BlockState state, PastelNodeB if (node.spinTicks > 0) node.spinTicks--; - } else if (!node.updated) { + } else if (!node.upgradesInitialized) { node.updateUpgrades(); - node.updated = true; + node.upgradesInitialized = true; } } @@ -154,26 +143,21 @@ public void changeConnectionState(ConnectionState connectionState) { } public Optional getInnerRing() { - return innerRing; + return this.innerRing.map(Holder.Reference::value); } public Optional getOuterRing() { - return outerRing; + return this.outerRing.map(Holder.Reference::value); } public Optional getRedstoneRing() { - return redstoneRing; - } - - public PastelNetwork.NodePriority getPriority() { - return priority; + return this.redstoneRing.map(Holder.Reference::value); } // outer goes first, then inner, then redstone - public boolean tryInteractRings(ItemStack item, PastelNodeType type) { - var upgrade = SpectrumPastelUpgradeSignatures.of(item); - - if (upgrade.category.isRedstone()) { + // we do not allow duplicate upgrades + public boolean applyUpgrade(Holder.Reference upgrade) { + if (upgrade.value().goesToRedstoneRing()) { if (redstoneRing.isEmpty()) { redstoneRing = Optional.of(upgrade); return true; @@ -182,10 +166,18 @@ public boolean tryInteractRings(ItemStack item, PastelNodeType type) { return false; } - if (outerRing.isEmpty() && type.hasOuterRing()) { + if (outerRing.isEmpty() && getNodeType().hasOuterRing()) { + if(innerRing.isPresent() && innerRing.get().equals(upgrade)) { + return false; + } + outerRing = Optional.of(upgrade); return true; } else if (innerRing.isEmpty()) { + if(outerRing.isPresent() && outerRing.get().equals(upgrade)) { + return false; + } + innerRing = Optional.of(upgrade); return true; } @@ -198,13 +190,13 @@ public ItemStack tryRemoveUpgrade() { var stack = ItemStack.EMPTY; if (redstoneRing.isPresent()) { - stack = redstoneRing.get().upgradeItem.getDefaultInstance(); + stack = redstoneRing.get().value().upgradeItem.value().getDefaultInstance(); redstoneRing = Optional.empty(); } else if (innerRing.isPresent()) { - stack = innerRing.get().upgradeItem.getDefaultInstance(); + stack = innerRing.get().value().upgradeItem.value().getDefaultInstance(); innerRing = Optional.empty(); } else if (outerRing.isPresent()) { - stack = outerRing.get().upgradeItem.getDefaultInstance(); + stack = outerRing.get().value().upgradeItem.value().getDefaultInstance(); outerRing = Optional.empty(); } @@ -216,38 +208,34 @@ public ItemStack tryRemoveUpgrade() { } public void updateUpgrades() { - transferCount = PastelTransmissionLogic.DEFAULT_MAX_TRANSFER_AMOUNT; - transferTime = PastelTransmissionLogic.DEFAULT_TRANSFER_TICKS_PER_NODE; - var oldFilterSlotCount = filterSlotRows; + transferCountMultiplier = PastelTransmissionLogic.DEFAULT_MAX_TRANSFER_COUNT_MULTIPLIER; + transferDurationTicks = PastelTransmissionLogic.DEFAULT_TRANSFER_TICKS_PER_NODE; + transferCooldownTicks = PastelTransmissionLogic.DEFAULT_TRANSFER_COOLDOWN_TICKS; + var oldFilterSlotRows = filterSlotRows; filterSlotRows = DEFAULT_FILTER_SLOT_ROWS; triggerTransfer = false; lit = false; lamp = false; sensor = false; - var oldPriority = priority; - priority = PastelNetwork.NodePriority.GENERIC; - //First one processed can't compound because it has nothing to compound on - outerRing.ifPresent(r -> apply(r, Collections.emptyList())); - innerRing.ifPresent(r -> apply(r, outerRing.map(List::of).orElse(Collections.emptyList()))); - redstoneRing.ifPresent(r -> apply(r, Collections.emptyList())); + outerRing.ifPresent(r -> apply(r.value(), null)); + innerRing.ifPresent(r -> apply(r.value(), outerRing.map(Holder.Reference::value).orElse(null))); + redstoneRing.ifPresent(r -> apply(r.value(), null)); // Sanity - transferCount = Math.max(transferCount, 1); - transferTime = Mth.clamp(transferTime, 2, 100); + transferCountMultiplier = Math.max(transferCountMultiplier, 1); + transferDurationTicks = Mth.clamp(transferDurationTicks, 2, 100); filterSlotRows = Mth.clamp(filterSlotRows, 1, 5); if (lit && lamp) { lit = false; } - if (level != null) { - networkUUID.ifPresent(uuid -> ServerPastelNetworkManager.get((ServerLevel) level).getNetwork(uuid).ifPresent(n -> n.updateNodePriority(this, oldPriority))); - if (getBlockState().getValue(BlockStateProperties.LIT) != lit) - level.setBlockAndUpdate(worldPosition, getBlockState().setValue(BlockStateProperties.LIT, lit)); + if (level != null && getBlockState().getValue(BlockStateProperties.LIT) != lit) { + level.setBlockAndUpdate(worldPosition, getBlockState().setValue(BlockStateProperties.LIT, lit)); } - if (filterSlotRows < oldFilterSlotCount) { + if (filterSlotRows < oldFilterSlotRows) { for (int i = getDrawnSlots(); i < filterItems.size(); i++) { updateTagFilteringItems(); filterItems.set(i, ItemStack.EMPTY); @@ -266,21 +254,26 @@ public void notifySensor() { } } - public long getMaxTransferredAmount() { - return transferCount; + public int transferMultiplier() { + return transferCountMultiplier; + } + + public int getTransferDurationTicks() { + return transferDurationTicks; } - public int getTransferTime() { - return transferTime; + public int getTransferCooldownTicks() { + return transferCooldownTicks; } public float getRedstoneAlphaMult() { return redstoneRing.isPresent() ? 0.5F : 0.25F; } - public boolean canTransfer() { - var result = redstoneRing.map(r -> r.preProcessor - .apply(new PastelUpgradeSignature.RedstoneContext(this, level, worldPosition, cachedUnpowered))).orElse(InteractionResult.PASS); + public boolean isEnabled() { + InteractionResult result = redstoneRing.map(r -> r.value().preProcessor + .apply(new PastelUpgradeSignature.RedstoneContext(this, level, worldPosition, cachedUnpowered))) + .orElse(InteractionResult.PASS); if (result == InteractionResult.SUCCESS) return true; @@ -292,9 +285,10 @@ public boolean canTransfer() { if (time > this.cachedRedstonePowerTick && !getBlockState().getValue(PastelNodeBlock.REDSTONE_EMITTING)) { this.cachedUnpowered = level.getBestNeighborSignal(this.worldPosition) == 0; } + this.cachedRedstonePowerTick = time; boolean notPowered = redstoneRing.map(r -> { - var post = r.postProcessor.apply(new PastelUpgradeSignature.RedstoneContext(this, level, worldPosition, cachedUnpowered)); + InteractionResult post = r.value().postProcessor.apply(new PastelUpgradeSignature.RedstoneContext(this, level, worldPosition, cachedUnpowered)); if (post == InteractionResult.SUCCESS) return true; @@ -305,12 +299,18 @@ public boolean canTransfer() { return cachedUnpowered; }).orElse(cachedUnpowered); - var canTransfer = this.getLevel().getGameTime() > lastTransferTick; if (triggerTransfer) { - return triggered && canTransfer; + return triggered; } + return notPowered; + } + + public boolean cooldownExceededTo(PastelNodeBlockEntity otherNode) { + long thisNextTransferTime = this.lastTransferTick + this.getTransferCooldownTicks(); + long otherNextTransferTime = otherNode.lastTransferTick + otherNode.getTransferCooldownTicks(); + long time = this.getLevel().getGameTime(); - return canTransfer && notPowered; + return time >= thisNextTransferTime && time >= otherNextTransferTime; } public void markTransferred(boolean setTransferCooldown) { @@ -329,47 +329,88 @@ public void markTransferred(boolean setTransferCooldown) { protected void loadAdditional(CompoundTag nbt, HolderLookup.Provider registryLookup) { super.loadAdditional(nbt, registryLookup); - this.nodeId = nbt.contains("NodeID") ? nbt.getUUID("NodeID") : UUID.randomUUID(); - this.networkUUID = nbt.contains("NetworkUUID") ? Optional.of(nbt.getUUID("NetworkUUID")) : Optional.empty(); - this.triggered = nbt.contains("Triggered") && nbt.getBoolean("Triggered"); - this.waiting = nbt.contains("Waiting") && nbt.getBoolean("Waiting"); - this.creationStamp = nbt.contains("creationStamp") ? nbt.getLong("creationStamp") : 0; - this.lastTransferTick = nbt.contains("LastTransferTick", Tag.TAG_LONG) ? nbt.getLong("LastTransferTick") : 0; - this.itemCountUnderway = nbt.contains("ItemCountUnderway", Tag.TAG_LONG) ? nbt.getLong("ItemCountUnderway") : 0; - this.color = nbt.contains("ColorId", Tag.TAG_INT) ? Optional.of(DyeColor.byId(nbt.getInt("ColorId"))) : Optional.empty(); - this.outerRing = nbt.contains("OuterRing") ? Optional.ofNullable(SpectrumRegistries.PASTEL_UPGRADE.get(ResourceLocation.tryParse(nbt.getString("OuterRing")))) : Optional.empty(); - this.innerRing = nbt.contains("InnerRing") ? Optional.ofNullable(SpectrumRegistries.PASTEL_UPGRADE.get(ResourceLocation.tryParse(nbt.getString("InnerRing")))) : Optional.empty(); - this.redstoneRing = nbt.contains("RedstoneRing") ? Optional.ofNullable(SpectrumRegistries.PASTEL_UPGRADE.get(ResourceLocation.tryParse(nbt.getString("RedstoneRing")))) : Optional.empty(); + this.nodeId = nbt.contains("node_id") ? nbt.getUUID("node_id") : UUID.randomUUID(); + this.networkUUID = nbt.contains("network_uuid") ? Optional.of(nbt.getUUID("network_uuid")) : Optional.empty(); + this.triggered = nbt.contains("triggered") && nbt.getBoolean("triggered"); + this.waiting = nbt.contains("waiting") && nbt.getBoolean("waiting"); + this.creationStamp = nbt.contains("creation_timestamp") ? nbt.getLong("creation_timestamp") : 0; + this.lastTransferTick = nbt.contains("last_transfer_tick", Tag.TAG_LONG) ? nbt.getLong("last_transfer_tick") : 0; + this.activeTransfers = new Object2LongArrayMap<>(); + if(nbt.contains("active_transfers", Tag.TAG_COMPOUND)) { + HolderGetter reg = registryLookup.asGetterLookup().lookupOrThrow(SpectrumRegistryKeys.PASTEL_PAYLOAD_TYPE); + CompoundTag activeTransfersTag = nbt.getCompound("active_transfers"); + for(String key : activeTransfersTag.getAllKeys()) { + ResourceKey resourceKey = ResourceKey.create(SpectrumRegistryKeys.PASTEL_PAYLOAD_TYPE, ResourceLocation.parse(key)); + Optional> type = reg.get(resourceKey); + if(type.isPresent()) { + Long value = activeTransfersTag.getLong(key); + activeTransfers.put(type.get().key(), value); + } + } + } + this.color = nbt.contains("color_id", Tag.TAG_INT) ? Optional.of(DyeColor.byId(nbt.getInt("color_id"))) : Optional.empty(); + + this.outerRing = Optional.empty(); + this.innerRing = Optional.empty(); + this.redstoneRing = Optional.empty(); + Optional.ofNullable(ResourceLocation.tryParse(nbt.getString("outer_ring"))) + .map((resourceLocation) -> ResourceKey.create(SpectrumRegistryKeys.PASTEL_UPGRADE, resourceLocation)) + .flatMap((resourceKey) -> registryLookup.lookupOrThrow(SpectrumRegistryKeys.PASTEL_UPGRADE).get(resourceKey)) + .ifPresent(pastelUpgradeSignatureReference -> outerRing = Optional.of(pastelUpgradeSignatureReference)); + + Optional.ofNullable(ResourceLocation.tryParse(nbt.getString("inner_ring"))) + .map((resourceLocation) -> ResourceKey.create(SpectrumRegistryKeys.PASTEL_UPGRADE, resourceLocation)) + .flatMap((resourceKey) -> registryLookup.lookupOrThrow(SpectrumRegistryKeys.PASTEL_UPGRADE).get(resourceKey)) + .ifPresent(pastelUpgradeSignatureReference -> innerRing = Optional.of(pastelUpgradeSignatureReference)); + + Optional.ofNullable(ResourceLocation.tryParse(nbt.getString("redstone_ring"))) + .map((resourceLocation) -> ResourceKey.create(SpectrumRegistryKeys.PASTEL_UPGRADE, resourceLocation)) + .flatMap((resourceKey) -> registryLookup.lookupOrThrow(SpectrumRegistryKeys.PASTEL_UPGRADE).get(resourceKey)) + .ifPresent(pastelUpgradeSignatureReference -> redstoneRing = Optional.of(pastelUpgradeSignatureReference)); if (this.getNodeType().usesFilters()) { FilterConfigurable.readFilterNbt(nbt, this.filterItems); this.updateTagFilteringItems(); } + + this.upgradesInitialized = false; } @Override protected void saveAdditional(CompoundTag nbt, HolderLookup.Provider registryLookup) { super.saveAdditional(nbt, registryLookup); if (creationStamp != -1) { - nbt.putLong("creationStamp", creationStamp); + nbt.putLong("creation_timestamp", creationStamp); } if (this.networkUUID.isPresent()) { - nbt.putUUID("NetworkUUID", this.networkUUID.get()); + nbt.putUUID("network_uuid", this.networkUUID.get()); } if (this.color.isPresent()) { - nbt.putInt("ColorId", this.color.get().getId()); + nbt.putInt("color_id", this.color.get().getId()); } - nbt.putUUID("NodeID", this.nodeId); - nbt.putBoolean("Triggered", this.triggered); - nbt.putBoolean("Waiting", this.waiting); - nbt.putLong("LastTransferTick", this.lastTransferTick); - nbt.putLong("ItemCountUnderway", this.itemCountUnderway); + nbt.putUUID("node_id", this.nodeId); + nbt.putBoolean("triggered", this.triggered); + nbt.putBoolean("waiting", this.waiting); + nbt.putLong("last_transfer_tick", this.lastTransferTick); + + CompoundTag transferTag = new CompoundTag(); + for(Map.Entry, Long> transfer : this.activeTransfers.entrySet()) { + transferTag.putLong(registryLookup.asGetterLookup().lookupOrThrow(SpectrumRegistryKeys.PASTEL_PAYLOAD_TYPE).get(transfer.getKey()).get().key().location().toString(), transfer.getValue()); + } + nbt.put("active_transfers", transferTag); if (this.getNodeType().usesFilters()) { FilterConfigurable.writeFilterNbt(nbt, this.filterItems); } - outerRing.ifPresent(r -> nbt.putString("OuterRing", SpectrumPastelUpgradeSignatures.toString(r))); - innerRing.ifPresent(r -> nbt.putString("InnerRing", SpectrumPastelUpgradeSignatures.toString(r))); - redstoneRing.ifPresent(r -> nbt.putString("RedstoneRing", SpectrumPastelUpgradeSignatures.toString(r))); + + this.outerRing.ifPresent(pastelUpgradeSignatureReference -> pastelUpgradeSignatureReference.unwrapKey().ifPresent((resourceKey) -> { + nbt.putString("outer_ring", resourceKey.location().toString()); + })); + this.innerRing.ifPresent(pastelUpgradeSignatureReference -> pastelUpgradeSignatureReference.unwrapKey().ifPresent((resourceKey) -> { + nbt.putString("inner_ring", resourceKey.location().toString()); + })); + this.redstoneRing.ifPresent(pastelUpgradeSignatureReference -> pastelUpgradeSignatureReference.unwrapKey().ifPresent((resourceKey) -> { + nbt.putString("redstone_ring", resourceKey.location().toString()); + })); } @Override @@ -413,6 +454,20 @@ public PastelNodeType getNodeType() { return PastelNodeType.CONNECTION; } + public PastelNodeBases.PastelNodeBase getNodeBase() { + if (this.getBlockState().getBlock() instanceof PastelNodeBlock pastelNodeBlock) { + return pastelNodeBlock.base; + } + return PastelNodeBases.ITEM; + } + + public Set> getSupportedPayloads() { + if (this.getBlockState().getBlock() instanceof PastelNodeBlock pastelNodeBlock) { + return pastelNodeBlock.supportedPayloads; + } + return Set.of(); + } + public void setNetworkUUID(@Nullable UUID uuid) { this.networkUUID = Optional.ofNullable(uuid); if (this.getLevel() != null && !this.getLevel().isClientSide()) { @@ -421,13 +476,12 @@ public void setNetworkUUID(@Nullable UUID uuid) { } } - public long getItemCountUnderway() { - return this.itemCountUnderway; + public long getUnderway(ResourceKey payloadType) { + return this.activeTransfers.getOrDefault(payloadType, 0L); } - public void addItemCountUnderway(long count) { - this.itemCountUnderway += count; - this.itemCountUnderway = Math.max(0, this.itemCountUnderway); + public void addUnderway(ResourceKey payloadType, long amount) { + this.activeTransfers.put(payloadType, Math.max(0, this.activeTransfers.getOrDefault(payloadType, 0L) + amount)); this.setChanged(); } @@ -502,7 +556,7 @@ public int getDrawnSlots() { @Override public void writeClientSideData(AbstractContainerMenu menu, RegistryFriendlyByteBuf buffer) { - FilterConfigurable.ExtendedDataWithPos.PACKET_CODEC.encode(buffer, new FilterConfigurable.ExtendedDataWithPos(this.getBlockPos(), this)); + ExtendedDataWithPos.STREAM_CODEC.encode(buffer, new FilterConfigurable.ExtendedDataWithPos(this.getBlockPos(), this)); } public boolean equals(Object obj) { @@ -697,36 +751,18 @@ public boolean isSensor() { } @Override - public void applySlotUpgrade(PastelUpgradeSignature upgrade) { - filterSlotRows += getNodeType().hasOuterRing() ? upgrade.slotRows : upgrade.slotRows * 2; - } - - @Override - public void applySimple(PastelUpgradeSignature upgrade) { - transferCount += upgrade.stack; - transferTime += upgrade.speed; - } - - @Override - public void applyCompounding(PastelUpgradeSignature upgrade) { - transferCount = Math.round(transferCount * upgrade.stackMult); - transferTime = Math.round(transferTime * upgrade.speedMult); - } - - @Override - public void upgradePriority() { - if (priority == PastelNetwork.NodePriority.GENERIC) { - priority = PastelNetwork.NodePriority.MODERATE; - } else { - priority = PastelNetwork.NodePriority.HIGH; - } + public void applySignature(PastelUpgradeSignature upgrade) { + filterSlotRows += getNodeType().hasOuterRing() ? upgrade.additionalFilterRows : upgrade.additionalFilterRows * 2; + transferCountMultiplier = Math.round(transferCountMultiplier * upgrade.transferCountMultiplier); + transferDurationTicks = Math.round(transferDurationTicks * upgrade.transferDurationMultiplier); + transferCooldownTicks = Math.round(transferCooldownTicks * upgrade.transferCooldownMultiplier); } @Override public String toString() { - return this.getNodeType().toString() + "-" + - this.getColor().toString() + "-" + - this.getBlockPos().toString() + "-" + + return this.getNodeType() + "-" + + this.getColor() + "-" + + this.getBlockPos() + "-" + this.getNodeId(); } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBlockEntityRenderer.java b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBlockEntityRenderer.java index 8d99844b44..9b8512ed3e 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBlockEntityRenderer.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeBlockEntityRenderer.java @@ -1,6 +1,5 @@ package de.dafuqs.spectrum.blocks.pastel_network.nodes; -import com.mojang.authlib.minecraft.client.*; import com.mojang.blaze3d.vertex.*; import com.mojang.math.*; import de.dafuqs.spectrum.*; @@ -8,10 +7,7 @@ import de.dafuqs.spectrum.blocks.pastel_network.*; import de.dafuqs.spectrum.blocks.pastel_network.network.*; import de.dafuqs.spectrum.helpers.*; -import de.dafuqs.spectrum.registries.*; import net.minecraft.client.*; -import net.minecraft.client.model.geom.*; -import net.minecraft.client.model.geom.builders.*; import net.minecraft.client.renderer.*; import net.minecraft.client.renderer.block.*; import net.minecraft.client.renderer.blockentity.*; @@ -19,39 +15,24 @@ import net.minecraft.client.resources.model.*; import net.minecraft.resources.*; import net.minecraft.util.*; -import net.minecraft.world.item.*; -import javax.annotation.*; public class PastelNodeBlockEntityRenderer implements BlockEntityRenderer { private static final long REAL_DAY_LENGTH = 86400 * 20; - private static final Crystal CONNECTION = new Crystal(ModelResourceLocation.standalone(SpectrumCommon.locate("technical/connection_node_crystal")), false); - private static final Crystal PROVIDER = new Crystal(ModelResourceLocation.standalone(SpectrumCommon.locate("technical/provider_node_crystal")), true); - private static final Crystal SENDER = new Crystal(ModelResourceLocation.standalone(SpectrumCommon.locate("technical/sender_node_crystal")), true); - private static final Crystal STORAGE = new Crystal(ModelResourceLocation.standalone(SpectrumCommon.locate("technical/storage_node_crystal")), true); - private static final Crystal GATHER = new Crystal(ModelResourceLocation.standalone(SpectrumCommon.locate("technical/gather_node_crystal")), false); - private static final ResourceLocation BASE = SpectrumCommon.locate("textures/block/pastel_node_base.png"); + public static final ModelResourceLocation CRYSTAL_CONNECTION = ModelResourceLocation.standalone(SpectrumCommon.locate("technical/connection_node_crystal")); + public static final ModelResourceLocation CRYSTAL_PROVIDER = ModelResourceLocation.standalone(SpectrumCommon.locate("technical/provider_node_crystal")); + public static final ModelResourceLocation CRYSTAL_SENDER = ModelResourceLocation.standalone(SpectrumCommon.locate("technical/sender_node_crystal")); + public static final ModelResourceLocation CRYSTAL_STORAGE = ModelResourceLocation.standalone(SpectrumCommon.locate("technical/storage_node_crystal")); + public static final ModelResourceLocation CRYSTAL_GATHER = ModelResourceLocation.standalone(SpectrumCommon.locate("technical/gather_node_crystal")); + private static final ResourceLocation INNER_RING = SpectrumCommon.locate("textures/block/pastel_node_inner_ring_blank.png"); private static final ResourceLocation OUTER_RING = SpectrumCommon.locate("textures/block/pastel_node_outer_ring_blank.png"); private static final ResourceLocation REDSTONE_RING = SpectrumCommon.locate("textures/block/pastel_node_redstone_ring_blank.png"); - private final ModelPart base; - @SuppressWarnings("unused") public PastelNodeBlockEntityRenderer(BlockEntityRendererProvider.Context ctx) { - this.base = getItemNodeBaseTexturedModelData().bakeRoot(); - } - public static LayerDefinition getItemNodeBaseTexturedModelData() { - MeshDefinition modelData = new MeshDefinition(); - PartDefinition modelPartData = modelData.getRoot(); - modelPartData.addOrReplaceChild("base", CubeListBuilder.create().texOffs(6, 0).addBox(-1.0F, 1.1F, -1.0F, 2.0F, 0.0F, 2.0F), PartPose.ZERO); - modelPartData.addOrReplaceChild("leaf1", CubeListBuilder.create().texOffs(-4, 0).addBox(-2.0F, 1.0F, -4.0F, 4.0F, 0.0F, 4.0F), PartPose.offsetAndRotation(0.0F, 0.0F, -1.0F, 0.5236F, 0.0F, 0.0F)); - modelPartData.addOrReplaceChild("leaf2", CubeListBuilder.create().texOffs(-4, 4).addBox(-2.0F, 1.0F, 0.0F, 4.0F, 0.0F, 4.0F), PartPose.offsetAndRotation(0.0F, 0.0F, 1.0F, -0.5236F, 0.0F, 0.0F)); - modelPartData.addOrReplaceChild("leaf3", CubeListBuilder.create().texOffs(-4, 8).addBox(0.0F, 1.0F, -2.0F, 4.0F, 0.0F, 4.0F), PartPose.offsetAndRotation(1.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.5236F)); - modelPartData.addOrReplaceChild("leaf4", CubeListBuilder.create().texOffs(-4, 12).addBox(-4.0F, 1.0F, -2.0F, 4.0F, 0.0F, 4.0F), PartPose.offsetAndRotation(-1.0F, 0.0F, 0.0F, 0.0F, 0.0F, -0.5236F)); - return LayerDefinition.create(modelData, 16, 16); } @Override @@ -65,14 +46,6 @@ public void render(PastelNodeBlockEntity node, float tickDelta, PoseStack matric var time = (world.getGameTime() + node.getCreationStamp()) % REAL_DAY_LENGTH + tickDelta; - var crystal = switch (node.getNodeType()) { - case CONNECTION -> CONNECTION; - case STORAGE -> STORAGE; - case PROVIDER -> PROVIDER; - case SENDER -> SENDER; - case GATHER -> GATHER; - }; - var heightMod = 0.5F; switch (node.getState()) { @@ -121,16 +94,19 @@ public void render(PastelNodeBlockEntity node, float tickDelta, PoseStack matric } } + BlockRenderDispatcher blockRenderManager = Minecraft.getInstance().getBlockRenderer(); + matrices.translate(0, -0.5, 0); float quarterCrystalRotation = node.crystalRotation / 2; - matrices.mulPose(Axis.YP.rotation(quarterCrystalRotation)); - var rootBuffer = vertexConsumers.getBuffer(RenderType.entityCutout(BASE)); - base.render(matrices, rootBuffer, light, overlay); + // BASE + matrices.mulPose(Axis.YP.rotation(quarterCrystalRotation)); + ModelResourceLocation base = node.getNodeBase().getModelLocation(); + blockRenderManager.getModelRenderer().renderModel(matrices.last(), vertexConsumers.getBuffer(Sheets.cutoutBlockSheet()), null, blockRenderManager.getBlockModelShaper().getModelManager().getModel(base), 1.0F, 1.0F, 1.0F, LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY); matrices.mulPose(Axis.YP.rotation(quarterCrystalRotation * 2)); + // RINGS matrices.scale(0.6F, 0.6F, 0.6F); - var color = SpectrumColorHelper.colorIntToVec(node.networkUUID.flatMap(id -> Pastel.getClientInstance().getNetwork(id)).map(PastelNetwork::getColor).orElse(0xFFFFFF)); color = SpectrumColorHelper.colorIntToVec(SpectrumColorHelper.interpolate(color, SpectrumColorHelper.WASH, 0.2125F)); @@ -149,7 +125,8 @@ public void render(PastelNodeBlockEntity node, float tickDelta, PoseStack matric RenderHelper.renderFlatTransWithZYOffsetAndColor(matrices, redstoneRing, true, 5F + ringHeight, 15F, node.ringAlpha * node.getRedstoneAlphaMult(), 1F, overlay, color.x, color.y, color.z); } - if (crystal.hasOuterRing()) { + PastelNodeType nodeType = node.getNodeType(); + if (nodeType.hasOuterRing()) { var outerRing = vertexConsumers.getBuffer(RenderType.entityTranslucent(node.getOuterRing().map(PastelUpgradeSignature::outerRing).orElse(OUTER_RING))); if (node.getOuterRing().isPresent()) { RenderHelper.renderFlatTransWithZYOffset(matrices, outerRing, true, 5.75F + ringHeight * 2, 11F, node.ringAlpha, 1F, overlay); @@ -158,16 +135,21 @@ public void render(PastelNodeBlockEntity node, float tickDelta, PoseStack matric } } + // CRYSTAL matrices.translate(0.0, node.crystalHeight, 0.0); - BlockRenderDispatcher blockRenderManager = Minecraft.getInstance().getBlockRenderer(); - blockRenderManager.getModelRenderer().renderModel(matrices.last(), vertexConsumers.getBuffer(Sheets.solidBlockSheet()), null, blockRenderManager.getBlockModelShaper().getModelManager().getModel(crystal.crystal), 1.0F, 1.0F, 1.0F, LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY); + ModelResourceLocation crystalLocation = switch (nodeType) { + case CONNECTION -> CRYSTAL_CONNECTION; + case STORAGE -> CRYSTAL_STORAGE; + case PROVIDER -> CRYSTAL_PROVIDER; + case SENDER -> CRYSTAL_SENDER; + case GATHER -> CRYSTAL_GATHER; + }; + blockRenderManager.getModelRenderer().renderModel(matrices.last(), vertexConsumers.getBuffer(Sheets.translucentCullBlockSheet()), null, blockRenderManager.getBlockModelShaper().getModelManager().getModel(crystalLocation), 1.0F, 1.0F, 1.0F, LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY); matrices.popPose(); } private float mod(double in) { return (float) (in % (Math.PI * 2)); } - - private record Crystal(ModelResourceLocation crystal, boolean hasOuterRing) { - } + } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeType.java b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeType.java index eee8c4ce48..bb6851cba9 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeType.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/PastelNodeType.java @@ -1,31 +1,21 @@ package de.dafuqs.spectrum.blocks.pastel_network.nodes; -import net.minecraft.*; -import net.minecraft.network.chat.*; import net.minecraft.util.*; -import java.util.*; - public enum PastelNodeType implements StringRepresentable { - CONNECTION(List.of(Component.translatable("block.spectrum.connection_node.tooltip")), false, false), - STORAGE(List.of(Component.translatable("block.spectrum.storage_node.tooltip").withStyle(ChatFormatting.WHITE), Component.translatable("block.spectrum.pastel_network_nodes.tooltip.placing").withStyle(ChatFormatting.GRAY)), true, true), - PROVIDER(List.of(Component.translatable("block.spectrum.provider_node.tooltip").withStyle(ChatFormatting.WHITE), Component.translatable("block.spectrum.pastel_network_nodes.tooltip.placing").withStyle(ChatFormatting.GRAY)), false, true), - SENDER(List.of(Component.translatable("block.spectrum.sender_node.tooltip").withStyle(ChatFormatting.WHITE), Component.translatable("block.spectrum.pastel_network_nodes.tooltip.placing").withStyle(ChatFormatting.GRAY)), false, true), - GATHER(List.of(Component.translatable("block.spectrum.gather_node.tooltip").withStyle(ChatFormatting.WHITE), Component.translatable("block.spectrum.pastel_network_nodes.tooltip.placing").withStyle(ChatFormatting.GRAY)), true, false); + CONNECTION(false, false), + STORAGE(true, true), + PROVIDER(false, true), + SENDER(false, true), + GATHER(true, true); - private final List tooltips; private final boolean usesFilters, hasOuterRing; - PastelNodeType(List tooltips, boolean usesFilters, boolean hasOuterRing) { - this.tooltips = tooltips; + PastelNodeType(boolean usesFilters, boolean hasOuterRing) { this.usesFilters = usesFilters; this.hasOuterRing = hasOuterRing; } - public List getTooltips() { - return this.tooltips; - } - public boolean usesFilters() { return usesFilters; } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/package-info.java index ff84a9c0ec..fd2b9c42e1 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/nodes/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.pastel_network.nodes; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/package-info.java index f34540dc24..4c2d2e9565 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.pastel_network; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/payloads/FluidPastelPayload.java b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/payloads/FluidPastelPayload.java new file mode 100644 index 0000000000..874516e2eb --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/payloads/FluidPastelPayload.java @@ -0,0 +1,60 @@ +package de.dafuqs.spectrum.blocks.pastel_network.payloads; + +import com.mojang.serialization.*; +import com.mojang.serialization.codecs.*; +import de.dafuqs.spectrum.blocks.pastel_network.nodes.*; +import de.dafuqs.spectrum.particle.client.*; +import net.minecraft.core.*; +import net.minecraft.core.particles.*; +import net.minecraft.network.*; +import net.minecraft.network.codec.*; +import net.minecraft.world.level.*; +import net.minecraft.world.phys.*; +import net.neoforged.neoforge.client.extensions.common.*; +import net.neoforged.neoforge.fluids.*; +import net.neoforged.neoforge.fluids.capability.*; +import org.jspecify.annotations.*; + +public record FluidPastelPayload(FluidStack fluidStack, ParticleOptions particleEffect) implements PastelPayload { + + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(i -> i.group( + FluidStack.CODEC.fieldOf("fluid").forGetter(FluidPastelPayload::fluidStack) + ).apply(i, FluidPastelPayload::new)); + + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + FluidStack.STREAM_CODEC, FluidPastelPayload::fluidStack, + FluidPastelPayload::new + ); + + public FluidPastelPayload(FluidStack fluidStack) { + this(fluidStack, ColorParticleOption.create(ParticleTypes.ENTITY_EFFECT, IClientFluidTypeExtensions.of(fluidStack.getFluid()).getTintColor(fluidStack))); + } + + @Override + public void tick(Level level, PastelTransmissionParticle particle) { + if(level.getGameTime() % 2 == 0) { + Vec3 pos = particle.getPos(); + level.addParticle(particleEffect, pos.x(), pos.y(), pos.z(), 0, 0, 0); + } + } + + public MapCodec codec() { + return CODEC; + } + + public StreamCodec streamCodec() { + return STREAM_CODEC; + } + + @Override + public void arriveAtDestination(Level level, BlockPos destination, @Nullable PastelNodeBlockEntity destinationNode) { + if (destinationNode != null) { + @Nullable IFluidHandler destinationHandler = FluidPastelPayloadType.getConnectedFluidStorage(destinationNode); + if (destinationHandler != null) { + destinationHandler.fill(fluidStack, IFluidHandler.FluidAction.EXECUTE); + destinationNode.addUnderway(SpectrumPastelPayloadTypes.FLUID.getKey(), -fluidStack.getAmount()); + } + } + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/payloads/FluidPastelPayloadType.java b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/payloads/FluidPastelPayloadType.java new file mode 100644 index 0000000000..f2adaa8b83 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/payloads/FluidPastelPayloadType.java @@ -0,0 +1,96 @@ +package de.dafuqs.spectrum.blocks.pastel_network.payloads; + +import de.dafuqs.spectrum.*; +import de.dafuqs.spectrum.blocks.pastel_network.network.*; +import de.dafuqs.spectrum.blocks.pastel_network.nodes.*; +import net.minecraft.core.*; +import net.minecraft.world.level.block.state.*; +import net.neoforged.neoforge.capabilities.*; +import net.neoforged.neoforge.fluids.*; +import net.neoforged.neoforge.fluids.capability.*; +import net.neoforged.neoforge.registries.*; +import org.jgrapht.*; +import org.jgrapht.graph.*; +import org.jspecify.annotations.*; + +public class FluidPastelPayloadType extends PastelPayloadType { + + public FluidPastelPayloadType() { + super(SpectrumCommon.locate("fluid"), SpectrumPastelPayloads.FLUID.get()); + } + + public static @Nullable IFluidHandler getConnectedFluidStorage(PastelNodeBlockEntity pastelNodeBlockEntity) { + BlockState state = pastelNodeBlockEntity.getBlockState(); + if (!(state.getBlock() instanceof PastelNodeBlock)) { + return null; + } + Direction direction = state.getValue(PastelNodeBlock.FACING); + return pastelNodeBlockEntity.getLevel().getCapability(Capabilities.FluidHandler.BLOCK, pastelNodeBlockEntity.getBlockPos().relative(direction.getOpposite()), direction); + } + + @Override + public DeferredHolder getPayloadType() { + return SpectrumPastelPayloadTypes.FLUID; + } + + @Override + public void tryTransferToType(PastelTransmissionLogic logic, PastelNodeBlockEntity sourceNode, PastelNodeType type, PastelTransmissionLogic.TransferMode transferMode) { + IFluidHandler sourceHandler = getConnectedFluidStorage(sourceNode); + if (sourceHandler == null) { + return; + } + + for (PastelNodeBlockEntity destinationNode : logic.getLoadedNodes(getPayloadType(), type)) { + if (!destinationNode.isEnabled() || !sourceNode.cooldownExceededTo(destinationNode)) { + continue; + } + + IFluidHandler destinationHandler = getConnectedFluidStorage(destinationNode); + if (destinationHandler != null) { + boolean success = transferBetween(logic, sourceNode, sourceHandler, destinationNode, destinationHandler, transferMode); + if (success && transferMode != PastelTransmissionLogic.TransferMode.PULL) { + return; + } + } + } + } + + private boolean transferBetween(PastelTransmissionLogic logic, PastelNodeBlockEntity sourceNode, IFluidHandler sourceHandler, PastelNodeBlockEntity destinationNode, IFluidHandler destinationHandler, PastelTransmissionLogic.TransferMode transferMode) { + long underwayCount = destinationNode.getUnderway(getPayloadType().getKey()); + for(int sourceTankId = 0; sourceTankId < sourceHandler.getTanks(); sourceTankId++) { + FluidStack sourceFluid = sourceHandler.getFluidInTank(sourceTankId); + if (sourceFluid.isEmpty()) { + continue; + } + + int transferLimit = Math.max(sourceNode.transferMultiplier(), destinationNode.transferMultiplier()) * 50; + FluidStack proposedStack = new FluidStack(sourceFluid.getFluid(), transferLimit + (int) underwayCount); + int fluidSpace = destinationHandler.fill(proposedStack, IFluidHandler.FluidAction.SIMULATE); + int amountToSend = Math.min(transferLimit, fluidSpace); + if(amountToSend < 1) { + continue; + } + + // Find a valid path from source to target + // there always should be one - but better safe than sorry + GraphPath graphPath = logic.getPath(sourceNode, destinationNode); + if (graphPath == null) { + return false; + } + + FluidStack drainedAmount = sourceHandler.drain(sourceFluid.copyWithAmount(amountToSend), IFluidHandler.FluidAction.EXECUTE); + if(drainedAmount.getAmount() < 1) { + continue; + } + PastelPayload payload = new FluidPastelPayload(drainedAmount); + PastelTransmission transmission = new PastelTransmission(graphPath.getVertexList(), payload, sourceNode.getTransferDurationTicks()); + logic.addTransmission(sourceNode, destinationNode, transferMode, transmission); + destinationNode.addUnderway(getPayloadType().getKey(), drainedAmount.getAmount()); + + return true; + } + + return false; + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/payloads/InkPastelPayload.java b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/payloads/InkPastelPayload.java new file mode 100644 index 0000000000..66422c9177 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/payloads/InkPastelPayload.java @@ -0,0 +1,30 @@ +package de.dafuqs.spectrum.blocks.pastel_network.payloads; + +import com.mojang.serialization.*; +import com.mojang.serialization.codecs.*; +import de.dafuqs.spectrum.api.ink.*; +import net.minecraft.network.*; +import net.minecraft.network.codec.*; + +import java.util.*; + +public record InkPastelPayload(List inkAmount) implements PastelPayload { + + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(i -> i.group( + InkAmount.CODEC.listOf().fieldOf("ink").forGetter(InkPastelPayload::inkAmount) + ).apply(i, InkPastelPayload::new)); + + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + InkAmount.STREAM_CODEC.apply(ByteBufCodecs.list()), InkPastelPayload::inkAmount, + InkPastelPayload::new + ); + + public MapCodec codec() { + return CODEC; + } + + public StreamCodec streamCodec() { + return STREAM_CODEC; + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/payloads/InkPastelPayloadType.java b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/payloads/InkPastelPayloadType.java new file mode 100644 index 0000000000..841d242cec --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/payloads/InkPastelPayloadType.java @@ -0,0 +1,64 @@ +package de.dafuqs.spectrum.blocks.pastel_network.payloads; + +import de.dafuqs.spectrum.*; +import de.dafuqs.spectrum.api.ink.*; +import de.dafuqs.spectrum.api.ink.capability.*; +import de.dafuqs.spectrum.blocks.pastel_network.network.*; +import de.dafuqs.spectrum.blocks.pastel_network.nodes.*; +import net.minecraft.core.*; +import net.minecraft.world.level.block.state.*; +import net.neoforged.neoforge.registries.*; +import org.jspecify.annotations.*; + +import java.util.*; + +public class InkPastelPayloadType extends PastelPayloadType { + + public InkPastelPayloadType() { + super(SpectrumCommon.locate("ink"), SpectrumPastelPayloads.INK.get()); + } + + @Override + public DeferredHolder getPayloadType() { + return SpectrumPastelPayloadTypes.INK; + } + + @Override + public boolean runsEveryTick() { + return true; + } + + public static @Nullable InkCapability getConnectedInkStorage(PastelNodeBlockEntity pastelNodeBlockEntity) { + BlockState state = pastelNodeBlockEntity.getBlockState(); + if (!(state.getBlock() instanceof PastelNodeBlock)) { + return null; + } + Direction direction = state.getValue(PastelNodeBlock.FACING); + return pastelNodeBlockEntity.getLevel().getCapability(InkCapabilities.BLOCK, pastelNodeBlockEntity.getBlockPos().relative(direction.getOpposite()), null); + } + + @Override + public void tick(PastelTransmissionLogic logic) { + Set nodes = logic.getLoadedNodes(getPayloadType(), null); + if (nodes.size() < 2) return; + + List targets = new ArrayList<>(nodes.size()); + for (PastelNodeBlockEntity node : nodes) { + if (!node.isEnabled()) { + continue; + } + + InkCapability inkCapability = getConnectedInkStorage(node); + if (inkCapability != null) { + targets.add(inkCapability); + } + } + + if (targets.size() < 2) { + return; + } + + InkTransferHelper.equalizeInk(targets); + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/payloads/ItemPastelPayload.java b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/payloads/ItemPastelPayload.java index 21e750e2f7..130642083d 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/payloads/ItemPastelPayload.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/payloads/ItemPastelPayload.java @@ -1,53 +1,67 @@ package de.dafuqs.spectrum.blocks.pastel_network.payloads; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.serialization.MapCodec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import de.dafuqs.spectrum.blocks.pastel_network.nodes.PastelNodeBlockEntity; -import de.dafuqs.spectrum.helpers.InWorldInteractionHelper; -import de.dafuqs.spectrum.particle.client.PastelTransmissionParticle; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.core.BlockPos; -import net.minecraft.network.RegistryFriendlyByteBuf; -import net.minecraft.network.codec.StreamCodec; -import net.minecraft.world.item.ItemDisplayContext; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; -import net.neoforged.neoforge.items.IItemHandler; -import net.neoforged.neoforge.items.ItemHandlerHelper; -import org.jspecify.annotations.Nullable; +import com.mojang.blaze3d.vertex.*; +import com.mojang.serialization.*; +import com.mojang.serialization.codecs.*; +import de.dafuqs.spectrum.blocks.pastel_network.nodes.*; +import de.dafuqs.spectrum.helpers.*; +import de.dafuqs.spectrum.particle.client.*; +import net.minecraft.client.*; +import net.minecraft.client.renderer.*; +import net.minecraft.client.renderer.texture.*; +import net.minecraft.core.*; +import net.minecraft.network.*; +import net.minecraft.network.codec.*; +import net.minecraft.world.item.*; +import net.minecraft.world.level.*; +import net.minecraft.world.phys.*; +import net.neoforged.neoforge.items.*; +import org.jspecify.annotations.*; -public class ItemPastelPayload implements PastelPayload { +public record ItemPastelPayload(ItemStack itemStack) implements PastelPayload { public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(i -> i.group( - ItemStack.CODEC.fieldOf("stack").forGetter(ItemPastelPayload::getItemStack) + ItemStack.CODEC.fieldOf("stack").forGetter(ItemPastelPayload::itemStack) ).apply(i, ItemPastelPayload::new)); public static final StreamCodec STREAM_CODEC = StreamCodec.composite( - ItemStack.STREAM_CODEC, ItemPastelPayload::getItemStack, + ItemStack.STREAM_CODEC, ItemPastelPayload::itemStack, ItemPastelPayload::new ); - private final ItemStack itemStack; + public void renderAfterEntities(PastelTransmissionParticle particle, Level level, PoseStack poseStack, final MultiBufferSource vertexConsumers, Camera camera, float tickDelta) { + Vec3 cameraPos = camera.getPosition(); + Vec3 pos = particle.getPos(); + + poseStack.pushPose(); + + poseStack.translate(pos.x() - cameraPos.x, pos.y() - cameraPos.y, pos.z() - cameraPos.z); + int light = particle.getLightColor(tickDelta); + poseStack.mulPose(camera.rotation()); + poseStack.scale(0.65F, 0.65F, 0.65F); + poseStack.translate(0, -0.15, 0); + particle.itemRenderer.renderStatic(this.itemStack, ItemDisplayContext.GROUND, light, OverlayTexture.NO_OVERLAY, poseStack, vertexConsumers, level, 0); + poseStack.popPose(); + } - public ItemPastelPayload(ItemStack itemStack) { - this.itemStack = itemStack; + public MapCodec codec() { + return CODEC; } - public ItemStack getItemStack() { - return itemStack; + public StreamCodec streamCodec() { + return STREAM_CODEC; } + @Override public void arriveAtDestination(Level level, BlockPos destination, @Nullable PastelNodeBlockEntity destinationNode) { int inserted = 0; int count = itemStack.getCount(); if (destinationNode != null) { - IItemHandler destinationStorage = destinationNode.getConnectedStorage(); + IItemHandler destinationStorage = ItemPastelPayloadType.getConnectedItemStorage(destinationNode); if (destinationStorage != null) { inserted = count; inserted -= ItemHandlerHelper.insertItemStacked(destinationStorage, itemStack.copyWithCount(count), false).getCount(); - destinationNode.addItemCountUnderway(-count); + destinationNode.addUnderway(SpectrumPastelPayloadTypes.ITEM.getKey(), -count); } } @@ -56,20 +70,9 @@ public void arriveAtDestination(Level level, BlockPos destination, @Nullable Pas long diff = amount - inserted; InWorldInteractionHelper.scatter(level, destination.getX() + 0.5, destination.getY() + 0.5, destination.getZ() + 0.5, itemStack, diff); if (destinationNode != null) { - destinationNode.addItemCountUnderway(-diff); + destinationNode.addUnderway(SpectrumPastelPayloadTypes.ITEM.getKey(), -diff); } } } - public void render(PastelTransmissionParticle particle, Level level, PoseStack poseStack, final MultiBufferSource vertexConsumers, int light) { - particle.itemRenderer.renderStatic(this.itemStack, ItemDisplayContext.GROUND, light, OverlayTexture.NO_OVERLAY, poseStack, vertexConsumers, level, 0); - } - - public MapCodec codec() { - return CODEC; - } - - public StreamCodec streamCodec() { - return STREAM_CODEC; - } } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/payloads/ItemPastelPayloadType.java b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/payloads/ItemPastelPayloadType.java new file mode 100644 index 0000000000..c5f1f48f38 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/payloads/ItemPastelPayloadType.java @@ -0,0 +1,108 @@ +package de.dafuqs.spectrum.blocks.pastel_network.payloads; + +import de.dafuqs.spectrum.*; +import de.dafuqs.spectrum.blocks.pastel_network.network.*; +import de.dafuqs.spectrum.blocks.pastel_network.nodes.*; +import net.minecraft.core.*; +import net.minecraft.world.item.*; +import net.minecraft.world.level.block.state.*; +import net.neoforged.neoforge.capabilities.*; +import net.neoforged.neoforge.items.*; +import net.neoforged.neoforge.registries.*; +import org.jgrapht.*; +import org.jgrapht.graph.*; +import org.jspecify.annotations.*; + +import java.util.function.*; + +public class ItemPastelPayloadType extends PastelPayloadType { + + public ItemPastelPayloadType() { + super(SpectrumCommon.locate("item"), SpectrumPastelPayloads.ITEM.get()); + } + + @Override + public DeferredHolder getPayloadType() { + return SpectrumPastelPayloadTypes.ITEM; + } + + public static @Nullable IItemHandler getConnectedItemStorage(PastelNodeBlockEntity pastelNodeBlockEntity) { + BlockState state = pastelNodeBlockEntity.getBlockState(); + if (!(state.getBlock() instanceof PastelNodeBlock)) { + return null; + } + Direction direction = state.getValue(PastelNodeBlock.FACING); + return pastelNodeBlockEntity.getLevel().getCapability(Capabilities.ItemHandler.BLOCK, pastelNodeBlockEntity.getBlockPos().relative(direction.getOpposite()), direction); + } + + @Override + public void tryTransferToType(PastelTransmissionLogic logic, PastelNodeBlockEntity sourceNode, PastelNodeType type, PastelTransmissionLogic.TransferMode transferMode) { + IItemHandler sourceHandler = getConnectedItemStorage(sourceNode); + if (sourceHandler == null) { + return; + } + + for (PastelNodeBlockEntity destinationNode : logic.getLoadedNodes(getPayloadType(), type)) { + if (!destinationNode.isEnabled() || !sourceNode.cooldownExceededTo(destinationNode)) { + continue; + } + + IItemHandler destinationHandler = getConnectedItemStorage(destinationNode); + if (destinationHandler != null) { + boolean success = transferBetween(logic, sourceNode, sourceHandler, destinationNode, destinationHandler, transferMode); + if (success && transferMode != PastelTransmissionLogic.TransferMode.PULL) { + return; + } + } + } + } + + private boolean transferBetween(PastelTransmissionLogic logic, PastelNodeBlockEntity sourceNode, IItemHandler sourceStorage, PastelNodeBlockEntity destinationNode, IItemHandler destinationStorage, PastelTransmissionLogic.TransferMode transferMode) { + long underwayCount = destinationNode.getUnderway(getPayloadType().getKey()); + Predicate filter = sourceNode.getTransferFilterTo(destinationNode); + int transferLimit = Math.max(sourceNode.transferMultiplier(), destinationNode.transferMultiplier()); + for (int slotId = 0; slotId < sourceStorage.getSlots(); slotId++) { + ItemStack stack = sourceStorage.extractItem(slotId, transferLimit, true); + + // is the stack valid? + if (stack.isEmpty()) + continue; + if (!filter.test(stack)) + continue; + + // how many items can be transferred from source to destination? + long proposedAmount = stack.getCount(); + ItemStack proposedStack = stack.copyWithCount((int) (proposedAmount + underwayCount)); + int unableToInsertAmount = ItemHandlerHelper.insertItemStacked(destinationStorage, proposedStack, true).getCount(); + int amountToSend = stack.getCount() - unableToInsertAmount; + if(amountToSend < 1) { + continue; + } + + // Find a valid path from source to target + // there always should be one - but better safe than sorry + GraphPath graphPath = logic.getPath(sourceNode, destinationNode); + if (graphPath == null) { + return false; + } + + // Remove from source inventory + int extracted = 0; + for (int sourceSlot = 0; sourceSlot < sourceStorage.getSlots(); sourceSlot++) { + if (ItemStack.isSameItemSameComponents(stack, sourceStorage.getStackInSlot(sourceSlot))) + extracted += sourceStorage.extractItem(sourceSlot, amountToSend - extracted, false).getCount(); + if (extracted == amountToSend) + break; + } + + // Send the items + PastelPayload payload = new ItemPastelPayload(stack.copyWithCount(extracted)); + PastelTransmission transmission = new PastelTransmission(graphPath.getVertexList(), payload, sourceNode.getTransferDurationTicks()); + logic.addTransmission(sourceNode, destinationNode, transferMode, transmission); + destinationNode.addUnderway(getPayloadType().getKey(), extracted); + return true; + } + return false; + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/payloads/PastelPayload.java b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/payloads/PastelPayload.java index f38e3adf88..26ee1602d4 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/payloads/PastelPayload.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/payloads/PastelPayload.java @@ -2,36 +2,22 @@ import com.mojang.blaze3d.vertex.*; import com.mojang.serialization.*; -import com.sammy.malum.registry.common.worldgen.*; -import de.dafuqs.spectrum.*; import de.dafuqs.spectrum.blocks.pastel_network.nodes.*; import de.dafuqs.spectrum.particle.client.*; import de.dafuqs.spectrum.registries.*; +import net.minecraft.client.*; import net.minecraft.client.renderer.*; import net.minecraft.core.*; import net.minecraft.network.*; import net.minecraft.network.codec.*; import net.minecraft.world.level.*; -import net.minecraft.world.level.levelgen.feature.*; -import net.neoforged.bus.api.*; -import net.neoforged.neoforge.registries.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public interface PastelPayload { - Codec CODEC = SpectrumRegistries.PASTEL_PAYLOAD_TYPE.byNameCodec().dispatch(PastelPayload::codec, codec -> codec); + Codec CODEC = SpectrumRegistries.PASTEL_PAYLOAD.byNameCodec().dispatch(PastelPayload::codec, codec -> codec); StreamCodec STREAM_CODEC = ByteBufCodecs.fromCodecWithRegistries(CODEC); - DeferredRegister> REGISTRAR = DeferredRegister.create(SpectrumRegistryKeys.PASTEL_PAYLOAD_TYPE, SpectrumCommon.MOD_ID); - - DeferredHolder, MapCodec> ITEM = REGISTRAR.register("item", () -> ItemPastelPayload.CODEC); - //DeferredHolder, MapCodec> FLUID = REGISTRAR.register("fluid", () -> FluidPastelPayload.CODEC); - //DeferredHolder, MapCodec> INK = REGISTRAR.register("ink", () -> InkPastelPayload.CODEC); - - static void register(IEventBus modBus) { - REGISTRAR.register(modBus); - } - MapCodec codec(); StreamCodec streamCodec(); @@ -41,24 +27,10 @@ static void register(IEventBus modBus) { * @param destination the position of the node to arrive at * @param destinationNode the pastel node. Can be null if it was broken while the transmission was underway */ - void arriveAtDestination(Level level, BlockPos destination, @Nullable PastelNodeBlockEntity destinationNode); - - void render(PastelTransmissionParticle pastelTransmissionParticle, Level level, PoseStack poseStack, MultiBufferSource vertexConsumers, int light); - - // void spawnTravelParticles(Level level); // TODO + default void arriveAtDestination(Level level, BlockPos destination, @Nullable PastelNodeBlockEntity destinationNode) { } - /*class FluidPastelPayload implements PastelPayload { - private FluidStack fluidStack; - public FluidPastelPayload(FluidStack fluidStack) { - this.fluidStack = fluidStack; - } - } + default void renderAfterEntities(PastelTransmissionParticle pastelTransmissionParticle, Level level, PoseStack poseStack, MultiBufferSource vertexConsumers, final Camera camera, final float tickDelta) { } - class InkPastelPayload implements PastelPayload { - private InkAmount inkAmount; - public InkPastelPayload(InkAmount inkAmount) { - this.inkAmount = inkAmount; - } - }*/ + default void tick(Level level, PastelTransmissionParticle particle) { } } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/payloads/PastelPayloadType.java b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/payloads/PastelPayloadType.java new file mode 100644 index 0000000000..2fed28e4ed --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/payloads/PastelPayloadType.java @@ -0,0 +1,50 @@ +package de.dafuqs.spectrum.blocks.pastel_network.payloads; + +import com.mojang.serialization.*; +import de.dafuqs.spectrum.blocks.pastel_network.network.*; +import de.dafuqs.spectrum.blocks.pastel_network.nodes.*; +import net.minecraft.resources.*; +import net.neoforged.neoforge.registries.*; + +import java.util.function.*; + +public abstract class PastelPayloadType { + + protected final ResourceLocation id; + protected final MapCodec codec; + + public PastelPayloadType(ResourceLocation id, MapCodec codec) { + this.id = id; + this.codec = codec; + } + + public abstract DeferredHolder getPayloadType(); + + public boolean runsEveryTick() { + return false; + } + + public void tick(PastelTransmissionLogic logic) { + transferBetween(logic, PastelNodeType.SENDER, PastelNodeType.GATHER, PastelTransmissionLogic.TransferMode.PUSH_PULL); + transferBetween(logic, PastelNodeType.PROVIDER, PastelNodeType.GATHER, PastelTransmissionLogic.TransferMode.PULL); + transferBetween(logic, PastelNodeType.STORAGE, PastelNodeType.GATHER, PastelTransmissionLogic.TransferMode.PULL); + transferBetween(logic, PastelNodeType.SENDER, PastelNodeType.STORAGE, PastelTransmissionLogic.TransferMode.PUSH); + } + + protected void transferBetween(PastelTransmissionLogic logic, PastelNodeType sourceType, PastelNodeType destinationType, PastelTransmissionLogic.TransferMode transferMode) { + for (PastelNodeBlockEntity sourceNode : logic.getLoadedNodes(getPayloadType(), sourceType)) { + if (!sourceNode.isEnabled()) { + continue; + } + + for(Supplier payloadType : sourceNode.getSupportedPayloads()) { + payloadType.get().tryTransferToType(logic, sourceNode, destinationType, transferMode); + } + } + } + + protected void tryTransferToType(PastelTransmissionLogic logic, PastelNodeBlockEntity sourceNode, PastelNodeType type, PastelTransmissionLogic.TransferMode transferMode){ + + } + +} \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/payloads/SpectrumPastelPayloadTypes.java b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/payloads/SpectrumPastelPayloadTypes.java new file mode 100644 index 0000000000..003f4ac6a4 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/payloads/SpectrumPastelPayloadTypes.java @@ -0,0 +1,20 @@ +package de.dafuqs.spectrum.blocks.pastel_network.payloads; + +import de.dafuqs.spectrum.*; +import de.dafuqs.spectrum.registries.*; +import net.neoforged.bus.api.*; +import net.neoforged.neoforge.registries.*; + +public class SpectrumPastelPayloadTypes { + + public static final DeferredRegister REGISTRAR = DeferredRegister.create(SpectrumRegistryKeys.PASTEL_PAYLOAD_TYPE, SpectrumCommon.MOD_ID); + + public static final DeferredHolder ITEM = REGISTRAR.register("item", ItemPastelPayloadType::new); + public static final DeferredHolder FLUID = REGISTRAR.register("fluid", FluidPastelPayloadType::new); + public static final DeferredHolder INK = REGISTRAR.register("ink", InkPastelPayloadType::new); + + public static void register(IEventBus modBus) { + REGISTRAR.register(modBus); + } + +} \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/payloads/SpectrumPastelPayloads.java b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/payloads/SpectrumPastelPayloads.java new file mode 100644 index 0000000000..e6873625c1 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/payloads/SpectrumPastelPayloads.java @@ -0,0 +1,21 @@ +package de.dafuqs.spectrum.blocks.pastel_network.payloads; + +import com.mojang.serialization.*; +import de.dafuqs.spectrum.*; +import de.dafuqs.spectrum.registries.*; +import net.neoforged.bus.api.*; +import net.neoforged.neoforge.registries.*; + +public class SpectrumPastelPayloads { + + public static final DeferredRegister> REGISTRAR = DeferredRegister.create(SpectrumRegistryKeys.PASTEL_PAYLOAD, SpectrumCommon.MOD_ID); + + public static final DeferredHolder, MapCodec> ITEM = REGISTRAR.register("item", () -> ItemPastelPayload.CODEC); + public static final DeferredHolder, MapCodec> FLUID = REGISTRAR.register("fluid", () -> FluidPastelPayload.CODEC); + public static final DeferredHolder, MapCodec> INK = REGISTRAR.register("ink", () -> InkPastelPayload.CODEC); + + public static void register(IEventBus modBus) { + REGISTRAR.register(modBus); + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/payloads/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/payloads/package-info.java index 6319bdae35..1b0c55466f 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/payloads/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/pastel_network/payloads/package-info.java @@ -3,6 +3,5 @@ @FieldsAreNonnullByDefault package de.dafuqs.spectrum.blocks.pastel_network.payloads; -import net.minecraft.FieldsAreNonnullByDefault; -import net.minecraft.MethodsReturnNonnullByDefault; -import org.jspecify.annotations.NullMarked; +import net.minecraft.*; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pedestal/BuiltinGemstoneColor.java b/src/main/java/de/dafuqs/spectrum/blocks/pedestal/BuiltinGemstoneColor.java index af6aa7b180..42fe4ccd98 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/pedestal/BuiltinGemstoneColor.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/pedestal/BuiltinGemstoneColor.java @@ -1,13 +1,12 @@ package de.dafuqs.spectrum.blocks.pedestal; import de.dafuqs.spectrum.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.api.item.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.core.*; import net.minecraft.util.*; import net.minecraft.world.item.*; -import javax.annotation.*; public enum BuiltinGemstoneColor implements GemstoneColor, StringRepresentable { CYAN("cyan", InkColors.CYAN_COLOR), diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pedestal/PedestalBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/pedestal/PedestalBlock.java index bc106bb9ed..486a65e5ef 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/pedestal/PedestalBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/pedestal/PedestalBlock.java @@ -8,8 +8,6 @@ import de.dafuqs.spectrum.blocks.upgrade.*; import de.dafuqs.spectrum.compat.modonomicon.*; import de.dafuqs.spectrum.networking.s2c_payloads.*; -import de.dafuqs.spectrum.particle.effect.*; -import de.dafuqs.spectrum.recipe.pedestal.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.core.*; import net.minecraft.core.particles.*; @@ -30,7 +28,7 @@ import net.minecraft.world.phys.*; import net.minecraft.world.phys.shapes.*; import org.joml.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pedestal/PedestalBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/pedestal/PedestalBlockEntity.java index f809e8cbcd..57f13cb772 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/pedestal/PedestalBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/pedestal/PedestalBlockEntity.java @@ -36,8 +36,7 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.block.state.properties.*; import net.minecraft.world.phys.*; -import org.jetbrains.annotations.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; @@ -145,87 +144,87 @@ public static void spawnCraftingStartParticles(Level world, BlockPos blockPos) { } } - public static void serverTick(Level world, BlockPos blockPos, BlockState blockState, PedestalBlockEntity pedestalBlockEntity) { - if (pedestalBlockEntity.upgrades == null) { - pedestalBlockEntity.calculateUpgrades(); + public static void serverTick(Level level, BlockPos pos, BlockState state, PedestalBlockEntity pedestal) { + if (pedestal.upgrades == null) { + pedestal.calculateUpgrades(level); } // check recipe crafted last tick => performance boolean shouldMarkDirty = false; - var calculatedEntry = calculateRecipe(world, pedestalBlockEntity); + var calculatedEntry = calculateRecipe(level, pedestal); var calculatedRecipe = calculatedEntry == null ? null : calculatedEntry.value(); - pedestalBlockEntity.inventoryChanged = false; - if (pedestalBlockEntity.currentRecipe != calculatedEntry) { - pedestalBlockEntity.shouldCraft = false; - pedestalBlockEntity.currentRecipe = calculatedEntry; - pedestalBlockEntity.propertyDelegate.craftingTime = 0; + pedestal.inventoryChanged = false; + if (pedestal.currentRecipe != calculatedEntry) { + pedestal.shouldCraft = false; + pedestal.currentRecipe = calculatedEntry; + pedestal.propertyDelegate.craftingTime = 0; if (calculatedRecipe instanceof PedestalRecipe calculatedPedestalRecipe) { - pedestalBlockEntity.propertyDelegate.craftingTimeTotal = (int) Math.ceil(calculatedPedestalRecipe.getCraftingTime() / pedestalBlockEntity.upgrades.getEffectiveValue(UpgradeType.SPEED)); + pedestal.propertyDelegate.craftingTimeTotal = (int) Math.ceil(calculatedPedestalRecipe.getCraftingTime() / pedestal.upgrades.getEffectiveValue(UpgradeType.SPEED)); - Player player = pedestalBlockEntity.getOwnerIfOnline(world); + Player player = pedestal.getOwnerIfOnline(level); if (player instanceof ServerPlayer serverPlayerEntity) { - SpectrumAdvancementCriteria.PEDESTAL_RECIPE_CALCULATED.trigger(serverPlayerEntity, calculatedPedestalRecipe.assemble(pedestalBlockEntity.createRecipeInput(), world.registryAccess()), (int) calculatedPedestalRecipe.getExperience(), pedestalBlockEntity.propertyDelegate.craftingTimeTotal); + SpectrumAdvancementCriteria.PEDESTAL_RECIPE_CALCULATED.trigger(serverPlayerEntity, calculatedPedestalRecipe.assemble(pedestal.createRecipeInput(), level.registryAccess()), (int) calculatedPedestalRecipe.getExperience(), pedestal.propertyDelegate.craftingTimeTotal); } } else { - pedestalBlockEntity.propertyDelegate.craftingTimeTotal = (int) Math.ceil(SpectrumConfig.CONFIG.VanillaRecipeCraftingTimeTicks.get() / pedestalBlockEntity.upgrades.getEffectiveValue(UpgradeType.SPEED)); + pedestal.propertyDelegate.craftingTimeTotal = (int) Math.ceil(SpectrumConfig.CONFIG.VanillaRecipeCraftingTimeTicks.get() / pedestal.upgrades.getEffectiveValue(UpgradeType.SPEED)); } - pedestalBlockEntity.setChanged(); - PlayBlockBoundSoundInstancePayload.sendCancelBlockBoundSoundInstance((ServerLevel) pedestalBlockEntity.getLevel(), pedestalBlockEntity.getBlockPos()); - pedestalBlockEntity.updateInClientWorld(); + pedestal.setChanged(); + PlayBlockBoundSoundInstancePayload.sendCancelBlockBoundSoundInstance((ServerLevel) pedestal.getLevel(), pedestal.getBlockPos()); + pedestal.updateInClientWorld(); } // only craft when there is redstone power - if (pedestalBlockEntity.propertyDelegate.craftingTime == 0 && !pedestalBlockEntity.shouldCraft && !(blockState.getBlock() instanceof PedestalBlock && blockState.getValue(BlockStateProperties.POWERED))) { + if (pedestal.propertyDelegate.craftingTime == 0 && !pedestal.shouldCraft && !(state.getBlock() instanceof PedestalBlock && state.getValue(BlockStateProperties.POWERED))) { return; } - int maxCountPerStack = pedestalBlockEntity.getMaxStackSize(); + int maxCountPerStack = pedestal.getMaxStackSize(); // Pedestal crafting boolean craftingFinished = false; - if (calculatedRecipe instanceof PedestalRecipe pedestalRecipe && pedestalBlockEntity.canAcceptRecipeOutput(calculatedRecipe, pedestalBlockEntity.createRecipeInput(), maxCountPerStack)) { - pedestalBlockEntity.propertyDelegate.craftingTime++; - if (pedestalBlockEntity.propertyDelegate.craftingTime == pedestalBlockEntity.propertyDelegate.craftingTimeTotal) { - pedestalBlockEntity.propertyDelegate.craftingTime = 0; - craftingFinished = craftPedestalRecipe(pedestalBlockEntity, pedestalRecipe, pedestalBlockEntity, maxCountPerStack); + if (calculatedRecipe instanceof PedestalRecipe pedestalRecipe && pedestal.canAcceptRecipeOutput(calculatedRecipe, pedestal.createRecipeInput(), maxCountPerStack)) { + pedestal.propertyDelegate.craftingTime++; + if (pedestal.propertyDelegate.craftingTime == pedestal.propertyDelegate.craftingTimeTotal) { + pedestal.propertyDelegate.craftingTime = 0; + craftingFinished = craftPedestalRecipe(pedestal, pedestalRecipe, pedestal, maxCountPerStack); if (craftingFinished) { - pedestalBlockEntity.inventoryChanged = true; + pedestal.inventoryChanged = true; } shouldMarkDirty = true; } // Vanilla crafting - } else if (calculatedRecipe instanceof CraftingRecipe vanillaCraftingRecipe && pedestalBlockEntity.canAcceptRecipeOutput(calculatedRecipe, pedestalBlockEntity.createRecipeInput(), maxCountPerStack)) { - pedestalBlockEntity.propertyDelegate.craftingTime++; - if (pedestalBlockEntity.propertyDelegate.craftingTime == pedestalBlockEntity.propertyDelegate.craftingTimeTotal) { - pedestalBlockEntity.propertyDelegate.craftingTime = 0; - craftingFinished = pedestalBlockEntity.craftVanillaRecipe(world, vanillaCraftingRecipe, pedestalBlockEntity, maxCountPerStack); + } else if (calculatedRecipe instanceof CraftingRecipe vanillaCraftingRecipe && pedestal.canAcceptRecipeOutput(calculatedRecipe, pedestal.createRecipeInput(), maxCountPerStack)) { + pedestal.propertyDelegate.craftingTime++; + if (pedestal.propertyDelegate.craftingTime == pedestal.propertyDelegate.craftingTimeTotal) { + pedestal.propertyDelegate.craftingTime = 0; + craftingFinished = pedestal.craftVanillaRecipe(level, vanillaCraftingRecipe, pedestal, maxCountPerStack); if (craftingFinished) { - playCraftingFinishedSoundEvent(pedestalBlockEntity, calculatedRecipe); - pedestalBlockEntity.inventoryChanged = true; + playCraftingFinishedSoundEvent(pedestal, calculatedRecipe); + pedestal.inventoryChanged = true; } shouldMarkDirty = true; } } - if (pedestalBlockEntity.propertyDelegate.craftingTime == 1 && pedestalBlockEntity.propertyDelegate.craftingTimeTotal > 1) { - PlayBlockBoundSoundInstancePayload.sendPlayBlockBoundSoundInstance(SpectrumSoundEvents.PEDESTAL_CRAFTING, (ServerLevel) pedestalBlockEntity.getLevel(), pedestalBlockEntity.getBlockPos(), pedestalBlockEntity.propertyDelegate.craftingTimeTotal - pedestalBlockEntity.propertyDelegate.craftingTime); + if (pedestal.propertyDelegate.craftingTime == 1 && pedestal.propertyDelegate.craftingTimeTotal > 1) { + PlayBlockBoundSoundInstancePayload.sendPlayBlockBoundSoundInstance(SpectrumSoundEvents.PEDESTAL_CRAFTING, (ServerLevel) pedestal.getLevel(), pedestal.getBlockPos(), pedestal.propertyDelegate.craftingTimeTotal - pedestal.propertyDelegate.craftingTime); } // try to output the currently stored output stack - ItemStack outputItemStack = pedestalBlockEntity.inventory.get(OUTPUT_SLOT_ID); + ItemStack outputItemStack = pedestal.inventory.get(OUTPUT_SLOT_ID); if (outputItemStack != ItemStack.EMPTY) { - if (world.getBlockState(blockPos.above()).getCollisionShape(world, blockPos.above()).isEmpty()) { - spawnOutputAsItemEntity((ServerLevel) world, blockPos, pedestalBlockEntity, outputItemStack); + if (level.getBlockState(pos.above()).getCollisionShape(level, pos.above()).isEmpty()) { + spawnOutputAsItemEntity((ServerLevel) level, pos, pedestal, outputItemStack); } else { boolean couldOutput = false; - BlockEntity belowBlockEntity = world.getBlockEntity(blockPos.below()); + BlockEntity belowBlockEntity = level.getBlockEntity(pos.below()); if (belowBlockEntity instanceof Container belowInventory) { - couldOutput = tryPutIntoInventory(pedestalBlockEntity, belowInventory, outputItemStack); + couldOutput = tryPutIntoInventory(pedestal, belowInventory, outputItemStack); } if (!couldOutput) { - BlockEntity aboveBlockEntity = world.getBlockEntity(blockPos.above()); + BlockEntity aboveBlockEntity = level.getBlockEntity(pos.above()); if (aboveBlockEntity instanceof Container aboveInventory && !(aboveBlockEntity instanceof HopperBlockEntity)) { - couldOutput = tryPutIntoInventory(pedestalBlockEntity, aboveInventory, outputItemStack); + couldOutput = tryPutIntoInventory(pedestal, aboveInventory, outputItemStack); } } if (couldOutput) { @@ -233,18 +232,17 @@ public static void serverTick(Level world, BlockPos blockPos, BlockState blockSt } else { // play sound when the entity can not put its output anywhere if (craftingFinished) { - pedestalBlockEntity.playSound(SoundEvents.LAVA_EXTINGUISH); + pedestal.playSound(SoundEvents.LAVA_EXTINGUISH); } } } } if (shouldMarkDirty) { - setChanged(world, blockPos, blockState); + setChanged(level, pos, state); } } - @Contract(pure = true) public static PedestalVariant getVariant(PedestalBlockEntity pedestalBlockEntity) { return pedestalBlockEntity.pedestalVariant; } @@ -869,17 +867,11 @@ private PedestalRecipeTier getStructureTier() { return PedestalRecipeTier.BASIC; } - @Override - public void resetUpgrades() { - this.upgrades = null; - this.setChanged(); - } - /** * Search for upgrades at valid positions and apply */ @Override - public void calculateUpgrades() { + public void calculateUpgrades(Level level) { this.upgrades = Upgradeable.calculateUpgradeMods4(level, worldPosition, 3, 2, this.ownerUUID); this.setChanged(); } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pedestal/PedestalBlockEntityRenderer.java b/src/main/java/de/dafuqs/spectrum/blocks/pedestal/PedestalBlockEntityRenderer.java index ac98d90be8..5c447e4540 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/pedestal/PedestalBlockEntityRenderer.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/pedestal/PedestalBlockEntityRenderer.java @@ -13,7 +13,6 @@ import net.minecraft.resources.*; import net.minecraft.world.item.*; import net.minecraft.world.item.crafting.*; -import javax.annotation.*; public class PedestalBlockEntityRenderer implements BlockEntityRenderer { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pedestal/PedestalRecipeInput.java b/src/main/java/de/dafuqs/spectrum/blocks/pedestal/PedestalRecipeInput.java index 23cdf2bfb6..527cad3ff3 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/pedestal/PedestalRecipeInput.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/pedestal/PedestalRecipeInput.java @@ -5,7 +5,7 @@ import net.minecraft.world.item.*; import net.minecraft.world.item.crafting.*; import net.minecraft.world.level.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/pedestal/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/pedestal/package-info.java index 9d9f91c3df..f51c8117f8 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/pedestal/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/pedestal/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.pedestal; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/potion_workshop/PotionWorkshopBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/potion_workshop/PotionWorkshopBlock.java index 7f57df787d..6d0554cb73 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/potion_workshop/PotionWorkshopBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/potion_workshop/PotionWorkshopBlock.java @@ -17,7 +17,7 @@ import net.minecraft.world.level.pathfinder.*; import net.minecraft.world.phys.*; import net.minecraft.world.phys.shapes.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class PotionWorkshopBlock extends HorizontalDirectionalBlock implements EntityBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/potion_workshop/PotionWorkshopBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/potion_workshop/PotionWorkshopBlockEntity.java index 3f36502508..2db8a61040 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/potion_workshop/PotionWorkshopBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/potion_workshop/PotionWorkshopBlockEntity.java @@ -30,7 +30,7 @@ import net.minecraft.world.level.*; import net.minecraft.world.level.block.entity.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; import java.util.stream.*; @@ -400,6 +400,7 @@ private static void decrementUsingRemainder(PotionWorkshopBlockEntity potionWork ItemStack currentRemainder = currentStack.getCraftingRemainingItem(); currentStack.shrink(amount); if (!currentRemainder.isEmpty()) { + currentRemainder.setCount(amount); addToInventoryOrSpawn(potionWorkshopBlockEntity, currentRemainder); } } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/potion_workshop/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/potion_workshop/package-info.java index 091d2eb578..a0682c8651 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/potion_workshop/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/potion_workshop/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.potion_workshop; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/present/PresentBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/present/PresentBlock.java index 974a8e1b5c..ca45dde34b 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/present/PresentBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/present/PresentBlock.java @@ -1,7 +1,7 @@ package de.dafuqs.spectrum.blocks.present; import com.mojang.serialization.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.api.item.*; import de.dafuqs.spectrum.components.*; import de.dafuqs.spectrum.helpers.*; @@ -30,7 +30,7 @@ import net.minecraft.world.phys.*; import net.minecraft.world.phys.shapes.*; import org.joml.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; @@ -199,7 +199,7 @@ public static void spawnParticlesClient(Level world, BlockPos pos, Map color : colors.entrySet()) { - spawnParticlesClient(world, pos, color.getKey().getColorInt(), color.getValue() * 10); + spawnParticlesClient(world, pos, color.getKey().getColorARGB(), color.getValue() * 10); } } } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/present/PresentBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/present/PresentBlockEntity.java index aa75a4fff1..263a631fb4 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/present/PresentBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/present/PresentBlockEntity.java @@ -1,7 +1,6 @@ package de.dafuqs.spectrum.blocks.present; import de.dafuqs.spectrum.api.block.*; -import de.dafuqs.spectrum.api.energy.color.*; import de.dafuqs.spectrum.blocks.*; import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.registries.*; @@ -13,6 +12,7 @@ import net.minecraft.world.item.component.*; import net.minecraft.world.level.*; import net.minecraft.world.level.block.state.*; +import org.jspecify.annotations.*; import java.util.*; @@ -66,16 +66,16 @@ public int openingTick() { } @Override - public UUID getOwnerUUID() { + public @Nullable UUID getOwnerUUID() { return PresentBlockItem.getOwner(this.stack).flatMap(ResolvableProfile::id).orElse(null); } - public ResolvableProfile getOwner() { + public @Nullable ResolvableProfile getOwner() { return PresentBlockItem.getOwner(this.stack).orElse(null); } @Override - public String getOwnerName() { + public @Nullable String getOwnerName() { return PresentBlockItem.getOwner(this.stack).flatMap(ResolvableProfile::name).orElse("???"); } @@ -90,7 +90,7 @@ public void setOpenerUUID(Player opener) { setChanged(); } - public UUID getOpenerUUID() { + public @Nullable UUID getOpenerUUID() { return this.ownerUUID; } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/present/PresentBlockItem.java b/src/main/java/de/dafuqs/spectrum/blocks/present/PresentBlockItem.java index 6e720c991c..15592c7203 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/present/PresentBlockItem.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/present/PresentBlockItem.java @@ -1,7 +1,7 @@ package de.dafuqs.spectrum.blocks.present; import com.mojang.authlib.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.components.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.*; @@ -20,7 +20,7 @@ import net.minecraft.world.level.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; import java.util.stream.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/present/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/present/package-info.java index 4b59b9acce..bc9a75137d 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/present/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/present/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.present; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/redstone/BlockBreakerBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/redstone/BlockBreakerBlock.java index d66994cde8..b06beb8cfa 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/redstone/BlockBreakerBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/redstone/BlockBreakerBlock.java @@ -18,14 +18,14 @@ import net.minecraft.world.level.gameevent.*; import net.minecraft.world.level.material.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class BlockBreakerBlock extends RedstoneInteractionBlock implements EntityBlock { public static final MapCodec CODEC = simpleCodec(BlockBreakerBlock::new); - private static ItemStack BREAK_STACK; + private static @Nullable ItemStack BREAK_STACK; public BlockBreakerBlock(Properties settings) { super(settings); @@ -84,7 +84,7 @@ protected void destroy(ServerLevel world, BlockPos breakerPos, Direction directi if (!(blockEntity instanceof BlockBreakerBlockEntity blockBreakerBlockEntity)) { return; } - @Nullable Player owner = FakePlayerHelper.getFakePlayer(world, blockBreakerBlockEntity); + Player owner = FakePlayerHelper.getFakePlayer(world, blockBreakerBlockEntity); if (!GenericClaimModsCompat.canBreak(world, breakingPos, owner)) { return; } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/redstone/BlockBreakerBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/redstone/BlockBreakerBlockEntity.java index 1eb75bf588..16a7edea0f 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/redstone/BlockBreakerBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/redstone/BlockBreakerBlockEntity.java @@ -7,19 +7,20 @@ import net.minecraft.world.entity.player.*; import net.minecraft.world.level.block.entity.*; import net.minecraft.world.level.block.state.*; +import org.jspecify.annotations.*; import java.util.*; public class BlockBreakerBlockEntity extends BlockEntity implements PlayerOwned { - private UUID ownerUUID; + private @Nullable UUID ownerUUID; public BlockBreakerBlockEntity(BlockPos pos, BlockState state) { super(SpectrumBlockEntities.BLOCK_BREAKER.get(), pos, state); } @Override - public UUID getOwnerUUID() { + public @Nullable UUID getOwnerUUID() { return this.ownerUUID; } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/redstone/BlockPlacerBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/redstone/BlockPlacerBlock.java index fc16c099e8..0149b67db8 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/redstone/BlockPlacerBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/redstone/BlockPlacerBlock.java @@ -21,7 +21,7 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.gameevent.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class BlockPlacerBlock extends RedstoneInteractionBlock implements EntityBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/redstone/EnderGlassBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/redstone/EnderGlassBlock.java index 3f2d809f3b..0208cef179 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/redstone/EnderGlassBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/redstone/EnderGlassBlock.java @@ -96,24 +96,26 @@ public BlockState getStateForPlacement(BlockPlaceContext ctx) { } @Override - public void neighborChanged(BlockState state, Level world, BlockPos pos, Block block, BlockPos fromPos, boolean notify) { + public void neighborChanged(BlockState state, Level world, BlockPos pos, Block block, BlockPos fromPos, boolean movedByPiston) { if (!world.isClientSide()) { - BlockState fromPosBlockState = world.getBlockState(fromPos); - if (fromPosBlockState.getBlock() instanceof EnderGlassBlock) { - TransparencyState neighborState = fromPosBlockState.getValue(TRANSPARENCY_STATE); + BlockState fromPosState = world.getBlockState(fromPos); + if (fromPosState.getBlock() instanceof EnderGlassBlock) { + TransparencyState neighborState = fromPosState.getValue(TRANSPARENCY_STATE); TransparencyState currentState = state.getValue(TRANSPARENCY_STATE); if (neighborState != currentState) { world.setBlockAndUpdate(pos, world.getBlockState(pos).setValue(TRANSPARENCY_STATE, neighborState)); } - } else if (fromPosBlockState.isSignalSource() || block.defaultBlockState().isSignalSource()) { + } else if(block == Blocks.REDSTONE_WIRE && fromPosState.isAir()) { + // funky redstone mechanics + } else if (fromPosState.isSignalSource() || block.defaultBlockState().isSignalSource()) { TransparencyState targetState = getTransparencyStateForRedstonePower(world.getBestNeighborSignal(pos)); if (getTransparencyState(state) != targetState) { world.setBlockAndUpdate(pos, state.setValue(TRANSPARENCY_STATE, targetState)); } } } - super.neighborChanged(state, world, pos, block, fromPos, notify); + super.neighborChanged(state, world, pos, block, fromPos, movedByPiston); } public static TransparencyState getTransparencyState(BlockState state) { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/redstone/PlayerDetectorBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/redstone/PlayerDetectorBlock.java index 219b2cee33..fbeccce1cf 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/redstone/PlayerDetectorBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/redstone/PlayerDetectorBlock.java @@ -12,7 +12,7 @@ import net.minecraft.world.level.block.entity.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/redstone/RedstoneCalculatorBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/redstone/RedstoneCalculatorBlock.java index 60b2e967f3..0dca6a3370 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/redstone/RedstoneCalculatorBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/redstone/RedstoneCalculatorBlock.java @@ -16,7 +16,6 @@ import net.minecraft.world.level.block.state.properties.*; import net.minecraft.world.phys.*; import net.minecraft.world.ticks.*; -import javax.annotation.*; public class RedstoneCalculatorBlock extends DiodeBlock implements EntityBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/redstone/RedstoneSandBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/redstone/RedstoneSandBlock.java index 2237a4f35a..7e9e9c788f 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/redstone/RedstoneSandBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/redstone/RedstoneSandBlock.java @@ -9,7 +9,7 @@ import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.block.state.properties.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class RedstoneSandBlock extends FallingBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/redstone/RedstoneTimerBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/redstone/RedstoneTimerBlock.java index a42e7ddbaf..b10d14091c 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/redstone/RedstoneTimerBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/redstone/RedstoneTimerBlock.java @@ -17,9 +17,7 @@ import net.minecraft.world.level.levelgen.structure.*; import net.minecraft.world.phys.*; import net.minecraft.world.ticks.*; -import org.jspecify.annotations.Nullable; - -import javax.annotation.*; +import org.jspecify.annotations.*; public class RedstoneTimerBlock extends DiodeBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/redstone/RedstoneTransceiverBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/redstone/RedstoneTransceiverBlock.java index 86730d8631..4c9f0d8f0e 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/redstone/RedstoneTransceiverBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/redstone/RedstoneTransceiverBlock.java @@ -20,7 +20,7 @@ import net.minecraft.world.level.block.state.properties.*; import net.minecraft.world.level.gameevent.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/redstone/RedstoneTransceiverBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/redstone/RedstoneTransceiverBlockEntity.java index d9bac2a401..c10c880519 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/redstone/RedstoneTransceiverBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/redstone/RedstoneTransceiverBlockEntity.java @@ -12,7 +12,7 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.gameevent.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class RedstoneTransceiverBlockEntity extends BlockEntity implements WirelessRedstoneSignalEventQueue.Callback { @@ -26,15 +26,22 @@ public RedstoneTransceiverBlockEntity(BlockPos blockPos, BlockState blockState) this.listener = new WirelessRedstoneSignalEventQueue(new BlockPositionSource(this.worldPosition), RANGE, this); } - private static boolean isSender(Level world, BlockPos blockPos) { + private static boolean isSender(@Nullable Level world, BlockPos blockPos) { if (world == null) { return false; } - return world.getBlockState(blockPos).getValue(RedstoneTransceiverBlock.SENDER); + return isSender(world.getBlockState(blockPos)); + } + + private static boolean isSender(BlockState state) { + if(!state.is(SpectrumBlocks.REDSTONE_TRANSCEIVER)) { + return false; + } + return state.getValue(RedstoneTransceiverBlock.SENDER); } public static void serverTick(Level world, BlockPos pos, BlockState state, RedstoneTransceiverBlockEntity blockEntity) { - if (isSender(world, pos)) { + if (isSender(blockEntity.getBlockState())) { if (blockEntity.currentSignal != blockEntity.cachedSignal) { blockEntity.currentSignal = blockEntity.cachedSignal; blockEntity.getLevel().gameEvent(SpectrumGameEvents.WIRELESS_REDSTONE_SIGNAL, blockEntity.getBlockPos(), new GameEvent.Context(null, state)); diff --git a/src/main/java/de/dafuqs/spectrum/blocks/redstone/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/redstone/package-info.java index 2bc010cbd3..4559c3ada6 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/redstone/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/redstone/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.redstone; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/shooting_star/ShootingStar.java b/src/main/java/de/dafuqs/spectrum/blocks/shooting_star/ShootingStar.java index fc0725b625..947d8f7444 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/shooting_star/ShootingStar.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/shooting_star/ShootingStar.java @@ -1,24 +1,18 @@ package de.dafuqs.spectrum.blocks.shooting_star; import com.mojang.serialization.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.registries.*; import io.netty.buffer.*; import net.minecraft.network.codec.*; import net.minecraft.resources.*; import net.minecraft.util.*; -import net.minecraft.world.item.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.storage.loot.*; -import javax.annotation.*; - -import org.jetbrains.annotations.*; import org.joml.*; import java.util.*; -import java.util.function.*; -import java.util.stream.*; public interface ShootingStar { @@ -76,7 +70,6 @@ public static Variant getType(String name) { return types[0]; } - @Contract("_ -> new") public static ResourceKey getLootTable(int index) { return values()[index].getLootTable(); } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/shooting_star/ShootingStarDispenserBehavior.java b/src/main/java/de/dafuqs/spectrum/blocks/shooting_star/ShootingStarDispenserBehavior.java index e48b9a8e5f..c1cf54a62a 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/shooting_star/ShootingStarDispenserBehavior.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/shooting_star/ShootingStarDispenserBehavior.java @@ -7,7 +7,6 @@ import net.minecraft.world.level.*; import net.minecraft.world.level.block.*; import net.minecraft.world.phys.*; -import javax.annotation.*; public class ShootingStarDispenserBehavior extends DefaultDispenseItemBehavior { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/shooting_star/ShootingStarItem.java b/src/main/java/de/dafuqs/spectrum/blocks/shooting_star/ShootingStarItem.java index 36996091d1..e7e716cc94 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/shooting_star/ShootingStarItem.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/shooting_star/ShootingStarItem.java @@ -13,7 +13,6 @@ import net.minecraft.world.level.*; import net.minecraft.world.level.gameevent.*; import net.minecraft.world.phys.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/shooting_star/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/shooting_star/package-info.java index 735ec10c6e..cd32cc1782 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/shooting_star/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/shooting_star/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.shooting_star; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/spirit_instiller/SpiritInstillerBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/spirit_instiller/SpiritInstillerBlock.java index 873de3428b..1694d7bf5e 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/spirit_instiller/SpiritInstillerBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/spirit_instiller/SpiritInstillerBlock.java @@ -20,7 +20,7 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.*; import net.minecraft.world.phys.shapes.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/spirit_instiller/SpiritInstillerBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/spirit_instiller/SpiritInstillerBlockEntity.java index 2642b121d7..8f74f2f2a9 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/spirit_instiller/SpiritInstillerBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/spirit_instiller/SpiritInstillerBlockEntity.java @@ -19,6 +19,7 @@ import net.minecraft.server.level.*; import net.minecraft.sounds.*; import net.minecraft.util.*; +import net.minecraft.world.*; import net.minecraft.world.entity.player.*; import net.minecraft.world.item.*; import net.minecraft.world.item.crafting.*; @@ -27,11 +28,11 @@ import net.minecraft.world.level.block.entity.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.*; -import javax.annotation.*; +import org.jspecify.annotations.*; import java.util.*; -public class SpiritInstillerBlockEntity extends InWorldInteractionBlockEntity implements MultiblockCrafter { +public class SpiritInstillerBlockEntity extends InWorldInteractionBlockEntity implements MultiblockCrafter, WorldlyContainer { private static final FlowAnimator.Factory FACTORY; private static final KeyFrame platformPos = (tickDelta, time) -> (float) (Math.sin((time + tickDelta + 15) / 23) + 6F) * 2F; @@ -47,15 +48,15 @@ public class SpiritInstillerBlockEntity extends InWorldInteractionBlockEntity im }}; private boolean inventoryChanged; - private UUID ownerUUID; - private UpgradeHolder upgrades; + private @Nullable UUID ownerUUID; + private @Nullable UpgradeHolder upgrades; private Rotation multiblockRotation = Rotation.NONE; - private RecipeHolder currentRecipe; + private @Nullable RecipeHolder currentRecipe; private int craftingTime; private int craftingTimeTotal; private boolean validStructure; - protected FlowAnimator animator; + protected @Nullable FlowAnimator animator; protected FlowData _platformY = FlowData.NULL(), _haloY = FlowData.NULL(), _platformSpin = FlowData.NULL(), _haloSpin = FlowData.NULL(), _haloAlpha = FlowData.NULL(), _blossomAlpha = FlowData.NULL(); @@ -99,99 +100,108 @@ private void updateAnimator() { } } - public static void serverTick(Level world, BlockPos blockPos, BlockState blockState, SpiritInstillerBlockEntity spiritInstillerBlockEntity) { - if (spiritInstillerBlockEntity.upgrades == null) { - spiritInstillerBlockEntity.calculateUpgrades(); + public static void serverTick(Level level, BlockPos pos, BlockState state, SpiritInstillerBlockEntity spiritInstiller) { + if (spiritInstiller.upgrades == null) { + spiritInstiller.calculateUpgrades(level); } - if (spiritInstillerBlockEntity.inventoryChanged) { - var previousRecipe = spiritInstillerBlockEntity.currentRecipe; - calculateCurrentRecipe(world, spiritInstillerBlockEntity); + if (spiritInstiller.inventoryChanged) { + var previousRecipe = spiritInstiller.currentRecipe; + calculateCurrentRecipe(level, spiritInstiller); - if (spiritInstillerBlockEntity.currentRecipe != previousRecipe) { - spiritInstillerBlockEntity.craftingTime = 0; - if (spiritInstillerBlockEntity.currentRecipe == null) { - PlayBlockBoundSoundInstancePayload.sendCancelBlockBoundSoundInstance((ServerLevel) world, spiritInstillerBlockEntity.worldPosition); + if (spiritInstiller.currentRecipe != previousRecipe) { + spiritInstiller.craftingTime = 0; + if (spiritInstiller.currentRecipe == null) { + PlayBlockBoundSoundInstancePayload.sendCancelBlockBoundSoundInstance((ServerLevel) level, spiritInstiller.worldPosition); } else { - spiritInstillerBlockEntity.craftingTimeTotal = (int) Math.ceil(spiritInstillerBlockEntity.currentRecipe.value().getCraftingTime() / spiritInstillerBlockEntity.upgrades.getEffectiveValue(Upgradeable.UpgradeType.SPEED)); + spiritInstiller.craftingTimeTotal = (int) Math.ceil(spiritInstiller.currentRecipe.value().getCraftingTime() / spiritInstiller.upgrades.getEffectiveValue(Upgradeable.UpgradeType.SPEED)); } - spiritInstillerBlockEntity.updateInClientWorld(); + spiritInstiller.updateInClientWorld(); } - spiritInstillerBlockEntity.inventoryChanged = false; + spiritInstiller.inventoryChanged = false; } - if (spiritInstillerBlockEntity.currentRecipe == null) { + if (spiritInstiller.currentRecipe == null) { return; } - if (spiritInstillerBlockEntity.craftingTime % 60 == 0) { - if (!checkRecipeRequirements(world, blockPos, spiritInstillerBlockEntity)) { - spiritInstillerBlockEntity.craftingTime = 0; - spiritInstillerBlockEntity.setChanged(); - PlayBlockBoundSoundInstancePayload.sendCancelBlockBoundSoundInstance((ServerLevel) world, spiritInstillerBlockEntity.worldPosition); + if (spiritInstiller.craftingTime % 60 == 0) { + if (!checkRecipeRequirements(level, pos, spiritInstiller)) { + spiritInstiller.craftingTime = 0; + spiritInstiller.setChanged(); + PlayBlockBoundSoundInstancePayload.sendCancelBlockBoundSoundInstance((ServerLevel) level, spiritInstiller.worldPosition); return; } } - if (spiritInstillerBlockEntity.currentRecipe != null) { - spiritInstillerBlockEntity.craftingTime++; + if (spiritInstiller.currentRecipe != null) { + spiritInstiller.craftingTime++; - if (spiritInstillerBlockEntity.craftingTime == 1) { - PlayBlockBoundSoundInstancePayload.sendPlayBlockBoundSoundInstance(SpectrumSoundEvents.SPIRIT_INSTILLER_CRAFTING, (ServerLevel) world, spiritInstillerBlockEntity.worldPosition, Integer.MAX_VALUE); - } else if (spiritInstillerBlockEntity.craftingTime == Math.floor(spiritInstillerBlockEntity.craftingTimeTotal * 0.01) - || spiritInstillerBlockEntity.craftingTime == Math.floor(spiritInstillerBlockEntity.craftingTimeTotal * 0.25) - || spiritInstillerBlockEntity.craftingTime == Math.floor(spiritInstillerBlockEntity.craftingTimeTotal * 0.5) - || spiritInstillerBlockEntity.craftingTime == Math.floor(spiritInstillerBlockEntity.craftingTimeTotal * 0.75) - || spiritInstillerBlockEntity.craftingTime == Math.floor(spiritInstillerBlockEntity.craftingTimeTotal * 0.83) - || spiritInstillerBlockEntity.craftingTime == Math.floor(spiritInstillerBlockEntity.craftingTimeTotal * 0.90) - || spiritInstillerBlockEntity.craftingTime == Math.floor(spiritInstillerBlockEntity.craftingTimeTotal * 0.95) - || spiritInstillerBlockEntity.craftingTime == Math.floor(spiritInstillerBlockEntity.craftingTimeTotal * 0.98) - || spiritInstillerBlockEntity.craftingTime == Math.floor(spiritInstillerBlockEntity.craftingTimeTotal * 0.99)) { - spiritInstillerBlockEntity.doItemBowlOrbs(world); - } else if (spiritInstillerBlockEntity.craftingTime == spiritInstillerBlockEntity.craftingTimeTotal) { - craftSpiritInstillerRecipe(world, spiritInstillerBlockEntity, spiritInstillerBlockEntity.currentRecipe); + if (spiritInstiller.craftingTime == 1) { + PlayBlockBoundSoundInstancePayload.sendPlayBlockBoundSoundInstance(SpectrumSoundEvents.SPIRIT_INSTILLER_CRAFTING, (ServerLevel) level, spiritInstiller.worldPosition, Integer.MAX_VALUE); + } else if (spiritInstiller.craftingTime == Math.floor(spiritInstiller.craftingTimeTotal * 0.01) + || spiritInstiller.craftingTime == Math.floor(spiritInstiller.craftingTimeTotal * 0.25) + || spiritInstiller.craftingTime == Math.floor(spiritInstiller.craftingTimeTotal * 0.5) + || spiritInstiller.craftingTime == Math.floor(spiritInstiller.craftingTimeTotal * 0.75) + || spiritInstiller.craftingTime == Math.floor(spiritInstiller.craftingTimeTotal * 0.83) + || spiritInstiller.craftingTime == Math.floor(spiritInstiller.craftingTimeTotal * 0.90) + || spiritInstiller.craftingTime == Math.floor(spiritInstiller.craftingTimeTotal * 0.95) + || spiritInstiller.craftingTime == Math.floor(spiritInstiller.craftingTimeTotal * 0.98) + || spiritInstiller.craftingTime == Math.floor(spiritInstiller.craftingTimeTotal * 0.99)) { + spiritInstiller.doItemBowlOrbs(level); + } else if (spiritInstiller.craftingTime == spiritInstiller.craftingTimeTotal) { + craftSpiritInstillerRecipe(level, spiritInstiller, spiritInstiller.currentRecipe); } - spiritInstillerBlockEntity.setChanged(); + spiritInstiller.setChanged(); } } private static void calculateCurrentRecipe(Level world, SpiritInstillerBlockEntity spiritInstillerBlockEntity) { + ItemStack instillerStack = spiritInstillerBlockEntity.getItem(SpiritInstillerRecipe.CENTER_INGREDIENT); + if (instillerStack.isEmpty()) { + spiritInstillerBlockEntity.craftingTime = 0; + spiritInstillerBlockEntity.currentRecipe = null; + spiritInstillerBlockEntity.updateInClientWorld(); + return; + } + + // fetch item bowl stacks + spiritInstillerBlockEntity.setItem(SpiritInstillerRecipe.CENTER_INGREDIENT, instillerStack); + + // left item bowl + if (world.getBlockEntity(getItemBowlPos(spiritInstillerBlockEntity, false)) instanceof ItemBowlBlockEntity itemBowlBlockEntity) { + spiritInstillerBlockEntity.setItem(SpiritInstillerRecipe.FIRST_INGREDIENT, itemBowlBlockEntity.getItem(0)); + } else { + spiritInstillerBlockEntity.setItem(SpiritInstillerRecipe.FIRST_INGREDIENT, ItemStack.EMPTY); + } + // right item bowl + if (world.getBlockEntity(getItemBowlPos(spiritInstillerBlockEntity, true)) instanceof ItemBowlBlockEntity itemBowlBlockEntity) { + spiritInstillerBlockEntity.setItem(SpiritInstillerRecipe.SECOND_INGREDIENT, itemBowlBlockEntity.getItem(0)); + } else { + spiritInstillerBlockEntity.setItem(SpiritInstillerRecipe.SECOND_INGREDIENT, ItemStack.EMPTY); + } + // test the cached recipe => faster if (spiritInstillerBlockEntity.currentRecipe != null && !spiritInstillerBlockEntity.isEmpty()) { if (spiritInstillerBlockEntity.currentRecipe.value().matches(spiritInstillerBlockEntity.getRecipeInput(), world)) { + spiritInstillerBlockEntity.updateInClientWorld(); return; } } - // cached recipe did not match => calculate new - spiritInstillerBlockEntity.craftingTime = 0; - spiritInstillerBlockEntity.currentRecipe = null; - - ItemStack instillerStack = spiritInstillerBlockEntity.getItem(SpiritInstillerRecipe.CENTER_INGREDIENT); - if (!instillerStack.isEmpty()) { - spiritInstillerBlockEntity.setItem(SpiritInstillerRecipe.CENTER_INGREDIENT, instillerStack); - - // left item bowl - if (world.getBlockEntity(getItemBowlPos(spiritInstillerBlockEntity, false)) instanceof ItemBowlBlockEntity itemBowlBlockEntity) { - spiritInstillerBlockEntity.setItem(SpiritInstillerRecipe.FIRST_INGREDIENT, itemBowlBlockEntity.getItem(0)); - } else { - spiritInstillerBlockEntity.setItem(SpiritInstillerRecipe.FIRST_INGREDIENT, ItemStack.EMPTY); - } - // right item bowl - if (world.getBlockEntity(getItemBowlPos(spiritInstillerBlockEntity, true)) instanceof ItemBowlBlockEntity itemBowlBlockEntity) { - spiritInstillerBlockEntity.setItem(SpiritInstillerRecipe.SECOND_INGREDIENT, itemBowlBlockEntity.getItem(0)); - } else { - spiritInstillerBlockEntity.setItem(SpiritInstillerRecipe.SECOND_INGREDIENT, ItemStack.EMPTY); - } - - RecipeHolder spiritInstillerRecipe = world.getRecipeManager().getRecipeFor(SpectrumRecipeTypes.SPIRIT_INSTILLING, spiritInstillerBlockEntity.getRecipeInput(), world).orElse(null); - if (spiritInstillerRecipe != null) { - spiritInstillerBlockEntity.currentRecipe = spiritInstillerRecipe; - spiritInstillerBlockEntity.craftingTimeTotal = (int) Math.ceil(spiritInstillerRecipe.value().getCraftingTime() / spiritInstillerBlockEntity.upgrades.getEffectiveValue(Upgradeable.UpgradeType.SPEED)); - } + // dies abitger recipe match? + RecipeHolder spiritInstillerRecipe = world.getRecipeManager().getRecipeFor(SpectrumRecipeTypes.SPIRIT_INSTILLING, spiritInstillerBlockEntity.getRecipeInput(), world).orElse(null); + if (spiritInstillerRecipe != null) { + spiritInstillerBlockEntity.currentRecipe = spiritInstillerRecipe; + spiritInstillerBlockEntity.craftingTimeTotal = (int) Math.ceil(spiritInstillerRecipe.value().getCraftingTime() / spiritInstillerBlockEntity.upgrades.getEffectiveValue(Upgradeable.UpgradeType.SPEED)); + spiritInstillerBlockEntity.updateInClientWorld(); + return; } + // no matching recipe found + spiritInstillerBlockEntity.craftingTime = 0; + spiritInstillerBlockEntity.currentRecipe = null; spiritInstillerBlockEntity.updateInClientWorld(); } @@ -440,15 +450,8 @@ public InstanceRecipeInput getRecipeInput() { return new InstanceRecipeInput<>(items, this); } - // UPGRADEABLE - @Override - public void resetUpgrades() { - this.upgrades = null; - this.setChanged(); - } - @Override - public void calculateUpgrades() { + public void calculateUpgrades(Level level) { this.upgrades = Upgradeable.calculateUpgradeMods2(level, worldPosition, multiblockRotation, 4, 1, this.ownerUUID); this.setChanged(); } @@ -462,7 +465,7 @@ public UpgradeHolder getUpgradeHolder() { // "owned" is not to be taken literally here. The owner // is always set to the last player interacted with to trigger advancements @Override - public UUID getOwnerUUID() { + public @Nullable UUID getOwnerUUID() { return this.ownerUUID; } @@ -535,4 +538,19 @@ public void inventoryChanged() { FACTORY = builder.build(); } + + @Override + public int[] getSlotsForFace(Direction side) { + return new int[]{0}; + } + + @Override + public boolean canPlaceItemThroughFace(int index, ItemStack itemStack, @Nullable Direction direction) { + return true; + } + + @Override + public boolean canTakeItemThroughFace(int index, ItemStack stack, Direction direction) { + return true; + } } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/spirit_instiller/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/spirit_instiller/package-info.java index 21a7e36df2..231a6610b7 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/spirit_instiller/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/spirit_instiller/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.spirit_instiller; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/spirit_sallow/OminousSaplingBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/spirit_sallow/OminousSaplingBlock.java index 01bfa02be4..ccf3177c17 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/spirit_sallow/OminousSaplingBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/spirit_sallow/OminousSaplingBlock.java @@ -15,7 +15,7 @@ import net.minecraft.world.level.block.entity.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/spirit_sallow/SpiritVinesPlantBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/spirit_sallow/SpiritVinesPlantBlock.java index 1b2685abf5..673a078294 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/spirit_sallow/SpiritVinesPlantBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/spirit_sallow/SpiritVinesPlantBlock.java @@ -2,7 +2,7 @@ import com.mojang.serialization.*; import de.dafuqs.spectrum.api.item.*; -import de.dafuqs.spectrum.blocks.pedestal.BuiltinGemstoneColor; +import de.dafuqs.spectrum.blocks.pedestal.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.core.*; import net.minecraft.server.level.*; @@ -14,7 +14,7 @@ import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class SpiritVinesPlantBlock extends GrowingPlantBodyBlock implements SpiritVine { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/spirit_sallow/SpiritVinesPlantStemBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/spirit_sallow/SpiritVinesPlantStemBlock.java index 6703cf1565..401c1bc89f 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/spirit_sallow/SpiritVinesPlantStemBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/spirit_sallow/SpiritVinesPlantStemBlock.java @@ -2,7 +2,7 @@ import com.mojang.serialization.*; import de.dafuqs.spectrum.api.item.*; -import de.dafuqs.spectrum.blocks.pedestal.BuiltinGemstoneColor; +import de.dafuqs.spectrum.blocks.pedestal.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.core.*; import net.minecraft.server.level.*; @@ -14,7 +14,7 @@ import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class SpiritVinesPlantStemBlock extends GrowingPlantHeadBlock implements SpiritVine { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/spirit_sallow/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/spirit_sallow/package-info.java index 0e369e6bb0..6341eb3a36 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/spirit_sallow/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/spirit_sallow/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.spirit_sallow; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/statues/GrotesqueBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/statues/GrotesqueBlock.java index f3c9b05c3a..7feb73c7dc 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/statues/GrotesqueBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/statues/GrotesqueBlock.java @@ -10,7 +10,7 @@ import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.shapes.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/statues/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/statues/package-info.java index 1ff145f53e..d9573f52e0 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/statues/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/statues/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.statues; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/structure/DeepLightBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/structure/DeepLightBlock.java index d6999682d6..61a35485f1 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/structure/DeepLightBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/structure/DeepLightBlock.java @@ -6,7 +6,7 @@ import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.entity.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class DeepLightBlock extends HorizontalDirectionalBlock implements EntityBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/structure/DreamGateBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/structure/DreamGateBlock.java index 7ec9cdd63a..86f65ec4ad 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/structure/DreamGateBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/structure/DreamGateBlock.java @@ -2,10 +2,10 @@ import com.mojang.serialization.*; import de.dafuqs.spectrum.helpers.*; +import de.dafuqs.spectrum.mob_effect.*; import de.dafuqs.spectrum.networking.s2c_payloads.*; import de.dafuqs.spectrum.particle.*; import de.dafuqs.spectrum.registries.*; -import de.dafuqs.spectrum.mob_effect.*; import net.minecraft.core.*; import net.minecraft.server.level.*; import net.minecraft.sounds.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/structure/ManxiBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/structure/ManxiBlock.java index 6d08499298..9ddd126829 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/structure/ManxiBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/structure/ManxiBlock.java @@ -13,7 +13,7 @@ import net.minecraft.world.level.block.entity.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class ManxiBlock extends HorizontalDirectionalBlock implements EntityBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/structure/PreservationBlockDetectorBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/structure/PreservationBlockDetectorBlock.java index 619296cf19..54cb9df440 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/structure/PreservationBlockDetectorBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/structure/PreservationBlockDetectorBlock.java @@ -8,9 +8,9 @@ import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.entity.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; -public class PreservationBlockDetectorBlock extends SpectrumFacingBlock implements EntityBlock, GameMasterBlock { +public class PreservationBlockDetectorBlock extends SpectrumDirectionalBlock implements EntityBlock, GameMasterBlock { public static final MapCodec CODEC = simpleCodec(PreservationBlockDetectorBlock::new); diff --git a/src/main/java/de/dafuqs/spectrum/blocks/structure/PreservationBlockDetectorBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/structure/PreservationBlockDetectorBlockEntity.java index 8ffc067e0c..a929b8b7a4 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/structure/PreservationBlockDetectorBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/structure/PreservationBlockDetectorBlockEntity.java @@ -13,7 +13,7 @@ import net.minecraft.world.level.block.entity.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; import java.util.concurrent.atomic.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/structure/PreservationChestBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/structure/PreservationChestBlock.java index 1a303f0c74..2e616d91ed 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/structure/PreservationChestBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/structure/PreservationChestBlock.java @@ -6,13 +6,11 @@ import de.dafuqs.spectrum.registries.*; import net.minecraft.client.resources.model.*; import net.minecraft.core.*; -import net.minecraft.sounds.*; -import net.minecraft.world.entity.player.*; import net.minecraft.world.inventory.*; import net.minecraft.world.level.*; import net.minecraft.world.level.block.entity.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class PreservationChestBlock extends SpectrumChestBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/structure/PreservationChestBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/structure/PreservationChestBlockEntity.java index e3a60e6dd8..934df19c8b 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/structure/PreservationChestBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/structure/PreservationChestBlockEntity.java @@ -18,7 +18,7 @@ import net.minecraft.world.level.storage.loot.*; import net.minecraft.world.level.storage.loot.parameters.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class PreservationChestBlockEntity extends SpectrumChestBlockEntity { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/structure/PreservationControllerBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/structure/PreservationControllerBlock.java index 6fea2476e4..024be78d94 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/structure/PreservationControllerBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/structure/PreservationControllerBlock.java @@ -12,7 +12,7 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.block.state.properties.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class PreservationControllerBlock extends BaseEntityBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/structure/PreservationControllerBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/structure/PreservationControllerBlockEntity.java index 8e10c63503..b1368ea9be 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/structure/PreservationControllerBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/structure/PreservationControllerBlockEntity.java @@ -20,9 +20,7 @@ import net.minecraft.world.level.block.entity.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; - -import javax.annotation.*; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/structure/PreservationItemBowlBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/structure/PreservationItemBowlBlock.java index 13561a61b3..1508e8f3d2 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/structure/PreservationItemBowlBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/structure/PreservationItemBowlBlock.java @@ -12,7 +12,7 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.*; import net.minecraft.world.phys.shapes.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class PreservationItemBowlBlock extends Block implements EntityBlock { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/structure/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/structure/package-info.java index 6ba9fde54b..011b58acb5 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/structure/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/structure/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.structure; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/titration_barrel/TitrationBarrelBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/titration_barrel/TitrationBarrelBlock.java index 16fc338fab..9738d6f0bc 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/titration_barrel/TitrationBarrelBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/titration_barrel/TitrationBarrelBlock.java @@ -23,7 +23,7 @@ import net.minecraft.world.level.block.state.properties.*; import net.minecraft.world.phys.*; import net.neoforged.neoforge.fluids.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/titration_barrel/TitrationBarrelBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/titration_barrel/TitrationBarrelBlockEntity.java index 5f0b2b982f..f2bd626604 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/titration_barrel/TitrationBarrelBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/titration_barrel/TitrationBarrelBlockEntity.java @@ -23,7 +23,7 @@ import net.minecraft.world.level.block.state.*; import net.neoforged.neoforge.fluids.*; import net.neoforged.neoforge.fluids.capability.templates.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; @@ -63,11 +63,11 @@ public void inventoryChanged() { BlockState state = getBlockState(); BarrelState barrelState = state.getValue(BARREL_STATE); - boolean empty = isEmpty(); + boolean empty = isEmpty() && tank.getFluidAmount() == 0; if(barrelState == BarrelState.EMPTY && !empty) { - level.setBlock(getBlockPos(), state.setValue(BARREL_STATE, BarrelState.FILLED), 3); + level.setBlockAndUpdate(getBlockPos(), state.setValue(BARREL_STATE, BarrelState.FILLED)); } else if(barrelState == BarrelState.FILLED && empty) { - level.setBlock(getBlockPos(), state.setValue(BARREL_STATE, BarrelState.EMPTY), 3); + level.setBlockAndUpdate(getBlockPos(), state.setValue(BARREL_STATE, BarrelState.EMPTY)); } this.setChanged(); @@ -237,6 +237,7 @@ public void giveRecipeRemainders(@Nullable Player player) { for (ItemStack stack : this.getItems()) { ItemStack remainder = stack.getCraftingRemainingItem(); if (!remainder.isEmpty()) { + remainder.setCount(stack.getCount()); if (player == null) { popResource(level, this.getBlockPos(), remainder); } else { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/titration_barrel/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/titration_barrel/package-info.java index 501f5b65e8..a819c1ed3e 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/titration_barrel/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/titration_barrel/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.titration_barrel; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/upgrade/UpgradeBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/upgrade/UpgradeBlock.java index 89a9bc62a2..635133917c 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/upgrade/UpgradeBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/upgrade/UpgradeBlock.java @@ -18,7 +18,7 @@ import net.minecraft.world.level.pathfinder.*; import net.minecraft.world.phys.*; import net.minecraft.world.phys.shapes.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; @@ -59,7 +59,7 @@ public boolean isPathfindable(BlockState state, PathComputationType type) { public void onPlace(BlockState state, Level world, BlockPos pos, BlockState oldState, boolean notify) { super.onPlace(state, world, pos, oldState, notify); if (!world.isClientSide()) { - updateConnectedUpgradeBlock((ServerLevel) world, pos); + updateConnectedUpgradeableBlocks((ServerLevel) world, pos); } } @@ -67,7 +67,7 @@ public void onPlace(BlockState state, Level world, BlockPos pos, BlockState oldS public void onRemove(BlockState state, Level world, BlockPos pos, BlockState newState, boolean moved) { super.onRemove(state, world, pos, newState, moved); if (!world.isClientSide()) { - updateConnectedUpgradeBlock((ServerLevel) world, pos); + updateConnectedUpgradeableBlocks((ServerLevel) world, pos); } } @@ -75,13 +75,13 @@ public void onRemove(BlockState state, Level world, BlockPos pos, BlockState new * When placed or removed the upgrade block searches for a valid Upgradeable block * and triggers it to update its upgrades */ - private void updateConnectedUpgradeBlock(ServerLevel world, BlockPos pos) { + private void updateConnectedUpgradeableBlocks(ServerLevel level, BlockPos pos) { for (Vec3i possibleUpgradeBlockOffset : Upgradeable.POSSIBLE_UPGRADE_POS_OFFSETS) { BlockPos currentPos = pos.offset(possibleUpgradeBlockOffset); - BlockEntity blockEntity = world.getBlockEntity(currentPos); + BlockEntity blockEntity = level.getBlockEntity(currentPos); if (blockEntity instanceof Upgradeable upgradeable && upgradeable.getUpgradePosOffsets().contains(possibleUpgradeBlockOffset)) { - upgradeable.resetUpgrades(); - playConnectedParticles(world, pos, currentPos); + upgradeable.calculateUpgrades(level); + playConnectedParticles(level, pos, currentPos); } } } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/upgrade/UpgradeBlockBlockEntityRenderer.java b/src/main/java/de/dafuqs/spectrum/blocks/upgrade/UpgradeBlockBlockEntityRenderer.java index 0b3495a5f7..01e230e19a 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/upgrade/UpgradeBlockBlockEntityRenderer.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/upgrade/UpgradeBlockBlockEntityRenderer.java @@ -10,7 +10,6 @@ import net.minecraft.world.inventory.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.entity.*; -import javax.annotation.*; public class UpgradeBlockBlockEntityRenderer implements BlockEntityRenderer { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/upgrade/Upgradeable.java b/src/main/java/de/dafuqs/spectrum/blocks/upgrade/Upgradeable.java index 040e463a10..9d96e46e2b 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/upgrade/Upgradeable.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/upgrade/Upgradeable.java @@ -8,7 +8,7 @@ import net.minecraft.server.level.*; import net.minecraft.world.level.*; import net.minecraft.world.level.block.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; @@ -174,9 +174,7 @@ private static UpgradeHolder calculateUpgrades(Level world, BlockPos blockPos, L return new UpgradeHolder(upgradeMods); } - void resetUpgrades(); - - void calculateUpgrades(); + void calculateUpgrades(Level level); UpgradeHolder getUpgradeHolder(); diff --git a/src/main/java/de/dafuqs/spectrum/blocks/upgrade/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/upgrade/package-info.java index 925a298c99..c2781b0452 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/upgrade/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/upgrade/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.upgrade; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/weathering/ShaleClayBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/weathering/ShaleClayBlock.java index d798764757..65047309e8 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/weathering/ShaleClayBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/weathering/ShaleClayBlock.java @@ -10,7 +10,7 @@ import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; import net.neoforged.neoforge.common.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class ShaleClayBlock extends Block implements Weathering { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/weathering/Weathering.java b/src/main/java/de/dafuqs/spectrum/blocks/weathering/Weathering.java index 88da6fe074..ab5da4f302 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/weathering/Weathering.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/weathering/Weathering.java @@ -8,7 +8,6 @@ import net.minecraft.world.level.biome.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; -import javax.annotation.*; import java.util.Optional; import java.util.function.Supplier; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/weathering/WeatheringSlabBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/weathering/WeatheringSlabBlock.java index dffc09e9ab..bbd92470e9 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/weathering/WeatheringSlabBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/weathering/WeatheringSlabBlock.java @@ -6,7 +6,7 @@ import net.minecraft.util.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class WeatheringSlabBlock extends SlabBlock implements Weathering { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/weathering/WeatheringStairsBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/weathering/WeatheringStairsBlock.java index 43b91865e7..8c5481113b 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/weathering/WeatheringStairsBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/weathering/WeatheringStairsBlock.java @@ -6,7 +6,7 @@ import net.minecraft.util.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class WeatheringStairsBlock extends StairBlock implements Weathering { diff --git a/src/main/java/de/dafuqs/spectrum/blocks/weathering/package-info.java b/src/main/java/de/dafuqs/spectrum/blocks/weathering/package-info.java index b2e43b2d37..be006d884c 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/weathering/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/weathering/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.blocks.weathering; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/capabilities/SpectrumCapabilities.java b/src/main/java/de/dafuqs/spectrum/capabilities/SpectrumCapabilities.java index 51220518e9..3d2b324097 100644 --- a/src/main/java/de/dafuqs/spectrum/capabilities/SpectrumCapabilities.java +++ b/src/main/java/de/dafuqs/spectrum/capabilities/SpectrumCapabilities.java @@ -1,13 +1,14 @@ package de.dafuqs.spectrum.capabilities; +import de.dafuqs.spectrum.api.ink.capability.*; import de.dafuqs.spectrum.blocks.amphora.*; import de.dafuqs.spectrum.blocks.bottomless_bundle.*; import de.dafuqs.spectrum.blocks.chests.*; -import de.dafuqs.spectrum.blocks.cinderhearth.*; -import de.dafuqs.spectrum.blocks.crystallarieum.*; import de.dafuqs.spectrum.blocks.enchanter.*; -import de.dafuqs.spectrum.blocks.energy.*; import de.dafuqs.spectrum.blocks.fusion_shrine.*; +import de.dafuqs.spectrum.blocks.ink.*; +import de.dafuqs.spectrum.blocks.ink.gen.*; +import de.dafuqs.spectrum.blocks.ink.sink.*; import de.dafuqs.spectrum.blocks.item_bowl.*; import de.dafuqs.spectrum.blocks.pedestal.*; import de.dafuqs.spectrum.blocks.potion_workshop.*; @@ -18,7 +19,6 @@ import net.neoforged.neoforge.capabilities.*; import net.neoforged.neoforge.fluids.capability.templates.*; import net.neoforged.neoforge.items.wrapper.*; -import javax.annotation.*; public class SpectrumCapabilities { @@ -26,7 +26,7 @@ public static void register(RegisterCapabilitiesEvent event) { // ItemHandler.BLOCK event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, SpectrumBlockEntities.FUSION_SHRINE.get(), (FusionShrineBlockEntity blockEntity, Direction direction) -> new InvWrapper(blockEntity));; event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, SpectrumBlockEntities.PEDESTAL.get(), (PedestalBlockEntity blockEntity, Direction direction) -> new SidedInvWrapper(blockEntity, direction)); - event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, SpectrumBlockEntities.SPIRIT_INSTILLER.get(), (SpiritInstillerBlockEntity blockEntity, Direction direction) -> new InvWrapper(blockEntity)); + event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, SpectrumBlockEntities.SPIRIT_INSTILLER.get(), (SpiritInstillerBlockEntity blockEntity, Direction direction) -> new SidedInvWrapper(blockEntity, direction)); event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, SpectrumBlockEntities.ENCHANTER.get(), (EnchanterBlockEntity blockEntity, Direction direction) -> new SidedInvWrapper(blockEntity, direction)); event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, SpectrumBlockEntities.CINDERHEARTH.get(), (CinderhearthBlockEntity blockEntity, Direction direction) -> new SidedInvWrapper(blockEntity, direction)); event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, SpectrumBlockEntities.CRYSTALLARIEUM.get(), (CrystallarieumBlockEntity blockEntity, Direction direction) -> new InvWrapper(blockEntity)); @@ -54,7 +54,6 @@ public static void register(RegisterCapabilitiesEvent event) { // ItemHandler.ITEM event.registerItem(Capabilities.ItemHandler.ITEM, (stack, ctx) -> BottomlessItemCapability.get(stack), SpectrumBlocks.BOTTOMLESS_BUNDLE.asItem()); - /* // BAG_OF_HOLDING only works server side // the client does not know about the content of the ender chest, unless opened @@ -63,6 +62,21 @@ public static void register(RegisterCapabilitiesEvent event) { // FluidHandler.ITEM event.registerItem(Capabilities.FluidHandler.ITEM, (stack, v) -> new FluidHandlerItemStackSimple.Consumable(SpectrumDataComponentTypes.FLUID_CONTENT, stack, 1000), SpectrumItems.MERMAIDS_GEM.get()); + + // Ink Blocks + event.registerBlockEntity(InkCapabilities.BLOCK, SpectrumBlockEntities.TWILL.get(), (blockEntity, context) -> BlockEntityInkCapability.of(blockEntity)); + event.registerBlockEntity(InkCapabilities.BLOCK, SpectrumBlockEntities.VANTACLAST.get(), (blockEntity, context) -> BlockEntityInkCapability.of(blockEntity)); + event.registerBlockEntity(InkCapabilities.BLOCK, SpectrumBlockEntities.DAYDREAMER.get(), (blockEntity, context) -> BlockEntityInkCapability.of(blockEntity)); + + event.registerBlockEntity(InkCapabilities.BLOCK, SpectrumBlockEntities.COLOR_PICKER.get(), (blockEntity, context) -> BlockEntityInkCapability.of(blockEntity)); + event.registerBlockEntity(InkCapabilities.BLOCK, SpectrumBlockEntities.TINTING_STATION.get(), (blockEntity, context) -> BlockEntityInkCapability.of(blockEntity)); + event.registerBlockEntity(InkCapabilities.BLOCK, SpectrumBlockEntities.CINDERHEARTH.get(), (blockEntity, context) -> BlockEntityInkCapability.of(blockEntity)); + event.registerBlockEntity(InkCapabilities.BLOCK, SpectrumBlockEntities.CRYSTALLARIEUM.get(), (blockEntity, context) -> BlockEntityInkCapability.of(blockEntity)); + + // Ink Items + event.registerItem(InkCapabilities.ITEM, (stack, ctx) -> ItemInkCapability.of(stack), + SpectrumItems.INK_FLASK, SpectrumItems.INK_ASSORTMENT, SpectrumItems.CREATIVE_INK_ASSORTMENT, SpectrumItems.PIGMENT_PALETTE, SpectrumItems.ARTISTS_PALETTE, + SpectrumItems.SHIELDGRASP_AMULET, SpectrumItems.HEARTSINGERS_REWARD, SpectrumItems.GLOVES_OF_DAWNS_GRASP, SpectrumItems.RING_OF_PURSUIT, SpectrumItems.RING_OF_DENSER_STEPS, SpectrumItems.RING_OF_AERIAL_GRACE, SpectrumItems.LAURELS_OF_SERENITY); } } \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/capabilities/package-info.java b/src/main/java/de/dafuqs/spectrum/capabilities/package-info.java index 0ebd6da48f..51c019e516 100644 --- a/src/main/java/de/dafuqs/spectrum/capabilities/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/capabilities/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.capabilities; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/commands/AdvancementSyncCommand.java b/src/main/java/de/dafuqs/spectrum/commands/AdvancementSyncCommand.java new file mode 100644 index 0000000000..15b17d903a --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/commands/AdvancementSyncCommand.java @@ -0,0 +1,102 @@ +package de.dafuqs.spectrum.commands; + +import com.mojang.brigadier.tree.*; +import de.dafuqs.spectrum.progression.*; +import net.minecraft.commands.*; +import net.minecraft.commands.Commands; +import net.minecraft.commands.arguments.*; +import net.minecraft.network.chat.*; +import net.minecraft.server.*; +import net.minecraft.server.level.*; +import net.neoforged.neoforge.server.command.*; + +import java.util.*; + + +public class AdvancementSyncCommand { + + public static void register(LiteralCommandNode root) { + LiteralCommandNode baseNode = Commands.literal("advancement_sync") + .requires((source) -> source.hasPermission(0)) + .executes((context) -> list(context.getSource())) + .requires((source) -> source.hasPermission(2)) + .then(Commands.argument("target", EntityArgument.player()) + .executes((context) -> list(context.getSource(), EntityArgument.getPlayer(context, "target")))) + .requires((source) -> source.hasPermission(2)) + .then(Commands.literal("create") + .then(Commands.argument("targets", EntityArgument.players()) + .then(Commands.argument("option", EnumArgument.enumArgument(AdvancementSyncer.Option.class)) + .executes((context) -> create(context.getSource(), EntityArgument.getPlayers(context, "targets"), context.getArgument("option", AdvancementSyncer.Option.class)))))) + .then(Commands.literal("clear") + .then(Commands.argument("targets", EntityArgument.players()) + .executes((context) -> clear(context.getSource(), EntityArgument.getPlayers(context, "targets"))))).build(); + + root.addChild(baseNode); + } + + private static int list(CommandSourceStack source) { + if (source.getPlayer() == null) { + return -1; + } + return list(source, source.getPlayer()); + } + + private static int list(CommandSourceStack source, ServerPlayer player) { + MinecraftServer server = source.getServer(); + AdvancementSyncer advancementSyncer = AdvancementSyncer.getInstance(server); + List parties = advancementSyncer.getSyncs(player); + + if (parties.isEmpty()) { + source.sendSystemMessage(Component.translatable("commands.spectrum.advancement_sync.no_parties", player.getDisplayName().getString())); + } else { + source.sendSystemMessage(Component.translatable("commands.spectrum.advancement_sync.parties_header", player.getDisplayName().getString())); + for (AdvancementSyncer.Party party : parties) { + StringBuilder s = new StringBuilder(); + s.append("- "); + s.append(party.option().getSerializedName()); + s.append(": "); + List playerEntries = new ArrayList<>(); + for (UUID uuid : party.players()) { + ServerPlayer p = server.getPlayerList().getPlayer(uuid); + playerEntries.add(p == null ? uuid.toString() : p.getDisplayName().getString()); + } + s.append(String.join(", ", playerEntries)); + source.sendSystemMessage(Component.literal(s.toString())); + } + } + + return parties.size(); + } + + private static int create(CommandSourceStack source, Collection players, AdvancementSyncer.Option option) { + if(players.size() < 2) { + source.sendSystemMessage(Component.translatable("commands.spectrum.advancement_sync.not_enough_players")); + return 0; + } + + AdvancementSyncer advancementSyncer = AdvancementSyncer.getInstance(source.getServer()); + advancementSyncer.sync(players, option); + for(ServerPlayer p : players) { + if(option.persistent) { + if(option.spectrumOnly) { + p.sendSystemMessage(Component.translatable("commands.spectrum.advancement_sync.added_to_spectrum_party", players.size())); + } else { + p.sendSystemMessage(Component.translatable("commands.spectrum.advancement_sync.added_to_party", players.size())); + } + } + } + return players.size(); + } + + private static int clear(CommandSourceStack source, Collection players) { + AdvancementSyncer advancementSyncer = AdvancementSyncer.getInstance(source.getServer()); + int removed = 0; + for(ServerPlayer p : players) { + int removedCount = advancementSyncer.clear(p); + p.sendSystemMessage(Component.translatable("commands.spectrum.advancement_sync.cleared", removedCount)); + removed += removedCount; + } + return removed; + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/commands/DumpRegistriesCommand.java b/src/main/java/de/dafuqs/spectrum/commands/DumpRegistriesCommand.java index d913fa4f17..744fdfc3ea 100644 --- a/src/main/java/de/dafuqs/spectrum/commands/DumpRegistriesCommand.java +++ b/src/main/java/de/dafuqs/spectrum/commands/DumpRegistriesCommand.java @@ -6,7 +6,6 @@ import net.minecraft.resources.*; import net.neoforged.fml.loading.*; import org.apache.commons.io.output.*; -import org.spongepowered.include.com.google.common.base.*; import java.io.*; import java.nio.charset.*; @@ -30,7 +29,7 @@ private static int execute(CommandSourceStack source) { file.getParentFile().mkdirs(); try { file.createNewFile(); - FileWriterWithEncoding writer = new FileWriterWithEncoding.Builder().setCharset(StandardCharsets.UTF_8).get(); + FileWriterWithEncoding writer = new FileWriterWithEncoding.Builder().setCharset(StandardCharsets.UTF_8).setFile(file).get(); for (ResourceKey e : registry.value().registryKeySet()) { writer.write(e.location().toString()); writer.write(System.lineSeparator()); diff --git a/src/main/java/de/dafuqs/spectrum/commands/DumpTagsCommand.java b/src/main/java/de/dafuqs/spectrum/commands/DumpTagsCommand.java index 40764aad03..cad8d93152 100644 --- a/src/main/java/de/dafuqs/spectrum/commands/DumpTagsCommand.java +++ b/src/main/java/de/dafuqs/spectrum/commands/DumpTagsCommand.java @@ -37,7 +37,7 @@ private static int execute(CommandSourceStack source) { tagFile.getParentFile().mkdirs(); tagFile.createNewFile(); - FileWriterWithEncoding writer = new FileWriterWithEncoding.Builder().setCharset(StandardCharsets.UTF_8).get(); + FileWriterWithEncoding writer = new FileWriterWithEncoding.Builder().setCharset(StandardCharsets.UTF_8).setFile(tagFile).get(); for (Holder entry : pair.getSecond()) { writer.write(entry.unwrapKey().get().location().toString()); writer.write(System.lineSeparator()); diff --git a/src/main/java/de/dafuqs/spectrum/commands/ForceEnchantCommand.java b/src/main/java/de/dafuqs/spectrum/commands/ForceEnchantCommand.java new file mode 100644 index 0000000000..20bf5af519 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/commands/ForceEnchantCommand.java @@ -0,0 +1,86 @@ +package de.dafuqs.spectrum.commands; + +import com.mojang.brigadier.arguments.*; +import com.mojang.brigadier.builder.*; +import com.mojang.brigadier.exceptions.*; +import com.mojang.brigadier.tree.*; +import de.dafuqs.spectrum.helpers.*; +import net.minecraft.commands.*; +import net.minecraft.commands.arguments.*; +import net.minecraft.core.*; +import net.minecraft.core.registries.*; +import net.minecraft.network.chat.*; +import net.minecraft.resources.*; +import net.minecraft.server.commands.*; +import net.minecraft.util.*; +import net.minecraft.world.*; +import net.minecraft.world.entity.*; +import net.minecraft.world.item.*; +import net.minecraft.world.item.enchantment.*; +import net.neoforged.fml.loading.*; +import org.apache.commons.io.output.*; + +import java.io.*; +import java.nio.charset.*; +import java.util.*; +import java.util.function.*; + + +public class ForceEnchantCommand { + + private static final DynamicCommandExceptionType ERROR_NOT_LIVING_ENTITY = new DynamicCommandExceptionType((o) -> Component.translatableEscape("commands.enchant.failed.entity", o)); + private static final DynamicCommandExceptionType ERROR_NO_ITEM = new DynamicCommandExceptionType((o) -> Component.translatableEscape("commands.enchant.failed.itemless", o)); + private static final SimpleCommandExceptionType ERROR_NOTHING_HAPPENED = new SimpleCommandExceptionType(Component.translatable("commands.enchant.failed")); + + public static void register(LiteralCommandNode root, CommandBuildContext context) { + LiteralCommandNode node = Commands.literal("force_enchant") + .requires((source) -> source.hasPermission(4)) + .then(Commands.argument("targets", EntityArgument.entities()) + .then(((RequiredArgumentBuilder) Commands.argument("enchantment", ResourceArgument.resource(context, Registries.ENCHANTMENT)) + .executes((c) -> enchant(c.getSource(), EntityArgument.getEntities(c, "targets"), ResourceArgument.getEnchantment(c, "enchantment"), 1))) + .then(Commands.argument("level", IntegerArgumentType.integer(0)) + .executes((c) -> enchant(c.getSource(), EntityArgument.getEntities(c, "targets"), ResourceArgument.getEnchantment(c, "enchantment"), IntegerArgumentType.getInteger(c, "level")))))) + .build(); + root.addChild(node); + } + + private static int enchant(CommandSourceStack source, Collection targets, Holder enchantment, int level) throws CommandSyntaxException { + int i = 0; + + for(Entity entity : targets) { + if (entity instanceof LivingEntity livingentity) { + ItemStack stack = livingentity.getMainHandItem(); + if (!stack.isEmpty()) { + if(!stack.supportsEnchantment(enchantment)) { + source.sendSuccess(() -> Component.translatable("commands.spectrum.force_enchant.enchantment_not_supported", stack.getDisplayName().getString(), enchantment.getRegisteredName()), true); + } + if(!EnchantmentHelper.isEnchantmentCompatible(stack.getEnchantments().keySet(), enchantment)) { + source.sendSuccess(() -> Component.translatable("commands.spectrum.force_enchant.has_incompatible_enchantments", stack.getDisplayName().getString()), true); + } + + Tuple result = SpectrumEnchantmentHelper.addOrUpgradeEnchantment(stack, enchantment, level, true, true); + livingentity.setItemInHand(InteractionHand.MAIN_HAND, result.getB()); + + i++; + } else if (targets.size() == 1) { + throw ERROR_NO_ITEM.create(livingentity.getName().getString()); + } + } else if (targets.size() == 1) { + throw ERROR_NOT_LIVING_ENTITY.create(entity.getName().getString()); + } + } + + if (i == 0) { + throw ERROR_NOTHING_HAPPENED.create(); + } else { + if (targets.size() == 1) { + source.sendSuccess(() -> Component.translatable("commands.enchant.success.single", Enchantment.getFullname(enchantment, level), targets.iterator().next().getDisplayName()), true); + } else { + source.sendSuccess(() -> Component.translatable("commands.enchant.success.multiple", Enchantment.getFullname(enchantment, level), targets.size()), true); + } + + return i; + } + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/commands/ListItemTagsCommand.java b/src/main/java/de/dafuqs/spectrum/commands/ListItemTagsCommand.java index decb8c7e6d..3323affdb5 100644 --- a/src/main/java/de/dafuqs/spectrum/commands/ListItemTagsCommand.java +++ b/src/main/java/de/dafuqs/spectrum/commands/ListItemTagsCommand.java @@ -9,19 +9,19 @@ import net.minecraft.server.level.*; import net.minecraft.tags.*; import net.minecraft.world.item.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; public class ListItemTagsCommand { - public static void register(LiteralCommandNode root, CommandBuildContext commandBuildContext) { + public static void register(LiteralCommandNode root, CommandBuildContext context) { LiteralCommandNode node = Commands.literal("list_item_tags") - .executes((context) -> execute(context.getSource(), null)) + .executes((c) -> execute(c.getSource(), null)) .build(); - ArgumentCommandNode targets = Commands.argument("item", ItemArgument.item(commandBuildContext)) - .executes((context) -> execute(context.getSource(), ItemArgument.getItem(context, "item"))).build(); + ArgumentCommandNode targets = Commands.argument("item", ItemArgument.item(context)) + .executes((c) -> execute(c.getSource(), ItemArgument.getItem(c, "item"))).build(); node.addChild(targets); root.addChild(node); diff --git a/src/main/java/de/dafuqs/spectrum/commands/SanityCommand.java b/src/main/java/de/dafuqs/spectrum/commands/SanityCommand.java index 36e6999bcb..6aa0efc862 100644 --- a/src/main/java/de/dafuqs/spectrum/commands/SanityCommand.java +++ b/src/main/java/de/dafuqs/spectrum/commands/SanityCommand.java @@ -8,13 +8,13 @@ import de.dafuqs.revelationary.advancement_criteria.*; import de.dafuqs.spectrum.*; import de.dafuqs.spectrum.api.color.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.api.item.*; import de.dafuqs.spectrum.api.recipe.*; import de.dafuqs.spectrum.blocks.*; import de.dafuqs.spectrum.blocks.deeper_down.flora.*; import de.dafuqs.spectrum.blocks.gemstone.*; -import de.dafuqs.spectrum.blocks.pedestal.BuiltinGemstoneColor; +import de.dafuqs.spectrum.blocks.pedestal.*; import de.dafuqs.spectrum.items.*; import de.dafuqs.spectrum.items.trinkets.*; import de.dafuqs.spectrum.recipe.*; @@ -23,8 +23,8 @@ import de.dafuqs.spectrum.recipe.pedestal.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.advancements.*; -import net.minecraft.commands.Commands; import net.minecraft.commands.*; +import net.minecraft.commands.Commands; import net.minecraft.core.*; import net.minecraft.core.registries.*; import net.minecraft.locale.*; @@ -45,7 +45,7 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.storage.loot.*; import org.apache.commons.lang3.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; @@ -255,9 +255,9 @@ private static int execute(CommandSourceStack source, String modId) { // Impossible to unlock recipes for (RecipeHolder recipeEntry : recipeManager.getRecipes()) { if (recipeEntry.value() instanceof GatedRecipe gatedRecipe) { - Optional advancementIdentifier = gatedRecipe.getRequiredAdvancementIdentifier(); + Optional advancementIdentifier = gatedRecipe.getRequiredAdvancement(); if (advancementIdentifier.isPresent() && advancementLoader.get(advancementIdentifier.get()) == null) { - SpectrumCommon.logWarning("[SANITY: " + gatedRecipe.getRecipeTypeShortID() + " Recipe Unlocks] Advancement '" + gatedRecipe.getRequiredAdvancementIdentifier() + "' in recipe '" + recipeEntry.id() + "' does not exist"); + SpectrumCommon.logWarning("[SANITY: " + gatedRecipe.getRecipeTypeShortID() + " Recipe Unlocks] Advancement '" + gatedRecipe.getRequiredAdvancement() + "' in recipe '" + recipeEntry.id() + "' does not exist"); } } } @@ -269,6 +269,31 @@ private static int execute(CommandSourceStack source, String modId) { testIngredientsAndOutputInColorRegistry(SpectrumRecipeTypes.ENCHANTMENT_UPGRADE, "Enchantment Upgrade", recipeManager, registryManager); testIngredientsAndOutputInColorRegistry(SpectrumRecipeTypes.SPIRIT_INSTILLING, "Spirit Instiller", recipeManager, registryManager); + // Items that are meant to be enchantable but not really + for (Map.Entry, Item> item : BuiltInRegistries.ITEM.entrySet()) { + if (!item.getKey().location().getNamespace().equals(modId)) { + continue; + } + + Item i = item.getValue(); + + ItemStack defaultStack = i.getDefaultInstance(); + boolean isEnchantable = i.isEnchantable(defaultStack); + int enchantmentValue = i.getEnchantmentValue(defaultStack); + if(isEnchantable) { + if(enchantmentValue <= 0) { + SpectrumCommon.logWarning("[SANITY: Enchantability] " + item.getValue().getDescriptionId() + " is enchantable, but has an enchantment value of " + enchantmentValue); + } + } + if(enchantmentValue > 0) { + if(!isEnchantable) { + if(i == SpectrumItems.GILDED_BOOK.get()) { + continue; + } + SpectrumCommon.logWarning("[SANITY: Enchantability] " + item.getValue().getDescriptionId() + " is has a positive enchantment value, but its default instance is not enchantable"); + } + } + } // Impossible to unlock block cloaks for (Map.Entry> cloaks : RevelationRegistry.getBlockStateEntries().entrySet()) { @@ -407,8 +432,13 @@ private static int execute(CommandSourceStack source, String modId) { ItemStack output = recipe.getResultItem(source.registryAccess()); if (output.getItem() == Items.ENCHANTED_BOOK) { ItemEnchantments enchantments = EnchantmentHelper.getEnchantmentsForCrafting(output); - if (!enchantments.isEmpty() && recipe.getBulkItem() instanceof PigmentItem pigmentItem) { - upgradeColors.put(enchantments.keySet().stream().toList().getFirst(), pigmentItem.getInkColor()); + if (!enchantments.isEmpty()) { + for(ItemStack stack : recipe.getForSourceLevel(1).ingredient().getItems()) { + if(stack.getItem() instanceof PigmentItem pigmentItem) { + upgradeColors.put(enchantments.keySet().stream().toList().getFirst(), pigmentItem.getInkColor()); + break; + } + } } } } @@ -506,7 +536,7 @@ private static int execute(CommandSourceStack source, String modId) { private static , C extends RecipeInput> void testRecipeUnlocks(RecipeType recipeType, String name, RecipeManager recipeManager, ServerAdvancementManager advancementLoader) { for (RecipeHolder recipe : recipeManager.getAllRecipesFor(recipeType)) { - Optional advancementIdentifier = recipe.value().getRequiredAdvancementIdentifier(); + Optional advancementIdentifier = recipe.value().getRequiredAdvancement(); if (advancementIdentifier.isPresent() && advancementLoader.get(advancementIdentifier.get()) == null) { SpectrumCommon.logWarning("[SANITY: " + name + " Recipe Unlocks] Advancement '" + advancementIdentifier + "' in recipe '" + recipe.id() + "' does not exist"); } diff --git a/src/main/java/de/dafuqs/spectrum/commands/package-info.java b/src/main/java/de/dafuqs/spectrum/commands/package-info.java index 9384a7050c..2e2615fd1b 100644 --- a/src/main/java/de/dafuqs/spectrum/commands/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/commands/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.commands; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/FluidIngredientREI.java b/src/main/java/de/dafuqs/spectrum/compat/REI/FluidIngredientREI.java index 76cc54f2bb..aac5bbd32b 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/FluidIngredientREI.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/FluidIngredientREI.java @@ -4,11 +4,7 @@ import me.shedaniel.rei.api.common.util.*; import net.neoforged.neoforge.fluids.*; import net.neoforged.neoforge.fluids.crafting.*; -import org.jspecify.annotations.NonNull; - -import javax.annotation.*; - -import java.util.*; +import org.jspecify.annotations.*; import static net.minecraft.world.level.material.Fluids.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/GatedRecipeDisplay.java b/src/main/java/de/dafuqs/spectrum/compat/REI/GatedRecipeDisplay.java index d28365e20c..afa3f12efd 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/GatedRecipeDisplay.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/GatedRecipeDisplay.java @@ -2,7 +2,7 @@ import me.shedaniel.rei.api.common.display.*; import net.minecraft.network.chat.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public interface GatedRecipeDisplay extends Display { diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/GatedSpectrumDisplay.java b/src/main/java/de/dafuqs/spectrum/compat/REI/GatedSpectrumDisplay.java index dae5cd2499..ace61e5659 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/GatedSpectrumDisplay.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/GatedSpectrumDisplay.java @@ -10,14 +10,14 @@ import net.minecraft.resources.*; import net.minecraft.world.item.*; import net.minecraft.world.item.crafting.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; public abstract class GatedSpectrumDisplay extends BasicDisplay implements GatedRecipeDisplay { private final @Nullable ResourceLocation requiredAdvancementIdentifier; - private final boolean secret; + private final @Nullable ResourceLocation revealSecretAdvancement; private final @Nullable Component secretHintText; // 1 input => 1 output @@ -33,20 +33,22 @@ public GatedSpectrumDisplay(RecipeHolder> recipe, List< // n inputs => m outputs public GatedSpectrumDisplay(RecipeHolder> recipe, List inputs, List outputs) { super(inputs, outputs); - this.secret = recipe.value().isSecret(); - this.requiredAdvancementIdentifier = recipe.value().getRequiredAdvancementIdentifier().orElse(null); + this.requiredAdvancementIdentifier = recipe.value().getRequiredAdvancement().orElse(null); + this.revealSecretAdvancement = recipe.value().getRevealSecretAdvancement().orElse(null); this.secretHintText = recipe.value().getSecretHintText(recipe.id()); } @Override public boolean isUnlocked() { - Minecraft client = Minecraft.getInstance(); - return AdvancementHelper.hasAdvancement(client.player, this.requiredAdvancementIdentifier); + return AdvancementHelper.hasAdvancement(Minecraft.getInstance().player, this.requiredAdvancementIdentifier); } @Override public boolean isSecret() { - return this.secret; + if(this.revealSecretAdvancement == null) { + return false; + } + return !AdvancementHelper.hasAdvancement(Minecraft.getInstance().player, this.revealSecretAdvancement); } public @Nullable Component getSecretHintText() { diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/REIClientIntegration.java b/src/main/java/de/dafuqs/spectrum/compat/REI/REIClientIntegration.java index 34cca72176..f031abc8dc 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/REIClientIntegration.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/REIClientIntegration.java @@ -8,6 +8,7 @@ import de.dafuqs.spectrum.recipe.anvil_crushing.*; import de.dafuqs.spectrum.recipe.cinderhearth.*; import de.dafuqs.spectrum.recipe.color_picker.*; +import de.dafuqs.spectrum.recipe.crafting.*; import de.dafuqs.spectrum.recipe.crystallarieum.*; import de.dafuqs.spectrum.recipe.enchanter.*; import de.dafuqs.spectrum.recipe.fluid_converting.*; @@ -34,6 +35,7 @@ import me.shedaniel.rei.forge.*; import me.shedaniel.rei.plugin.common.*; import net.minecraft.world.inventory.*; +import net.minecraft.world.item.crafting.*; import net.minecraft.world.level.block.*; import java.util.*; @@ -44,6 +46,7 @@ public class REIClientIntegration implements REIClientPlugin { @Override public void registerCategories(CategoryRegistry registry) { + registry.add(new GatedCraftingCategory()); registry.add(new PedestalCraftingCategory()); registry.add(new AnvilCrushingCategory()); registry.add(new FusionShrineCategory()); @@ -54,7 +57,6 @@ public void registerCategories(CategoryRegistry registry) { registry.add(new PotionWorkshopCraftingCategory()); registry.add(new PotionWorkshopReactingCategory()); registry.add(new SpiritInstillingCategory()); - registry.add(new SludgeConvertingCategory()); registry.add(new LiquidCrystalConvertingCategory()); registry.add(new MidnightSolutionConvertingCategory()); registry.add(new DragonrotConvertingCategory()); @@ -75,14 +77,15 @@ public void registerCategories(CategoryRegistry registry) { EntryStacks.of(SpectrumBlocks.PEDESTAL_MOONSTONE) ); registry.addWorkstations(SpectrumPlugins.PEDESTAL_CRAFTING, pedestals); + if (SpectrumConfig.CONFIG.canPedestalCraftVanillaRecipes()) { registry.addWorkstations(BuiltinPlugin.CRAFTING, pedestals); + registry.addWorkstations(SpectrumPlugins.GATED_CRAFTING, pedestals); } - - registry.addWorkstations(BuiltinPlugin.CRAFTING, EntryStacks.of(SpectrumItems.CRAFTING_TABLET)); - registry.addWorkstations(BuiltinPlugin.CRAFTING, EntryStacks.of(SpectrumBlocks.FABRICATION_CHEST)); + registry.addWorkstations(BuiltinPlugin.CRAFTING, EntryStacks.of(SpectrumItems.CRAFTING_TABLET), EntryStacks.of(SpectrumBlocks.FABRICATION_CHEST)); registry.addWorkstations(BuiltinPlugin.BLASTING, EntryStacks.of(SpectrumBlocks.CINDERHEARTH)); + registry.addWorkstations(SpectrumPlugins.GATED_CRAFTING, EntryStacks.of(SpectrumItems.CRAFTING_TABLET), EntryStacks.of(SpectrumBlocks.FABRICATION_CHEST), EntryStacks.of(SpectrumBlocks.CINDERHEARTH)); registry.addWorkstations(SpectrumPlugins.ANVIL_CRUSHING, EntryStacks.of(Blocks.ANVIL), EntryStacks.of(SpectrumBlocks.BEDROCK_ANVIL), EntryStacks.of(SpectrumBlocks.STRATINE_FLOATBLOCK), EntryStacks.of(SpectrumBlocks.PALTAERIA_FLOATBLOCK)); registry.addWorkstations(SpectrumPlugins.FUSION_SHRINE, EntryIngredient.of(EntryStacks.of(SpectrumBlocks.FUSION_SHRINE_BASALT), EntryStacks.of(SpectrumBlocks.FUSION_SHRINE_CALCITE))); registry.addWorkstations(SpectrumPlugins.NATURES_STAFF, EntryStacks.of(SpectrumItems.NATURES_STAFF)); @@ -90,7 +93,6 @@ public void registerCategories(CategoryRegistry registry) { registry.addWorkstations(SpectrumPlugins.FREEZING, EntryStacks.of(SpectrumBlocks.POLAR_BEAR_IDOL)); registry.addWorkstations(SpectrumPlugins.ENCHANTER_CRAFTING, EntryStacks.of(SpectrumBlocks.ENCHANTER)); registry.addWorkstations(SpectrumPlugins.ENCHANTMENT_UPGRADE, EntryStacks.of(SpectrumBlocks.ENCHANTER)); - registry.addWorkstations(SpectrumPlugins.SLUDGE_CONVERTING, EntryStacks.of(SpectrumItems.SLUDGE_BUCKET)); registry.addWorkstations(SpectrumPlugins.LIQUID_CRYSTAL_CONVERTING, EntryStacks.of(SpectrumItems.LIQUID_CRYSTAL_BUCKET)); registry.addWorkstations(SpectrumPlugins.MIDNIGHT_SOLUTION_CONVERTING, EntryStacks.of(SpectrumItems.MIDNIGHT_SOLUTION_BUCKET)); registry.addWorkstations(SpectrumPlugins.DRAGONROT_CONVERTING, EntryStacks.of(SpectrumItems.DRAGONROT_BUCKET)); @@ -107,6 +109,7 @@ public void registerCategories(CategoryRegistry registry) { @Override public void registerDisplays(DisplayRegistry registry) { + registry.registerRecipeFiller(GatedCraftingRecipe.class, RecipeType.CRAFTING, GatedCraftingDisplay::new); registry.registerRecipeFiller(AnvilCrushingRecipe.class, SpectrumRecipeTypes.ANVIL_CRUSHING, AnvilCrushingDisplay::new); registry.registerRecipeFiller(PedestalRecipe.class, SpectrumRecipeTypes.PEDESTAL, PedestalCraftingDisplay::new); registry.registerRecipeFiller(FusionShrineRecipe.class, SpectrumRecipeTypes.FUSION_SHRINE, FusionShrineDisplay::new); @@ -115,7 +118,6 @@ public void registerDisplays(DisplayRegistry registry) { registry.registerRecipeFiller(PotionWorkshopBrewingRecipe.class, SpectrumRecipeTypes.POTION_WORKSHOP_BREWING, PotionWorkshopBrewingDisplay::new); registry.registerRecipeFiller(PotionWorkshopCraftingRecipe.class, SpectrumRecipeTypes.POTION_WORKSHOP_CRAFTING, PotionWorkshopCraftingDisplay::new); registry.registerRecipeFiller(SpiritInstillerRecipe.class, SpectrumRecipeTypes.SPIRIT_INSTILLING, SpiritInstillingDisplay::new); - registry.registerRecipeFiller(SludgeConvertingRecipe.class, SpectrumRecipeTypes.SLUDGE_CONVERTING, SludgeConvertingDisplay::new); registry.registerRecipeFiller(LiquidCrystalConvertingRecipe.class, SpectrumRecipeTypes.LIQUID_CRYSTAL_CONVERTING, LiquidCrystalConvertingDisplay::new); registry.registerRecipeFiller(MidnightSolutionConvertingRecipe.class, SpectrumRecipeTypes.MIDNIGHT_SOLUTION_CONVERTING, MidnightSolutionConvertingDisplay::new); registry.registerRecipeFiller(DragonrotConvertingRecipe.class, SpectrumRecipeTypes.DRAGONROT_CONVERTING, DragonrotConvertingDisplay::new); @@ -131,7 +133,6 @@ public void registerDisplays(DisplayRegistry registry) { FreezingIdolBlock.FREEZING_MAP.forEach((key, value) -> registry.add(new FreezingDisplay(BlockToBlockWithChanceDisplay.blockToEntryStack(key), BlockToBlockWithChanceDisplay.blockToEntryStack(value.getA().getBlock()), value.getB()))); FirestarterIdolBlock.BURNING_MAP.forEach((key, value) -> registry.add(new HeatingDisplay(BlockToBlockWithChanceDisplay.blockToEntryStack(key), BlockToBlockWithChanceDisplay.blockToEntryStack(value.getA().getBlock()), value.getB()))); - registry.registerVisibilityPredicate((category, display) -> { // do not list recipes in REI at all, until they are unlocked // secret recipes are never shown diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/REIHelper.java b/src/main/java/de/dafuqs/spectrum/compat/REI/REIHelper.java index d95ea08378..83bb61ab60 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/REIHelper.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/REIHelper.java @@ -4,7 +4,6 @@ import me.shedaniel.rei.api.common.entry.*; import me.shedaniel.rei.api.common.util.*; import net.neoforged.neoforge.fluids.crafting.*; -import javax.annotation.*; import java.util.*; import java.util.stream.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/SpectrumPlugins.java b/src/main/java/de/dafuqs/spectrum/compat/REI/SpectrumPlugins.java index afa0cd6f40..60bc5616ec 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/SpectrumPlugins.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/SpectrumPlugins.java @@ -6,6 +6,7 @@ public class SpectrumPlugins { + public static final CategoryIdentifier GATED_CRAFTING = CategoryIdentifier.of(SpectrumCommon.locate("gated_crafting")); public static final CategoryIdentifier PEDESTAL_CRAFTING = CategoryIdentifier.of(SpectrumCommon.locate("pedestal_crafting")); public static final CategoryIdentifier ANVIL_CRUSHING = CategoryIdentifier.of(SpectrumCommon.locate("anvil_crushing")); public static final CategoryIdentifier FUSION_SHRINE = CategoryIdentifier.of(SpectrumCommon.locate("fusion_shrine")); @@ -16,7 +17,6 @@ public class SpectrumPlugins { public static final CategoryIdentifier POTION_WORKSHOP_CRAFTING = CategoryIdentifier.of(SpectrumCommon.locate("potion_workshop_crafting")); public static final CategoryIdentifier POTION_WORKSHOP_REACTING = CategoryIdentifier.of(SpectrumCommon.locate("potion_workshop_reacting")); public static final CategoryIdentifier SPIRIT_INSTILLER = CategoryIdentifier.of(SpectrumCommon.locate("spirit_instiller")); - public static final CategoryIdentifier SLUDGE_CONVERTING = CategoryIdentifier.of(SpectrumCommon.locate("sludge_converting")); public static final CategoryIdentifier LIQUID_CRYSTAL_CONVERTING = CategoryIdentifier.of(SpectrumCommon.locate("liquid_crystal_converting")); public static final CategoryIdentifier MIDNIGHT_SOLUTION_CONVERTING = CategoryIdentifier.of(SpectrumCommon.locate("midnight_solution_converting")); public static final CategoryIdentifier DRAGONROT_CONVERTING = CategoryIdentifier.of(SpectrumCommon.locate("dragonrot_converting")); diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/package-info.java b/src/main/java/de/dafuqs/spectrum/compat/REI/package-info.java index 6386e0d0db..c4564d51ae 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.compat.REI; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/AnvilCrushingCategory.java b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/AnvilCrushingCategory.java index 57bd878123..35b0dd30f7 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/AnvilCrushingCategory.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/AnvilCrushingCategory.java @@ -12,7 +12,6 @@ import net.minecraft.resources.*; import net.minecraft.world.item.*; import net.minecraft.world.level.block.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/BlockToBlockWithChanceCategory.java b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/BlockToBlockWithChanceCategory.java index 6a666783af..a5cdb6ce30 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/BlockToBlockWithChanceCategory.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/BlockToBlockWithChanceCategory.java @@ -3,7 +3,6 @@ import me.shedaniel.math.*; import me.shedaniel.rei.api.client.gui.widgets.*; import net.minecraft.network.chat.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/BlockToBlockWithChanceDisplay.java b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/BlockToBlockWithChanceDisplay.java index 2c820ff688..91eba6e5e5 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/BlockToBlockWithChanceDisplay.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/BlockToBlockWithChanceDisplay.java @@ -7,7 +7,7 @@ import me.shedaniel.rei.api.common.util.*; import net.minecraft.network.chat.*; import net.minecraft.world.level.block.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/CrystallarieumCategory.java b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/CrystallarieumCategory.java index 5097fb6a64..0486ce17ed 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/CrystallarieumCategory.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/CrystallarieumCategory.java @@ -1,7 +1,7 @@ package de.dafuqs.spectrum.compat.REI.plugins; import de.dafuqs.spectrum.*; -import de.dafuqs.spectrum.blocks.crystallarieum.*; +import de.dafuqs.spectrum.blocks.ink.sink.*; import de.dafuqs.spectrum.compat.REI.*; import de.dafuqs.spectrum.recipe.crystallarieum.*; import de.dafuqs.spectrum.registries.*; @@ -14,7 +14,6 @@ import net.minecraft.network.chat.*; import net.minecraft.resources.*; import net.minecraft.world.item.*; -import javax.annotation.*; import java.util.*; @@ -61,16 +60,16 @@ public void setupWidgets(Point startPoint, Rectangle bounds, List widget } // catalysts - widgets.add(Widgets.createLabel(new Point(startPoint.x, startPoint.y + 44), Component.translatable("container.spectrum.rei.crystallarieum.catalyst")).leftAligned().color(0x3f3f3f).noShadow()); + widgets.add(Widgets.createLabel(new Point(startPoint.x, startPoint.y + 44), Component.translatable("container.spectrum.rei.crystallarieum.additive")).leftAligned().color(0x3f3f3f).noShadow()); widgets.add(Widgets.createLabel(new Point(startPoint.x, startPoint.y + 60), Component.translatable("container.spectrum.rei.crystallarieum.speed")).leftAligned().color(0x3f3f3f).noShadow()); widgets.add(Widgets.createLabel(new Point(startPoint.x, startPoint.y + 70), Component.translatable("container.spectrum.rei.crystallarieum.ink_drain")).leftAligned().color(0x3f3f3f).noShadow()); widgets.add(Widgets.createLabel(new Point(startPoint.x, startPoint.y + 80), Component.translatable("container.spectrum.rei.crystallarieum.depletion")).leftAligned().color(0x3f3f3f).noShadow()); int i = 0; int startX = 46; - int offsetPerReagent = 18; - for (CrystallarieumCatalyst catalyst : display.catalysts) { - int offsetX = startPoint.x + startX + offsetPerReagent * i; + int offsetPerAdditive = 18; + for (CrystallarieumAdditive catalyst : display.additives) { + int offsetX = startPoint.x + startX + offsetPerAdditive * i; widgets.add(Widgets.createSlot(new Point(offsetX, startPoint.y + 1 + 38)).markInput().entries(EntryIngredients.ofIngredient(catalyst.ingredient()))); int offsetU = CrystallarieumRecipe.growthSpeedOffsetU(catalyst); @@ -86,8 +85,8 @@ public void setupWidgets(Point startPoint, Rectangle bounds, List widget } // description texts - if (display.growsWithoutCatalyst) { - widgets.add(Widgets.createLabel(new Point(startPoint.x, startPoint.y + 92), Component.translatable("container.spectrum.rei.crystallarieum.crafting_time_per_stage_seconds_catalyst_optional", display.secondsPerStage)).leftAligned().color(0x3f3f3f).noShadow()); + if (display.growsWithoutAdditive) { + widgets.add(Widgets.createLabel(new Point(startPoint.x, startPoint.y + 92), Component.translatable("container.spectrum.rei.crystallarieum.crafting_time_per_stage_seconds_additive_optional", display.secondsPerStage)).leftAligned().color(0x3f3f3f).noShadow()); } else { widgets.add(Widgets.createLabel(new Point(startPoint.x, startPoint.y + 92), Component.translatable("container.spectrum.rei.crystallarieum.crafting_time_per_stage_seconds", display.secondsPerStage)).leftAligned().color(0x3f3f3f).noShadow()); } diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/CrystallarieumDisplay.java b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/CrystallarieumDisplay.java index bb252e0145..36d0ce4559 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/CrystallarieumDisplay.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/CrystallarieumDisplay.java @@ -1,9 +1,10 @@ package de.dafuqs.spectrum.compat.REI.plugins; import de.dafuqs.revelationary.api.advancements.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.compat.REI.*; import de.dafuqs.spectrum.recipe.crystallarieum.*; +import dev.emi.emi.api.stack.*; import me.shedaniel.rei.api.common.category.*; import me.shedaniel.rei.api.common.display.basic.*; import me.shedaniel.rei.api.common.entry.*; @@ -11,17 +12,17 @@ import net.minecraft.client.*; import net.minecraft.world.item.*; import net.minecraft.world.item.crafting.*; +import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; -import javax.annotation.*; import java.util.*; public class CrystallarieumDisplay extends GatedSpectrumDisplay { protected final List growthStages; - protected final List catalysts; + protected final List additives; protected final InkColor inkColor; - protected final boolean growsWithoutCatalyst; + protected final boolean growsWithoutAdditive; protected final int secondsPerStage; public CrystallarieumDisplay(RecipeHolder recipe) { @@ -31,9 +32,9 @@ public CrystallarieumDisplay(RecipeHolder recipe) { for (BlockState state : recipe.value().getGrowthStages()) { growthStages.add(EntryIngredients.of(state.getBlock().asItem())); } - this.catalysts = recipe.value().getCatalysts(); + this.additives = recipe.value().getAdditives(); this.inkColor = recipe.value().getInkColor(); - this.growsWithoutCatalyst = recipe.value().growsWithoutCatalyst(); + this.growsWithoutAdditive = recipe.value().growsWithoutAdditive(); this.secondsPerStage = recipe.value().getSecondsPerGrowthStage(); } @@ -45,6 +46,12 @@ public static List inputs(CrystallarieumRecipe recipe) { if (firstBlockStateItem != Items.AIR) { inputs.add(EntryIngredients.of(firstBlockStateItem)); } + + recipe.getAdditives() + .stream() + .map((i) -> EntryIngredients.ofIngredient(i.ingredient())) + .forEach(inputs::add); + return inputs; } @@ -56,7 +63,13 @@ public static List outputs(CrystallarieumRecipe recipe) { } for (BlockState growthStageState : recipe.getGrowthStages()) { - Item blockStateItem = growthStageState.getBlock().asItem(); + Block block = growthStageState.getBlock(); + // Yes, there was a request for the Crystallarieum to grow fluids + if(block instanceof LiquidBlock liquidBlock) { + outputs.add(EntryIngredients.of(liquidBlock.fluid)); + continue; + } + Item blockStateItem = block.asItem(); if (blockStateItem != Items.AIR) { outputs.add(EntryIngredients.of(blockStateItem)); } diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/EnchanterCategory.java b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/EnchanterCategory.java index 1bd524fa01..e8b0b21732 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/EnchanterCategory.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/EnchanterCategory.java @@ -7,7 +7,6 @@ import me.shedaniel.rei.api.common.util.*; import net.minecraft.network.chat.*; import net.minecraft.resources.*; -import javax.annotation.*; public abstract class EnchanterCategory extends GatedDisplayCategory { diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/EnchanterDisplay.java b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/EnchanterDisplay.java index c34f8a61a1..3272453f8f 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/EnchanterDisplay.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/EnchanterDisplay.java @@ -4,7 +4,6 @@ import de.dafuqs.spectrum.recipe.*; import me.shedaniel.rei.api.common.entry.*; import net.minecraft.world.item.crafting.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/EnchanterEnchantingCategory.java b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/EnchanterEnchantingCategory.java index f2de06df33..662d8555c3 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/EnchanterEnchantingCategory.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/EnchanterEnchantingCategory.java @@ -6,7 +6,6 @@ import me.shedaniel.rei.api.common.category.*; import me.shedaniel.rei.api.common.entry.*; import net.minecraft.network.chat.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/EnchanterEnchantingDisplay.java b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/EnchanterEnchantingDisplay.java index 586ac87e35..2133b8f3ba 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/EnchanterEnchantingDisplay.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/EnchanterEnchantingDisplay.java @@ -10,7 +10,6 @@ import me.shedaniel.rei.api.common.util.*; import net.minecraft.client.*; import net.minecraft.world.item.crafting.*; -import javax.annotation.*; import java.util.*; import java.util.stream.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/EnchantmentUpgradeCategory.java b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/EnchantmentUpgradeCategory.java index 52bd4db3da..e89b0556a0 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/EnchantmentUpgradeCategory.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/EnchantmentUpgradeCategory.java @@ -11,7 +11,6 @@ import me.shedaniel.rei.api.common.entry.*; import net.minecraft.client.*; import net.minecraft.network.chat.*; -import javax.annotation.*; import java.util.*; @@ -43,42 +42,40 @@ public Component getDescriptionText(EnchantmentUpgradeDisplay display) { @Override public void setupWidgets(Point startPoint, Rectangle bounds, List widgets, EnchantmentUpgradeDisplay display) { - boolean overUnlocked = AdvancementHelper.hasAdvancement(Minecraft.getInstance().player, SpectrumAdvancements.OVERENCHANTING); + boolean overchantingUnlocked = AdvancementHelper.hasAdvancement(Minecraft.getInstance().player, SpectrumAdvancements.OVERENCHANTING); List inputs = display.getInputEntries(); // enchanter structure background destinationX destinationY sourceX, sourceY, width, height widgets.add(Widgets.createTexturedWidget(BACKGROUND_TEXTURE, startPoint.x - 8 + 12, startPoint.y - 7 + 21, 0, 0, 54, 54)); // Overchanting Star - if (overUnlocked && display.recipeMaxLevel > display.enchantMaxLevel) + if (overchantingUnlocked && display.recipeMaxLevel > display.enchantMaxLevel) widgets.add(Widgets.withTooltip( Widgets.withBounds(Widgets.createTexturedWidget(BACKGROUND_TEXTURE, startPoint.x - 10, startPoint.y + 2, 64, 0, 16, 16), new Rectangle(startPoint.x - 10, startPoint.y + 2, 16, 16)), Component.translatable(EnchanterBlockEntity.OVERCHANTING_TOOLTIP).withStyle(s -> s.withColor(OVERCHANT_COLOR)))); - var maxIndex = (overUnlocked ? display.recipeMaxLevel : display.enchantMaxLevel) - 1; + int maxIndex = (overchantingUnlocked ? display.recipeMaxLevel : display.enchantMaxLevel) - 2; widgets.add(Widgets.createButton(new Rectangle(startPoint.x - 8 + 84, startPoint.y + 20, 8, 8), Component.literal("-")) .onClick(b -> display.index = Math.clamp(display.index - 1, 0, maxIndex))); // decrement widgets.add(Widgets.createButton(new Rectangle(startPoint.x - 8 + 94, startPoint.y + 20, 8, 8), Component.literal("+")) .onClick(b -> display.index = Math.clamp(display.index + 1, 0, maxIndex))); // increment // surrounding input slots - widgets.add(Widgets.createSlot(new Point(startPoint.x - 8 + 18, startPoint.y - 7 + 9)).markInput().entries(inputs.get(0))); - widgets.add(Widgets.createSlot(new Point(startPoint.x - 8 + 44, startPoint.y - 7 + 9)).markInput().entries(inputs.get(1))); - widgets.add(Widgets.createSlot(new Point(startPoint.x - 8 + 62, startPoint.y - 7 + 27)).markInput().entries(inputs.get(2))); - widgets.add(Widgets.createSlot(new Point(startPoint.x - 8 + 62, startPoint.y - 7 + 53)).markInput().entries(inputs.get(3))); - widgets.add(Widgets.createSlot(new Point(startPoint.x - 8 + 44, startPoint.y - 7 + 71)).markInput().entries(inputs.get(4))); - widgets.add(Widgets.createSlot(new Point(startPoint.x - 8 + 18, startPoint.y - 7 + 71)).markInput().entries(inputs.get(5))); - widgets.add(Widgets.createSlot(new Point(startPoint.x - 8, startPoint.y - 7 + 53)).markInput().entries(inputs.get(6))); - widgets.add(Widgets.createSlot(new Point(startPoint.x - 8, startPoint.y - 7 + 27)).markInput().entries(inputs.get(7))); + widgets.add(new OffsetEntryWidget(new Point(startPoint.x - 8 + 18, startPoint.y - 7 + 9), inputs, () -> display.index + 2).markInput()); + widgets.add(new OffsetEntryWidget(new Point(startPoint.x - 8 + 44, startPoint.y - 7 + 9), inputs, () -> display.index + 2).markInput()); + widgets.add(new OffsetEntryWidget(new Point(startPoint.x - 8 + 62, startPoint.y - 7 + 27), inputs, () -> display.index + 2).markInput()); + widgets.add(new OffsetEntryWidget(new Point(startPoint.x - 8 + 62, startPoint.y - 7 + 53), inputs, () -> display.index + 2).markInput()); + widgets.add(new OffsetEntryWidget(new Point(startPoint.x - 8 + 44, startPoint.y - 7 + 71), inputs, () -> display.index + 2).markInput()); + widgets.add(new OffsetEntryWidget(new Point(startPoint.x - 8 + 18, startPoint.y - 7 + 71), inputs, () -> display.index + 2).markInput()); + widgets.add(new OffsetEntryWidget(new Point(startPoint.x - 8, startPoint.y - 7 + 53), inputs, () -> display.index + 2).markInput()); + widgets.add(new OffsetEntryWidget(new Point(startPoint.x - 8, startPoint.y - 7 + 27), inputs, () -> display.index + 2).markInput()); // Knowledge Gem and Enchanter - widgets.add(new IndexedEntryWidget(new Point(startPoint.x - 8 + 111, startPoint.y - 7 + 14), () -> display.index).markInput() - .entries(inputs.get(8))); + widgets.add(new IndexedEntryWidget(new Point(startPoint.x - 8 + 111, startPoint.y - 7 + 14), () -> display.index).markInput().entries(inputs.get(0))); widgets.add(Widgets.createSlot(new Point(startPoint.x - 8 + 111, startPoint.y - 7 + 60)).entries(ENCHANTER).disableBackground()); // center input slot - widgets.add(new IndexedEntryWidget(new Point(startPoint.x - 8 + 31, startPoint.y - 7 + 40), () -> display.index).markInput() - .entries(inputs.get(9))); + widgets.add(new IndexedEntryWidget(new Point(startPoint.x - 8 + 31, startPoint.y - 7 + 40), () -> display.index).markInput().entries(inputs.get(1))); // output arrow widgets.add(Widgets.createArrow(new Point(startPoint.x - 8 + 80, startPoint.y - 7 + 40)).animationDurationTicks(getCraftingTime(display))); @@ -103,9 +100,7 @@ public void setupWidgets(Point startPoint, Rectangle bounds, List widget var costLabel = Widgets.createLabel(new Point(startPoint.x - 11 + 70, startPoint.y - 11 + 85), getDescriptionText(display)).leftAligned().color(NORMAL_COLOR).noShadow(); costLabel.setOnRender((drawContext, label) -> { - var level = display.index + 1; - - label.setMessage(Component.translatable(EnchanterBlockEntity.ITEM_TRANS, display.itemScaling.apply(level))); + label.setMessage(Component.translatable(EnchanterBlockEntity.ITEM_TRANS, display.levelData.get(display.index).countPerBowl() * 8)); }); widgets.add(levelLabel); diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/EnchantmentUpgradeDisplay.java b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/EnchantmentUpgradeDisplay.java index d1d80878d6..33c79048c6 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/EnchantmentUpgradeDisplay.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/EnchantmentUpgradeDisplay.java @@ -2,33 +2,28 @@ import de.dafuqs.revelationary.api.advancements.*; import de.dafuqs.spectrum.compat.REI.*; +import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.items.magic_items.*; -import de.dafuqs.spectrum.recipe.*; import de.dafuqs.spectrum.recipe.enchanter.*; import me.shedaniel.rei.api.common.category.*; import me.shedaniel.rei.api.common.entry.*; import me.shedaniel.rei.api.common.util.*; import net.minecraft.client.*; import net.minecraft.core.*; -import net.minecraft.core.component.*; import net.minecraft.network.chat.*; import net.minecraft.world.item.*; import net.minecraft.world.item.crafting.*; import net.minecraft.world.item.enchantment.*; -import javax.annotation.*; import java.util.*; public class EnchantmentUpgradeDisplay extends EnchanterDisplay { protected final Holder enchantment; - - final int enchantMaxLevel; - final int recipeMaxLevel; - - final Component transKey; - final RecipeScaling.ScalingData itemScaling; - final RecipeScaling.ScalingData xpScaling; + protected final int enchantMaxLevel; + protected final int recipeMaxLevel; + protected final Component transKey; + protected final List levelData; int index = 0; @@ -40,9 +35,7 @@ public EnchantmentUpgradeDisplay(RecipeHolder recipeEn enchantMaxLevel = enchantment.value().getMaxLevel(); recipeMaxLevel = recipe.getLevelCap(); - - itemScaling = recipe.getItemScaling(); - xpScaling = recipe.getXPScaling(); + levelData = recipe.getLevelData(); transKey = enchantment.value().description().copy().withStyle(s -> { s.withItalic(true); s.withColor(EnchantmentUpgradeCategory.NORMAL_COLOR); @@ -51,25 +44,23 @@ public EnchantmentUpgradeDisplay(RecipeHolder recipeEn } private static List buildIngredients(EnchantmentUpgradeRecipe recipe) { - List inputs = new ArrayList<>(); + Holder enchant = recipe.getEnchantment(); + int levelCap = recipe.getLevelCap(); - var enchant = recipe.getEnchantment(); - var levelCap = recipe.getLevelCap(); + List inputs = new ArrayList<>(); var knowledgeGem = new ArrayList(); var enchantedBooks = new ArrayList(); - - for (int i = 0; i < 8; i++) { - inputs.add(EntryIngredients.of(recipe.getBulkItem(), 1)); - } - + var bowlIngredients = new ArrayList(); for (int level = 1; level < levelCap; level++) { - knowledgeGem.add(KnowledgeGemItem.getKnowledgeDropStackWithXP(recipe.getXPScaling().apply(level), true)); - enchantedBooks.add(getEnchantedBookStackWith(enchant, level)); + knowledgeGem.add(KnowledgeGemItem.getKnowledgeDropStackWithXP(recipe.getRequiredXPForSourceLevel(level), true)); + enchantedBooks.add(SpectrumEnchantmentHelper.getEnchantedBookStackWith(enchant, level)); + bowlIngredients.add(recipe.getLevelData().get(level-1).ingredient()); } - inputs.add(EntryIngredients.ofItemStacks(knowledgeGem)); inputs.add(EntryIngredients.ofItemStacks(enchantedBooks)); + inputs.addAll(EntryIngredients.ofIngredients(bowlIngredients)); + return inputs; } @@ -78,20 +69,12 @@ private static List buildOutputs(EnchantmentUpgradeRecipe recip var levelCap = recipe.getLevelCap(); for (int level = 1; level < levelCap; level++) { - stacks.add(getEnchantedBookStackWith(recipe.getEnchantment(), level + 1)); + stacks.add(SpectrumEnchantmentHelper.getEnchantedBookStackWith(recipe.getEnchantment(), level + 1)); } return Collections.singletonList(EntryIngredients.ofItemStacks(stacks)); } - private static ItemStack getEnchantedBookStackWith(Holder enchant, int level) { - var enchStack = new ItemStack(Items.ENCHANTED_BOOK); - var builder = new ItemEnchantments.Mutable(ItemEnchantments.EMPTY); - builder.set(enchant, level); - enchStack.set(DataComponents.STORED_ENCHANTMENTS, builder.toImmutable()); - return enchStack; - } - @Override public CategoryIdentifier getCategoryIdentifier() { return SpectrumPlugins.ENCHANTMENT_UPGRADE; diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/FluidConvertingCategory.java b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/FluidConvertingCategory.java index 886c381dec..b853968556 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/FluidConvertingCategory.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/FluidConvertingCategory.java @@ -2,7 +2,6 @@ import me.shedaniel.math.*; import me.shedaniel.rei.api.client.gui.widgets.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/FusionShrineCategory.java b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/FusionShrineCategory.java index acffad6c37..15fc1a162d 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/FusionShrineCategory.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/FusionShrineCategory.java @@ -10,7 +10,6 @@ import me.shedaniel.rei.api.common.util.*; import net.minecraft.network.chat.*; import net.minecraft.world.level.material.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/FusionShrineDisplay.java b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/FusionShrineDisplay.java index 62b05d0040..266255eda7 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/FusionShrineDisplay.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/FusionShrineDisplay.java @@ -9,7 +9,6 @@ import net.minecraft.client.*; import net.minecraft.network.chat.*; import net.minecraft.world.item.crafting.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/GatedCraftingCategory.java b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/GatedCraftingCategory.java new file mode 100644 index 0000000000..71ef0dbe4a --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/GatedCraftingCategory.java @@ -0,0 +1,63 @@ +package de.dafuqs.spectrum.compat.REI.plugins; + +import com.google.common.collect.*; +import de.dafuqs.spectrum.*; +import de.dafuqs.spectrum.compat.REI.*; +import de.dafuqs.spectrum.inventories.*; +import de.dafuqs.spectrum.registries.*; +import me.shedaniel.math.*; +import me.shedaniel.rei.api.client.gui.*; +import me.shedaniel.rei.api.client.gui.widgets.*; +import me.shedaniel.rei.api.common.category.*; +import me.shedaniel.rei.api.common.entry.*; +import me.shedaniel.rei.api.common.util.*; +import net.minecraft.network.chat.*; +import net.minecraft.resources.*; +import net.minecraft.world.item.*; +import net.minecraft.world.level.block.*; + +import java.util.*; + +// see me.shedaniel.rei.plugin.client.categories.crafting.DefaultCraftingCategory +public class GatedCraftingCategory extends GatedDisplayCategory { + + @Override + public CategoryIdentifier getCategoryIdentifier() { + return SpectrumPlugins.GATED_CRAFTING; + } + + @Override + public ResourceLocation getIdentifier() { + return SpectrumCommon.locate("gated_crafting"); + } + + @Override + public Component getTitle() { + return Component.translatable("container.spectrum.rei.gated_crafting.title"); + } + + @Override + public Renderer getIcon() { + return EntryStacks.of(Blocks.CRAFTING_TABLE); + } + + @Override + public void setupWidgets(Point startPoint, Rectangle bounds, List widgets, GatedCraftingDisplay display) { + widgets.add(Widgets.createRecipeBase(bounds)); + widgets.add(Widgets.createArrow(new Point(startPoint.x + 60, startPoint.y + 18))); + widgets.add(Widgets.createResultSlotBackground(new Point(startPoint.x + 95, startPoint.y + 19))); + List>> input = display.getInputIngredients(3, 3); + List slots = Lists.newArrayList(); + for (int y = 0; y < 3; y++) + for (int x = 0; x < 3; x++) + slots.add(Widgets.createSlot(new Point(startPoint.x + 1 + x * 18, startPoint.y + 1 + y * 18)).markInput()); + for (InputIngredient> ingredient : input) { + slots.get(ingredient.getIndex()).entries(ingredient.get()); + } + widgets.addAll(slots); + widgets.add(Widgets.createSlot(new Point(startPoint.x + 95, startPoint.y + 19)).entries(display.getOutputEntries().get(0)).disableBackground().markOutput()); + if (display.shapeless) { + widgets.add(Widgets.createShapelessIcon(bounds)); + } + } +} diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/GatedCraftingDisplay.java b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/GatedCraftingDisplay.java new file mode 100644 index 0000000000..5bf24b2621 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/GatedCraftingDisplay.java @@ -0,0 +1,88 @@ +package de.dafuqs.spectrum.compat.REI.plugins; + +import de.dafuqs.spectrum.api.item.*; +import de.dafuqs.spectrum.api.recipe.*; +import de.dafuqs.spectrum.blocks.pedestal.*; +import de.dafuqs.spectrum.compat.REI.*; +import de.dafuqs.spectrum.recipe.crafting.*; +import de.dafuqs.spectrum.recipe.fusion_shrine.*; +import de.dafuqs.spectrum.recipe.pedestal.*; +import it.unimi.dsi.fastutil.ints.*; +import me.shedaniel.rei.api.common.category.*; +import me.shedaniel.rei.api.common.display.*; +import me.shedaniel.rei.api.common.display.basic.*; +import me.shedaniel.rei.api.common.entry.*; +import me.shedaniel.rei.api.common.entry.type.*; +import me.shedaniel.rei.api.common.transfer.info.*; +import me.shedaniel.rei.api.common.transfer.info.simple.*; +import me.shedaniel.rei.api.common.util.*; +import me.shedaniel.rei.plugin.common.*; +import me.shedaniel.rei.plugin.common.displays.crafting.*; +import net.minecraft.client.*; +import net.minecraft.core.*; +import net.minecraft.resources.*; +import net.minecraft.world.entity.player.*; +import net.minecraft.world.inventory.*; +import net.minecraft.world.item.*; +import net.minecraft.world.item.crafting.*; +import org.jspecify.annotations.*; + +import java.util.*; +import java.util.function.*; +import java.util.stream.*; + +public class GatedCraftingDisplay extends GatedSpectrumDisplay { + + protected final int width; + public boolean shapeless; + + public GatedCraftingDisplay(RecipeHolder recipe) { + super(recipe, EntryIngredients.ofIngredients(recipe.value().getIngredients()), Collections.singletonList(EntryIngredients.of(recipe.value().getResultItem(BasicDisplay.registryAccess())))); + if(recipe.value() instanceof ShapedGatedCraftingRecipe shapedGatedCraftingRecipe) { + this.width = shapedGatedCraftingRecipe.getWidth(); + this.shapeless = false; + } else { + this.width = 3; + this.shapeless = true; + } + } + + @Override + public CategoryIdentifier getCategoryIdentifier() { + return SpectrumPlugins.GATED_CRAFTING; + } + + public List>> getInputIngredients(int craftingWidth, int craftingHeight) { + Map>> grid = new HashMap<>(); + + List inputEntries = getInputEntries(); + for (int i = 0; i < inputEntries.size(); i++) { + EntryIngredient stacks = inputEntries.get(i); + if (stacks.isEmpty()) { + continue; + } + int index = DefaultCraftingDisplay.getSlotWithSize(width, i, craftingWidth); + int x = i % width; + int y = i / width; + grid.put(new IntIntImmutablePair(x, y), InputIngredient.of(index, 3 * y + x, stacks)); + } + + List>> list = new ArrayList<>(craftingWidth * craftingHeight); + for (int i = 0, n = craftingWidth * craftingHeight; i < n; i++) { + list.add(InputIngredient.empty(i)); + } + + for (int x = 0; x < craftingWidth; x++) { + for (int y = 0; y < craftingHeight; y++) { + InputIngredient> ingredient = grid.get(new IntIntImmutablePair(x, y)); + if (ingredient != null) { + int index = craftingWidth * y + x; + list.set(index, ingredient); + } + } + } + + return list; + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/GatedDisplayCategory.java b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/GatedDisplayCategory.java index 4a6e0fdc92..e3fd51d2b8 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/GatedDisplayCategory.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/GatedDisplayCategory.java @@ -6,7 +6,6 @@ import me.shedaniel.rei.api.client.gui.widgets.*; import me.shedaniel.rei.api.client.registry.display.*; import net.minecraft.network.chat.*; -import javax.annotation.*; import java.util.*; @@ -29,7 +28,7 @@ public List setupDisplay(T display, Rectangle bounds) { if (display.isUnlocked()) { if (display.isSecret()) { if (display.getSecretHintText() == null) { - widgets.add(Widgets.createLabel(new Point(bounds.getCenterX(), bounds.getCenterY() - 9), SECRET).centered().color(0x3f3f3f).noShadow()); + widgets.add(Widgets.createLabel(new Point(bounds.getCenterX(), bounds.getCenterY() - 4), SECRET).centered().color(0x3f3f3f).noShadow()); } else { widgets.add(Widgets.createLabel(new Point(bounds.getCenterX(), bounds.getCenterY() - 9), SECRET_HINT).centered().color(0x3f3f3f).noShadow()); widgets.add(Widgets.createLabel(new Point(bounds.getCenterX(), bounds.getCenterY() + 1), display.getSecretHintText()).centered().color(0x3f3f3f).noShadow()); diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/GatedItemInformationPageCategory.java b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/GatedItemInformationPageCategory.java index 8fff4cc265..704cdfb9b7 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/GatedItemInformationPageCategory.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/GatedItemInformationPageCategory.java @@ -6,7 +6,6 @@ import net.minecraft.client.*; import net.minecraft.util.*; import net.minecraft.world.item.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/InkConvertingCategory.java b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/InkConvertingCategory.java index 5a657fea1d..04aa12930d 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/InkConvertingCategory.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/InkConvertingCategory.java @@ -8,7 +8,6 @@ import me.shedaniel.rei.api.common.category.*; import me.shedaniel.rei.api.common.util.*; import net.minecraft.network.chat.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/InkConvertingDisplay.java b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/InkConvertingDisplay.java index 2b0ea20f45..77ce5cff37 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/InkConvertingDisplay.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/InkConvertingDisplay.java @@ -1,14 +1,13 @@ package de.dafuqs.spectrum.compat.REI.plugins; import de.dafuqs.revelationary.api.advancements.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.compat.REI.*; -import de.dafuqs.spectrum.recipe.color_picker.InkConvertingRecipe; +import de.dafuqs.spectrum.recipe.color_picker.*; import me.shedaniel.rei.api.common.category.*; import me.shedaniel.rei.api.common.util.*; import net.minecraft.client.*; import net.minecraft.world.item.crafting.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/NaturesStaffConversionsCategory.java b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/NaturesStaffConversionsCategory.java index 2ffa8b7288..ab797723f1 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/NaturesStaffConversionsCategory.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/NaturesStaffConversionsCategory.java @@ -8,7 +8,6 @@ import me.shedaniel.rei.api.common.category.*; import me.shedaniel.rei.api.common.util.*; import net.minecraft.network.chat.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/NaturesStaffConversionsDisplay.java b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/NaturesStaffConversionsDisplay.java index a2d41d52e3..c4e0be3a13 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/NaturesStaffConversionsDisplay.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/NaturesStaffConversionsDisplay.java @@ -9,7 +9,7 @@ import net.minecraft.client.*; import net.minecraft.network.chat.*; import net.minecraft.resources.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/PedestalCraftingCategory.java b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/PedestalCraftingCategory.java index 071387a03b..eece444958 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/PedestalCraftingCategory.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/PedestalCraftingCategory.java @@ -13,7 +13,6 @@ import me.shedaniel.rei.api.common.util.*; import net.minecraft.network.chat.*; import net.minecraft.resources.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/PedestalCraftingDisplay.java b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/PedestalCraftingDisplay.java index 4e0494e6c3..109e459eeb 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/PedestalCraftingDisplay.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/PedestalCraftingDisplay.java @@ -2,7 +2,7 @@ import de.dafuqs.spectrum.api.item.*; import de.dafuqs.spectrum.api.recipe.*; -import de.dafuqs.spectrum.blocks.pedestal.BuiltinGemstoneColor; +import de.dafuqs.spectrum.blocks.pedestal.*; import de.dafuqs.spectrum.compat.REI.*; import de.dafuqs.spectrum.recipe.pedestal.*; import me.shedaniel.rei.api.common.category.*; @@ -24,11 +24,6 @@ public class PedestalCraftingDisplay extends GatedSpectrumDisplay { protected final int craftingTime; public boolean shapeless; - /** - * When using the REI recipe functionality - * - * @param recipe The recipe - */ public PedestalCraftingDisplay(RecipeHolder recipe) { super(recipe, mapIngredients(recipe.value()), Collections.singletonList(EntryIngredients.of(recipe.value().getResultItem(BasicDisplay.registryAccess())))); this.pedestalRecipeTier = recipe.value().getTier(); diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/PotionWorkshopCategory.java b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/PotionWorkshopCategory.java index 1d0632d057..b66a7e0721 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/PotionWorkshopCategory.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/PotionWorkshopCategory.java @@ -9,11 +9,9 @@ import me.shedaniel.rei.api.common.util.*; import net.minecraft.network.chat.*; import net.minecraft.resources.*; -import javax.annotation.*; import java.util.*; - public abstract class PotionWorkshopCategory extends GatedDisplayCategory { public final static ResourceLocation BACKGROUND_TEXTURE = SpectrumCommon.locate("textures/gui/container/potion_workshop_3_slots.png"); @@ -23,7 +21,6 @@ public Renderer getIcon() { return EntryStacks.of(SpectrumBlocks.POTION_WORKSHOP); } - @Override public void setupWidgets(Point startPoint, Rectangle bounds, List widgets, T display) { // bubbles diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/PotionWorkshopCraftingDisplay.java b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/PotionWorkshopCraftingDisplay.java index 8f09ba5032..16442687af 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/PotionWorkshopCraftingDisplay.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/PotionWorkshopCraftingDisplay.java @@ -13,11 +13,6 @@ public class PotionWorkshopCraftingDisplay extends PotionWorkshopRecipeDisplay { protected final IngredientStack baseIngredient; protected final boolean consumeBaseIngredient; - /** - * When using the REI recipe functionality - * - * @param recipe The recipe - */ public PotionWorkshopCraftingDisplay(RecipeHolder recipe) { super(recipe); this.baseIngredient = recipe.value().getBaseIngredient(); diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/PotionWorkshopRecipeDisplay.java b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/PotionWorkshopRecipeDisplay.java index c2fff34ca5..da5b337215 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/PotionWorkshopRecipeDisplay.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/PotionWorkshopRecipeDisplay.java @@ -12,11 +12,6 @@ public abstract class PotionWorkshopRecipeDisplay extends GatedSpectrumDisplay { protected final int craftingTime; - /** - * When using the REI recipe functionality - * - * @param recipe The recipe - */ public PotionWorkshopRecipeDisplay(RecipeHolder recipe) { super(recipe, REIHelper.toEntryIngredients(recipe.value().getIngredientStacks()), Collections.singletonList(EntryIngredients.of(recipe.value().getResultItem(BasicDisplay.registryAccess())))); this.craftingTime = recipe.value().getCraftingTime(); diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/PrimordialFireBurningCategory.java b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/PrimordialFireBurningCategory.java index e18d57616d..d188743766 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/PrimordialFireBurningCategory.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/PrimordialFireBurningCategory.java @@ -11,7 +11,6 @@ import me.shedaniel.rei.api.common.util.*; import net.minecraft.network.chat.*; import net.minecraft.resources.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/ScrollableTextWidget.java b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/ScrollableTextWidget.java index 27e4e28ff5..ab7844eb57 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/ScrollableTextWidget.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/ScrollableTextWidget.java @@ -9,7 +9,7 @@ import net.minecraft.client.gui.*; import net.minecraft.client.gui.components.events.*; import net.minecraft.util.*; -import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/SludgeConvertingCategory.java b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/SludgeConvertingCategory.java deleted file mode 100644 index db06bf5074..0000000000 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/SludgeConvertingCategory.java +++ /dev/null @@ -1,28 +0,0 @@ -package de.dafuqs.spectrum.compat.REI.plugins; - -import de.dafuqs.spectrum.compat.REI.*; -import de.dafuqs.spectrum.registries.*; -import me.shedaniel.rei.api.client.gui.*; -import me.shedaniel.rei.api.common.category.*; -import me.shedaniel.rei.api.common.util.*; -import net.minecraft.network.chat.*; - - -public class SludgeConvertingCategory extends FluidConvertingCategory { - - @Override - public CategoryIdentifier getCategoryIdentifier() { - return SpectrumPlugins.SLUDGE_CONVERTING; - } - - @Override - public Renderer getIcon() { - return EntryStacks.of(SpectrumItems.SLUDGE_BUCKET); - } - - @Override - public Component getTitle() { - return Component.translatable("container.spectrum.rei.sludge_converting.title"); - } - -} diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/SludgeConvertingDisplay.java b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/SludgeConvertingDisplay.java deleted file mode 100644 index 3d5a6b57b9..0000000000 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/SludgeConvertingDisplay.java +++ /dev/null @@ -1,25 +0,0 @@ -package de.dafuqs.spectrum.compat.REI.plugins; - -import de.dafuqs.spectrum.compat.REI.*; -import de.dafuqs.spectrum.recipe.fluid_converting.*; -import me.shedaniel.rei.api.common.category.*; -import net.minecraft.resources.*; -import net.minecraft.world.item.crafting.*; - -public class SludgeConvertingDisplay extends FluidConvertingDisplay { - - public SludgeConvertingDisplay(RecipeHolder recipe) { - super(recipe); - } - - @Override - public CategoryIdentifier getCategoryIdentifier() { - return SpectrumPlugins.SLUDGE_CONVERTING; - } - - @Override - public ResourceLocation getUnlockIdentifier() { - return SludgeConvertingRecipe.UNLOCK_IDENTIFIER; - } - -} \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/SpiritInstillingCategory.java b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/SpiritInstillingCategory.java index 9b9a732230..c9c6ff1079 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/SpiritInstillingCategory.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/SpiritInstillingCategory.java @@ -10,7 +10,6 @@ import me.shedaniel.rei.api.common.entry.*; import me.shedaniel.rei.api.common.util.*; import net.minecraft.network.chat.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/SpiritInstillingDisplay.java b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/SpiritInstillingDisplay.java index d78795eed0..b5aaa79139 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/SpiritInstillingDisplay.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/SpiritInstillingDisplay.java @@ -2,17 +2,12 @@ import de.dafuqs.revelationary.api.advancements.*; import de.dafuqs.spectrum.compat.REI.*; -import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.recipe.spirit_instiller.*; -import de.dafuqs.spectrum.recipe.spirit_instiller.dynamic.spawner_manipulation.*; import me.shedaniel.rei.api.common.category.*; import me.shedaniel.rei.api.common.display.basic.*; -import me.shedaniel.rei.api.common.entry.*; import me.shedaniel.rei.api.common.util.*; import net.minecraft.client.*; -import net.minecraft.world.item.*; import net.minecraft.world.item.crafting.*; -import javax.annotation.*; import java.util.*; @@ -22,21 +17,11 @@ public class SpiritInstillingDisplay extends GatedSpectrumDisplay { protected final int craftingTime; public SpiritInstillingDisplay(RecipeHolder recipe) { - super(recipe, REIHelper.toEntryIngredients(recipe.value().getIngredientStacks()), Collections.singletonList(buildOutput(recipe.value()))); + super(recipe, REIHelper.toEntryIngredients(recipe.value().getIngredientStacks()), Collections.singletonList(EntryIngredients.of(recipe.value().getResultItem(BasicDisplay.registryAccess())))); this.experience = recipe.value().getExperience(); this.craftingTime = recipe.value().getCraftingTime(); } - public static EntryIngredient buildOutput(SpiritInstillerRecipe recipe) { - if (recipe instanceof SpawnerChangeRecipe spawnerChangeRecipe) { - ItemStack outputStack = recipe.getResultItem(BasicDisplay.registryAccess()); - LoreHelper.setLore(outputStack, spawnerChangeRecipe.getOutputLoreText()); - return EntryIngredients.of(outputStack); - } else { - return EntryIngredients.of(recipe.getResultItem(BasicDisplay.registryAccess())); - } - } - @Override public CategoryIdentifier getCategoryIdentifier() { return SpectrumPlugins.SPIRIT_INSTILLER; diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/TitrationBarrelCategory.java b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/TitrationBarrelCategory.java index 249a57154d..4fe3780b93 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/TitrationBarrelCategory.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/TitrationBarrelCategory.java @@ -10,7 +10,6 @@ import me.shedaniel.rei.api.common.entry.*; import me.shedaniel.rei.api.common.util.*; import net.minecraft.network.chat.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/TitrationBarrelDisplay.java b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/TitrationBarrelDisplay.java index f604682d61..6ea8ebfdf2 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/TitrationBarrelDisplay.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/TitrationBarrelDisplay.java @@ -10,9 +10,7 @@ import net.minecraft.client.*; import net.minecraft.world.item.*; import net.minecraft.world.item.crafting.*; -import net.minecraft.world.level.material.*; import net.neoforged.neoforge.fluids.crafting.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/package-info.java b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/package-info.java index 2d51ae68b3..8ebb1404ce 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/plugins/package-info.java @@ -3,6 +3,5 @@ @FieldsAreNonnullByDefault package de.dafuqs.spectrum.compat.REI.plugins; -import net.minecraft.FieldsAreNonnullByDefault; -import net.minecraft.MethodsReturnNonnullByDefault; -import org.jspecify.annotations.NullMarked; +import net.minecraft.*; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/widgets/AnimatedTexturedWidget.java b/src/main/java/de/dafuqs/spectrum/compat/REI/widgets/AnimatedTexturedWidget.java index f6b7f019b2..5914ac5da3 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/widgets/AnimatedTexturedWidget.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/widgets/AnimatedTexturedWidget.java @@ -7,7 +7,7 @@ import net.minecraft.client.gui.components.events.*; import net.minecraft.resources.*; import net.minecraft.util.*; -import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/widgets/IndexedEntryWidget.java b/src/main/java/de/dafuqs/spectrum/compat/REI/widgets/IndexedEntryWidget.java index 1605c41f67..ee62e4b668 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/widgets/IndexedEntryWidget.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/widgets/IndexedEntryWidget.java @@ -4,9 +4,7 @@ import me.shedaniel.rei.api.client.gui.widgets.*; import me.shedaniel.rei.api.common.entry.*; import me.shedaniel.rei.impl.client.gui.widget.*; -import me.shedaniel.rei.impl.client.util.*; -import java.util.*; import java.util.function.*; public class IndexedEntryWidget extends EntryWidget { @@ -18,16 +16,6 @@ public IndexedEntryWidget(Point point, Supplier indexer) { this.indexer = indexer; } - @Override - public EntryWidget entries(Collection> stacks) { - return super.entries(stacks); - } - - @Override - public Slot entries(CyclingList> stacks) { - return super.entries(stacks); - } - @Override public Slot clearEntries() { return this; diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/widgets/OffsetEntryWidget.java b/src/main/java/de/dafuqs/spectrum/compat/REI/widgets/OffsetEntryWidget.java new file mode 100644 index 0000000000..6ef4bb1e36 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/widgets/OffsetEntryWidget.java @@ -0,0 +1,45 @@ +package de.dafuqs.spectrum.compat.REI.widgets; + +import me.shedaniel.math.*; +import me.shedaniel.rei.api.client.gui.widgets.*; +import me.shedaniel.rei.api.common.entry.*; +import me.shedaniel.rei.impl.client.gui.widget.*; + +import java.util.*; +import java.util.function.*; + +public class OffsetEntryWidget extends EntryWidget { + + List inputs; + private final Supplier indexer; + int prevIndex = -1; + + public OffsetEntryWidget(Point point, List inputs, Supplier indexer) { + super(point); + this.inputs = inputs; + this.indexer = indexer; + entries(inputs.getFirst()); + } + + @Override + public Slot clearEntries() { + return this; + } + + @Override + public EntryWidget entry(EntryStack stack) { + return this; + } + + @Override + public EntryStack getCurrentEntry() { + int i = indexer.get(); + if(i != prevIndex) { + this.getCyclingEntries().clear(); + if (removeTagMatch) tagMatch = null; + entries(inputs.get(i)); + prevIndex = i; + } + return super.getCurrentEntry(); + } +} diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/widgets/package-info.java b/src/main/java/de/dafuqs/spectrum/compat/REI/widgets/package-info.java index 48416b9257..67aa2c0c71 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/widgets/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/widgets/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.compat.REI.widgets; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/SpectrumIntegrationPacks.java b/src/main/java/de/dafuqs/spectrum/compat/SpectrumIntegrationPacks.java index 77ee41a131..fcbcf80d75 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/SpectrumIntegrationPacks.java +++ b/src/main/java/de/dafuqs/spectrum/compat/SpectrumIntegrationPacks.java @@ -1,6 +1,5 @@ package de.dafuqs.spectrum.compat; -import de.dafuqs.spectrum.*; import de.dafuqs.spectrum.compat.ae2.*; import de.dafuqs.spectrum.compat.alloy_forgery.*; import de.dafuqs.spectrum.compat.botania.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/ae2/AE2Compat.java b/src/main/java/de/dafuqs/spectrum/compat/ae2/AE2Compat.java index d8bb311108..c4dc1939bd 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/ae2/AE2Compat.java +++ b/src/main/java/de/dafuqs/spectrum/compat/ae2/AE2Compat.java @@ -1,40 +1,43 @@ package de.dafuqs.spectrum.compat.ae2; -import de.dafuqs.spectrum.api.energy.color.*; -import de.dafuqs.spectrum.blocks.crystallarieum.*; +import de.dafuqs.fractal.api.*; +import de.dafuqs.spectrum.api.item_group.*; +import de.dafuqs.spectrum.blocks.gemstone.*; import de.dafuqs.spectrum.compat.*; import de.dafuqs.spectrum.registries.*; import de.dafuqs.spectrum.registries.SpectrumItems.*; import de.dafuqs.spectrum.registries.client.*; import net.minecraft.client.renderer.*; +import net.minecraft.resources.*; import net.minecraft.world.item.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.material.*; import net.neoforged.bus.api.*; import net.neoforged.fml.event.lifecycle.*; +import net.neoforged.neoforge.common.*; import net.neoforged.neoforge.registries.*; import static de.dafuqs.spectrum.registries.SpectrumBlocks.*; public class AE2Compat extends SpectrumIntegrationPacks.ModIntegrationPack { - public static DeferredBlock SMALL_CERTUS_QUARTZ_BUD = SpectrumBlocks.register(cluster(blockWithItem("small_certus_quartz_bud", () -> new SpectrumClusterBlock(BlockBehaviour.Properties.of().pushReaction(PushReaction.DESTROY).destroyTime(1.0f).mapColor(MapColor.TERRACOTTA_WHITE).requiresCorrectToolForDrops().noOcclusion(), SpectrumClusterBlock.GrowthStage.SMALL), InkColors.YELLOW), SpectrumModelTemplates.CRYSTALLARIEUM_FARMABLE)); - public static DeferredBlock LARGE_CERTUS_QUARTZ_BUD = SpectrumBlocks.register(cluster(blockWithItem("large_certus_quartz_bud", () -> new SpectrumClusterBlock(BlockBehaviour.Properties.ofFullCopy(SMALL_CERTUS_QUARTZ_BUD.get()), SpectrumClusterBlock.GrowthStage.LARGE), InkColors.YELLOW), SpectrumModelTemplates.CRYSTALLARIEUM_FARMABLE)); - public static DeferredBlock CERTUS_QUARTZ_CLUSTER = SpectrumBlocks.register(cluster(blockWithItem("certus_quartz_cluster", () -> new SpectrumClusterBlock(BlockBehaviour.Properties.ofFullCopy(SMALL_CERTUS_QUARTZ_BUD.get()), SpectrumClusterBlock.GrowthStage.CLUSTER), InkColors.YELLOW), SpectrumModelTemplates.CRYSTALLARIEUM_FARMABLE)); - public static DeferredBlock SMALL_FLUIX_BUD = SpectrumBlocks.register(cluster(blockWithItem("small_fluix_bud", () -> new SpectrumClusterBlock(BlockBehaviour.Properties.of().pushReaction(PushReaction.DESTROY).destroyTime(1.0f).mapColor(Blocks.PURPLE_CONCRETE.defaultMapColor()).requiresCorrectToolForDrops().noOcclusion(), SpectrumClusterBlock.GrowthStage.SMALL), InkColors.YELLOW), SpectrumModelTemplates.CRYSTALLARIEUM_FARMABLE)); - public static DeferredBlock LARGE_FLUIX_BUD = SpectrumBlocks.register(cluster(blockWithItem("large_fluix_bud", () -> new SpectrumClusterBlock(BlockBehaviour.Properties.ofFullCopy(SMALL_FLUIX_BUD.get()), SpectrumClusterBlock.GrowthStage.LARGE), InkColors.YELLOW), SpectrumModelTemplates.CRYSTALLARIEUM_FARMABLE)); - public static DeferredBlock FLUIX_CLUSTER = SpectrumBlocks.register(cluster(blockWithItem("fluix_cluster", () -> new SpectrumClusterBlock(BlockBehaviour.Properties.ofFullCopy(SMALL_FLUIX_BUD.get()), SpectrumClusterBlock.GrowthStage.CLUSTER), InkColors.YELLOW), SpectrumModelTemplates.CRYSTALLARIEUM_FARMABLE)); + public static DeferredBlock SMALL_CERTUS_QUARTZ_BUD = SpectrumBlocks.register(cluster(blockWithItem("small_certus_quartz_bud", () -> new SpectrumClusterBlock(BlockBehaviour.Properties.of().pushReaction(PushReaction.DESTROY).destroyTime(1.0f).mapColor(MapColor.TERRACOTTA_WHITE).requiresCorrectToolForDrops().noOcclusion(), SpectrumClusterBlock.GrowthStage.SMALL)), SpectrumModelTemplates.CRYSTALLARIEUM_FARMABLE)); + public static DeferredBlock LARGE_CERTUS_QUARTZ_BUD = SpectrumBlocks.register(cluster(blockWithItem("large_certus_quartz_bud", () -> new SpectrumClusterBlock(BlockBehaviour.Properties.ofFullCopy(SMALL_CERTUS_QUARTZ_BUD.get()), SpectrumClusterBlock.GrowthStage.LARGE)), SpectrumModelTemplates.CRYSTALLARIEUM_FARMABLE)); + public static DeferredBlock CERTUS_QUARTZ_CLUSTER = SpectrumBlocks.register(cluster(blockWithItem("certus_quartz_cluster", () -> new SpectrumClusterBlock(BlockBehaviour.Properties.ofFullCopy(SMALL_CERTUS_QUARTZ_BUD.get()), SpectrumClusterBlock.GrowthStage.CLUSTER)), SpectrumModelTemplates.CRYSTALLARIEUM_FARMABLE)); + public static DeferredBlock SMALL_FLUIX_BUD = SpectrumBlocks.register(cluster(blockWithItem("small_fluix_bud", () -> new SpectrumClusterBlock(BlockBehaviour.Properties.of().pushReaction(PushReaction.DESTROY).destroyTime(1.0f).mapColor(Blocks.PURPLE_CONCRETE.defaultMapColor()).requiresCorrectToolForDrops().noOcclusion(), SpectrumClusterBlock.GrowthStage.SMALL)), SpectrumModelTemplates.CRYSTALLARIEUM_FARMABLE)); + public static DeferredBlock LARGE_FLUIX_BUD = SpectrumBlocks.register(cluster(blockWithItem("large_fluix_bud", () -> new SpectrumClusterBlock(BlockBehaviour.Properties.ofFullCopy(SMALL_FLUIX_BUD.get()), SpectrumClusterBlock.GrowthStage.LARGE)), SpectrumModelTemplates.CRYSTALLARIEUM_FARMABLE)); + public static DeferredBlock FLUIX_CLUSTER = SpectrumBlocks.register(cluster(blockWithItem("fluix_cluster", () -> new SpectrumClusterBlock(BlockBehaviour.Properties.ofFullCopy(SMALL_FLUIX_BUD.get()), SpectrumClusterBlock.GrowthStage.CLUSTER)), SpectrumModelTemplates.CRYSTALLARIEUM_FARMABLE)); - public static DeferredBlock PURE_CERTUS_QUARTZ_BLOCK = SpectrumBlocks.register(simple(blockWithItem("pure_certus_quartz_block", () -> new Block(BlockBehaviour.Properties.of().mapColor(MapColor.SAND).strength(0.3F).sound(SoundType.GLASS)), InkColors.YELLOW))); - public static DeferredBlock PURE_FLUIX_BLOCK = SpectrumBlocks.register(simple(blockWithItem("pure_fluix_block", () -> new Block(BlockBehaviour.Properties.of().mapColor(MapColor.SAND).strength(0.3F).sound(SoundType.GLASS)), InkColors.YELLOW))); + public static DeferredBlock PURE_CERTUS_QUARTZ_BLOCK = SpectrumBlocks.register(simple(blockWithItem("pure_certus_quartz_block", () -> new Block(BlockBehaviour.Properties.of().mapColor(MapColor.SAND).strength(0.3F).sound(SoundType.GLASS))))); + public static DeferredBlock PURE_FLUIX_BLOCK = SpectrumBlocks.register(simple(blockWithItem("pure_fluix_block", () -> new Block(BlockBehaviour.Properties.of().mapColor(MapColor.SAND).strength(0.3F).sound(SoundType.GLASS))))); public static DeferredItem PURE_CERTUS_QUARTZ = SpectrumItems.register("pure_certus_quartz", () -> new Item(IS.of())); public static DeferredItem PURE_FLUIX = SpectrumItems.register("pure_fluix", () -> new Item(IS.of())); @Override public void register(IEventBus modBus) { - + NeoForge.EVENT_BUS.addListener(AE2Compat::addItemsToSubTabs); } @Override @@ -47,4 +50,23 @@ public void registerClient(FMLClientSetupEvent event) { ItemBlockRenderTypes.setRenderLayer(FLUIX_CLUSTER.get(), RenderType.cutout()); } + @SubscribeEvent + public static void addItemsToSubTabs(CreativeSubTabEvent event) { + ResourceLocation subGroupId = event.subGroup().getIdentifier(); + + if (subGroupId.equals(ItemGroupIDs.SUBTAB_PURE_RESOURCES)) { + event.getItemDisplayBuilder().accept(PURE_CERTUS_QUARTZ); + event.getItemDisplayBuilder().accept(SMALL_CERTUS_QUARTZ_BUD); + event.getItemDisplayBuilder().accept(LARGE_CERTUS_QUARTZ_BUD); + event.getItemDisplayBuilder().accept(CERTUS_QUARTZ_CLUSTER); + event.getItemDisplayBuilder().accept(PURE_CERTUS_QUARTZ_BLOCK); + + event.getItemDisplayBuilder().accept(PURE_FLUIX); + event.getItemDisplayBuilder().accept(SMALL_FLUIX_BUD); + event.getItemDisplayBuilder().accept(LARGE_FLUIX_BUD); + event.getItemDisplayBuilder().accept(FLUIX_CLUSTER); + event.getItemDisplayBuilder().accept(PURE_FLUIX_BLOCK); + } + } + } diff --git a/src/main/java/de/dafuqs/spectrum/compat/ae2/package-info.java b/src/main/java/de/dafuqs/spectrum/compat/ae2/package-info.java index 5202c678d8..af22a99bb3 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/ae2/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/compat/ae2/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.compat.ae2; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/alloy_forgery/package-info.java b/src/main/java/de/dafuqs/spectrum/compat/alloy_forgery/package-info.java index 67757c9360..d973f73f3f 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/alloy_forgery/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/compat/alloy_forgery/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.compat.alloy_forgery; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/botania/BlackestLotusItem.java b/src/main/java/de/dafuqs/spectrum/compat/botania/BlackestLotusItem.java index d1dd91118f..482fec63f9 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/botania/BlackestLotusItem.java +++ b/src/main/java/de/dafuqs/spectrum/compat/botania/BlackestLotusItem.java @@ -9,7 +9,6 @@ import vazkii.botania.api.mana.*; import vazkii.botania.common.handler.*; import vazkii.botania.common.helper.*; -import vazkii.botania.network.*; import vazkii.botania.network.clientbound.*; import vazkii.botania.xplat.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/botania/BotaniaCompat.java b/src/main/java/de/dafuqs/spectrum/compat/botania/BotaniaCompat.java index a4b7e42c75..58f69e11bf 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/botania/BotaniaCompat.java +++ b/src/main/java/de/dafuqs/spectrum/compat/botania/BotaniaCompat.java @@ -1,27 +1,16 @@ package de.dafuqs.spectrum.compat.botania; -import com.mojang.datafixers.util.*; import de.dafuqs.fractal.api.*; -import de.dafuqs.spectrum.api.color.*; -import de.dafuqs.spectrum.api.energy.color.*; -import de.dafuqs.spectrum.api.interaction.*; import de.dafuqs.spectrum.api.item_group.*; import de.dafuqs.spectrum.compat.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.resources.*; -import net.minecraft.world.entity.player.*; import net.minecraft.world.item.*; -import net.minecraft.world.level.*; -import net.minecraft.world.level.block.*; import net.neoforged.bus.api.*; import net.neoforged.fml.event.lifecycle.*; import net.neoforged.neoforge.common.*; import net.neoforged.neoforge.registries.*; -import vazkii.botania.common.item.*; -import java.util.function.*; - -import static de.dafuqs.spectrum.registries.SpectrumBlocks.simple; import static de.dafuqs.spectrum.registries.SpectrumItems.*; @SuppressWarnings("unused") diff --git a/src/main/java/de/dafuqs/spectrum/compat/botania/LeastBlackLotusItem.java b/src/main/java/de/dafuqs/spectrum/compat/botania/LeastBlackLotusItem.java index 8db1279177..2e568641a8 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/botania/LeastBlackLotusItem.java +++ b/src/main/java/de/dafuqs/spectrum/compat/botania/LeastBlackLotusItem.java @@ -9,7 +9,6 @@ import vazkii.botania.api.mana.*; import vazkii.botania.common.handler.*; import vazkii.botania.common.helper.*; -import vazkii.botania.network.*; import vazkii.botania.network.clientbound.*; import vazkii.botania.xplat.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/claims/GenericClaimModsCompat.java b/src/main/java/de/dafuqs/spectrum/compat/claims/GenericClaimModsCompat.java index 9e716e436d..81edec2271 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/claims/GenericClaimModsCompat.java +++ b/src/main/java/de/dafuqs/spectrum/compat/claims/GenericClaimModsCompat.java @@ -3,7 +3,7 @@ import net.minecraft.core.*; import net.minecraft.world.entity.*; import net.minecraft.world.level.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class GenericClaimModsCompat { diff --git a/src/main/java/de/dafuqs/spectrum/compat/claims/package-info.java b/src/main/java/de/dafuqs/spectrum/compat/claims/package-info.java index e49498373a..f2f9b001a1 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/claims/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/compat/claims/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.compat.claims; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/create/CreateCompat.java b/src/main/java/de/dafuqs/spectrum/compat/create/CreateCompat.java index 67dcc03524..0313846490 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/create/CreateCompat.java +++ b/src/main/java/de/dafuqs/spectrum/compat/create/CreateCompat.java @@ -2,12 +2,10 @@ import com.simibubi.create.api.event.*; import de.dafuqs.fractal.api.*; -import de.dafuqs.spectrum.api.energy.color.*; import de.dafuqs.spectrum.api.item_group.*; -import de.dafuqs.spectrum.blocks.crystallarieum.*; import de.dafuqs.spectrum.blocks.fluid.*; +import de.dafuqs.spectrum.blocks.gemstone.*; import de.dafuqs.spectrum.compat.*; -import de.dafuqs.spectrum.compat.botania.*; import de.dafuqs.spectrum.registries.*; import de.dafuqs.spectrum.registries.client.*; import net.minecraft.client.renderer.*; @@ -23,7 +21,7 @@ import net.neoforged.fml.event.lifecycle.*; import net.neoforged.neoforge.common.*; import net.neoforged.neoforge.registries.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import static de.dafuqs.spectrum.registries.SpectrumBlocks.*; import static de.dafuqs.spectrum.registries.SpectrumItems.*; @@ -31,10 +29,10 @@ public class CreateCompat extends SpectrumIntegrationPacks.ModIntegrationPack { public static DeferredItem PURE_ZINC = SpectrumItems.register("pure_zinc", () -> new Item(IS.of())); - public static DeferredBlock SMALL_ZINC_BUD = SpectrumBlocks.register(cluster(blockWithItem("small_zinc_bud", () -> new SpectrumClusterBlock(BlockBehaviour.Properties.of().pushReaction(PushReaction.DESTROY).destroyTime(1.0f).mapColor(Blocks.LIGHT_GRAY_CONCRETE.defaultMapColor()).requiresCorrectToolForDrops().noOcclusion(), SpectrumClusterBlock.GrowthStage.SMALL), InkColors.BROWN), ModelTemplates.CROSS)); - public static DeferredBlock LARGE_ZINC_BUD = SpectrumBlocks.register(cluster(blockWithItem("large_zinc_bud", () -> new SpectrumClusterBlock(BlockBehaviour.Properties.ofFullCopy(SMALL_ZINC_BUD.get()), SpectrumClusterBlock.GrowthStage.LARGE), InkColors.BROWN), SpectrumModelTemplates.CRYSTALLARIEUM_FARMABLE)); - public static DeferredBlock ZINC_CLUSTER = SpectrumBlocks.register(cluster(blockWithItem("zinc_cluster", () -> new SpectrumClusterBlock(BlockBehaviour.Properties.ofFullCopy(SMALL_ZINC_BUD.get()), SpectrumClusterBlock.GrowthStage.CLUSTER), InkColors.BROWN), SpectrumModelTemplates.CRYSTALLARIEUM_FARMABLE)); - public static DeferredBlock PURE_ZINC_BLOCK = SpectrumBlocks.register(simple(blockWithItem("pure_zinc_block", () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.IRON_BLOCK)), InkColors.BROWN))); + public static DeferredBlock SMALL_ZINC_BUD = SpectrumBlocks.register(cluster(blockWithItem("small_zinc_bud", () -> new SpectrumClusterBlock(BlockBehaviour.Properties.of().pushReaction(PushReaction.DESTROY).destroyTime(1.0f).mapColor(Blocks.LIGHT_GRAY_CONCRETE.defaultMapColor()).requiresCorrectToolForDrops().noOcclusion(), SpectrumClusterBlock.GrowthStage.SMALL)), ModelTemplates.CROSS)); + public static DeferredBlock LARGE_ZINC_BUD = SpectrumBlocks.register(cluster(blockWithItem("large_zinc_bud", () -> new SpectrumClusterBlock(BlockBehaviour.Properties.ofFullCopy(SMALL_ZINC_BUD.get()), SpectrumClusterBlock.GrowthStage.LARGE)), SpectrumModelTemplates.CRYSTALLARIEUM_FARMABLE)); + public static DeferredBlock ZINC_CLUSTER = SpectrumBlocks.register(cluster(blockWithItem("zinc_cluster", () -> new SpectrumClusterBlock(BlockBehaviour.Properties.ofFullCopy(SMALL_ZINC_BUD.get()), SpectrumClusterBlock.GrowthStage.CLUSTER)), SpectrumModelTemplates.CRYSTALLARIEUM_FARMABLE)); + public static DeferredBlock PURE_ZINC_BLOCK = SpectrumBlocks.register(simple(blockWithItem("pure_zinc_block", () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.IRON_BLOCK))))); @Override public void register(IEventBus modBus) { diff --git a/src/main/java/de/dafuqs/spectrum/compat/create/package-info.java b/src/main/java/de/dafuqs/spectrum/compat/create/package-info.java index 06e841da2b..a09d66b6d4 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/create/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/compat/create/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.compat.create; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/emi/GatedSpectrumEmiRecipe.java b/src/main/java/de/dafuqs/spectrum/compat/emi/GatedSpectrumEmiRecipe.java index 7dc55bb357..5ce34a1797 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/emi/GatedSpectrumEmiRecipe.java +++ b/src/main/java/de/dafuqs/spectrum/compat/emi/GatedSpectrumEmiRecipe.java @@ -5,42 +5,55 @@ import dev.emi.emi.api.stack.*; import dev.emi.emi.api.widget.*; import net.minecraft.network.chat.*; +import net.minecraft.resources.*; +import net.minecraft.world.item.*; import net.minecraft.world.item.crafting.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; +import java.util.function.*; +import java.util.stream.*; public abstract class GatedSpectrumEmiRecipe> extends SpectrumEmiRecipe { public static final Component SECRET = Component.translatable("container.spectrum.rei.pedestal_crafting.secret_recipe"); public static final Component SECRET_HINT = Component.translatable("container.spectrum.rei.pedestal_crafting.secret_recipe.hint"); + public final @Nullable ResourceLocation revealSecretAdvancement; public final @Nullable Component secretHintText; - public final T recipe; public GatedSpectrumEmiRecipe(EmiRecipeCategory category, RecipeHolder entry, int width, int height) { super(category, entry.value().getRecipeTypeUnlockIdentifier(), entry.id(), width, height); this.recipe = entry.value(); - this.outputs = List.of(EmiStack.of(entry.value().getResultItem(getRegistryManager()))); + + this.outputs = buildOutputs(entry.value()); + + this.revealSecretAdvancement = entry.value().getRevealSecretAdvancement().orElse(null); this.secretHintText = entry.value().getSecretHintText(getId()); } + public List buildOutputs(T recipe) { + List out = new ArrayList<>(); + out.add(EmiStack.of(recipe.getResultItem(getRegistryManager()))); + out.addAll(recipe.getAdditionalResults().stream().map(EmiStack::of).toList()); + return out; + } + @Override public boolean isUnlocked() { - return hasAdvancement(recipe.getRequiredAdvancementIdentifier().orElse(null)) && super.isUnlocked(); + return hasAdvancement(recipe.getRequiredAdvancement().orElse(null)) && super.isUnlocked(); } - @Override - public boolean hideCraftable() { - return recipe.isSecret() || super.hideCraftable(); + public boolean isSecret() { + return revealSecretAdvancement != null && !hasAdvancement(revealSecretAdvancement); } @Override public void addWidgets(WidgetHolder widgets) { - if (recipe.isSecret() && isUnlocked()) { + if (isUnlocked() && isSecret()) { if (secretHintText == null) { - widgets.addText(SECRET, getDisplayWidth() / 2, getDisplayHeight() / 2, 0x3f3f3f, false).horizontalAlign(TextWidget.Alignment.CENTER); + widgets.addText(SECRET, getDisplayWidth() / 2, getDisplayHeight() / 2 - 4, 0x3f3f3f, false).horizontalAlign(TextWidget.Alignment.CENTER); } else { widgets.addText(SECRET_HINT, getDisplayWidth() / 2, getDisplayHeight() / 2 - 8, 0x3f3f3f, false).horizontalAlign(TextWidget.Alignment.CENTER); widgets.addText(secretHintText, getDisplayWidth() / 2, getDisplayHeight() / 2 + 2, 0x3f3f3f, false).horizontalAlign(TextWidget.Alignment.CENTER); diff --git a/src/main/java/de/dafuqs/spectrum/compat/emi/SpectrumEmiPlugin.java b/src/main/java/de/dafuqs/spectrum/compat/emi/SpectrumEmiPlugin.java index b1b7f05cf1..e84dbb5154 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/emi/SpectrumEmiPlugin.java +++ b/src/main/java/de/dafuqs/spectrum/compat/emi/SpectrumEmiPlugin.java @@ -9,6 +9,7 @@ import de.dafuqs.spectrum.data_loaders.*; import de.dafuqs.spectrum.inventories.*; import de.dafuqs.spectrum.inventories.slots.*; +import de.dafuqs.spectrum.recipe.crafting.*; import de.dafuqs.spectrum.recipe.fluid_converting.*; import de.dafuqs.spectrum.registries.*; import dev.emi.emi.api.*; @@ -65,7 +66,6 @@ public void registerCategories(EmiRegistry registry) { registry.addCategory(SpectrumEmiRecipeCategories.POTION_WORKSHOP_CRAFTING); registry.addCategory(SpectrumEmiRecipeCategories.POTION_WORKSHOP_REACTING); registry.addCategory(SpectrumEmiRecipeCategories.SPIRIT_INSTILLER); - registry.addCategory(SpectrumEmiRecipeCategories.SLUDGE_CONVERTING); registry.addCategory(SpectrumEmiRecipeCategories.LIQUID_CRYSTAL_CONVERTING); registry.addCategory(SpectrumEmiRecipeCategories.MIDNIGHT_SOLUTION_CONVERTING); registry.addCategory(SpectrumEmiRecipeCategories.DRAGONROT_CONVERTING); @@ -105,7 +105,6 @@ public void registerCategories(EmiRegistry registry) { registry.addWorkstation(SpectrumEmiRecipeCategories.FREEZING, EmiStack.of(SpectrumBlocks.POLAR_BEAR_IDOL)); registry.addWorkstation(SpectrumEmiRecipeCategories.ENCHANTER, EmiStack.of(SpectrumBlocks.ENCHANTER)); registry.addWorkstation(SpectrumEmiRecipeCategories.ENCHANTMENT_UPGRADE, EmiStack.of(SpectrumBlocks.ENCHANTER)); - registry.addWorkstation(SpectrumEmiRecipeCategories.SLUDGE_CONVERTING, EmiStack.of(SpectrumItems.SLUDGE_BUCKET)); registry.addWorkstation(SpectrumEmiRecipeCategories.LIQUID_CRYSTAL_CONVERTING, EmiStack.of(SpectrumItems.LIQUID_CRYSTAL_BUCKET)); registry.addWorkstation(SpectrumEmiRecipeCategories.MIDNIGHT_SOLUTION_CONVERTING, EmiStack.of(SpectrumItems.MIDNIGHT_SOLUTION_BUCKET)); registry.addWorkstation(SpectrumEmiRecipeCategories.DRAGONROT_CONVERTING, EmiStack.of(SpectrumItems.DRAGONROT_BUCKET)); @@ -121,11 +120,11 @@ public void registerCategories(EmiRegistry registry) { } public void registerRecipes(EmiRegistry registry) { - // TODO: Register our recipes ourselves - // right now dev.emi.emi.VanillaPlugin handles them - // which does not process the unlock check - //addAll(registry, RecipeType.CRAFTING, ShapedGatedCraftingEMIRecipe::new); - //addAll(registry, RecipeType.CRAFTING, ShapelessGatedCraftingEMIRecipe::new); + for (RecipeHolder recipe : registry.getRecipeManager().getAllRecipesFor(RecipeType.CRAFTING)) { + if(recipe.value() instanceof GatedCraftingRecipe) { + addRecipeSafe(registry, () -> new CraftingEMIRecipeGated((RecipeHolder)(Object) recipe)); + } + } addAll(registry, SpectrumRecipeTypes.ANVIL_CRUSHING, AnvilCrushingEmiRecipeGated::new); addAll(registry, SpectrumRecipeTypes.PEDESTAL, PedestalCraftingEmiRecipeGated::new); @@ -136,7 +135,6 @@ public void registerRecipes(EmiRegistry registry) { addAll(registry, SpectrumRecipeTypes.POTION_WORKSHOP_CRAFTING, (r) -> new PotionWorkshopEmiRecipeGated<>(SpectrumEmiRecipeCategories.POTION_WORKSHOP_CRAFTING, r)); addAll(registry, SpectrumRecipeTypes.POTION_WORKSHOP_REACTING, PotionWorkshopReactingEmiRecipe::new); addAll(registry, SpectrumRecipeTypes.SPIRIT_INSTILLING, SpiritInstillingEmiRecipeGated::new); - addAll(registry, SpectrumRecipeTypes.SLUDGE_CONVERTING, (r) -> new FluidConvertingEmiRecipeGated<>(SpectrumEmiRecipeCategories.SLUDGE_CONVERTING, r)); addAll(registry, SpectrumRecipeTypes.LIQUID_CRYSTAL_CONVERTING, (r) -> new FluidConvertingEmiRecipeGated<>(SpectrumEmiRecipeCategories.LIQUID_CRYSTAL_CONVERTING, r)); addAll(registry, SpectrumRecipeTypes.MIDNIGHT_SOLUTION_CONVERTING, (r) -> new FluidConvertingEmiRecipeGated<>(SpectrumEmiRecipeCategories.MIDNIGHT_SOLUTION_CONVERTING, r)); addAll(registry, SpectrumRecipeTypes.DRAGONROT_CONVERTING, (r) -> new FluidConvertingEmiRecipeGated<>(SpectrumEmiRecipeCategories.DRAGONROT_CONVERTING, r)); @@ -190,20 +188,12 @@ public void registerRecipes(EmiRegistry registry) { EmiStack dragonrot = EmiStack.of(SpectrumFluids.DRAGONROT.get(), amount); EmiStack liquidCrystal = EmiStack.of(SpectrumFluids.LIQUID_CRYSTAL.get(), amount); EmiStack midnightSolution = EmiStack.of(SpectrumFluids.MIDNIGHT_SOLUTION.get(), amount); - EmiStack sludge = EmiStack.of(SpectrumFluids.SLUDGE.get(), amount); EmiStack waterCatalyst = water.copy().setRemainder(water); EmiStack lavaCatalyst = lava.copy().setRemainder(lava); EmiStack dragonrotCatalyst = dragonrot.copy().setRemainder(dragonrot); EmiStack liquidCrystalCatalyst = liquidCrystal.copy().setRemainder(liquidCrystal); EmiStack midnightSolutionCatalyst = midnightSolution.copy().setRemainder(midnightSolution); - EmiStack sludgeCatalyst = sludge.copy().setRemainder(sludge); - addRecipeSafe(registry, () -> SpectrumWorldInteractionRecipe.customBuilder() - .id(syntheticId("world/fluid_interaction", SpectrumBlocks.SLUSH.get())) - .leftInput(dragonrotCatalyst) - .rightInput(waterCatalyst, false) - .output(EmiStack.of(SpectrumBlocks.SLUSH)) - .requiredAdvancement(DragonrotConvertingRecipe.UNLOCK_IDENTIFIER) - .build()); + addRecipeSafe(registry, () -> SpectrumWorldInteractionRecipe.customBuilder() .id(syntheticId("world/fluid_interaction", Blocks.TERRACOTTA)) .leftInput(dragonrotCatalyst) @@ -211,22 +201,6 @@ public void registerRecipes(EmiRegistry registry) { .output(EmiStack.of(Blocks.TERRACOTTA)) .requiredAdvancement(DragonrotConvertingRecipe.UNLOCK_IDENTIFIER) .build()); - addRecipeSafe(registry, () -> SpectrumWorldInteractionRecipe.customBuilder() - .id(syntheticId("world/fluid_interaction", SpectrumBlocks.BLACKSLAG.get())) - .leftInput(dragonrotCatalyst) - .rightInput(sludgeCatalyst, false) - .output(EmiStack.of(SpectrumBlocks.BLACKSLAG)) - .requiredAdvancement(DragonrotConvertingRecipe.UNLOCK_IDENTIFIER) - .requiredAdvancement(SludgeConvertingRecipe.UNLOCK_IDENTIFIER) - .build()); - addRecipeSafe(registry, () -> SpectrumWorldInteractionRecipe.customBuilder() - .id(syntheticId("world/fluid_interaction", SpectrumBlocks.COBBLED_BLACKSLAG.get())) - .leftInput(dragonrotCatalyst) - .rightInput(sludgeCatalyst, false) - .output(EmiStack.of(SpectrumBlocks.COBBLED_BLACKSLAG.get())) - .requiredAdvancement(DragonrotConvertingRecipe.UNLOCK_IDENTIFIER) - .requiredAdvancement(SludgeConvertingRecipe.UNLOCK_IDENTIFIER) - .build()); addRecipeSafe(registry, () -> SpectrumWorldInteractionRecipe.customBuilder() .id(syntheticId("world/fluid_interaction", Blocks.TUFF)) .leftInput(dragonrotCatalyst) @@ -251,10 +225,10 @@ public void registerRecipes(EmiRegistry registry) { .requiredAdvancement(LiquidCrystalConvertingRecipe.UNLOCK_IDENTIFIER) .build()); addRecipeSafe(registry, () -> SpectrumWorldInteractionRecipe.customBuilder() - .id(syntheticId("world/fluid_interaction", Blocks.CALCITE)) + .id(syntheticId("world/fluid_interaction", Blocks.CLAY)) .leftInput(liquidCrystalCatalyst) .rightInput(waterCatalyst, false) - .output(EmiStack.of(Blocks.CALCITE)) + .output(EmiStack.of(Blocks.CLAY)) .requiredAdvancement(LiquidCrystalConvertingRecipe.UNLOCK_IDENTIFIER) .build()); addRecipeSafe(registry, () -> SpectrumWorldInteractionRecipe.customBuilder() @@ -265,19 +239,11 @@ public void registerRecipes(EmiRegistry registry) { .requiredAdvancement(LiquidCrystalConvertingRecipe.UNLOCK_IDENTIFIER) .build()); addRecipeSafe(registry, () -> SpectrumWorldInteractionRecipe.customBuilder() - .id(syntheticId("world/fluid_interaction", Blocks.COBBLED_DEEPSLATE)) + .id(syntheticId("world/fluid_interaction", Blocks.CALCITE)) .leftInput(liquidCrystalCatalyst) .rightInput(lavaCatalyst, false) - .output(EmiStack.of(Blocks.COBBLED_DEEPSLATE)) - .requiredAdvancement(LiquidCrystalConvertingRecipe.UNLOCK_IDENTIFIER) - .build()); - addRecipeSafe(registry, () -> SpectrumWorldInteractionRecipe.customBuilder() - .id(syntheticId("world/fluid_interaction", Blocks.CLAY)) - .leftInput(liquidCrystalCatalyst) - .rightInput(sludgeCatalyst, false) - .output(EmiStack.of(Blocks.CLAY)) + .output(EmiStack.of(Blocks.CALCITE)) .requiredAdvancement(LiquidCrystalConvertingRecipe.UNLOCK_IDENTIFIER) - .requiredAdvancement(SludgeConvertingRecipe.UNLOCK_IDENTIFIER) .build()); addRecipeSafe(registry, () -> SpectrumWorldInteractionRecipe.customBuilder() .id(syntheticId("world/fluid_interaction", Blocks.BLACKSTONE)) @@ -286,34 +252,13 @@ public void registerRecipes(EmiRegistry registry) { .output(EmiStack.of(Blocks.BLACKSTONE)) .requiredAdvancement(MidnightSolutionConvertingRecipe.UNLOCK_IDENTIFIER) .build()); - addRecipeSafe(registry, () -> SpectrumWorldInteractionRecipe.customBuilder() - .id(syntheticId("world/fluid_interaction", Blocks.DIRT)) - .leftInput(sludgeCatalyst) - .rightInput(waterCatalyst, false) - .output(EmiStack.of(Blocks.DIRT)) - .requiredAdvancement(SludgeConvertingRecipe.UNLOCK_IDENTIFIER) - .build()); - addRecipeSafe(registry, () -> SpectrumWorldInteractionRecipe.customBuilder() - .id(syntheticId("world/fluid_interaction", Blocks.COARSE_DIRT)) - .leftInput(sludgeCatalyst) - .rightInput(waterCatalyst, false) - .output(EmiStack.of(Blocks.COARSE_DIRT)) - .requiredAdvancement(SludgeConvertingRecipe.UNLOCK_IDENTIFIER) - .build()); - addRecipeSafe(registry, () -> SpectrumWorldInteractionRecipe.customBuilder() - .id(syntheticId("world/fluid_interaction", Blocks.MUD)) - .leftInput(sludgeCatalyst) - .rightInput(lavaCatalyst, false) - .output(EmiStack.of(Blocks.MUD)) - .requiredAdvancement(SludgeConvertingRecipe.UNLOCK_IDENTIFIER) - .build()); } public void registerRecipeHandlers(EmiRegistry registry) { - registry.addRecipeHandler(SpectrumScreenHandlerTypes.PEDESTAL, new PedestalRecipeHandler()); - registry.addRecipeHandler(SpectrumScreenHandlerTypes.CRAFTING_TABLET, new CraftingTabletRecipeHandler()); - registry.addRecipeHandler(SpectrumScreenHandlerTypes.CINDERHEARTH, new CinderhearthRecipeHandler()); - registry.addRecipeHandler(SpectrumScreenHandlerTypes.POTION_WORKSHOP, new PotionWorkshopRecipeHandler()); + registry.addRecipeHandler(SpectrumMenuTypes.PEDESTAL, new PedestalRecipeHandler()); + registry.addRecipeHandler(SpectrumMenuTypes.CRAFTING_TABLET, new CraftingTabletRecipeHandler()); + registry.addRecipeHandler(SpectrumMenuTypes.CINDERHEARTH, new CinderhearthRecipeHandler()); + registry.addRecipeHandler(SpectrumMenuTypes.POTION_WORKSHOP, new PotionWorkshopRecipeHandler()); } public static ResourceLocation syntheticId(String type, Block block) { diff --git a/src/main/java/de/dafuqs/spectrum/compat/emi/SpectrumEmiRecipe.java b/src/main/java/de/dafuqs/spectrum/compat/emi/SpectrumEmiRecipe.java index 1563bebac2..34072d3557 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/emi/SpectrumEmiRecipe.java +++ b/src/main/java/de/dafuqs/spectrum/compat/emi/SpectrumEmiRecipe.java @@ -1,6 +1,7 @@ package de.dafuqs.spectrum.compat.emi; import de.dafuqs.revelationary.api.advancements.*; +import de.dafuqs.spectrum.api.recipe.*; import dev.emi.emi.api.recipe.*; import dev.emi.emi.api.stack.*; import dev.emi.emi.api.widget.TextWidget.*; @@ -9,7 +10,7 @@ import net.minecraft.core.*; import net.minecraft.network.chat.*; import net.minecraft.resources.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; @@ -30,6 +31,14 @@ public SpectrumEmiRecipe(EmiRecipeCategory category, @Nullable ResourceLocation this.height = height; } + public static EmiIngredient ofIngredientStack(IngredientStack s) { + return EmiIngredient.of(s.getItems().map(EmiStack::of).toList()); + } + + public static List ofIngredientStacks(Collection s) { + return s.stream().map(SpectrumEmiRecipe::ofIngredientStack).toList(); + } + public RegistryAccess getRegistryManager() { return Minecraft.getInstance().level.registryAccess(); } diff --git a/src/main/java/de/dafuqs/spectrum/compat/emi/SpectrumEmiRecipeCategories.java b/src/main/java/de/dafuqs/spectrum/compat/emi/SpectrumEmiRecipeCategories.java index c915f93389..ef125b7e31 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/emi/SpectrumEmiRecipeCategories.java +++ b/src/main/java/de/dafuqs/spectrum/compat/emi/SpectrumEmiRecipeCategories.java @@ -20,7 +20,6 @@ public class SpectrumEmiRecipeCategories { public static final EmiRecipeCategory POTION_WORKSHOP_CRAFTING = new SpectrumCategory(SpectrumCommon.locate("potion_workshop_crafting"), EmiStack.of(SpectrumBlocks.POTION_WORKSHOP)); public static final EmiRecipeCategory POTION_WORKSHOP_REACTING = new SpectrumCategory(SpectrumCommon.locate("potion_workshop_reacting"), EmiStack.of(SpectrumBlocks.POTION_WORKSHOP)); public static final EmiRecipeCategory SPIRIT_INSTILLER = new SpectrumCategory(SpectrumCommon.locate("spirit_instiller"), EmiStack.of(SpectrumBlocks.SPIRIT_INSTILLER), SpectrumBlocks.SPIRIT_INSTILLER.get().getDescriptionId()); - public static final EmiRecipeCategory SLUDGE_CONVERTING = new SpectrumCategory(SpectrumCommon.locate("sludge_converting"), EmiStack.of(SpectrumItems.SLUDGE_BUCKET)); public static final EmiRecipeCategory LIQUID_CRYSTAL_CONVERTING = new SpectrumCategory(SpectrumCommon.locate("liquid_crystal_converting"), EmiStack.of(SpectrumItems.LIQUID_CRYSTAL_BUCKET)); public static final EmiRecipeCategory MIDNIGHT_SOLUTION_CONVERTING = new SpectrumCategory(SpectrumCommon.locate("midnight_solution_converting"), EmiStack.of(SpectrumItems.MIDNIGHT_SOLUTION_BUCKET)); public static final EmiRecipeCategory DRAGONROT_CONVERTING = new SpectrumCategory(SpectrumCommon.locate("dragonrot_converting"), EmiStack.of(SpectrumItems.DRAGONROT_BUCKET), "container.spectrum.rei.dragonrot_converting.title"); diff --git a/src/main/java/de/dafuqs/spectrum/compat/emi/handlers/package-info.java b/src/main/java/de/dafuqs/spectrum/compat/emi/handlers/package-info.java index f9e7ed11a1..b36acd2faf 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/emi/handlers/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/compat/emi/handlers/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.compat.emi.handlers; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/emi/package-info.java b/src/main/java/de/dafuqs/spectrum/compat/emi/package-info.java index 1d8b33757f..98a6dd1f8a 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/emi/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/compat/emi/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.compat.emi; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/CinderhearthEmiRecipeGated.java b/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/CinderhearthEmiRecipeGated.java index f540256475..718d4fd5dd 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/CinderhearthEmiRecipeGated.java +++ b/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/CinderhearthEmiRecipeGated.java @@ -8,12 +8,18 @@ import dev.emi.emi.api.widget.*; import net.minecraft.world.item.crafting.*; +import java.util.*; +import java.util.stream.*; + public class CinderhearthEmiRecipeGated extends GatedSpectrumEmiRecipe { public CinderhearthEmiRecipeGated(RecipeHolder entry) { super(SpectrumEmiRecipeCategories.CINDERHEARTH, entry, 136, 48); - this.inputs = recipe.getIngredientStacks().stream().map(s -> EmiIngredient.of(s.getItems().map(EmiStack::of).toList())).toList(); - this.outputs = recipe.getResultsWithChance().stream().map(p -> EmiStack.of(p.stack()).setChance(p.chance())).toList(); + this.inputs = ofIngredientStacks(recipe.getIngredientStacks()); + + this.outputs = new ArrayList<>(); + this.outputs.addAll(recipe.getResultsWithChance().stream().map(p -> EmiStack.of(p.stack()).setChance(p.chance())).toList()); + this.outputs.addAll(recipe.getAdditionalResults().stream().map(EmiStack::of).toList()); } @Override diff --git a/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/CraftingEMIRecipeGated.java b/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/CraftingEMIRecipeGated.java new file mode 100644 index 0000000000..ddfcf979c1 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/CraftingEMIRecipeGated.java @@ -0,0 +1,91 @@ +package de.dafuqs.spectrum.compat.emi.recipes; + +import com.google.common.collect.*; +import de.dafuqs.spectrum.compat.emi.*; +import de.dafuqs.spectrum.recipe.crafting.*; +import dev.emi.emi.api.recipe.*; +import dev.emi.emi.api.render.*; +import dev.emi.emi.api.stack.*; +import dev.emi.emi.api.widget.*; +import dev.emi.emi.recipe.*; +import net.minecraft.world.item.*; +import net.minecraft.world.item.crafting.*; + +import java.util.*; + +// An amalgam of EmiShapedRecipe & EmiShapelessRecipe +public class CraftingEMIRecipeGated extends GatedSpectrumEmiRecipe { + + protected boolean shapeless = false; + + public CraftingEMIRecipeGated(RecipeHolder recipe) { + super(VanillaEmiRecipeCategories.CRAFTING, recipe, 118, 54); + if(recipe.value() instanceof ShapedGatedCraftingRecipe shapedGatedCraftingRecipe) { + this.inputs = padIngredients(shapedGatedCraftingRecipe); + } else { + this.inputs = recipe.value().getIngredients().stream().map(EmiIngredient::of).toList(); + this.shapeless = true; + } + } + + private static List padIngredients(ShapedGatedCraftingRecipe recipe) { + List list = Lists.newArrayList(); + int i = 0; + for (int y = 0; y < 3; y++) { + for (int x = 0; x < 3; x++) { + if (x >= recipe.getWidth() || y >= recipe.getHeight() || i >= recipe.getIngredients().size()) { + list.add(EmiStack.EMPTY); + } else { + list.add(EmiIngredient.of(recipe.getIngredients().get(i++))); + } + } + } + return list; + } + + public boolean canFit(int width, int height) { + if(shapeless) { + return this.inputs.size() <= width * height; + } else { + if (inputs.size() > 9) { + return false; + } + for (int i = 0; i < inputs.size(); i++) { + int x = i % 3; + int y = i / 3; + if (!inputs.get(i).isEmpty() && (x >= width || y >= height)) { + return false; + } + } + return true; + } + } + + @Override + public void addUnlockedWidgets(WidgetHolder widgets) { + if (shapeless) { + widgets.addTexture(EmiTexture.SHAPELESS, 97, 0); + } + widgets.addTexture(EmiTexture.EMPTY_ARROW, 60, 18); + + int sOff = 0; + if (!shapeless) { + if (canFit(1, 3)) { + sOff -= 1; + } + if (canFit(3, 1)) { + sOff -= 3; + } + } + for (int i = 0; i < 9; i++) { + int s = i + sOff; + if (s >= 0 && s < this.inputs.size()) { + widgets.addSlot(this.inputs.get(s), i % 3 * 18, i / 3 * 18); + } else { + widgets.addSlot(EmiStack.of(ItemStack.EMPTY), i % 3 * 18, i / 3 * 18); + } + } + widgets.addSlot(this.outputs.getFirst(), 92, 14).large(true).recipeContext(this); + } + +} \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/CrystallarieumEmiRecipeGated.java b/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/CrystallarieumEmiRecipeGated.java index 03d7e82399..d680d5a6da 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/CrystallarieumEmiRecipeGated.java +++ b/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/CrystallarieumEmiRecipeGated.java @@ -1,19 +1,22 @@ package de.dafuqs.spectrum.compat.emi.recipes; import de.dafuqs.spectrum.*; -import de.dafuqs.spectrum.blocks.crystallarieum.*; +import de.dafuqs.spectrum.blocks.ink.sink.*; import de.dafuqs.spectrum.compat.emi.*; import de.dafuqs.spectrum.recipe.crystallarieum.*; import de.dafuqs.spectrum.registries.*; import dev.emi.emi.api.neoforge.*; import dev.emi.emi.api.stack.*; import dev.emi.emi.api.widget.*; -import dev.emi.emi.platform.neoforge.*; import net.minecraft.network.chat.*; import net.minecraft.resources.*; +import net.minecraft.world.item.*; import net.minecraft.world.item.crafting.*; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.state.*; import java.util.*; +import java.util.function.*; import java.util.stream.*; public class CrystallarieumEmiRecipeGated extends GatedSpectrumEmiRecipe { @@ -23,29 +26,40 @@ public class CrystallarieumEmiRecipeGated extends GatedSpectrumEmiRecipe entry) { super(SpectrumEmiRecipeCategories.CRYSTALLARIEUM, entry, 124, 100); - inputs = List.of( - EmiIngredient.of(recipe.getIngredientStack()), - EmiStack.of(recipe.getGrowthStages().getFirst().getBlock()) - ); - outputs = Stream.concat( - Stream.concat( - Stream.of(recipe.getResultItem(getRegistryManager())), - recipe.getAdditionalResults().stream()) - .map(EmiStack::of), - recipe.getGrowthStages().stream().map(s -> EmiStack.of(s.getBlock())).filter(s -> !s.isEmpty()) - ).toList(); + + inputs = new ArrayList<>(); + inputs.add(EmiIngredient.of(recipe.getIngredientStack())); + inputs.add(EmiStack.of(recipe.getGrowthStages().getFirst().getBlock())); + recipe.getAdditives() + .stream() + .map((i) -> EmiIngredient.of(i.ingredient())) + .forEach(e -> inputs.add(e)); + + outputs.addAll(recipe.getGrowthStages().stream().map(state -> { + Block block = state.getBlock(); + return block instanceof LiquidBlock liquidBlock ? EmiStack.of(liquidBlock.fluid) : EmiStack.of(block); + }).toList()); + } + + @Override + public List getInputs() { + return super.getInputs(); } @Override public void addUnlockedWidgets(WidgetHolder widgets) { widgets.addSlot(inputs.getFirst(), 0, 0); - widgets.addSlot(NeoForgeEmiIngredient.of(recipe.getFluidIngredient()), 0, 18); + widgets.addSlot(NeoForgeEmiIngredient.of(recipe.getFluid()), 0, 18); widgets.addSlot(EmiStack.of(CrystallarieumBlock.withColor(SpectrumBlocks.CRYSTALLARIEUM.toStack(), recipe.getInkColor())), 20, 18).drawBack(false); widgets.addFillingArrow(40, 9, recipe.getSecondsPerGrowthStage() * 1000); - List states = recipe.getGrowthStages().stream().map(s -> EmiStack.of(s.getBlock())).toList(); + // Yes, there was a request for the Crystallarieum to grow fluids + List states = recipe.getGrowthStages().stream().map(state -> { + Block block = state.getBlock(); + return block instanceof LiquidBlock liquidBlock ? EmiStack.of(liquidBlock.fluid) : EmiStack.of(block); + }).toList(); Iterator it = states.iterator(); widgets.addSlot(it.next(), 20, 0); int x = 66; @@ -54,29 +68,29 @@ public void addUnlockedWidgets(WidgetHolder widgets) { x += 20; } - // catalysts - widgets.addText(Component.translatable("container.spectrum.rei.crystallarieum.catalyst"), 0, 43, 0x3f3f3f, false); + // additives + widgets.addText(Component.translatable("container.spectrum.rei.crystallarieum.additive"), 0, 43, 0x3f3f3f, false); widgets.addText(Component.translatable("container.spectrum.rei.crystallarieum.speed"), 0, 49 + LINE_HEIGHT, 0x3f3f3f, false); widgets.addText(Component.translatable("container.spectrum.rei.crystallarieum.ink_drain"), 0, 49 + LINE_HEIGHT * 2, 0x3f3f3f, false); widgets.addText(Component.translatable("container.spectrum.rei.crystallarieum.depletion"), 0, 49 + LINE_HEIGHT * 3, 0x3f3f3f, false); - List catalysts = recipe.getCatalysts(); - for (int i = 0; i < catalysts.size(); i++) { - CrystallarieumCatalyst catalyst = catalysts.get(i); + List additives = recipe.getAdditives(); + for (int i = 0; i < additives.size(); i++) { + CrystallarieumAdditive additive = additives.get(i); int xOff = 46 + 18 * i; - widgets.addSlot(EmiIngredient.of(catalyst.ingredient()), xOff, 38); - int offsetU = CrystallarieumRecipe.growthSpeedOffsetU(catalyst); + widgets.addSlot(EmiIngredient.of(additive.ingredient()), xOff, 38); + int offsetU = CrystallarieumRecipe.growthSpeedOffsetU(additive); widgets.addTexture(BACKGROUND_TEXTURE, xOff + 5, 59, 7, 7, offsetU, CrystallarieumRecipe.GROWTH_SPEED_V, 7, 7, 128, 128); - offsetU = CrystallarieumRecipe.consumptionOffsetU(catalyst, offsetU); + offsetU = CrystallarieumRecipe.consumptionOffsetU(additive, offsetU); widgets.addTexture(BACKGROUND_TEXTURE, xOff + 5, 69, 7, 7, offsetU, CrystallarieumRecipe.CONSUMPTION_V, 7, 7, 128, 128); - offsetU = CrystallarieumRecipe.consumeChanceOffsetU(catalyst, offsetU); + offsetU = CrystallarieumRecipe.consumeChanceOffsetU(additive, offsetU); widgets.addTexture(BACKGROUND_TEXTURE, xOff + 5, 79, 7, 7, offsetU, CrystallarieumRecipe.CONSUME_CHANCE_V, 7, 7, 128, 128); } - if (recipe.growsWithoutCatalyst()) { - widgets.addText(Component.translatable("container.spectrum.rei.crystallarieum.crafting_time_per_stage_seconds_catalyst_optional", recipe.getSecondsPerGrowthStage()), 0, 90, 0x3f3f3f, false); + if (recipe.growsWithoutAdditive()) { + widgets.addText(Component.translatable("container.spectrum.rei.crystallarieum.crafting_time_per_stage_seconds_additive_optional", recipe.getSecondsPerGrowthStage()), 0, 90, 0x3f3f3f, false); } else { widgets.addText(Component.translatable("container.spectrum.rei.crystallarieum.crafting_time_per_stage_seconds", recipe.getSecondsPerGrowthStage()), 0, 90, 0x3f3f3f, false); } diff --git a/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/EnchantmentUpgradeEmiRecipeGated.java b/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/EnchantmentUpgradeEmiRecipeGated.java index 5220f7706a..f87ee866af 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/EnchantmentUpgradeEmiRecipeGated.java +++ b/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/EnchantmentUpgradeEmiRecipeGated.java @@ -1,13 +1,13 @@ package de.dafuqs.spectrum.compat.emi.recipes; -import com.google.common.collect.*; import de.dafuqs.revelationary.api.advancements.*; import de.dafuqs.spectrum.*; import de.dafuqs.spectrum.blocks.enchanter.*; import de.dafuqs.spectrum.compat.emi.*; import de.dafuqs.spectrum.compat.emi.widgets.*; +import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.items.magic_items.*; -import de.dafuqs.spectrum.recipe.*; +import de.dafuqs.spectrum.recipe.cinderhearth.*; import de.dafuqs.spectrum.recipe.enchanter.*; import de.dafuqs.spectrum.registries.*; import dev.emi.emi.api.recipe.*; @@ -15,15 +15,15 @@ import dev.emi.emi.api.stack.*; import dev.emi.emi.api.widget.*; import net.minecraft.client.*; -import net.minecraft.core.component.*; +import net.minecraft.core.*; import net.minecraft.network.chat.*; import net.minecraft.resources.*; import net.minecraft.util.*; -import net.minecraft.world.item.*; import net.minecraft.world.item.crafting.*; import net.minecraft.world.item.enchantment.*; import java.util.*; +import java.util.stream.*; public class EnchantmentUpgradeEmiRecipeGated extends GatedSpectrumEmiRecipe { @@ -31,51 +31,36 @@ public class EnchantmentUpgradeEmiRecipeGated extends GatedSpectrumEmiRecipe levelData; + private int selectedSourceLevel = 1; public EnchantmentUpgradeEmiRecipeGated(EmiRecipeCategory category, RecipeHolder entry) { super(category, entry, 132, 90); - this.itemScaling = recipe.getItemScaling(); - this.xpScaling = recipe.getXPScaling(); - - inputs = Lists.newArrayList(); + this.levelData = recipe.getLevelData(); - var enchant = recipe.getEnchantment(); + Holder enchant = recipe.getEnchantment(); levelCap = recipe.getLevelCap(); maxNormal = enchant.value().getMaxLevel(); transKey = enchant.value().description().copy().withStyle(s -> s.withItalic(true)); - for (int i = 0; i < 8; i++) { - inputs.add(EmiStack.of(recipe.getBulkItem(), 1)); - } + this.inputs = recipe.getIngredientStacks().stream() + .map(s -> EmiIngredient.of(s.getItems().map(EmiStack::of).toList())) + .collect(Collectors.toCollection(ArrayList::new)); // Then the xp - inputs.add(EmiStack.of(KnowledgeGemItem.getKnowledgeDropStackWithXP(recipe.getBaseXPCost(), true))); + inputs.add(EmiStack.of(KnowledgeGemItem.getKnowledgeDropStackWithXP(recipe.getLevelData().getFirst().experience(), true))); this.outputs = new ArrayList<>(); // Last the book - for (int i = 1; i <= levelCap; i++) { - var enchStack = new ItemStack(Items.ENCHANTED_BOOK); - var builder = new ItemEnchantments.Mutable(ItemEnchantments.EMPTY); - - builder.set(enchant, i); - enchStack.set(DataComponents.STORED_ENCHANTMENTS, builder.toImmutable()); - inputs.add(EmiStack.of(enchStack.copy())); - - if (i > 1) { - enchStack.set(DataComponents.STORED_ENCHANTMENTS, builder.toImmutable()); - outputs.add(EmiStack.of(enchStack)); - } + for (int i = 1; i < levelCap; i++) { + inputs.add(EmiStack.of(SpectrumEnchantmentHelper.getEnchantedBookStackWith(enchant, i))); + outputs.add(EmiStack.of(SpectrumEnchantmentHelper.getEnchantedBookStackWith(enchant, i+1))); } - + outputs.addAll(recipe.getAdditionalResults().stream().map(EmiStack::of).toList()); } @Override @@ -83,7 +68,7 @@ public void addUnlockedWidgets(WidgetHolder widgets) { var overEnchant = AdvancementHelper.hasAdvancement(Minecraft.getInstance().player, SpectrumAdvancements.OVERENCHANTING); // Reset the indexer - indexer = 1; + selectedSourceLevel = 1; widgets.addTexture(BACKGROUND_TEXTURE, 13, 13, 54, 54, 0, 0); if (overEnchant && levelCap > maxNormal) @@ -91,8 +76,8 @@ public void addUnlockedWidgets(WidgetHolder widgets) { // Knowledge Gem and Enchanter final var gem = new DynamicStackWidget(c -> { - var xp = xpScaling.apply(indexer); - return EmiStack.of(KnowledgeGemItem.getKnowledgeDropStackWithXP(xp, false)); + int xp = levelData.get(selectedSourceLevel - 1).experience(); + return EmiStack.of(KnowledgeGemItem.getKnowledgeDropStackWithXP(xp, true)); }, 0, 111, 5); widgets.add(gem); widgets.addSlot(EmiStack.of(SpectrumBlocks.ENCHANTER), 111, 51).drawBack(false); @@ -100,60 +85,45 @@ public void addUnlockedWidgets(WidgetHolder widgets) { var cap = overEnchant ? levelCap : maxNormal; // Indexing buttons var minus = new SaneButtonWidget(84, 18, 8, 8, 64, 16, BACKGROUND_TEXTURE, () -> false, (mX, mY, b) -> { - indexer = Math.clamp(indexer - 1, 1, cap - 1); + selectedSourceLevel = Math.clamp(selectedSourceLevel - 1, 1, cap - 1); }).tooltipText(List.of(Component.translatable(EnchanterBlockEntity.CYCLING))); var plus = new SaneButtonWidget(94, 18, 8, 8, 72, 16, BACKGROUND_TEXTURE, () -> false, (mX, mY, b) -> { - indexer = Math.clamp(indexer + 1, 1, cap - 1); + selectedSourceLevel = Math.clamp(selectedSourceLevel + 1, 1, cap - 1); }).tooltipText(List.of(Component.translatable(EnchanterBlockEntity.CYCLING))); widgets.add(minus); widgets.add(plus); // surrounding input slots - widgets.addSlot(inputs.get(0), 18, 0); - widgets.addSlot(inputs.get(1), 44, 0); - widgets.addSlot(inputs.get(2), 62, 18); - widgets.addSlot(inputs.get(3), 62, 44); - widgets.addSlot(inputs.get(4), 44, 62); - widgets.addSlot(inputs.get(5), 18, 62); - widgets.addSlot(inputs.get(6), 0, 44); - widgets.addSlot(inputs.get(7), 0, 18); + widgets.add(new DynamicStackWidget(c -> inputs.get(selectedSourceLevel), 0, 18, 0)); + widgets.add(new DynamicStackWidget(c -> inputs.get(selectedSourceLevel), 0, 44, 0)); + widgets.add(new DynamicStackWidget(c -> inputs.get(selectedSourceLevel), 0, 62, 18)); + widgets.add(new DynamicStackWidget(c -> inputs.get(selectedSourceLevel), 0, 62, 44)); + widgets.add(new DynamicStackWidget(c -> inputs.get(selectedSourceLevel), 0, 44, 62)); + widgets.add(new DynamicStackWidget(c -> inputs.get(selectedSourceLevel), 0, 18, 62)); + widgets.add(new DynamicStackWidget(c -> inputs.get(selectedSourceLevel), 0, 0, 44)); + widgets.add(new DynamicStackWidget(c -> inputs.get(selectedSourceLevel), 0, 0, 18)); // Center Slot - final var in = new DynamicStackWidget(c -> inputs.get(BOOK_INDEXES_START + indexer - 1), 0, 31, 31); - widgets.add(in); + widgets.add(new DynamicStackWidget(c -> inputs.get(levelCap + selectedSourceLevel), 0, 31, 31)); // Output - final var out = new DynamicStackWidget(c -> inputs.get(BOOK_INDEXES_START + indexer), 0, 106, 26); - out.large(true).recipeContext(this); - widgets.add(out); + widgets.add(new DynamicStackWidget(c -> outputs.get(selectedSourceLevel - 1), 0, 106, 26).large(true).recipeContext(this)); widgets.addTexture(EmiTexture.EMPTY_ARROW, 80, 31); // Info - final var lv = new DynamicTextWidget(c -> { + widgets.add(new DynamicTextWidget(c -> { var color = NORMAL_COLOR; - if (indexer + 1 > maxNormal) + if (selectedSourceLevel + 1 > maxNormal) color = OVERCHANT_COLOR; - - return new Tuple<>(Component.translatable(EnchanterBlockEntity.LEVEL_TRANS, indexer, indexer + 1).getVisualOrderText(), color); - }, 67, 2, false); - widgets.add(lv); + return new Tuple<>(Component.translatable(EnchanterBlockEntity.LEVEL_TRANS, selectedSourceLevel, selectedSourceLevel + 1).getVisualOrderText(), color); + }, 67, 2, false)); - - final var itemUse = new DynamicTextWidget(c -> new Tuple<>(Component.translatable(EnchanterBlockEntity.ITEM_TRANS, itemScaling.apply(indexer)).getVisualOrderText(), NORMAL_COLOR), 67, 70, false); - widgets.add(itemUse); + // Item Use Text + widgets.add(new DynamicTextWidget(c -> new Tuple<>(Component.translatable(EnchanterBlockEntity.ITEM_TRANS, levelData.get(selectedSourceLevel-1).countPerBowl()*8).getVisualOrderText(), NORMAL_COLOR), 67, 70, false)); widgets.addText(transKey, 3, 82, NORMAL_COLOR, false); } - @Override - public List getOutputs() { - return super.getOutputs(); - } - - @Override - public List getInputs() { - return super.getInputs(); - } } diff --git a/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/FluidConvertingEmiRecipeGated.java b/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/FluidConvertingEmiRecipeGated.java index 946cad24f4..eec965a3b7 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/FluidConvertingEmiRecipeGated.java +++ b/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/FluidConvertingEmiRecipeGated.java @@ -11,14 +11,14 @@ public class FluidConvertingEmiRecipeGated extends GatedSpectrumEmiRecipe { public FluidConvertingEmiRecipeGated(EmiRecipeCategory category, RecipeHolder entry) { - super(category, entry, 78, 26); + super(category, entry, 120, 26); this.inputs = recipe.getIngredients().stream().map(EmiIngredient::of).toList(); } @Override public void addUnlockedWidgets(WidgetHolder widgets) { - widgets.addTexture(EmiTexture.EMPTY_ARROW, 23, 4); - widgets.addSlot(inputs.getFirst(), 0, 4); - widgets.addSlot(outputs.getFirst(), 52, 0).large(true).recipeContext(this); + widgets.addTexture(EmiTexture.EMPTY_ARROW, 23 + 21, 4); + widgets.addSlot(inputs.getFirst(), 0 + 21, 4); + widgets.addSlot(outputs.getFirst(), 52 + 21, 0).large(true).recipeContext(this); } } diff --git a/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/FusionShrineEmiRecipeGated.java b/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/FusionShrineEmiRecipeGated.java index 6ae992006f..d6cd99a4c6 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/FusionShrineEmiRecipeGated.java +++ b/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/FusionShrineEmiRecipeGated.java @@ -1,5 +1,6 @@ package de.dafuqs.spectrum.compat.emi.recipes; +import de.dafuqs.spectrum.api.recipe.*; import de.dafuqs.spectrum.compat.emi.*; import de.dafuqs.spectrum.recipe.fusion_shrine.*; import de.dafuqs.spectrum.registries.*; @@ -9,6 +10,7 @@ import dev.emi.emi.api.widget.*; import net.minecraft.client.*; import net.minecraft.util.*; +import net.minecraft.world.item.*; import net.minecraft.world.item.crafting.*; import java.util.*; @@ -26,8 +28,7 @@ public FusionShrineEmiRecipeGated(RecipeHolder entry) { } inputs = new ArrayList<>(); inputs.add(NeoForgeEmiIngredient.of(recipe.getFluid())); - inputs.addAll(recipe.getIngredientStacks().stream().map(s -> EmiIngredient.of(s.getItems().map(EmiStack::of).toList())).toList()); - outputs = List.of(EmiStack.of(recipe.getResultItem(getRegistryManager()))); + inputs.addAll(ofIngredientStacks(recipe.getIngredientStacks())); } @Override diff --git a/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/InkConvertingEmiRecipeGated.java b/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/InkConvertingEmiRecipeGated.java index 4cb66187ed..d45d7158e4 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/InkConvertingEmiRecipeGated.java +++ b/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/InkConvertingEmiRecipeGated.java @@ -1,7 +1,7 @@ package de.dafuqs.spectrum.compat.emi.recipes; import de.dafuqs.spectrum.compat.emi.*; -import de.dafuqs.spectrum.recipe.color_picker.InkConvertingRecipe; +import de.dafuqs.spectrum.recipe.color_picker.*; import dev.emi.emi.api.render.*; import dev.emi.emi.api.stack.*; import dev.emi.emi.api.widget.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/PedestalCraftingEmiRecipeGated.java b/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/PedestalCraftingEmiRecipeGated.java index 98f42a504a..b2f14fdfa6 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/PedestalCraftingEmiRecipeGated.java +++ b/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/PedestalCraftingEmiRecipeGated.java @@ -3,7 +3,7 @@ import de.dafuqs.spectrum.api.item.*; import de.dafuqs.spectrum.api.recipe.*; -import de.dafuqs.spectrum.blocks.pedestal.BuiltinGemstoneColor; +import de.dafuqs.spectrum.blocks.pedestal.*; import de.dafuqs.spectrum.compat.emi.*; import de.dafuqs.spectrum.inventories.*; import de.dafuqs.spectrum.recipe.pedestal.*; @@ -39,7 +39,7 @@ private static List getIngredients(PedestalRecipe recipe) { List list = NonNullList.withSize(9 + powderSlotCount, EmiStack.EMPTY); for (int i = 0; i < ingredientCount; i++) { - list.set(recipe.getGridSlotId(i), EmiIngredient.of(Arrays.stream(ingredients.get(i).getIngredient().getItems()).map(EmiStack::of).toList())); + list.set(recipe.getGridSlotId(i), ofIngredientStack(ingredients.get(i))); } for (int i = 0; i < powderSlotCount; i++) { GemstoneColor color = BuiltinGemstoneColor.values()[i]; diff --git a/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/PotionWorkshopEmiRecipeGated.java b/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/PotionWorkshopEmiRecipeGated.java index 80a25173ea..a6562c93f6 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/PotionWorkshopEmiRecipeGated.java +++ b/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/PotionWorkshopEmiRecipeGated.java @@ -16,7 +16,7 @@ public class PotionWorkshopEmiRecipeGated extend public PotionWorkshopEmiRecipeGated(EmiRecipeCategory category, RecipeHolder entry) { super(category, entry, 112, 66); - this.inputs = entry.value().getIngredientStacks().stream().map(s -> EmiIngredient.of(s.getItems().map(EmiStack::of).toList())).toList(); + this.inputs = ofIngredientStacks(recipe.getIngredientStacks()); } @Override diff --git a/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/PotionWorkshopReactingEmiRecipe.java b/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/PotionWorkshopReactingEmiRecipe.java index 2656830d71..8c58e982c4 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/PotionWorkshopReactingEmiRecipe.java +++ b/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/PotionWorkshopReactingEmiRecipe.java @@ -23,7 +23,7 @@ public > PotionWorkshopReactingEmiRecipe(Rec public boolean isUnlocked() { Minecraft client = Minecraft.getInstance(); - return AdvancementHelper.hasAdvancement(client.player, PotionWorkshopRecipe.UNLOCK_IDENTIFIER) && AdvancementHelper.hasAdvancement(client.player, recipe.getRequiredAdvancementIdentifier().orElse(null)); + return AdvancementHelper.hasAdvancement(client.player, PotionWorkshopRecipe.UNLOCK_IDENTIFIER) && AdvancementHelper.hasAdvancement(client.player, recipe.getRequiredAdvancement().orElse(null)); } @Override diff --git a/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/PrimordialFireBurningEmiRecipeGated.java b/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/PrimordialFireBurningEmiRecipeGated.java index 76f7689894..66ccba1ce7 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/PrimordialFireBurningEmiRecipeGated.java +++ b/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/PrimordialFireBurningEmiRecipeGated.java @@ -15,16 +15,16 @@ public class PrimordialFireBurningEmiRecipeGated extends GatedSpectrumEmiRecipe< private final static ResourceLocation FIRE_TEXTURE = SpectrumCommon.locate("textures/block/primordial_fire_0.png"); public PrimordialFireBurningEmiRecipeGated(RecipeHolder entry) { - super(SpectrumEmiRecipeCategories.PRIMORDIAL_FIRE_BURNING, entry, 80, 35); + super(SpectrumEmiRecipeCategories.PRIMORDIAL_FIRE_BURNING, entry, 120, 35); this.inputs = recipe.getIngredients().stream().map(EmiIngredient::of).toList(); } @Override public void addUnlockedWidgets(WidgetHolder widgets) { - widgets.addSlot(inputs.getFirst(), 0, 0); - widgets.add(new AnimatedTexturedWidget(FIRE_TEXTURE, 1, 19, 16, 176, 1000)); - widgets.addTexture(EmiTexture.EMPTY_ARROW, 24, 9); - widgets.addSlot(outputs.getFirst(), 54, 4).large(true).recipeContext(this); + widgets.addSlot(inputs.getFirst(), 0 + 20, 0); + widgets.add(new AnimatedTexturedWidget(FIRE_TEXTURE, 1 + 20, 19, 16, 176, 1000)); + widgets.addTexture(EmiTexture.EMPTY_ARROW, 24 + 20, 9); + widgets.addSlot(outputs.getFirst(), 54 + 20, 4).large(true).recipeContext(this); } } diff --git a/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/SpectrumWorldInteractionRecipe.java b/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/SpectrumWorldInteractionRecipe.java index 7f663b762f..3f56b8ad4c 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/SpectrumWorldInteractionRecipe.java +++ b/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/SpectrumWorldInteractionRecipe.java @@ -15,13 +15,13 @@ public class SpectrumWorldInteractionRecipe extends EmiWorldInteractionRecipe { private final List requiredAdvancementIdentifier = Lists.newArrayList(); - protected SpectrumWorldInteractionRecipe(de.dafuqs.spectrum.compat.emi.recipes.SpectrumWorldInteractionRecipe.Builder builder) { + protected SpectrumWorldInteractionRecipe(SpectrumWorldInteractionRecipe.Builder builder) { super(builder.superbuilder); requiredAdvancementIdentifier.addAll(builder.requiredAdvancementIdentifier); } - public static de.dafuqs.spectrum.compat.emi.recipes.SpectrumWorldInteractionRecipe.Builder customBuilder() { - return new de.dafuqs.spectrum.compat.emi.recipes.SpectrumWorldInteractionRecipe.Builder(); + public static SpectrumWorldInteractionRecipe.Builder customBuilder() { + return new SpectrumWorldInteractionRecipe.Builder(); } public boolean hasAdvancement(ResourceLocation advancement) { @@ -78,47 +78,47 @@ public SpectrumWorldInteractionRecipe build() { return new SpectrumWorldInteractionRecipe(this); } - public de.dafuqs.spectrum.compat.emi.recipes.SpectrumWorldInteractionRecipe.Builder id(ResourceLocation id) { + public SpectrumWorldInteractionRecipe.Builder id(ResourceLocation id) { superbuilder.id(id); return this; } - public de.dafuqs.spectrum.compat.emi.recipes.SpectrumWorldInteractionRecipe.Builder leftInput(EmiIngredient stack) { + public SpectrumWorldInteractionRecipe.Builder leftInput(EmiIngredient stack) { superbuilder.leftInput(stack); return this; } - public de.dafuqs.spectrum.compat.emi.recipes.SpectrumWorldInteractionRecipe.Builder leftInput(EmiIngredient stack, Function mutator) { + public SpectrumWorldInteractionRecipe.Builder leftInput(EmiIngredient stack, Function mutator) { superbuilder.leftInput(stack, mutator); return this; } - public de.dafuqs.spectrum.compat.emi.recipes.SpectrumWorldInteractionRecipe.Builder rightInput(EmiIngredient stack, boolean catalyst) { + public SpectrumWorldInteractionRecipe.Builder rightInput(EmiIngredient stack, boolean catalyst) { superbuilder.rightInput(stack, catalyst); return this; } - public de.dafuqs.spectrum.compat.emi.recipes.SpectrumWorldInteractionRecipe.Builder rightInput(EmiIngredient stack, boolean catalyst, Function mutator) { + public SpectrumWorldInteractionRecipe.Builder rightInput(EmiIngredient stack, boolean catalyst, Function mutator) { superbuilder.rightInput(stack, catalyst, mutator); return this; } - public de.dafuqs.spectrum.compat.emi.recipes.SpectrumWorldInteractionRecipe.Builder output(EmiStack stack) { + public SpectrumWorldInteractionRecipe.Builder output(EmiStack stack) { superbuilder.output(stack); return this; } - public de.dafuqs.spectrum.compat.emi.recipes.SpectrumWorldInteractionRecipe.Builder output(EmiStack stack, Function mutator) { + public SpectrumWorldInteractionRecipe.Builder output(EmiStack stack, Function mutator) { superbuilder.output(stack, mutator); return this; } - public de.dafuqs.spectrum.compat.emi.recipes.SpectrumWorldInteractionRecipe.Builder supportsRecipeTree(boolean supportsRecipeTree) { + public SpectrumWorldInteractionRecipe.Builder supportsRecipeTree(boolean supportsRecipeTree) { superbuilder.supportsRecipeTree(supportsRecipeTree); return this; } - public de.dafuqs.spectrum.compat.emi.recipes.SpectrumWorldInteractionRecipe.Builder requiredAdvancement(ResourceLocation advId) { + public SpectrumWorldInteractionRecipe.Builder requiredAdvancement(ResourceLocation advId) { requiredAdvancementIdentifier.add(advId); return this; } diff --git a/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/SpiritInstillingEmiRecipeGated.java b/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/SpiritInstillingEmiRecipeGated.java index b9e20d107c..4c54fe817d 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/SpiritInstillingEmiRecipeGated.java +++ b/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/SpiritInstillingEmiRecipeGated.java @@ -16,13 +16,7 @@ public class SpiritInstillingEmiRecipeGated extends GatedSpectrumEmiRecipe entry) { super(SpectrumEmiRecipeCategories.SPIRIT_INSTILLER, entry, 116, 48); - inputs = recipe.getIngredientStacks().stream().map(s -> EmiIngredient.of(s.getItems().map(EmiStack::of).toList())).toList(); - - if (recipe instanceof SpawnerChangeRecipe spawnerChangeRecipe) { - ItemStack outputStack = recipe.getResultItem(getRegistryManager()); - LoreHelper.setLore(outputStack, spawnerChangeRecipe.getOutputLoreText()); - outputs = List.of(EmiStack.of(outputStack)); - } + inputs = ofIngredientStacks(recipe.getIngredientStacks()); } @Override diff --git a/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/TitrationBarrelEmiRecipeGated.java b/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/TitrationBarrelEmiRecipeGated.java index 696c84d228..08dc9cf01a 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/TitrationBarrelEmiRecipeGated.java +++ b/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/TitrationBarrelEmiRecipeGated.java @@ -10,9 +10,7 @@ import net.minecraft.network.chat.*; import net.minecraft.world.item.crafting.*; import net.neoforged.api.distmarker.*; -import net.neoforged.neoforge.fluids.crafting.*; -import org.jspecify.annotations.Nullable; -import net.minecraft.world.level.material.*; +import org.jspecify.annotations.*; import java.util.*; @@ -26,7 +24,7 @@ public TitrationBarrelEmiRecipeGated(RecipeHolder entry) if (!recipe.getFluidInput().isEmpty()) { inputs.add(NeoForgeEmiIngredient.of(recipe.getFluidInput())); } - inputs.addAll(recipe.getIngredientStacks().stream().map(s -> EmiIngredient.of(s.getItems().map(EmiStack::of).toList())).toList()); + inputs.addAll(ofIngredientStacks(recipe.getIngredientStacks())); displayedStacks = buildFermentationOutputVariations(recipe); } diff --git a/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/package-info.java b/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/package-info.java index cc4bf4fb09..2a887ff488 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.compat.emi.recipes; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/emi/widgets/package-info.java b/src/main/java/de/dafuqs/spectrum/compat/emi/widgets/package-info.java index 14742de057..e6155cbb4e 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/emi/widgets/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/compat/emi/widgets/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.compat.emi.widgets; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/exclusions_lib/ExclusionsLibCompat.java b/src/main/java/de/dafuqs/spectrum/compat/exclusions_lib/ExclusionsLibCompat.java index 4683803c41..afd1574d27 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/exclusions_lib/ExclusionsLibCompat.java +++ b/src/main/java/de/dafuqs/spectrum/compat/exclusions_lib/ExclusionsLibCompat.java @@ -1,18 +1,13 @@ package de.dafuqs.spectrum.compat.exclusions_lib; import com.mojang.serialization.*; -import de.dafuqs.spectrum.*; import de.dafuqs.spectrum.compat.*; import net.minecraft.core.*; import net.minecraft.core.registries.*; -import net.minecraft.resources.*; import net.minecraft.world.level.*; import net.minecraft.world.level.levelgen.blockpredicates.*; import net.neoforged.bus.api.*; import net.neoforged.neoforge.registries.*; -import javax.annotation.*; - -import java.util.function.*; /** * Loaded when Exclusions Lib is *not* present diff --git a/src/main/java/de/dafuqs/spectrum/compat/exclusions_lib/package-info.java b/src/main/java/de/dafuqs/spectrum/compat/exclusions_lib/package-info.java index bd58fb19bb..b703ace244 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/exclusions_lib/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/compat/exclusions_lib/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.compat.exclusions_lib; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/gobber/GobberCompat.java b/src/main/java/de/dafuqs/spectrum/compat/gobber/GobberCompat.java index 209b0952e0..8b4525a5d1 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/gobber/GobberCompat.java +++ b/src/main/java/de/dafuqs/spectrum/compat/gobber/GobberCompat.java @@ -1,11 +1,9 @@ package de.dafuqs.spectrum.compat.gobber; import de.dafuqs.fractal.api.*; -import de.dafuqs.spectrum.api.energy.color.*; import de.dafuqs.spectrum.api.item_group.*; -import de.dafuqs.spectrum.blocks.crystallarieum.*; +import de.dafuqs.spectrum.blocks.gemstone.*; import de.dafuqs.spectrum.compat.*; -import de.dafuqs.spectrum.compat.create.*; import de.dafuqs.spectrum.registries.*; import de.dafuqs.spectrum.registries.SpectrumItems.*; import de.dafuqs.spectrum.registries.client.*; @@ -20,24 +18,23 @@ import net.neoforged.neoforge.common.*; import net.neoforged.neoforge.registries.*; -import static de.dafuqs.spectrum.registries.SpectrumBlocks.blockWithItem; -import static de.dafuqs.spectrum.registries.SpectrumBlocks.cluster; +import static de.dafuqs.spectrum.registries.SpectrumBlocks.*; public class GobberCompat extends SpectrumIntegrationPacks.ModIntegrationPack { - public static DeferredBlock SMALL_GLOBETTE_BUD = SpectrumBlocks.register(cluster(blockWithItem("small_globette_bud", () -> new SpectrumClusterBlock(BlockBehaviour.Properties.of().pushReaction(PushReaction.DESTROY).destroyTime(1.0f).mapColor(Blocks.BLUE_CONCRETE.defaultMapColor()).requiresCorrectToolForDrops().noOcclusion(), SpectrumClusterBlock.GrowthStage.SMALL), InkColors.BLUE), SpectrumModelTemplates.CRYSTALLARIEUM_FARMABLE)); - public static DeferredBlock LARGE_GLOBETTE_BUD = SpectrumBlocks.register(cluster(blockWithItem("large_globette_bud", () -> new SpectrumClusterBlock(BlockBehaviour.Properties.ofFullCopy(SMALL_GLOBETTE_BUD.get()), SpectrumClusterBlock.GrowthStage.LARGE), InkColors.BLUE), SpectrumModelTemplates.CRYSTALLARIEUM_FARMABLE)); - public static DeferredBlock GLOBETTE_CLUSTER = SpectrumBlocks.register(cluster(blockWithItem("globette_cluster", () -> new SpectrumClusterBlock(BlockBehaviour.Properties.ofFullCopy(SMALL_GLOBETTE_BUD.get()), SpectrumClusterBlock.GrowthStage.CLUSTER), InkColors.BLUE), SpectrumModelTemplates.CRYSTALLARIEUM_FARMABLE)); - public static DeferredBlock SMALL_GLOBETTE_NETHER_BUD = SpectrumBlocks.register(cluster(blockWithItem("small_globette_nether_bud", () -> new SpectrumClusterBlock(BlockBehaviour.Properties.of().pushReaction(PushReaction.DESTROY).destroyTime(1.0f).mapColor(Blocks.RED_CONCRETE.defaultMapColor()).requiresCorrectToolForDrops().noOcclusion(), SpectrumClusterBlock.GrowthStage.SMALL), InkColors.RED), SpectrumModelTemplates.CRYSTALLARIEUM_FARMABLE)); - public static DeferredBlock LARGE_GLOBETTE_NETHER_BUD = SpectrumBlocks.register(cluster(blockWithItem("large_globette_nether_bud", () -> new SpectrumClusterBlock(BlockBehaviour.Properties.ofFullCopy(SMALL_GLOBETTE_NETHER_BUD.get()), SpectrumClusterBlock.GrowthStage.LARGE), InkColors.RED), SpectrumModelTemplates.CRYSTALLARIEUM_FARMABLE)); - public static DeferredBlock GLOBETTE_NETHER_CLUSTER = SpectrumBlocks.register(cluster(blockWithItem("globette_nether_cluster", () -> new SpectrumClusterBlock(BlockBehaviour.Properties.ofFullCopy(SMALL_GLOBETTE_NETHER_BUD.get()), SpectrumClusterBlock.GrowthStage.CLUSTER), InkColors.RED), SpectrumModelTemplates.CRYSTALLARIEUM_FARMABLE)); - public static DeferredBlock SMALL_GLOBETTE_END_BUD = SpectrumBlocks.register(cluster(blockWithItem("small_globette_end_bud", () -> new SpectrumClusterBlock(BlockBehaviour.Properties.of().pushReaction(PushReaction.DESTROY).destroyTime(1.0f).mapColor(Blocks.GREEN_CONCRETE.defaultMapColor()).requiresCorrectToolForDrops().noOcclusion(), SpectrumClusterBlock.GrowthStage.SMALL), InkColors.GREEN), SpectrumModelTemplates.CRYSTALLARIEUM_FARMABLE)); - public static DeferredBlock LARGE_GLOBETTE_END_BUD = SpectrumBlocks.register(cluster(blockWithItem("large_globette_end_bud", () -> new SpectrumClusterBlock(BlockBehaviour.Properties.ofFullCopy(SMALL_GLOBETTE_END_BUD.get()), SpectrumClusterBlock.GrowthStage.LARGE), InkColors.GREEN), SpectrumModelTemplates.CRYSTALLARIEUM_FARMABLE)); - public static DeferredBlock GLOBETTE_END_CLUSTER = SpectrumBlocks.register(cluster(blockWithItem("globette_end_cluster", () -> new SpectrumClusterBlock(BlockBehaviour.Properties.ofFullCopy(SMALL_GLOBETTE_END_BUD.get()), SpectrumClusterBlock.GrowthStage.CLUSTER), InkColors.GREEN), SpectrumModelTemplates.CRYSTALLARIEUM_FARMABLE)); + public static DeferredBlock SMALL_GLOBETTE_BUD = SpectrumBlocks.register(cluster(blockWithItem("small_globette_bud", () -> new SpectrumClusterBlock(BlockBehaviour.Properties.of().pushReaction(PushReaction.DESTROY).destroyTime(1.0f).mapColor(Blocks.BLUE_CONCRETE.defaultMapColor()).requiresCorrectToolForDrops().noOcclusion(), SpectrumClusterBlock.GrowthStage.SMALL)), SpectrumModelTemplates.CRYSTALLARIEUM_FARMABLE)); + public static DeferredBlock LARGE_GLOBETTE_BUD = SpectrumBlocks.register(cluster(blockWithItem("large_globette_bud", () -> new SpectrumClusterBlock(BlockBehaviour.Properties.ofFullCopy(SMALL_GLOBETTE_BUD.get()), SpectrumClusterBlock.GrowthStage.LARGE)), SpectrumModelTemplates.CRYSTALLARIEUM_FARMABLE)); + public static DeferredBlock GLOBETTE_CLUSTER = SpectrumBlocks.register(cluster(blockWithItem("globette_cluster", () -> new SpectrumClusterBlock(BlockBehaviour.Properties.ofFullCopy(SMALL_GLOBETTE_BUD.get()), SpectrumClusterBlock.GrowthStage.CLUSTER)), SpectrumModelTemplates.CRYSTALLARIEUM_FARMABLE)); + public static DeferredBlock SMALL_GLOBETTE_NETHER_BUD = SpectrumBlocks.register(cluster(blockWithItem("small_globette_nether_bud", () -> new SpectrumClusterBlock(BlockBehaviour.Properties.of().pushReaction(PushReaction.DESTROY).destroyTime(1.0f).mapColor(Blocks.RED_CONCRETE.defaultMapColor()).requiresCorrectToolForDrops().noOcclusion(), SpectrumClusterBlock.GrowthStage.SMALL)), SpectrumModelTemplates.CRYSTALLARIEUM_FARMABLE)); + public static DeferredBlock LARGE_GLOBETTE_NETHER_BUD = SpectrumBlocks.register(cluster(blockWithItem("large_globette_nether_bud", () -> new SpectrumClusterBlock(BlockBehaviour.Properties.ofFullCopy(SMALL_GLOBETTE_NETHER_BUD.get()), SpectrumClusterBlock.GrowthStage.LARGE)), SpectrumModelTemplates.CRYSTALLARIEUM_FARMABLE)); + public static DeferredBlock GLOBETTE_NETHER_CLUSTER = SpectrumBlocks.register(cluster(blockWithItem("globette_nether_cluster", () -> new SpectrumClusterBlock(BlockBehaviour.Properties.ofFullCopy(SMALL_GLOBETTE_NETHER_BUD.get()), SpectrumClusterBlock.GrowthStage.CLUSTER)), SpectrumModelTemplates.CRYSTALLARIEUM_FARMABLE)); + public static DeferredBlock SMALL_GLOBETTE_END_BUD = SpectrumBlocks.register(cluster(blockWithItem("small_globette_end_bud", () -> new SpectrumClusterBlock(BlockBehaviour.Properties.of().pushReaction(PushReaction.DESTROY).destroyTime(1.0f).mapColor(Blocks.GREEN_CONCRETE.defaultMapColor()).requiresCorrectToolForDrops().noOcclusion(), SpectrumClusterBlock.GrowthStage.SMALL)), SpectrumModelTemplates.CRYSTALLARIEUM_FARMABLE)); + public static DeferredBlock LARGE_GLOBETTE_END_BUD = SpectrumBlocks.register(cluster(blockWithItem("large_globette_end_bud", () -> new SpectrumClusterBlock(BlockBehaviour.Properties.ofFullCopy(SMALL_GLOBETTE_END_BUD.get()), SpectrumClusterBlock.GrowthStage.LARGE)), SpectrumModelTemplates.CRYSTALLARIEUM_FARMABLE)); + public static DeferredBlock GLOBETTE_END_CLUSTER = SpectrumBlocks.register(cluster(blockWithItem("globette_end_cluster", () -> new SpectrumClusterBlock(BlockBehaviour.Properties.ofFullCopy(SMALL_GLOBETTE_END_BUD.get()), SpectrumClusterBlock.GrowthStage.CLUSTER)), SpectrumModelTemplates.CRYSTALLARIEUM_FARMABLE)); - public static DeferredBlock PURE_GLOBETTE_BLOCK = SpectrumBlocks.register(SpectrumBlocks.simple(blockWithItem("pure_globette_block", () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.QUARTZ_BLOCK)), InkColors.BLUE))); - public static DeferredBlock PURE_GLOBETTE_NETHER_BLOCK = SpectrumBlocks.register(SpectrumBlocks.simple(blockWithItem("pure_globette_nether_block", () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.QUARTZ_BLOCK)), InkColors.RED))); - public static DeferredBlock PURE_GLOBETTE_END_BLOCK = SpectrumBlocks.register(SpectrumBlocks.simple(blockWithItem("pure_globette_end_block", () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.QUARTZ_BLOCK)), InkColors.GREEN))); + public static DeferredBlock PURE_GLOBETTE_BLOCK = SpectrumBlocks.register(SpectrumBlocks.simple(blockWithItem("pure_globette_block", () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.QUARTZ_BLOCK))))); + public static DeferredBlock PURE_GLOBETTE_NETHER_BLOCK = SpectrumBlocks.register(SpectrumBlocks.simple(blockWithItem("pure_globette_nether_block", () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.QUARTZ_BLOCK))))); + public static DeferredBlock PURE_GLOBETTE_END_BLOCK = SpectrumBlocks.register(SpectrumBlocks.simple(blockWithItem("pure_globette_end_block", () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.QUARTZ_BLOCK))))); public static DeferredItem PURE_GLOBETTE = SpectrumItems.register("pure_globette", () -> new Item(IS.of())); public static DeferredItem PURE_GLOBETTE_NETHER = SpectrumItems.register("pure_globette_nether", () -> new Item(IS.of())); diff --git a/src/main/java/de/dafuqs/spectrum/compat/gobber/package-info.java b/src/main/java/de/dafuqs/spectrum/compat/gobber/package-info.java index 29d623a389..c1a453d30a 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/gobber/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/compat/gobber/package-info.java @@ -3,6 +3,5 @@ @FieldsAreNonnullByDefault package de.dafuqs.spectrum.compat.gobber; -import net.minecraft.FieldsAreNonnullByDefault; -import net.minecraft.MethodsReturnNonnullByDefault; -import org.jspecify.annotations.NullMarked; +import net.minecraft.*; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/malum/MalumCompat.java b/src/main/java/de/dafuqs/spectrum/compat/malum/MalumCompat.java index 77d0e3b581..6c509fe70c 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/malum/MalumCompat.java +++ b/src/main/java/de/dafuqs/spectrum/compat/malum/MalumCompat.java @@ -1,9 +1,5 @@ package de.dafuqs.spectrum.compat.malum; -import com.sammy.malum.registry.common.block.*; -import com.sammy.malum.registry.common.item.*; -import de.dafuqs.spectrum.api.color.*; -import de.dafuqs.spectrum.api.energy.color.*; import de.dafuqs.spectrum.compat.*; import net.neoforged.api.distmarker.*; import net.neoforged.bus.api.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/malum/package-info.java b/src/main/java/de/dafuqs/spectrum/compat/malum/package-info.java index 2d51bdc7c4..ef2832811b 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/malum/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/compat/malum/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.compat.malum; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/modonomicon/ModonomiconCompat.java b/src/main/java/de/dafuqs/spectrum/compat/modonomicon/ModonomiconCompat.java index ad9dd497fb..a4d9ca29cf 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/modonomicon/ModonomiconCompat.java +++ b/src/main/java/de/dafuqs/spectrum/compat/modonomicon/ModonomiconCompat.java @@ -12,7 +12,7 @@ import de.dafuqs.spectrum.compat.modonomicon.unlock_conditions.*; import de.dafuqs.spectrum.recipe.anvil_crushing.*; import de.dafuqs.spectrum.recipe.cinderhearth.*; -import de.dafuqs.spectrum.recipe.color_picker.InkConvertingRecipe; +import de.dafuqs.spectrum.recipe.color_picker.*; import de.dafuqs.spectrum.recipe.crystallarieum.*; import de.dafuqs.spectrum.recipe.enchanter.*; import de.dafuqs.spectrum.recipe.fluid_converting.*; @@ -45,7 +45,6 @@ public class ModonomiconCompat extends SpectrumIntegrationPacks.ModIntegrationPa public static final ResourceLocation LIQUID_CRYSTAL_CONVERTING_PAGE = SpectrumCommon.locate("liquid_crystal_converting"); public static final ResourceLocation MIDNIGHT_SOLUTION_CONVERTING_PAGE = SpectrumCommon.locate("midnight_solution_converting"); public static final ResourceLocation DRAGONROT_CONVERTING_PAGE = SpectrumCommon.locate("dragonrot_converting"); - public static final ResourceLocation SLUDGE_CONVERTING_PAGE = SpectrumCommon.locate("sludge_converting"); public static final ResourceLocation CRYSTALLARIEUM_GROWING_PAGE = SpectrumCommon.locate("crystallarieum_growing"); public static final ResourceLocation CINDERHEARTH_SMELTING_PAGE = SpectrumCommon.locate("cinderhearth_smelting"); public static final ResourceLocation TITRATION_BARREL_FERMENTING_PAGE = SpectrumCommon.locate("titration_barrel_fermenting"); @@ -86,7 +85,6 @@ private void registerPages() { registerGatedRecipePage(LIQUID_CRYSTAL_CONVERTING_PAGE, SpectrumRecipeTypes.LIQUID_CRYSTAL_CONVERTING, false); registerGatedRecipePage(MIDNIGHT_SOLUTION_CONVERTING_PAGE, SpectrumRecipeTypes.MIDNIGHT_SOLUTION_CONVERTING, false); registerGatedRecipePage(DRAGONROT_CONVERTING_PAGE, SpectrumRecipeTypes.DRAGONROT_CONVERTING, false); - registerGatedRecipePage(SLUDGE_CONVERTING_PAGE, SpectrumRecipeTypes.SLUDGE_CONVERTING, false); registerGatedRecipePage(CRYSTALLARIEUM_GROWING_PAGE, SpectrumRecipeTypes.CRYSTALLARIEUM, false); registerGatedRecipePage(CINDERHEARTH_SMELTING_PAGE, SpectrumRecipeTypes.CINDERHEARTH, false); registerGatedRecipePage(TITRATION_BARREL_FERMENTING_PAGE, SpectrumRecipeTypes.TITRATION_BARREL, true); @@ -158,13 +156,6 @@ public ResourceLocation getBackgroundTexture() { return SpectrumCommon.locate("textures/gui/guidebook/dragonrot.png"); } }); - - PageRendererRegistry.registerPageRenderer(SLUDGE_CONVERTING_PAGE, p -> new BookFluidConvertingPageRenderer<>((BookGatedRecipePage) p) { - @Override - public ResourceLocation getBackgroundTexture() { - return SpectrumCommon.locate("textures/gui/guidebook/sludge.png"); - } - }); } } diff --git a/src/main/java/de/dafuqs/spectrum/compat/modonomicon/ModonomiconHelper.java b/src/main/java/de/dafuqs/spectrum/compat/modonomicon/ModonomiconHelper.java index 20a58fb6ec..4b39e0ddcd 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/modonomicon/ModonomiconHelper.java +++ b/src/main/java/de/dafuqs/spectrum/compat/modonomicon/ModonomiconHelper.java @@ -9,7 +9,7 @@ import net.minecraft.network.chat.*; import net.minecraft.world.item.*; import net.minecraft.world.level.block.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookCinderhearthSmeltingPageRenderer.java b/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookCinderhearthSmeltingPageRenderer.java index a222b0d0ac..d2b4722e29 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookCinderhearthSmeltingPageRenderer.java +++ b/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookCinderhearthSmeltingPageRenderer.java @@ -14,7 +14,7 @@ import net.minecraft.resources.*; import net.minecraft.world.item.crafting.*; import net.minecraft.world.level.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookConfirmationButtonPageRenderer.java b/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookConfirmationButtonPageRenderer.java index c97f156e29..eeaf72872c 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookConfirmationButtonPageRenderer.java +++ b/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookConfirmationButtonPageRenderer.java @@ -34,8 +34,8 @@ public void onBeginDisplayPage(BookEntryScreen parentScreen, int left, int top) : confirmationPage.getButtonText(); Button button = Button.builder(buttonText.getComponent(), this::confirmationButtonClicked) + .pos(2, BookEntryScreen.PAGE_HEIGHT - Button.DEFAULT_HEIGHT - 2) .size(BookEntryScreen.PAGE_WIDTH - 12, Button.DEFAULT_HEIGHT) - .pos(2, BookEntryScreen.PAGE_HEIGHT - 3) .build(); button.active = !completed; @@ -46,7 +46,7 @@ protected void confirmationButtonClicked(Button button) { if (!(page instanceof BookConfirmationButtonPage confirmationPage)) return; PacketDistributor.sendToServer(new GuidebookConfirmationButtonPressedPayload(confirmationPage.getConfirmationString())); button.setMessage(confirmationPage.getConfirmedButtonText().getComponent()); - BookGuiManager.get().openEntry(page.getBook().getId(), page.getParentEntry().getId(), page.getPageNumber()); + button.active = false; } } diff --git a/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookCrystallarieumGrowingPageRenderer.java b/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookCrystallarieumGrowingPageRenderer.java index 0dff7d338b..81f10aaad2 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookCrystallarieumGrowingPageRenderer.java +++ b/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookCrystallarieumGrowingPageRenderer.java @@ -3,10 +3,9 @@ import com.klikli_dev.modonomicon.book.*; import com.klikli_dev.modonomicon.client.gui.book.entry.*; import com.klikli_dev.modonomicon.data.*; -import com.klikli_dev.modonomicon.fluid.*; import com.mojang.blaze3d.systems.*; import de.dafuqs.spectrum.*; -import de.dafuqs.spectrum.blocks.crystallarieum.*; +import de.dafuqs.spectrum.blocks.ink.sink.*; import de.dafuqs.spectrum.compat.modonomicon.pages.*; import de.dafuqs.spectrum.recipe.crystallarieum.*; import de.dafuqs.spectrum.registries.*; @@ -18,7 +17,7 @@ import net.minecraft.world.item.crafting.*; import net.minecraft.world.level.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; @@ -40,21 +39,21 @@ public BookCrystallarieumGrowingPageRenderer(BookGatedRecipePage s.withFont(font))); + catalystText = new BookTextHolder(Component.translatable("container.spectrum.rei.crystallarieum.additive").withStyle(s -> s.withFont(font))); speedText = new BookTextHolder(Component.translatable("container.spectrum.rei.crystallarieum.speed").withStyle(s -> s.withFont(font))); inkDrainText = new BookTextHolder(Component.translatable("container.spectrum.rei.crystallarieum.ink_drain").withStyle(s -> s.withFont(font))); depletionText = new BookTextHolder(Component.translatable("container.spectrum.rei.crystallarieum.depletion").withStyle(s -> s.withFont(font))); } if (page.getRecipe1() != null) { - craftingTimeText1 = new BookTextHolder(Component.translatable(page.getRecipe1().value().growsWithoutCatalyst() - ? "container.spectrum.rei.crystallarieum.crafting_time_per_stage_seconds_catalyst_optional" + craftingTimeText1 = new BookTextHolder(Component.translatable(page.getRecipe1().value().growsWithoutAdditive() + ? "container.spectrum.rei.crystallarieum.crafting_time_per_stage_seconds_additive_optional" : "container.spectrum.rei.crystallarieum.crafting_time_per_stage_seconds", page.getRecipe1().value().getSecondsPerGrowthStage()).withStyle(s -> s.withFont(font))); } if (page.getRecipe2() != null) { - craftingTimeText2 = new BookTextHolder(Component.translatable(page.getRecipe2().value().growsWithoutCatalyst() - ? "container.spectrum.rei.crystallarieum.crafting_time_per_stage_seconds_catalyst_optional" + craftingTimeText2 = new BookTextHolder(Component.translatable(page.getRecipe2().value().growsWithoutAdditive() + ? "container.spectrum.rei.crystallarieum.crafting_time_per_stage_seconds_additive_optional" : "container.spectrum.rei.crystallarieum.crafting_time_per_stage_seconds", page.getRecipe2().value().getSecondsPerGrowthStage()).withStyle(s -> s.withFont(font))); } } @@ -75,28 +74,31 @@ protected void drawRecipe(GuiGraphics drawContext, RecipeHolder it = recipe.getGrowthStages().iterator(); BlockState growthState = it.next(); - parentScreen.renderItemStack(drawContext, recipeX + startX + offsetPerReagent, recipeY - 1, mouseX, mouseY, growthState.getBlock().asItem().getDefaultInstance()); + parentScreen.renderItemStack(drawContext, recipeX + 20, recipeY - 1, mouseX, mouseY, growthState.getBlock().asItem().getDefaultInstance()); + + // growth stages int x = 0; while (it.hasNext()) { - parentScreen.renderItemStack(drawContext, recipeX + 62 + offsetPerReagent * x, recipeY + 4, mouseX, mouseY, it.next().getBlock().asItem().getDefaultInstance()); + parentScreen.renderItemStack(drawContext, recipeX + 50 + offsetPerAdditive * x, recipeY + 4, mouseX, mouseY, it.next().getBlock().asItem().getDefaultInstance()); x++; } - // crystallarieum - parentScreen.renderItemStack(drawContext, recipeX + startX + offsetPerReagent, recipeY + 8, mouseX, mouseY, CrystallarieumBlock.withColor(SpectrumBlocks.CRYSTALLARIEUM.asItem().getDefaultInstance(), recipe.getInkColor())); - // catalyst text renderBookTextHolder(drawContext, catalystText, 0, 42, BookEntryScreen.PAGE_WIDTH); renderBookTextHolder(drawContext, speedText, 0, 45 + LINE_HEIGHT, BookEntryScreen.PAGE_WIDTH); @@ -104,12 +106,12 @@ protected void drawRecipe(GuiGraphics drawContext, RecipeHolder> { private static final ResourceLocation BACKGROUND_TEXTURE = SpectrumCommon.locate("textures/gui/modonomicon/enchanter_crafting.png"); + private static final ItemStack ENCHANTER = SpectrumBlocks.ENCHANTER.asItem().getDefaultInstance(); public BookEnchanterCraftingPageRenderer(BookGatedRecipePage page) { super(page); @@ -41,25 +42,23 @@ protected void drawRecipe(GuiGraphics drawContext, RecipeHolder // the ingredients NonNullList ingredients = recipe.getIngredients(); - int ingredientX = recipeX - 3; - // surrounding input slots - parentScreen.renderIngredient(drawContext, ingredientX + 16, recipeY, mouseX, mouseY, ingredients.get(1)); - parentScreen.renderIngredient(drawContext, ingredientX + 40, recipeY, mouseX, mouseY, ingredients.get(2)); - parentScreen.renderIngredient(drawContext, ingredientX + 56, recipeY + 16, mouseX, mouseY, ingredients.get(3)); - parentScreen.renderIngredient(drawContext, ingredientX + 56, recipeY + 40, mouseX, mouseY, ingredients.get(4)); - parentScreen.renderIngredient(drawContext, ingredientX + 40, recipeY + 56, mouseX, mouseY, ingredients.get(5)); - parentScreen.renderIngredient(drawContext, ingredientX + 16, recipeY + 56, mouseX, mouseY, ingredients.get(6)); - parentScreen.renderIngredient(drawContext, ingredientX, recipeY + 40, mouseX, mouseY, ingredients.get(7)); - parentScreen.renderIngredient(drawContext, ingredientX, recipeY + 16, mouseX, mouseY, ingredients.get(8)); + parentScreen.renderIngredient(drawContext, recipeX + 13, recipeY, mouseX, mouseY, ingredients.get(1)); + parentScreen.renderIngredient(drawContext, recipeX + 37, recipeY, mouseX, mouseY, ingredients.get(2)); + parentScreen.renderIngredient(drawContext, recipeX + 53, recipeY + 16, mouseX, mouseY, ingredients.get(3)); + parentScreen.renderIngredient(drawContext, recipeX + 53, recipeY + 40, mouseX, mouseY, ingredients.get(4)); + parentScreen.renderIngredient(drawContext, recipeX + 37, recipeY + 56, mouseX, mouseY, ingredients.get(5)); + parentScreen.renderIngredient(drawContext, recipeX + 13, recipeY + 56, mouseX, mouseY, ingredients.get(6)); + parentScreen.renderIngredient(drawContext, recipeX - 3, recipeY + 40, mouseX, mouseY, ingredients.get(7)); + parentScreen.renderIngredient(drawContext, recipeX - 3, recipeY + 16, mouseX, mouseY, ingredients.get(8)); // center input slot - parentScreen.renderIngredient(drawContext, ingredientX + 28, recipeY + 28, mouseX, mouseY, ingredients.get(0)); + parentScreen.renderIngredient(drawContext, recipeX + 25, recipeY + 28, mouseX, mouseY, ingredients.get(0)); // Knowledge Gem and Enchanter ItemStack knowledgeDropStackWithXP = KnowledgeGemItem.getKnowledgeDropStackWithXP(recipe.getRequiredExperience(), true); parentScreen.renderItemStack(drawContext, recipeX + 81, recipeY + 9, mouseX, mouseY, knowledgeDropStackWithXP); - parentScreen.renderItemStack(drawContext, recipeX + 81, recipeY + 46, mouseX, mouseY, SpectrumBlocks.ENCHANTER.asItem().getDefaultInstance()); + parentScreen.renderItemStack(drawContext, recipeX + 81, recipeY + 46, mouseX, mouseY, ENCHANTER); // the output parentScreen.renderItemStack(drawContext, recipeX + 81, recipeY + 31, mouseX, mouseY, recipe.getResultItem(world.registryAccess())); diff --git a/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookEnchanterUpgradingPageRenderer.java b/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookEnchanterUpgradingPageRenderer.java index a891aef4ce..e30f5f98f8 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookEnchanterUpgradingPageRenderer.java +++ b/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookEnchanterUpgradingPageRenderer.java @@ -2,6 +2,8 @@ import com.mojang.blaze3d.systems.*; import de.dafuqs.spectrum.*; +import de.dafuqs.spectrum.api.recipe.*; +import de.dafuqs.spectrum.compat.modonomicon.*; import de.dafuqs.spectrum.compat.modonomicon.pages.*; import de.dafuqs.spectrum.items.magic_items.*; import de.dafuqs.spectrum.recipe.enchanter.*; @@ -14,11 +16,10 @@ import net.minecraft.world.item.crafting.*; import net.minecraft.world.level.*; -import java.util.*; - public class BookEnchanterUpgradingPageRenderer extends BookGatedRecipePageRenderer> { private static final ResourceLocation BACKGROUND_TEXTURE = SpectrumCommon.locate("textures/gui/modonomicon/enchanter_crafting.png"); + private static final ItemStack ENCHANTER = SpectrumBlocks.ENCHANTER.asItem().getDefaultInstance(); public BookEnchanterUpgradingPageRenderer(BookGatedRecipePage page) { super(page); @@ -43,33 +44,25 @@ protected void drawRecipe(GuiGraphics drawContext, RecipeHolder ingredients = recipe.getIngredients(); - int ingredientX = recipeX - 3; - // surrounding input slots - List inputStacks = new ArrayList<>(); - int requiredItemCountSplit = recipe.getBaseItemCost() / 8; - int requiredItemCountModulo = recipe.getBaseItemCost() % 8; - for (int i = 0; i < 8; i++) { - int addAmount = i < requiredItemCountModulo ? 1 : 0; - inputStacks.add(new ItemStack(recipe.getBulkItem(), requiredItemCountSplit + addAmount)); - } - - parentScreen.renderItemStack(drawContext, ingredientX + 16, recipeY, mouseX, mouseY, inputStacks.get(0)); - parentScreen.renderItemStack(drawContext, ingredientX + 40, recipeY, mouseX, mouseY, inputStacks.get(1)); - parentScreen.renderItemStack(drawContext, ingredientX + 56, recipeY + 16, mouseX, mouseY, inputStacks.get(2)); - parentScreen.renderItemStack(drawContext, ingredientX + 56, recipeY + 40, mouseX, mouseY, inputStacks.get(3)); - parentScreen.renderItemStack(drawContext, ingredientX + 40, recipeY + 56, mouseX, mouseY, inputStacks.get(4)); - parentScreen.renderItemStack(drawContext, ingredientX + 16, recipeY + 56, mouseX, mouseY, inputStacks.get(5)); - parentScreen.renderItemStack(drawContext, ingredientX, recipeY + 40, mouseX, mouseY, inputStacks.get(6)); - parentScreen.renderItemStack(drawContext, ingredientX, recipeY + 16, mouseX, mouseY, inputStacks.get(7)); + EnchantmentUpgradeRecipe.LevelData levelOneData = recipe.getForSourceLevel(1); + IngredientStack bowlStack = IngredientStack.of(levelOneData.ingredient(), levelOneData.countPerBowl()); + ModonomiconHelper.renderIngredientStack(drawContext, parentScreen, recipeX + 13, recipeY, mouseX, mouseY, bowlStack); + ModonomiconHelper.renderIngredientStack(drawContext, parentScreen, recipeX + 37, recipeY, mouseX, mouseY, bowlStack); + ModonomiconHelper.renderIngredientStack(drawContext, parentScreen, recipeX + 53, recipeY + 16, mouseX, mouseY, bowlStack); + ModonomiconHelper.renderIngredientStack(drawContext, parentScreen, recipeX + 53, recipeY + 40, mouseX, mouseY, bowlStack); + ModonomiconHelper.renderIngredientStack(drawContext, parentScreen, recipeX + 37, recipeY + 56, mouseX, mouseY, bowlStack); + ModonomiconHelper.renderIngredientStack(drawContext, parentScreen, recipeX + 13, recipeY + 56, mouseX, mouseY, bowlStack); + ModonomiconHelper.renderIngredientStack(drawContext, parentScreen, recipeX - 3, recipeY + 40, mouseX, mouseY, bowlStack); + ModonomiconHelper.renderIngredientStack(drawContext, parentScreen, recipeX - 3, recipeY + 16, mouseX, mouseY, bowlStack); // center input slot - parentScreen.renderIngredient(drawContext, ingredientX + 28, recipeY + 28, mouseX, mouseY, ingredients.getFirst()); + parentScreen.renderIngredient(drawContext, recipeX + 25, recipeY + 28, mouseX, mouseY, ingredients.getFirst()); // Knowledge Gem and Enchanter - ItemStack knowledgeDropStackWithXP = KnowledgeGemItem.getKnowledgeDropStackWithXP(recipe.getBaseXPCost(), true); + ItemStack knowledgeDropStackWithXP = KnowledgeGemItem.getKnowledgeDropStackWithXP(levelOneData.experience(), true); parentScreen.renderItemStack(drawContext, recipeX + 81, recipeY + 9, mouseX, mouseY, knowledgeDropStackWithXP); - parentScreen.renderItemStack(drawContext, recipeX + 81, recipeY + 46, mouseX, mouseY, SpectrumBlocks.ENCHANTER.asItem().getDefaultInstance()); + parentScreen.renderItemStack(drawContext, recipeX + 81, recipeY + 46, mouseX, mouseY, ENCHANTER); // the output parentScreen.renderItemStack(drawContext, recipeX + 81, recipeY + 31, mouseX, mouseY, recipe.getResultItem(world.registryAccess())); diff --git a/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookFusionShrineCraftingPageRenderer.java b/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookFusionShrineCraftingPageRenderer.java index cc87b8dcda..cbbb75126a 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookFusionShrineCraftingPageRenderer.java +++ b/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookFusionShrineCraftingPageRenderer.java @@ -12,7 +12,6 @@ import net.minecraft.resources.*; import net.minecraft.world.item.crafting.*; import net.minecraft.world.level.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookHintPageRenderer.java b/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookHintPageRenderer.java index 94b899ef53..797988f15a 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookHintPageRenderer.java +++ b/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookHintPageRenderer.java @@ -15,7 +15,7 @@ import net.minecraft.network.chat.*; import net.minecraft.sounds.*; import net.neoforged.neoforge.network.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookInkConvertingPageRenderer.java b/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookInkConvertingPageRenderer.java index 700cdef244..51fc3d8e92 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookInkConvertingPageRenderer.java +++ b/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookInkConvertingPageRenderer.java @@ -6,7 +6,7 @@ import com.mojang.blaze3d.systems.*; import de.dafuqs.spectrum.*; import de.dafuqs.spectrum.compat.modonomicon.pages.*; -import de.dafuqs.spectrum.recipe.color_picker.InkConvertingRecipe; +import de.dafuqs.spectrum.recipe.color_picker.*; import net.minecraft.client.*; import net.minecraft.client.gui.*; import net.minecraft.network.chat.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookLinkPageRenderer.java b/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookLinkPageRenderer.java index 35c88c3b41..96a191cb93 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookLinkPageRenderer.java +++ b/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookLinkPageRenderer.java @@ -5,7 +5,7 @@ import de.dafuqs.spectrum.compat.modonomicon.pages.*; import net.minecraft.client.gui.components.*; import net.minecraft.network.chat.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class BookLinkPageRenderer extends BookTextPageRenderer { diff --git a/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookPedestalCraftingPageRenderer.java b/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookPedestalCraftingPageRenderer.java index 0137a14ee7..1a7ffdb837 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookPedestalCraftingPageRenderer.java +++ b/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookPedestalCraftingPageRenderer.java @@ -13,9 +13,6 @@ import net.minecraft.world.item.*; import net.minecraft.world.item.crafting.*; import net.minecraft.world.level.*; -import org.jetbrains.annotations.*; - -import javax.annotation.*; import java.util.*; @@ -64,7 +61,6 @@ protected void drawRecipe(GuiGraphics drawContext, RecipeHolder } } - @Contract(pure = true) private ResourceLocation getBackgroundTextureForTier(PedestalRecipeTier pedestalRecipeTier) { return switch (pedestalRecipeTier) { case BASIC -> BACKGROUND_TEXTURE1; diff --git a/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookSnippetPageRenderer.java b/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookSnippetPageRenderer.java index 897585a357..5399ec3aac 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookSnippetPageRenderer.java +++ b/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookSnippetPageRenderer.java @@ -9,7 +9,7 @@ import net.minecraft.client.gui.*; import net.minecraft.network.chat.*; import net.minecraft.util.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class BookSnippetPageRenderer extends BookPageRenderer implements PageWithTextRenderer { @@ -23,17 +23,22 @@ public void render(GuiGraphics drawContext, int mouseX, int mouseY, float ticks) renderTitle(drawContext, page.getTitle(), page.showTitleSeparator(), BookEntryScreen.PAGE_WIDTH / 2, 0); } - if (page.getText() instanceof RenderedBookTextHolder renderedText) { - int y = getTextY(); - for (MutableComponent component : renderedText.getRenderedText()) { - var wrapped = MarkdownComponentRenderUtils.wrapComponents(component, BookEntryScreen.PAGE_WIDTH - 10, BookEntryScreen.PAGE_WIDTH - 10, font); - for (FormattedCharSequence orderedText : wrapped) { - drawCenteredStringNoShadow(drawContext, orderedText, page.getBook().getBookTextOffsetWidth() + BookEntryScreen.PAGE_WIDTH / 2, y, 0, 1); - y += font.lineHeight; + if(page.centerText()) { + if (page.getText() instanceof RenderedBookTextHolder renderedText) { + int y = getTextY(); + for (MutableComponent component : renderedText.getRenderedText()) { + var wrapped = MarkdownComponentRenderUtils.wrapComponents(component, BookEntryScreen.PAGE_WIDTH - 10, BookEntryScreen.PAGE_WIDTH - 10, font); + for (FormattedCharSequence orderedText : wrapped) { + drawCenteredStringNoShadow(drawContext, orderedText, page.getBook().getBookTextOffsetWidth() + BookEntryScreen.PAGE_WIDTH / 2, y, 0, 1); + y += font.lineHeight; + } } + } else { + drawCenteredStringNoShadow(drawContext, page.getText().getComponent().getVisualOrderText(), BookEntryScreen.PAGE_WIDTH / 2, getTextY(), 0, 1); } } else { - drawCenteredStringNoShadow(drawContext, page.getText().getComponent().getVisualOrderText(), BookEntryScreen.PAGE_WIDTH / 2, getTextY(), 0, 1); + var textY = this.getTextY(); + this.renderBookTextHolder(drawContext, this.getPage().getText(), 0, textY, BookEntryScreen.PAGE_WIDTH, BookEntryScreen.PAGE_HEIGHT - textY); } RenderSystem.enableBlend(); @@ -57,7 +62,7 @@ public void render(GuiGraphics drawContext, int mouseX, int mouseY, float ticks) } } - var textStyle = getClickedComponentStyleAtForTextHolder(page.getText(), BookEntryScreen.PAGE_WIDTH / 2, getTextY(), BookEntryScreen.PAGE_WIDTH, pMouseX, pMouseY); + var textStyle = getClickedComponentStyleAtForTextHolder(page.getText(), BookEntryScreen.PAGE_WIDTH / 2, getTextY(), BookEntryScreen.PAGE_WIDTH, BookEntryScreen.PAGE_HEIGHT - getTextY(), pMouseX, pMouseY); if (textStyle != null) { return textStyle; } diff --git a/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookStatusEffectPageRenderer.java b/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookStatusEffectPageRenderer.java index 53b4631128..ad7fbba9c5 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookStatusEffectPageRenderer.java +++ b/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookStatusEffectPageRenderer.java @@ -8,7 +8,6 @@ import net.minecraft.client.renderer.texture.*; import net.minecraft.core.*; import net.minecraft.core.registries.*; -import net.minecraft.resources.*; import net.minecraft.world.effect.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookTitrationBarrelFermentingPageRenderer.java b/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookTitrationBarrelFermentingPageRenderer.java index 04e092868c..95b7cfb1db 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookTitrationBarrelFermentingPageRenderer.java +++ b/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookTitrationBarrelFermentingPageRenderer.java @@ -17,7 +17,7 @@ import net.minecraft.world.item.crafting.*; import net.minecraft.world.level.*; import net.neoforged.neoforge.fluids.crafting.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; @@ -41,7 +41,7 @@ public BookTitrationBarrelFermentingPageRenderer(BookGatedRecipePage effects) { - - public static final InkPoweredComponent DEFAULT = new InkPoweredComponent(List.of()); - - public static final Codec CODEC = RecordCodecBuilder.create(i -> i.group( - InkPoweredStatusEffectInstance.CODEC.listOf().fieldOf("effects").forGetter(InkPoweredComponent::effects) - ).apply(i, InkPoweredComponent::new)); - - public static final StreamCodec PACKET_CODEC = StreamCodec.composite( - InkPoweredStatusEffectInstance.PACKET_CODEC.apply(ByteBufCodecs.list()), InkPoweredComponent::effects, - InkPoweredComponent::new - ); - -} diff --git a/src/main/java/de/dafuqs/spectrum/components/InkPoweredPotionContentsComponent.java b/src/main/java/de/dafuqs/spectrum/components/InkPoweredPotionContentsComponent.java new file mode 100644 index 0000000000..703773c529 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/components/InkPoweredPotionContentsComponent.java @@ -0,0 +1,81 @@ +package de.dafuqs.spectrum.components; + +import com.mojang.serialization.*; +import com.mojang.serialization.codecs.*; +import de.dafuqs.spectrum.api.ink.*; +import de.dafuqs.spectrum.registries.*; +import net.minecraft.network.*; +import net.minecraft.network.codec.*; +import net.minecraft.util.*; +import net.minecraft.world.effect.*; +import net.minecraft.world.item.*; +import net.minecraft.world.item.alchemy.*; + +import java.util.*; + +public record InkPoweredPotionContentsComponent(List effects) implements Iterable { + + public static final InkPoweredPotionContentsComponent DEFAULT = new InkPoweredPotionContentsComponent(List.of()); + + public static final Codec CODEC = RecordCodecBuilder.create(i -> i.group( + InkPoweredMobEffectInstance.CODEC.listOf().fieldOf("effects").forGetter(InkPoweredPotionContentsComponent::effects) + ).apply(i, InkPoweredPotionContentsComponent::new)); + + public static final StreamCodec PACKET_CODEC = StreamCodec.composite( + InkPoweredMobEffectInstance.PACKET_CODEC.apply(ByteBufCodecs.list()), InkPoweredPotionContentsComponent::effects, + InkPoweredPotionContentsComponent::new + ); + + public static List getEffects(ItemStack stack) { + return stack.getOrDefault(SpectrumDataComponentTypes.INK_POWERED_POTION_CONTENTS, InkPoweredPotionContentsComponent.DEFAULT).effects(); + } + + public static void setEffects(ItemStack stack, List effects) { + stack.set(SpectrumDataComponentTypes.INK_POWERED_POTION_CONTENTS, new InkPoweredPotionContentsComponent(effects)); + } + + public OptionalInt getColor() { + return getColor(this.effects()); + } + + public static OptionalInt getColor(List effects) { + int i = 0; + int j = 0; + int k = 0; + int l = 0; + + for (InkPoweredMobEffectInstance instance : effects) { + if (instance.getStatusEffectInstance().isVisible()) { + int i1 = instance.getColor(); + int j1 = instance.getStatusEffectInstance().getAmplifier() + 1; + i += j1 * FastColor.ARGB32.red(i1); + j += j1 * FastColor.ARGB32.green(i1); + k += j1 * FastColor.ARGB32.blue(i1); + l += j1; + } + } + + return l == 0 ? OptionalInt.empty() : OptionalInt.of(FastColor.ARGB32.color(i / l, j / l, k / l)); + } + + @Override + public Iterator iterator() { + return this.effects.stream() + .map(InkPoweredMobEffectInstance::getStatusEffectInstance) + .iterator(); + } + + public int size() { + return this.effects.size(); + } + + @Deprecated + public List getVanillaEffects() { + return effects.stream().map(InkPoweredMobEffectInstance::getStatusEffectInstance).toList(); + } + + public static void clearEffects(ItemStack itemStack) { + itemStack.remove(SpectrumDataComponentTypes.INK_POWERED_POTION_CONTENTS); + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/components/InkStorageComponent.java b/src/main/java/de/dafuqs/spectrum/components/InkStorageComponent.java index 7d76412023..f1dfac8bba 100644 --- a/src/main/java/de/dafuqs/spectrum/components/InkStorageComponent.java +++ b/src/main/java/de/dafuqs/spectrum/components/InkStorageComponent.java @@ -2,8 +2,8 @@ import com.mojang.serialization.*; import com.mojang.serialization.codecs.*; -import de.dafuqs.spectrum.api.energy.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; +import de.dafuqs.spectrum.api.ink.storage.*; import io.netty.buffer.*; import net.minecraft.network.codec.*; import net.minecraft.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/components/JadeWineComponent.java b/src/main/java/de/dafuqs/spectrum/components/JadeWineComponent.java index a30361e6cc..a2042d0eaf 100644 --- a/src/main/java/de/dafuqs/spectrum/components/JadeWineComponent.java +++ b/src/main/java/de/dafuqs/spectrum/components/JadeWineComponent.java @@ -8,7 +8,6 @@ import net.minecraft.network.codec.*; import net.minecraft.world.item.*; import net.minecraft.world.item.component.*; -import javax.annotation.*; import java.util.function.*; diff --git a/src/main/java/de/dafuqs/spectrum/components/WithMilkComponent.java b/src/main/java/de/dafuqs/spectrum/components/WithMilkComponent.java index 9b74b217b5..6f21f122f1 100644 --- a/src/main/java/de/dafuqs/spectrum/components/WithMilkComponent.java +++ b/src/main/java/de/dafuqs/spectrum/components/WithMilkComponent.java @@ -6,7 +6,6 @@ import net.minecraft.network.codec.*; import net.minecraft.world.item.*; import net.minecraft.world.item.component.*; -import javax.annotation.*; import java.util.function.*; diff --git a/src/main/java/de/dafuqs/spectrum/components/WrappedPresentComponent.java b/src/main/java/de/dafuqs/spectrum/components/WrappedPresentComponent.java index 95254bec81..bf3b6398a5 100644 --- a/src/main/java/de/dafuqs/spectrum/components/WrappedPresentComponent.java +++ b/src/main/java/de/dafuqs/spectrum/components/WrappedPresentComponent.java @@ -2,7 +2,7 @@ import com.mojang.serialization.*; import com.mojang.serialization.codecs.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.blocks.present.*; import de.dafuqs.spectrum.helpers.*; import net.minecraft.network.*; diff --git a/src/main/java/de/dafuqs/spectrum/components/package-info.java b/src/main/java/de/dafuqs/spectrum/components/package-info.java index dda28c6173..99cfa64724 100644 --- a/src/main/java/de/dafuqs/spectrum/components/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/components/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.components; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/config/SpectrumConfig.java b/src/main/java/de/dafuqs/spectrum/config/SpectrumConfig.java index 4f5adcb6db..c754205edd 100644 --- a/src/main/java/de/dafuqs/spectrum/config/SpectrumConfig.java +++ b/src/main/java/de/dafuqs/spectrum/config/SpectrumConfig.java @@ -147,7 +147,37 @@ public class SpectrumConfig { public final ModConfigSpec.ConfigValue DecayIsStoppedBySupportedClaimMods; public final ModConfigSpec.ConfigValue REIListsUnrevealedRecipesAsNotUnlocked; + public final ModConfigSpec.ConfigValue DragonrotDripstoneDripChance; + public final ModConfigSpec.ConfigValue LiquidCrystalDripstoneDripChance; + public final ModConfigSpec.ConfigValue MidnightSolutionDripstoneDripChance; + + public final ModConfigSpec.ConfigValue DimensionPortals; + + public final ModConfigSpec.ConfigValue ConstructorsStaffInkCostPerBlock; + public final ModConfigSpec.ConfigValue ExchangingStaffInkCostPerBlock; + + public enum DimensionPortalSetting { + CREATE_PORTALS, + PROTECT_LOWEST_OVERWORLD_LEVEL, + NO_PORTALS + } + private SpectrumConfig(ModConfigSpec.Builder builder) { + ConstructorsStaffInkCostPerBlock = builder + .translation("config.spectrum.constructors_staff_ink_cost_per_block") + .comment("Required Ink for one Block placed by the Constructor's Staff") + .define("constructors_staff_ink_cost_per_block", 1); + + ExchangingStaffInkCostPerBlock = builder + .translation("config.spectrum.exchanging_staff_ink_cost_per_block") + .comment("Required Ink for one Block placed by the Exchanging Staff") + .define("exchanging_staff_ink_cost_per_block", 5); + + DimensionPortals = builder + .translation("config.spectrum.dimension_portals") + .comment("Allow the creation of portals using Ruin") + .defineEnum("dimension_portals", DimensionPortalSetting.CREATE_PORTALS); + ToastTimeMilliseconds = builder .translation("config.spectrum.toast_milliseconds") .comment("The duration in milliseconds ingame recipe/unlock popups stay on the screen") @@ -229,21 +259,21 @@ private SpectrumConfig(ModConfigSpec.Builder builder) { ShootingStarDimensions = builder .translation("config.spectrum.shooting_star_dimensions") - .comment("Dimensions where shooting stars spawn for players. Shooting Stars will only spawn for players with sufficient progress in the mod") - .defineList("shooting_star_dimensions", List.of("minecraft:overworld", "starry_skies:overworld", "paradise_lost:paradise_lost"), () -> "mymod:my_[regex_matched_]*_dimension_id", o -> true); + .comment("Dimensions where Shooting Stars spawn for players. Shooting Stars will only spawn for players with sufficient progress in the mod.") + .defineList("shooting_star_dimensions", List.of("minecraft:overworld", "starry_skies:overworld", "paradise_lost:paradise_lost", "tropicraft:tropics"), () -> "mymod:my_[regex_matched_]*_dimension_id", o -> true); ShootingStarSpawnChance = builder .translation("config.spectrum.shooting_star_spawn_chance") .comment(""" - Shooting star spawns are checked every night between time 13000 and 22000, every 100 ticks (so 100 chances per night). + Shooting Star spawns are checked every night between time 13000 and 22000, every 100 ticks (so 100 chances per night). By default, there is a 0.0075 ^= 0.75 % chance at each of those check times. Making it ~1 shooting star spawn per night per player that unlocked the required progression.""") .define("shooting_star_spawn_chance", 0.0075D); StormStoneDimensions = builder .translation("config.spectrum.storm_stone_dimensions") - .comment("Dimensions where lightning strikes can spawn Storm Stones") - .defineList("storm_stone_dimensions", List.of("minecraft:overworld", "starry_skies:overworld", "paradise_lost:paradise_lost"), () -> "mymod:my_[regex_matched_]*_dimension_id", o -> true); + .comment("Dimensions where lightning strikes will cause Storm Stones to spawn. Storm Stones will only be visible for players with sufficient progress in the mod.") + .defineList("storm_stone_dimensions", List.of("minecraft:overworld", "starry_skies:overworld", "paradise_lost:paradise_lost", "tropicraft:tropics"), () -> "mymod:my_[regex_matched_]*_dimension_id", o -> true); StormStoneSpawnChance = builder .translation("config.spectrum.storm_stone_spawn_chance") @@ -617,7 +647,7 @@ private SpectrumConfig(ModConfigSpec.Builder builder) { NightfallsBladeEnchantability = builder .translation("config.spectrum.nightfalls_blade_enchantability") - .define("nightfalls_blade_enchantability", 0); + .define("nightfalls_blade_enchantability", 1); MaxLevelForEffectsInLesserPotionPendant = builder .translation("config.spectrum.max_level_for_effects_in_lesser_potion_pendant") @@ -644,6 +674,19 @@ private SpectrumConfig(ModConfigSpec.Builder builder) { Setting this value to false will instead not show this screen, showing no recipes whatsoever, until unlocked """) .define("rei_lists_unrevealed_recipes_as_not_unlocked", true); + + DragonrotDripstoneDripChance = builder + .translation("config.spectrum.dragonrot_dripstone_drip_chance") + .comment("The chance for Dripstone to fill a Cauldron with Dragonrot") + .define("dragonrot_dripstone_drip_chance", 0.01D); + LiquidCrystalDripstoneDripChance = builder + .translation("config.spectrum.liquid_crystal_dripstone_drip_chance") + .comment("The chance for Dripstone to fill a Cauldron with Liquid Crystal") + .define("liquid_crystal_dripstone_drip_chance", 0.01D); + MidnightSolutionDripstoneDripChance = builder + .translation("config.spectrum.midnight_solution_dripstone_drip_chance") + .comment("The chance for Dripstone to fill a Cauldron with Midnight Solution") + .define("midnight_solution_dripstone_drip_chance", 0.01D); } public final boolean canPedestalCraftVanillaRecipes() { diff --git a/src/main/java/de/dafuqs/spectrum/config/package-info.java b/src/main/java/de/dafuqs/spectrum/config/package-info.java index 7269d5e808..40a2ce7d1c 100644 --- a/src/main/java/de/dafuqs/spectrum/config/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/config/package-info.java @@ -3,6 +3,5 @@ @FieldsAreNonnullByDefault package de.dafuqs.spectrum.config; -import net.minecraft.FieldsAreNonnullByDefault; -import net.minecraft.MethodsReturnNonnullByDefault; -import org.jspecify.annotations.NullMarked; +import net.minecraft.*; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/data/package-info.java b/src/main/java/de/dafuqs/spectrum/data/package-info.java index 7639bfb46a..b59b2f594e 100644 --- a/src/main/java/de/dafuqs/spectrum/data/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/data/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.data; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/data_loaders/ColorMappingDataLoader.java b/src/main/java/de/dafuqs/spectrum/data_loaders/ColorMappingDataLoader.java index f2b2d756c4..a9193d1b49 100644 --- a/src/main/java/de/dafuqs/spectrum/data_loaders/ColorMappingDataLoader.java +++ b/src/main/java/de/dafuqs/spectrum/data_loaders/ColorMappingDataLoader.java @@ -1,22 +1,15 @@ package de.dafuqs.spectrum.data_loaders; import com.google.gson.*; -import com.mojang.datafixers.util.*; -import com.mojang.serialization.*; -import com.mojang.serialization.codecs.*; import de.dafuqs.spectrum.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.core.*; import net.minecraft.resources.*; import net.minecraft.server.packs.resources.*; -import net.minecraft.util.*; import net.minecraft.util.profiling.*; -import javax.annotation.*; import java.util.*; -import java.util.function.*; -import java.util.stream.*; public class ColorMappingDataLoader extends SimpleJsonResourceReloadListener { diff --git a/src/main/java/de/dafuqs/spectrum/data_loaders/CrystalApothecarySimulationsDataLoader.java b/src/main/java/de/dafuqs/spectrum/data_loaders/CrystalApothecarySimulationsDataLoader.java index 1d0763b0fb..4eaa8dc14a 100644 --- a/src/main/java/de/dafuqs/spectrum/data_loaders/CrystalApothecarySimulationsDataLoader.java +++ b/src/main/java/de/dafuqs/spectrum/data_loaders/CrystalApothecarySimulationsDataLoader.java @@ -5,7 +5,6 @@ import com.mojang.serialization.*; import com.mojang.serialization.codecs.*; import de.dafuqs.spectrum.*; -import de.dafuqs.spectrum.registries.*; import net.minecraft.core.registries.*; import net.minecraft.resources.*; import net.minecraft.server.packs.resources.*; diff --git a/src/main/java/de/dafuqs/spectrum/data_loaders/EntityFishingDataLoader.java b/src/main/java/de/dafuqs/spectrum/data_loaders/EntityFishingDataLoader.java index f1295fe4df..08d52772a6 100644 --- a/src/main/java/de/dafuqs/spectrum/data_loaders/EntityFishingDataLoader.java +++ b/src/main/java/de/dafuqs/spectrum/data_loaders/EntityFishingDataLoader.java @@ -17,7 +17,6 @@ import net.minecraft.world.entity.*; import net.minecraft.world.level.*; import net.minecraft.world.level.material.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/data_loaders/GeodeOreDefinition.java b/src/main/java/de/dafuqs/spectrum/data_loaders/GeodeOreDefinition.java new file mode 100644 index 0000000000..1f2c839a77 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/data_loaders/GeodeOreDefinition.java @@ -0,0 +1,18 @@ +package de.dafuqs.spectrum.data_loaders; + +import com.mojang.serialization.*; +import com.mojang.serialization.codecs.*; +import de.dafuqs.spectrum.api.predicate.block.*; +import net.minecraft.world.level.levelgen.feature.configurations.*; + +import java.util.*; + +public record GeodeOreDefinition(BrokenBlockPredicate blocks, List oreConfiguration, int minDistance, int maxDistance, int tries) { + public static final Codec CODEC = RecordCodecBuilder.create((i -> i.group( + BrokenBlockPredicate.CODEC.fieldOf("geode_inner_layer_block_predicate").forGetter(c -> c.blocks), + Codec.list(OreConfiguration.TargetBlockState.CODEC).fieldOf("ore_configuration").forGetter(c -> c.oreConfiguration), + Codec.INT.fieldOf("min_distance_from_center").forGetter(c -> c.minDistance), + Codec.INT.fieldOf("max_distance_from_center").forGetter(c -> c.maxDistance), + Codec.INT.fieldOf("tries_per_range_increment").forGetter(c -> c.tries) + ).apply(i, GeodeOreDefinition::new))); +} \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/data_loaders/NaturesStaffConversionDataLoader.java b/src/main/java/de/dafuqs/spectrum/data_loaders/NaturesStaffConversionDataLoader.java index 060efb52eb..d09fb4e34c 100644 --- a/src/main/java/de/dafuqs/spectrum/data_loaders/NaturesStaffConversionDataLoader.java +++ b/src/main/java/de/dafuqs/spectrum/data_loaders/NaturesStaffConversionDataLoader.java @@ -10,7 +10,7 @@ import net.minecraft.util.profiling.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/data_loaders/client/BiomeRenderingDataLoader.java b/src/main/java/de/dafuqs/spectrum/data_loaders/client/BiomeRenderingDataLoader.java index 139ba5a880..7412a4e4d2 100644 --- a/src/main/java/de/dafuqs/spectrum/data_loaders/client/BiomeRenderingDataLoader.java +++ b/src/main/java/de/dafuqs/spectrum/data_loaders/client/BiomeRenderingDataLoader.java @@ -6,18 +6,14 @@ import com.mojang.serialization.codecs.*; import de.dafuqs.spectrum.*; import de.dafuqs.spectrum.render.biome_rendering.*; -import net.minecraft.core.registries.Registries; -import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.packs.resources.ResourceManager; -import net.minecraft.server.packs.resources.SimpleJsonResourceReloadListener; -import net.minecraft.util.profiling.ProfilerFiller; -import net.minecraft.world.level.biome.Biome; +import net.minecraft.core.registries.*; +import net.minecraft.resources.*; +import net.minecraft.server.packs.resources.*; +import net.minecraft.util.profiling.*; +import net.minecraft.world.level.biome.*; import net.neoforged.neoforge.common.conditions.*; -import javax.annotation.*; import java.util.*; -import java.util.function.*; public class BiomeRenderingDataLoader extends SimpleJsonResourceReloadListener { diff --git a/src/main/java/de/dafuqs/spectrum/data_loaders/client/ParticleSpawnerParticlesDataLoader.java b/src/main/java/de/dafuqs/spectrum/data_loaders/client/ParticleSpawnerParticlesDataLoader.java index 0be54ef469..5686481440 100644 --- a/src/main/java/de/dafuqs/spectrum/data_loaders/client/ParticleSpawnerParticlesDataLoader.java +++ b/src/main/java/de/dafuqs/spectrum/data_loaders/client/ParticleSpawnerParticlesDataLoader.java @@ -10,7 +10,7 @@ import net.minecraft.util.*; import net.minecraft.util.profiling.*; import net.minecraft.world.entity.player.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/data_loaders/client/package-info.java b/src/main/java/de/dafuqs/spectrum/data_loaders/client/package-info.java index 9ca69412d9..5d0afcd89f 100644 --- a/src/main/java/de/dafuqs/spectrum/data_loaders/client/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/data_loaders/client/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.data_loaders.client; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/data_loaders/package-info.java b/src/main/java/de/dafuqs/spectrum/data_loaders/package-info.java index dc5e9cd790..4e0dd38aae 100644 --- a/src/main/java/de/dafuqs/spectrum/data_loaders/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/data_loaders/package-info.java @@ -3,6 +3,5 @@ @FieldsAreNonnullByDefault package de.dafuqs.spectrum.data_loaders; -import net.minecraft.FieldsAreNonnullByDefault; -import net.minecraft.MethodsReturnNonnullByDefault; -import org.jspecify.annotations.NullMarked; +import net.minecraft.*; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/data_loaders/resonance_processors/DropSelfResonanceProcessor.java b/src/main/java/de/dafuqs/spectrum/data_loaders/resonance_processors/DropSelfResonanceProcessor.java index d577e6256b..a7ff6ad7d3 100644 --- a/src/main/java/de/dafuqs/spectrum/data_loaders/resonance_processors/DropSelfResonanceProcessor.java +++ b/src/main/java/de/dafuqs/spectrum/data_loaders/resonance_processors/DropSelfResonanceProcessor.java @@ -1,5 +1,6 @@ package de.dafuqs.spectrum.data_loaders.resonance_processors; +import com.mojang.datafixers.util.*; import com.mojang.serialization.*; import com.mojang.serialization.codecs.*; import de.dafuqs.spectrum.api.interaction.*; @@ -12,6 +13,7 @@ import net.minecraft.world.level.block.entity.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.block.state.properties.*; +import org.jspecify.annotations.*; import java.util.*; @@ -38,13 +40,12 @@ public DropSelfResonanceProcessor(BrokenBlockPredicate blockTarget, List } @Override - public boolean process(BlockState state, BlockEntity blockEntity, List droppedStacks) { + public Optional> process(BlockState state, @Nullable BlockEntity blockEntity, List droppedStacks) { if (blockPredicate.test(state)) { - dropSelf(state, blockEntity, droppedStacks); ResonanceProcessor.preventNextXPDrop = true; - return true; + return Optional.of(dropSelf(state, blockEntity, droppedStacks)); } - return false; + return Optional.empty(); } public void copyBlockStateTags(BlockState minedState, ItemStack convertedStack) { @@ -77,18 +78,18 @@ public void copyNbt(BlockEntity blockEntity, ItemStack convertedStack) { } } - private void dropSelf(BlockState minedState, BlockEntity blockEntity, List droppedStacks) { + private List dropSelf(BlockState minedState, @Nullable BlockEntity blockEntity, List droppedStacks) { ItemStack selfStack = minedState.getBlock().asItem().getDefaultInstance(); if (!statePropertiesToCopy.isEmpty()) { copyBlockStateTags(minedState, selfStack); } - if (!nbtToCopy.isEmpty()) { + if (!nbtToCopy.isEmpty() && blockEntity != null) { copyNbt(blockEntity, selfStack); } droppedStacks.clear(); - droppedStacks.add(selfStack); + return List.of(selfStack); } public MapCodec getCodec() { diff --git a/src/main/java/de/dafuqs/spectrum/data_loaders/resonance_processors/ModifyDropsResonanceProcessor.java b/src/main/java/de/dafuqs/spectrum/data_loaders/resonance_processors/ModifyDropsResonanceProcessor.java index 509a2373ce..b1533e06d9 100644 --- a/src/main/java/de/dafuqs/spectrum/data_loaders/resonance_processors/ModifyDropsResonanceProcessor.java +++ b/src/main/java/de/dafuqs/spectrum/data_loaders/resonance_processors/ModifyDropsResonanceProcessor.java @@ -12,6 +12,7 @@ import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.entity.*; import net.minecraft.world.level.block.state.*; +import org.jspecify.annotations.*; import java.util.*; @@ -35,28 +36,31 @@ public ModifyDropsResonanceProcessor(BrokenBlockPredicate blockTarget, Map droppedStacks) { + public Optional> process(BlockState state, @Nullable BlockEntity blockEntity, List droppedStacks) { if (blockPredicate.test(state)) { - modifyDrops(droppedStacks); - return true; + return Optional.of(modifyDrops(droppedStacks)); } - return false; + return Optional.empty(); } - private void modifyDrops(List droppedStacks) { - ListIterator i = droppedStacks.listIterator(); - while(i.hasNext()) { - ItemStack stack = i.next(); + private List modifyDrops(List droppedStacks) { + List results = new ArrayList<>(); + outer: + for (ItemStack stack : droppedStacks) { for (Map.Entry modifiedDrop : modifiedDrops.entrySet()) { if (modifiedDrop.getKey().test(stack)) { ItemStack convertedStack; convertedStack = modifiedDrop.getValue().getDefaultInstance(); convertedStack.setCount(stack.getCount()); - i.set(convertedStack); - break; + results.add(convertedStack); + break outer; } } + + // did not find a matching conversion; use the original + results.add(stack); } + return results; } public MapCodec getCodec() { diff --git a/src/main/java/de/dafuqs/spectrum/data_loaders/resonance_processors/package-info.java b/src/main/java/de/dafuqs/spectrum/data_loaders/resonance_processors/package-info.java index 8b5f2054cf..9a465590e3 100644 --- a/src/main/java/de/dafuqs/spectrum/data_loaders/resonance_processors/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/data_loaders/resonance_processors/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.data_loaders.resonance_processors; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/deeper_down/client/DeeperDownDimensionEffects.java b/src/main/java/de/dafuqs/spectrum/deeper_down/client/DeeperDownDimensionEffects.java index 3a9b71bca3..231a85921d 100644 --- a/src/main/java/de/dafuqs/spectrum/deeper_down/client/DeeperDownDimensionEffects.java +++ b/src/main/java/de/dafuqs/spectrum/deeper_down/client/DeeperDownDimensionEffects.java @@ -2,7 +2,7 @@ import net.minecraft.client.renderer.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class DeeperDownDimensionEffects extends DimensionSpecialEffects { diff --git a/src/main/java/de/dafuqs/spectrum/deeper_down/client/HowlingSpireEffects.java b/src/main/java/de/dafuqs/spectrum/deeper_down/client/HowlingSpireEffects.java index ac5de9e0e1..7edd036190 100644 --- a/src/main/java/de/dafuqs/spectrum/deeper_down/client/HowlingSpireEffects.java +++ b/src/main/java/de/dafuqs/spectrum/deeper_down/client/HowlingSpireEffects.java @@ -1,6 +1,5 @@ package de.dafuqs.spectrum.deeper_down.client; -import de.dafuqs.spectrum.*; import de.dafuqs.spectrum.config.*; import de.dafuqs.spectrum.particle.*; import de.dafuqs.spectrum.particle.client.*; diff --git a/src/main/java/de/dafuqs/spectrum/deeper_down/client/package-info.java b/src/main/java/de/dafuqs/spectrum/deeper_down/client/package-info.java index d352770801..31e5b01801 100644 --- a/src/main/java/de/dafuqs/spectrum/deeper_down/client/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/deeper_down/client/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.deeper_down.client; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/deeper_down/package-info.java b/src/main/java/de/dafuqs/spectrum/deeper_down/package-info.java index 1bb0636824..e5d291cadb 100644 --- a/src/main/java/de/dafuqs/spectrum/deeper_down/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/deeper_down/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.deeper_down; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/entity/SpectrumEntityRenderers.java b/src/main/java/de/dafuqs/spectrum/entity/SpectrumEntityRenderers.java index edeacbfd68..a9548e37a8 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/SpectrumEntityRenderers.java +++ b/src/main/java/de/dafuqs/spectrum/entity/SpectrumEntityRenderers.java @@ -1,6 +1,7 @@ package de.dafuqs.spectrum.entity; import de.dafuqs.spectrum.entity.render.*; +import de.dafuqs.spectrum.registries.*; import net.minecraft.client.renderer.entity.*; import net.minecraft.world.entity.*; import net.neoforged.fml.event.lifecycle.*; @@ -9,7 +10,7 @@ public class SpectrumEntityRenderers { public static void registerClient(FMLClientSetupEvent event) { - register(SpectrumEntityTypes.FLOAT_BLOCK.get(), FloatBlockEntityRenderer::new); + register(SpectrumEntityTypes.FLOAT_BLOCK.get(), FallingBlockRenderer::new); register(SpectrumEntityTypes.SEAT.get(), SeatEntityRenderer::new); register(SpectrumEntityTypes.SHOOTING_STAR.get(), ShootingStarEntityRenderer::new); register(SpectrumEntityTypes.PHANTOM_FRAME.get(), PhantomFrameEntityRenderer::new); @@ -40,6 +41,8 @@ public static void registerClient(FMLClientSetupEvent event) { register(SpectrumEntityTypes.DRACONIC_TWINSWORD.get(), (context) -> new BidentEntityRenderer(context, 2.15F, 0)); register(SpectrumEntityTypes.MARROW.get(), MarrowRenderer::new); register(SpectrumEntityTypes.SPLINTERSPAWN.get(), SplinterspawnRenderer::new); + register(SpectrumEntityTypes.KOI.get(), KoiRenderer::new); + register(SpectrumEntityTypes.CRAWFISH.get(), CrawfishRenderer::new); } private static void register(EntityType type, EntityRendererProvider factory) { diff --git a/src/main/java/de/dafuqs/spectrum/entity/SpectrumEntitySubPredicateTypes.java b/src/main/java/de/dafuqs/spectrum/entity/SpectrumEntitySubPredicateTypes.java index 8171e7db17..92fb24ed46 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/SpectrumEntitySubPredicateTypes.java +++ b/src/main/java/de/dafuqs/spectrum/entity/SpectrumEntitySubPredicateTypes.java @@ -4,7 +4,6 @@ import de.dafuqs.spectrum.*; import de.dafuqs.spectrum.entity.predicates.*; import net.minecraft.advancements.critereon.*; -import net.minecraft.core.*; import net.minecraft.core.registries.*; import net.neoforged.bus.api.*; import net.neoforged.neoforge.registries.*; diff --git a/src/main/java/de/dafuqs/spectrum/entity/SpectrumEntityTypes.java b/src/main/java/de/dafuqs/spectrum/entity/SpectrumEntityTypes.java deleted file mode 100644 index a1ea2da837..0000000000 --- a/src/main/java/de/dafuqs/spectrum/entity/SpectrumEntityTypes.java +++ /dev/null @@ -1,96 +0,0 @@ -package de.dafuqs.spectrum.entity; - -import de.dafuqs.spectrum.*; -import de.dafuqs.spectrum.entity.entity.*; -import net.minecraft.core.registries.*; -import net.minecraft.world.entity.*; -import net.minecraft.world.entity.monster.*; -import net.minecraft.world.level.levelgen.*; -import net.neoforged.bus.api.*; -import net.neoforged.neoforge.event.entity.*; -import net.neoforged.neoforge.registries.*; - -public class SpectrumEntityTypes { - - private static final DeferredRegister> REGISTER = DeferredRegister.create(Registries.ENTITY_TYPE, SpectrumCommon.MOD_ID); - - public static final DeferredHolder, EntityType> LIVING_MARKER = register("living_marker", 0, 2147483647, false, EntityDimensions.scalable(0F, 0F), true, LivingMarkerEntity::new); - public static final DeferredHolder, EntityType> SHOOTING_STAR = register("shooting_star", 15, 20, true, EntityDimensions.scalable(0.8F, 0.8F), true, ShootingStarEntity::new); - public static final DeferredHolder, EntityType> SEAT = register("seat", 8, 10, false, EntityDimensions.scalable(0.01F, 0.01F), true, SeatEntity::new); - public static final DeferredHolder, EntityType> FLOAT_BLOCK = register("float_block", 10, 20, true, EntityDimensions.scalable(0.98F, 0.98F), true, FloatBlockEntity::new); - public static final DeferredHolder, EntityType> PHANTOM_FRAME = register("phantom_frame", 10, 2147483647, false, EntityDimensions.scalable(0.5F, 0.5F), false, PhantomFrameEntity::new); - public static final DeferredHolder, EntityType> GLOW_PHANTOM_FRAME = register("glow_phantom_frame", 10, 2147483647, false, EntityDimensions.scalable(0.5F, 0.5F), false, PhantomGlowFrameEntity::new); - public static final DeferredHolder, EntityType> BLOCK_FLOODER_PROJECTILE = register("block_flooder_projectile", 4, 10, true, EntityDimensions.scalable(0.25F, 0.25F), true, BlockFlooderProjectile::new); - public static final DeferredHolder, EntityType> INK_PROJECTILE = register("ink_projectile", 4, 10, true, EntityDimensions.scalable(0.3F, 0.3F), true, InkProjectileEntity::new); - public static final DeferredHolder, EntityType> LAGOON_FISHING_BOBBER = register("lagoon_fishing_bobber", EntityType.Builder.of(LagoonFishingHook::new, MobCategory.MISC).noSave().noSummon().fireImmune().sized(0.25F, 0.25F).clientTrackingRange(4).updateInterval(5)); - public static final DeferredHolder, EntityType> MOLTEN_FISHING_BOBBER = register("molten_fishing_bobber", EntityType.Builder.of(MoltenFishingHook::new, MobCategory.MISC).noSave().noSummon().fireImmune().sized(0.25F, 0.25F).clientTrackingRange(4).updateInterval(5)); - public static final DeferredHolder, EntityType> BEDROCK_FISHING_BOBBER = register("bedrock_fishing_bobber", EntityType.Builder.of(BedrockFishingHook::new, MobCategory.MISC).noSave().noSummon().fireImmune().sized(0.25F, 0.25F).clientTrackingRange(4).updateInterval(5)); - public static final DeferredHolder, EntityType> FIREPROOF_ITEM = register("fireproof_item", 6, 20, true, EntityDimensions.scalable(0.25F, 0.25F), true, FireproofItemEntity::new); - public static final DeferredHolder, EntityType> EGG_LAYING_WOOLY_PIG = register("egg_laying_wooly_pig", EntityType.Builder.of(EggLayingWoolyPigEntity::new, MobCategory.CREATURE).sized(0.9F, 1.3F).clientTrackingRange(10)); - public static final DeferredHolder, EntityType> GLASS_ARROW = register("glass_arrow", EntityType.Builder.of(GlassArrowEntity::new, MobCategory.MISC).sized(0.5F, 0.5F).clientTrackingRange(4).updateInterval(20)); - public static final DeferredHolder, EntityType> MINING_PROJECTILE = register("mining_projectile", 4, 10, true, EntityDimensions.scalable(0.3F, 0.3F), true, MiningProjectileEntity::new); - public static final DeferredHolder, EntityType> PARAMETRIC_MINING_DEVICE_ENTITY = register("parametric_mining_device", 4, 10, true, EntityDimensions.scalable(0.25F, 0.25F), false, ParametricMiningDeviceEntity::new); - public static final DeferredHolder, EntityType> BIDENT = register("bident", 4, 10, true, EntityDimensions.scalable(0.5F, 0.5F), true, BidentEntity::new); - public static final DeferredHolder, EntityType> BIDENT_MIRROR_IMAGE = register("bident_mirror_image", 4, 10, true, EntityDimensions.scalable(0.5F, 0.5F), true, BidentMirrorImageEntity::new); - public static final DeferredHolder, EntityType> LIGHT_SHARD = register("light_shard", EntityType.Builder.of(LightShardEntity::new, MobCategory.MISC).noSave().fireImmune().sized(0.75F, 0.75F).clientTrackingRange(4).updateInterval(20)); - public static final DeferredHolder, EntityType> LIGHT_SPEAR = register("light_spear", EntityType.Builder.of(LightSpearEntity::new, MobCategory.MISC).noSave().fireImmune().sized(0.75F, 0.75F).clientTrackingRange(4).updateInterval(20)); - public static final DeferredHolder, EntityType> LIGHT_MINE = register("light_mine", EntityType.Builder.of(LightMineEntity::new, MobCategory.MISC).noSave().fireImmune().sized(0.75F, 0.75F).clientTrackingRange(4).updateInterval(20)); - public static final DeferredHolder, EntityType> MONSTROSITY = register("monstrosity", EntityType.Builder.of(MonstrosityEntity::new, MobCategory.MISC).fireImmune().canSpawnFarFromPlayer().sized(6.0F, 6.0F).clientTrackingRange(10)); - public static final DeferredHolder, EntityType> PRESERVATION_TURRET = register("preservation_turret", EntityType.Builder.of(PreservationTurretEntity::new, MobCategory.MONSTER).fireImmune().canSpawnFarFromPlayer().sized(1.0F, 1.0F).clientTrackingRange(10)); - public static final DeferredHolder, EntityType> LIZARD = register("lizard", EntityType.Builder.of(LizardEntity::new, MobCategory.AMBIENT).sized(1.0F, 0.7F).clientTrackingRange(10)); - public static final DeferredHolder, EntityType> KINDLING = register("kindling", EntityType.Builder.of(KindlingEntity::new, MobCategory.CREATURE).sized(1.0F, 1.0F).passengerAttachments(0.5F).clientTrackingRange(10).fireImmune()); - public static final DeferredHolder, EntityType> KINDLING_COUGH = register("kindling_cough", EntityType.Builder.of(KindlingCoughEntity::new, MobCategory.MISC).sized(0.25F, 0.25F).clientTrackingRange(4).updateInterval(10).fireImmune()); - public static final DeferredHolder, EntityType> ERASER = register("eraser", EntityType.Builder.of(EraserEntity::new, MobCategory.MONSTER).sized(0.3F, 0.3F).clientTrackingRange(10)); - public static final DeferredHolder, EntityType> ITEM_PROJECTILE = register("item_projectile", EntityType.Builder.of(ItemProjectileEntity::new, MobCategory.MISC).sized(0.25F, 0.25F).clientTrackingRange(6).updateInterval(20)); - public static final DeferredHolder, EntityType> DRAGON_TALON = register("dragon_talon", 4, 10, true, EntityDimensions.scalable(0.5F, 0.5F), true, DragonTalonEntity::new); - public static final DeferredHolder, EntityType> DRACONIC_TWINSWORD = register("draconic_twinsword", 6, 2, true, EntityDimensions.scalable(0.5F, 0.5F), true, DraconicTwinswordEntity::new); - public static final DeferredHolder, EntityType> MARROW = register("marrow", EntityType.Builder.of(Marrow::new, MobCategory.MONSTER).sized(0.6F, 1.99F).eyeHeight(1.74F).ridingOffset(-0.7F).clientTrackingRange(8)); - public static final DeferredHolder, EntityType> SPLINTERSPAWN = register("splinterspawn", EntityType.Builder.of(Splinterspawn::new, MobCategory.MONSTER).sized(0.4F, 0.3F).eyeHeight(0.13F).passengerAttachments(0.2375F).clientTrackingRange(8)); - - public static void registerAttributes(EntityAttributeCreationEvent event) { - event.put(LIVING_MARKER.get(),LivingMarkerEntity.createLivingAttributes().build()); - event.put(EGG_LAYING_WOOLY_PIG.get(), EggLayingWoolyPigEntity.createEggLayingWoolyPigAttributes().build()); - event.put(MONSTROSITY.get(), MonstrosityEntity.createMonstrosityAttributes().build()); - event.put(PRESERVATION_TURRET.get(), PreservationTurretEntity.createGuardianTurretAttributes().build()); - event.put(LIZARD.get(), LizardEntity.createLizardAttributes().build()); - event.put(KINDLING.get(), KindlingEntity.createKindlingAttributes().build()); - event.put(ERASER.get(), EraserEntity.createEraserAttributes().build()); - event.put(MARROW.get(), Marrow.createMarrowAttributes().build()); - event.put(SPLINTERSPAWN.get(), Splinterspawn.createSplinterSpawnAttributes().build()); - } - - public static void registerSpawnPlacements(RegisterSpawnPlacementsEvent event) { - event.register(ERASER.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Monster::checkMonsterSpawnRules, RegisterSpawnPlacementsEvent.Operation.OR); - event.register(MARROW.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Monster::checkMonsterSpawnRules, RegisterSpawnPlacementsEvent.Operation.OR); - } - - // TODO: remove - public static DeferredHolder, EntityType> register(String name, int trackingDistance, int updateIntervalTicks, boolean alwaysUpdateVelocity, EntityDimensions size, boolean fireImmune, EntityType.EntityFactory factory) { - return REGISTER.register( - name, () -> { - EntityType.Builder builder = EntityType.Builder.of(factory, MobCategory.MISC) - .clientTrackingRange(trackingDistance) - .updateInterval(updateIntervalTicks) - .setShouldReceiveVelocityUpdates(alwaysUpdateVelocity) - .sized(size.width(), size.height()); - - if (fireImmune) { - builder.fireImmune(); - } - - return builder.build(SpectrumCommon.MOD_ID + "." + name); - } - ); - } - - private static DeferredHolder, EntityType> register(String id, EntityType.Builder type) { - return REGISTER.register(id, () -> type.build(SpectrumCommon.MOD_ID + "." + id)); - } - - public static void register(IEventBus modBus) { - modBus.addListener(SpectrumEntityTypes::registerAttributes); - modBus.addListener(SpectrumEntityTypes::registerSpawnPlacements); - REGISTER.register(modBus); - } - -} diff --git a/src/main/java/de/dafuqs/spectrum/entity/SpectrumTrackedDataHandlerRegistry.java b/src/main/java/de/dafuqs/spectrum/entity/SpectrumTrackedDataHandlerRegistry.java index f3e18c60ff..66cd74b826 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/SpectrumTrackedDataHandlerRegistry.java +++ b/src/main/java/de/dafuqs/spectrum/entity/SpectrumTrackedDataHandlerRegistry.java @@ -1,7 +1,7 @@ package de.dafuqs.spectrum.entity; import de.dafuqs.spectrum.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.entity.variants.*; import de.dafuqs.spectrum.items.tools.*; import de.dafuqs.spectrum.registries.*; diff --git a/src/main/java/de/dafuqs/spectrum/entity/ai/package-info.java b/src/main/java/de/dafuqs/spectrum/entity/ai/package-info.java index c67a7aa98f..76ac53f94d 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/ai/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/entity/ai/package-info.java @@ -3,6 +3,5 @@ @FieldsAreNonnullByDefault package de.dafuqs.spectrum.entity.ai; -import net.minecraft.FieldsAreNonnullByDefault; -import net.minecraft.MethodsReturnNonnullByDefault; -import org.jspecify.annotations.NullMarked; +import net.minecraft.*; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/entity/animation/package-info.java b/src/main/java/de/dafuqs/spectrum/entity/animation/package-info.java index 5dea428471..d7c0cca2fc 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/animation/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/entity/animation/package-info.java @@ -3,6 +3,5 @@ @FieldsAreNonnullByDefault package de.dafuqs.spectrum.entity.animation; -import net.minecraft.FieldsAreNonnullByDefault; -import net.minecraft.MethodsReturnNonnullByDefault; -import org.jspecify.annotations.NullMarked; +import net.minecraft.*; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/entity/entity/BedrockFishingHook.java b/src/main/java/de/dafuqs/spectrum/entity/entity/BedrockFishingHook.java index 8112d9031f..4e78bb0547 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/entity/BedrockFishingHook.java +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/BedrockFishingHook.java @@ -1,6 +1,6 @@ package de.dafuqs.spectrum.entity.entity; -import de.dafuqs.spectrum.entity.*; +import de.dafuqs.spectrum.registries.*; import net.minecraft.world.entity.*; import net.minecraft.world.entity.player.*; import net.minecraft.world.level.*; diff --git a/src/main/java/de/dafuqs/spectrum/entity/entity/BidentBaseEntity.java b/src/main/java/de/dafuqs/spectrum/entity/entity/BidentBaseEntity.java index 7fa1229e87..2bcfa2a3f3 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/entity/BidentBaseEntity.java +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/BidentBaseEntity.java @@ -2,12 +2,14 @@ import de.dafuqs.spectrum.registries.*; import net.minecraft.network.syncher.*; +import net.minecraft.server.level.*; import net.minecraft.sounds.*; +import net.minecraft.util.*; import net.minecraft.world.entity.*; import net.minecraft.world.entity.projectile.*; import net.minecraft.world.item.*; +import net.minecraft.world.item.enchantment.*; import net.minecraft.world.level.*; -import javax.annotation.*; public abstract class BidentBaseEntity extends ThrownTrident { @@ -27,6 +29,15 @@ protected void defineSynchedData(SynchedEntityData.Builder builder) { public void setPickupItemStack(ItemStack stack) { entityData.set(STACK, stack.copy()); super.setPickupItemStack(stack); + this.entityData.set(ID_LOYALTY, this.getLoyaltyFromItem(stack)); + this.entityData.set(ID_FOIL, stack.hasFoil()); + } + + // [VanillaCopy] ThrownTrident.getLoyaltyFromItem + private byte getLoyaltyFromItem(ItemStack stack) { + return this.level() instanceof ServerLevel serverlevel + ? (byte) Mth.clamp(EnchantmentHelper.getTridentReturnToOwnerAcceleration(serverlevel, stack, this), 0, 127) + : 0; } @Override diff --git a/src/main/java/de/dafuqs/spectrum/entity/entity/BidentEntity.java b/src/main/java/de/dafuqs/spectrum/entity/entity/BidentEntity.java index b6aa1fd99f..bda7814adb 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/entity/BidentEntity.java +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/BidentEntity.java @@ -1,10 +1,9 @@ package de.dafuqs.spectrum.entity.entity; -import de.dafuqs.spectrum.entity.*; +import de.dafuqs.spectrum.registries.*; import net.minecraft.world.entity.*; import net.minecraft.world.entity.projectile.*; import net.minecraft.world.level.*; -import net.minecraft.world.phys.*; public class BidentEntity extends BidentBaseEntity { diff --git a/src/main/java/de/dafuqs/spectrum/entity/entity/BidentMirrorImageEntity.java b/src/main/java/de/dafuqs/spectrum/entity/entity/BidentMirrorImageEntity.java index 0a453ab3bc..0d414cf6c4 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/entity/BidentMirrorImageEntity.java +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/BidentMirrorImageEntity.java @@ -1,10 +1,9 @@ package de.dafuqs.spectrum.entity.entity; -import de.dafuqs.spectrum.entity.*; import de.dafuqs.spectrum.helpers.*; +import de.dafuqs.spectrum.magic.*; import de.dafuqs.spectrum.particle.*; import de.dafuqs.spectrum.registries.*; -import de.dafuqs.spectrum.magic.*; import net.minecraft.sounds.*; import net.minecraft.util.valueproviders.*; import net.minecraft.world.entity.*; @@ -12,7 +11,7 @@ import net.minecraft.world.item.enchantment.*; import net.minecraft.world.level.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class BidentMirrorImageEntity extends BidentBaseEntity { public BidentMirrorImageEntity(Level world) { diff --git a/src/main/java/de/dafuqs/spectrum/entity/entity/BlockFlooderProjectile.java b/src/main/java/de/dafuqs/spectrum/entity/entity/BlockFlooderProjectile.java index b21da86814..6b764bf67b 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/entity/BlockFlooderProjectile.java +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/BlockFlooderProjectile.java @@ -1,7 +1,6 @@ package de.dafuqs.spectrum.entity.entity; import de.dafuqs.spectrum.blocks.block_flooder.*; -import de.dafuqs.spectrum.entity.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.core.*; import net.minecraft.core.particles.*; diff --git a/src/main/java/de/dafuqs/spectrum/entity/entity/Crawfish.java b/src/main/java/de/dafuqs/spectrum/entity/entity/Crawfish.java new file mode 100644 index 0000000000..682399e87a --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/Crawfish.java @@ -0,0 +1,302 @@ +package de.dafuqs.spectrum.entity.entity; + +import de.dafuqs.spectrum.registries.*; +import net.minecraft.core.*; +import net.minecraft.nbt.*; +import net.minecraft.network.syncher.*; +import net.minecraft.server.level.*; +import net.minecraft.sounds.*; +import net.minecraft.tags.*; +import net.minecraft.util.*; +import net.minecraft.util.valueproviders.*; +import net.minecraft.world.*; +import net.minecraft.world.damagesource.*; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.ai.attributes.*; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.ai.goal.target.*; +import net.minecraft.world.entity.item.*; +import net.minecraft.world.entity.monster.*; +import net.minecraft.world.entity.player.*; +import net.minecraft.world.food.*; +import net.minecraft.world.item.*; +import net.minecraft.world.level.*; +import net.minecraft.world.level.block.state.*; +import net.minecraft.world.level.gameevent.*; +import net.minecraft.world.level.pathfinder.*; +import net.minecraft.world.phys.*; +import org.jspecify.annotations.*; + +import java.util.*; +import java.util.function.*; + +public class Crawfish extends TamableAnimal implements NeutralMob { + + private static final UniformInt PERSISTENT_ANGER_TIME = TimeUtil.rangeOfSeconds(20, 39); + private @Nullable UUID persistentAngerTarget; + private static final EntityDataAccessor DATA_REMAINING_ANGER_TIME = SynchedEntityData.defineId(Crawfish.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_XP = SynchedEntityData.defineId(Crawfish.class, EntityDataSerializers.INT); + + public Crawfish(EntityType entityType, Level level) { + super(entityType, level); + this.setPathfindingMalus(PathType.WATER_BORDER, 0.0F); + this.setPathfindingMalus(PathType.WATER, 0.0F); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(2, new LeapAtTargetGoal(this, 0.1F)); + this.goalSelector.addGoal(3, new MeleeAttackGoal(this, 1.0, false)); + this.goalSelector.addGoal(5, new FollowOwnerGoal(this, 1.0, 10.0F, 2.0F)); + this.goalSelector.addGoal(6, new BreedGoal(this, 1.0)); + this.goalSelector.addGoal(7, new CollectXPGoal<>(this, 1.0)); + this.goalSelector.addGoal(8, new RandomStrollGoal(this, 1.0)); + this.goalSelector.addGoal(10, new LookAtPlayerGoal(this, Player.class, 8.0F)); + this.goalSelector.addGoal(10, new RandomLookAroundGoal(this)); + this.targetSelector.addGoal(1, new OwnerHurtByTargetGoal(this)); + this.targetSelector.addGoal(2, new OwnerHurtTargetGoal(this)); + this.targetSelector.addGoal(3, new HurtByTargetGoal(this)); + this.targetSelector.addGoal(4, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, this::isAngryAt)); + this.targetSelector.addGoal(7, new NearestAttackableTargetGoal<>(this, LivingEntity.class, true, otherEntity -> { + if(this.hasEffect(SpectrumMobEffects.CALMING)) { + return false; + } + if(otherEntity instanceof Player player && player.getUUID() == getOwnerUUID()) { + return false; + } + if(otherEntity.getType() == EntityType.RABBIT) { + return true; + } + if(otherEntity.getType() == SpectrumEntityTypes.CRAWFISH.get()) { + return true; + } + return hatesThisEntityInParticular(otherEntity); + })); + } + + @Override + public boolean isPushedByFluid() { + return false; + } + + protected boolean hatesThisEntityInParticular(LivingEntity other) { + long a = other.getUUID().hashCode() & 0x10; + long b = this.getUUID().hashCode() & 0x10; + return a == b; + } + + @Override + public void onSyncedDataUpdated(EntityDataAccessor key) { + if (DATA_XP.equals(key)) { + this.updateXPDependentValues(); + } + super.onSyncedDataUpdated(key); + } + + public static AttributeSupplier.Builder createCrawfishAttributes() { + return Monster.createMonsterAttributes() + .add(Attributes.MAX_HEALTH, 20.0) + .add(Attributes.MOVEMENT_SPEED, 0.3) + .add(Attributes.ATTACK_DAMAGE, 6.0) + .add(Attributes.ARMOR, 3) + .add(Attributes.ARMOR_TOUGHNESS, 1); + } + + private void updateXPDependentValues() { + this.refreshDimensions(); + + double xp = Math.min(this.getCollectedXP(), 1000); + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(20 + (xp / 20.0)); + this.getAttribute(Attributes.SCALE).setBaseValue(1.0 + (xp / 20.0)); + this.getAttribute(Attributes.ATTACK_DAMAGE).setBaseValue(6 + (xp / 20)); + this.getAttribute(Attributes.ARMOR).setBaseValue(3 + (xp / 50)); + this.getAttribute(Attributes.ARMOR_TOUGHNESS).setBaseValue(1 + (xp / 200)); + } + + // Living XP bottles + @Override + protected int getBaseExperienceReward() { + return 1 + getCollectedXP(); + } + + @Override + protected int decreaseAirSupply(int currentAir) { + return currentAir; + } + + public void setCollectedXP(int xp) { + this.entityData.set(DATA_XP, xp); + } + + public int getCollectedXP() { + return this.entityData.get(DATA_XP); + } + + @Override + public boolean canBeLeashed() { + return !this.isAngry(); + } + + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); + builder.define(DATA_REMAINING_ANGER_TIME, 0); + builder.define(DATA_XP, 0); + } + + @Override + public void addAdditionalSaveData(CompoundTag compound) { + super.addAdditionalSaveData(compound); + this.addPersistentAngerSaveData(compound); + this.setCollectedXP(compound.getInt("collected_xp")); + } + + @Override + public void readAdditionalSaveData(CompoundTag compound) { + super.readAdditionalSaveData(compound); + this.readPersistentAngerSaveData(this.level(), compound); + compound.putInt("collected_xp", this.getCollectedXP()); + } + + @Override + protected SoundEvent getAmbientSound() { + return SpectrumSoundEvents.ENTITY_CRAWFISH_AMBIENT; + } + + @Override + protected SoundEvent getHurtSound(DamageSource damageSource) { + return SpectrumSoundEvents.ENTITY_CRAWFISH_HURT; + } + + @Override + protected SoundEvent getDeathSound() { + return SpectrumSoundEvents.ENTITY_CRAWFISH_DEATH; + } + + @Override + protected void playStepSound(BlockPos pos, BlockState block) { + this.playSound(SpectrumSoundEvents.ENTITY_CRAWFISH_STEP, 0.15F, 1.0F); + } + + @Override + public boolean isFood(ItemStack stack) { + return stack.is(SpectrumItemTags.CRAWFISH_FOOD); + } + + @Override + public @Nullable AgeableMob getBreedOffspring(ServerLevel level, AgeableMob otherParent) { + Crawfish offspring = SpectrumEntityTypes.CRAWFISH.get().create(level); + if (offspring != null && this.isTame()) { + offspring.setOwnerUUID(this.getOwnerUUID()); + offspring.setTame(true, true); + } + return offspring; + } + + @Override + public InteractionResult mobInteract(Player player, InteractionHand hand) { + ItemStack handStack = player.getItemInHand(hand); + if (!this.level().isClientSide || this.isBaby() && this.isFood(handStack)) { + if (this.isTame() && this.isOwnedBy(player) && this.isFood(handStack) && this.getHealth() < this.getMaxHealth()) { + FoodProperties foodproperties = handStack.getFoodProperties(this); + float f = foodproperties != null ? (float) foodproperties.nutrition() : 1.0F; + this.heal(2.0F * f); + handStack.consume(1, player); + this.gameEvent(GameEvent.EAT); + return InteractionResult.sidedSuccess(this.level().isClientSide()); + } + } + return super.mobInteract(player, hand); + } + + public boolean isAngryAtAllPlayers(Level level) { + return this.isAngry(); + } + + @Override + public int getRemainingPersistentAngerTime() { + return this.entityData.get(DATA_REMAINING_ANGER_TIME); + } + + @Override + public void setRemainingPersistentAngerTime(int time) { + this.entityData.set(DATA_REMAINING_ANGER_TIME, time); + } + + @Override + public void startPersistentAngerTimer() { + this.setRemainingPersistentAngerTime(PERSISTENT_ANGER_TIME.sample(this.random)); + } + + @Override + public @Nullable UUID getPersistentAngerTarget() { + return this.persistentAngerTarget; + } + + @Override + public void setPersistentAngerTarget(@javax.annotation.Nullable UUID target) { + this.persistentAngerTarget = target; + } + + public static class CollectXPGoal extends Goal { + + private final T mob; + private final double speedModifier; + private @Nullable ExperienceOrb experienceOrb; + private int ticksUntilNextPathRecalculation; + + public CollectXPGoal(T mob, double speedModifier) { + this.mob = mob; + this.speedModifier = speedModifier; + this.setFlags(EnumSet.of(Flag.MOVE, Flag.TARGET)); + } + + @Override + public boolean canUse() { + if(!this.mob.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { + return false; + } + + List orbs = this.mob.level().getEntitiesOfClass(ExperienceOrb.class, mob.getBoundingBox().expandTowards(10, 4, 10)); + if(orbs.isEmpty()) { + this.experienceOrb = null; + return false; + } + this.experienceOrb = orbs.getFirst(); + return true; + } + + @Override + public void start() { + this.mob.getNavigation().moveTo(experienceOrb, this.speedModifier); + } + + @Override + public void stop() { + super.stop(); + } + + @Override + public void tick() { + if(experienceOrb == null || experienceOrb.isRemoved()) { + this.experienceOrb = null; + stop(); + return; + } + + if (--this.ticksUntilNextPathRecalculation <= 0) { + // in case the orb moved + this.mob.getNavigation().moveTo(experienceOrb, this.speedModifier); + this.ticksUntilNextPathRecalculation = 4 + this.mob.getRandom().nextInt(7); + } + + if(this.mob.getAttackBoundingBox().intersects(experienceOrb.getBoundingBox())) { + mob.playSound(SoundEvents.EXPERIENCE_ORB_PICKUP, 0.75F, 1.0F); + mob.setCollectedXP(mob.getCollectedXP() + experienceOrb.getValue()); + experienceOrb.discard(); + stop(); + } + } + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/entity/entity/DraconicTwinswordEntity.java b/src/main/java/de/dafuqs/spectrum/entity/entity/DraconicTwinswordEntity.java index 863c1af4a1..6f762415bc 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/entity/DraconicTwinswordEntity.java +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/DraconicTwinswordEntity.java @@ -1,8 +1,6 @@ package de.dafuqs.spectrum.entity.entity; -import de.dafuqs.spectrum.api.entity.*; import de.dafuqs.spectrum.api.item.*; -import de.dafuqs.spectrum.entity.*; import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.helpers.enchantments.*; import de.dafuqs.spectrum.items.tools.*; @@ -31,7 +29,7 @@ import net.minecraft.world.level.block.*; import net.minecraft.world.phys.*; import org.apache.commons.lang3.mutable.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/entity/entity/DragonTalonEntity.java b/src/main/java/de/dafuqs/spectrum/entity/entity/DragonTalonEntity.java index 73138e70f2..c01aef9b28 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/entity/DragonTalonEntity.java +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/DragonTalonEntity.java @@ -1,7 +1,6 @@ package de.dafuqs.spectrum.entity.entity; import de.dafuqs.spectrum.api.item.*; -import de.dafuqs.spectrum.entity.*; import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.items.tools.*; import de.dafuqs.spectrum.mixin.accessors.*; @@ -25,7 +24,7 @@ import net.minecraft.world.level.block.*; import net.minecraft.world.phys.*; import org.apache.commons.lang3.mutable.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/entity/entity/EggLayingWoolyPigEntity.java b/src/main/java/de/dafuqs/spectrum/entity/entity/EggLayingWoolyPigEntity.java index d561a4039b..105216815c 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/entity/EggLayingWoolyPigEntity.java +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/EggLayingWoolyPigEntity.java @@ -1,6 +1,5 @@ package de.dafuqs.spectrum.entity.entity; -import de.dafuqs.spectrum.entity.*; import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.core.*; @@ -26,7 +25,7 @@ import net.minecraft.world.level.storage.loot.*; import net.minecraft.world.level.storage.loot.parameters.*; import net.neoforged.neoforge.common.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; import java.util.function.*; diff --git a/src/main/java/de/dafuqs/spectrum/entity/entity/EraserEntity.java b/src/main/java/de/dafuqs/spectrum/entity/entity/EraserEntity.java index dcbc2e4d09..2ffe4e8cfa 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/entity/EraserEntity.java +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/EraserEntity.java @@ -24,7 +24,7 @@ import net.minecraft.world.item.component.*; import net.minecraft.world.level.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; @@ -81,7 +81,7 @@ protected void playStepSound(BlockPos pos, BlockState state) { @Override public boolean canBeAffected(MobEffectInstance effect) { - return super.canBeAffected(effect) && effect.getEffect() != SpectrumMobEffects.DEADLY_POISON; + return super.canBeAffected(effect) && !effect.getEffect().is(SpectrumMobEffects.DEADLY_POISON); } @Override diff --git a/src/main/java/de/dafuqs/spectrum/entity/entity/FireproofItemEntity.java b/src/main/java/de/dafuqs/spectrum/entity/entity/FireproofItemEntity.java index 3748b2bd36..23f0b3c5bb 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/entity/FireproofItemEntity.java +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/FireproofItemEntity.java @@ -1,6 +1,6 @@ package de.dafuqs.spectrum.entity.entity; -import de.dafuqs.spectrum.entity.*; +import de.dafuqs.spectrum.registries.*; import net.minecraft.tags.*; import net.minecraft.world.damagesource.*; import net.minecraft.world.entity.*; diff --git a/src/main/java/de/dafuqs/spectrum/entity/entity/FloatBlockEntity.java b/src/main/java/de/dafuqs/spectrum/entity/entity/FloatBlockEntity.java index ea139a045a..b2ac2319be 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/entity/FloatBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/FloatBlockEntity.java @@ -1,7 +1,6 @@ package de.dafuqs.spectrum.entity.entity; -import de.dafuqs.spectrum.blocks.FloatBlock; -import de.dafuqs.spectrum.entity.*; +import de.dafuqs.spectrum.blocks.*; import de.dafuqs.spectrum.recipe.anvil_crushing.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.*; @@ -14,6 +13,7 @@ import net.minecraft.server.level.*; import net.minecraft.util.*; import net.minecraft.world.*; +import net.minecraft.world.damagesource.*; import net.minecraft.world.entity.*; import net.minecraft.world.entity.item.*; import net.minecraft.world.entity.player.*; @@ -27,83 +27,45 @@ import net.minecraft.world.level.material.*; import net.minecraft.world.phys.*; import net.minecraft.world.phys.shapes.*; -import org.jspecify.annotations.Nullable; +import org.joml.*; +import org.jspecify.annotations.*; +import java.lang.Math; import java.util.function.*; /** - * An entity that resembles a block. + * A FallingBlock that is able to move in all directions */ -public class FloatBlockEntity extends Entity { +public class FloatBlockEntity extends FallingBlockEntity { - private static final float MAX_DAMAGE = 16.0F; + private static final int MAX_DAMAGE = 16; private static final float DAMAGE_PER_FALLEN_BLOCK = 1.0F; - private static final EntityDataAccessor ORIGIN = SynchedEntityData.defineId(FloatBlockEntity.class, EntityDataSerializers.BLOCK_POS); + private static final Predicate DAMAGE_SELECTOR = EntitySelector.NO_CREATIVE_OR_SPECTATOR.and(entity -> entity.isAlive() && (entity instanceof LivingEntity || entity instanceof ItemEntity)); + private static final EntityDataAccessor LAUNCH_TIME = SynchedEntityData.defineId(FloatBlockEntity.class, EntityDataSerializers.LONG); private static final EntityDataAccessor GRAVITY_MODIFIER = SynchedEntityData.defineId(FloatBlockEntity.class, EntityDataSerializers.FLOAT); - protected int moveTime; - protected @Nullable CompoundTag blockEntityData; - protected BlockState blockState = Blocks.STONE.defaultBlockState(); - protected boolean canSetBlock = true; - protected boolean collides; - - public FloatBlockEntity(Level world, BlockPos pos, BlockState blockState) { - this(SpectrumEntityTypes.FLOAT_BLOCK.get(), world, pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, blockState); - } - - public FloatBlockEntity(EntityType entityType, Level world, double x, double y, double z, BlockState blockState) { - this(entityType, world); - this.setBlockState(blockState); + public FloatBlockEntity(Level level, double x, double y, double z, BlockState state) { + this(SpectrumEntityTypes.FLOAT_BLOCK.get(), level); + this.blockState = state; this.blocksBuilding = true; this.setPos(x, y, z); this.setDeltaMovement(Vec3.ZERO); this.xo = x; this.yo = y; this.zo = z; - this.setOrigin(BlockPos.containing(this.position())); - this.setLaunchTime(level().getGameTime()); + this.setStartPos(this.blockPosition()); + this.entityData.set(LAUNCH_TIME, level.getGameTime()); - if (blockState.getBlock() instanceof FloatBlock floatBlock) { + if (state.getBlock() instanceof FloatBlock floatBlock) { setGravity(floatBlock.getGravityMod()); } - } - public FloatBlockEntity(EntityType entityType, Level world) { - super(entityType, world); - this.moveTime = 0; - } - - public void setBlockState(BlockState blockState) { - this.blockState = blockState; - makeBoundingBox(); + setHurtsEntities(DAMAGE_PER_FALLEN_BLOCK, MAX_DAMAGE); } - /** - * Calculates the bounding box based on the blockstate's collision shape. - * If the blockstate doesn't have collision, this method turns collision - * off for this entity and sets the bounding box to the outline shape instead. - * Note: Complex bounding boxes are not supported. These are all rectangular prisms. - * - * @return The bounding box of this entity - */ - @Override - protected AABB makeBoundingBox() { - BlockPos origin = this.entityData.get(ORIGIN); - // Sable Compat: this method may run before the constructor is finished, hence the null check - BlockState state = this.blockState == null ? Blocks.STONE.defaultBlockState() : this.blockState; - VoxelShape shape = state.getCollisionShape(level(), origin); - if (shape.isEmpty()) { - this.collides = false; - shape = this.blockState.getShape(level(), origin); - if (shape.isEmpty()) { - return super.makeBoundingBox(); - } - } else { - this.collides = true; - } - AABB box = shape.bounds(); - return box.move(position().subtract(new Vec3(0.5, 0, 0.5))); + public FloatBlockEntity(EntityType entityType, Level level) { + super(entityType, level); } @Override @@ -113,65 +75,108 @@ public void tick() { return; } - // Destroy the block in the world that this is spawned from - // If no block exists, remove this entity - if (this.moveTime++ == 0) { - BlockPos blockPos = this.blockPosition(); - Block block = this.blockState.getBlock(); - if (this.level().getBlockState(blockPos).is(block)) { - this.level().removeBlock(blockPos, false); - } else { - this.discard(); - } - } + ++this.time; - if (!this.isNoGravity()) { - this.moveDist = (float) this.position().y() - this.getOrigin().getY(); - long launchTime = level().getGameTime() - getLaunchTime(); - double additionalYVelocity = launchTime > 100 ? this.getDefaultGravity() / 10 : Math.min(Math.sin((Math.PI * launchTime) / 100D), 1) * (this.getDefaultGravity() / 10); - this.push(0.0D, additionalYVelocity, 0.0D); - this.setDeltaMovement(this.getDeltaMovement().scale(0.98D)); + Vec3 deltaMovement = this.getDeltaMovement(); + this.applyGravity(); + this.handlePortal(); + this.move(MoverType.SELF, this.getDeltaMovement()); + + Block block = this.blockState.getBlock(); + + Level level = this.level(); + if (!level.isClientSide && this.isAlive() && !this.isNoGravity()) { + + BlockPos blockpos = this.blockPosition(); + boolean isConcretePowder = this.blockState.getBlock() instanceof ConcretePowderBlock; + boolean hydrateConcretePowder = isConcretePowder && this.blockState.canBeHydrated(level, blockpos, level.getFluidState(blockpos), blockpos); + double d0 = deltaMovement.lengthSqr(); + if (isConcretePowder && d0 > (double)1.0F) { + BlockHitResult blockhitresult = level.clip(new ClipContext(new Vec3(this.xo, this.yo, this.zo), this.position(), net.minecraft.world.level.ClipContext.Block.COLLIDER, ClipContext.Fluid.SOURCE_ONLY, this)); + if (blockhitresult.getType() != HitResult.Type.MISS && this.blockState.canBeHydrated(level, blockpos, level.getFluidState(blockhitresult.getBlockPos()), blockhitresult.getBlockPos())) { + blockpos = blockhitresult.getBlockPos(); + hydrateConcretePowder = true; + } + } - // recalculate fall damage - if (!level().isClientSide()) { - this.dealDamage(); + if (!this.verticalCollision && !hydrateConcretePowder) { + if (this.time > 100 && (blockpos.getY() <= level.getMinBuildHeight() || blockpos.getY() > level.getMaxBuildHeight()) || this.time > 600) { + if (this.dropItem && level.getGameRules().getBoolean(GameRules.RULE_DOENTITYDROPS)) { + this.spawnAtLocation(block); + } + + this.discard(); + } + } else { + BlockState blockstate = level.getBlockState(blockpos); + // Since `Direction.fromDelta` only takes ints, we have to pull off some tomfoolery + Direction movementDirection = Direction.fromDelta((int) (deltaMovement.x() * 100), (int) (deltaMovement.y() * 100), (int) (deltaMovement.z() * 100)); + movementDirection = movementDirection == null ? Direction.DOWN : movementDirection; + boolean canBePlacedAtPos = blockstate.canBeReplaced(new DirectionalPlaceContext(level, blockpos, movementDirection.getOpposite(), ItemStack.EMPTY, movementDirection)); + boolean canPlaceAtDirection = FallingBlock.isFree(level.getBlockState(blockpos.relative(movementDirection))) && (!isConcretePowder || !hydrateConcretePowder); + boolean canSurviveAtPos = this.blockState.canSurvive(level, blockpos) && !canPlaceAtDirection; + if (canBePlacedAtPos && canSurviveAtPos) { + // place as block + if (this.blockState.hasProperty(BlockStateProperties.WATERLOGGED) && level.getFluidState(blockpos).getType() == Fluids.WATER) { + this.blockState = this.blockState.setValue(BlockStateProperties.WATERLOGGED, true); + } + + if (!level.setBlockAndUpdate(blockpos, this.blockState)) { + if (this.dropItem && level.getGameRules().getBoolean(GameRules.RULE_DOENTITYDROPS)) { + this.discard(); + this.callOnBrokenAfterFall(block, blockpos); + this.spawnAtLocation(block); + } + } else { + ((ServerLevel) level).getChunkSource().chunkMap.broadcast(this, new ClientboundBlockUpdatePacket(blockpos, level.getBlockState(blockpos))); + this.discard(); + if (block instanceof Fallable fallable) { + fallable.onLand(level, blockpos, this.blockState, blockstate, this); + } + + if (this.blockData != null && this.blockState.hasBlockEntity()) { + BlockEntity blockentity = level.getBlockEntity(blockpos); + if (blockentity != null) { + CompoundTag compoundtag = blockentity.saveWithoutMetadata(level.registryAccess()); + + for(String s : this.blockData.getAllKeys()) { + compoundtag.put(s, this.blockData.get(s).copy()); + } + + blockentity.loadWithComponents(compoundtag, level.registryAccess()); + blockentity.setChanged(); + } + } + } + } else { + // drop as item + this.discard(); + if (this.dropItem && level.getGameRules().getBoolean(GameRules.RULE_DOENTITYDROPS)) { + this.callOnBrokenAfterFall(block, blockpos); + this.spawnAtLocation(block); + } + } } } - this.moveEntities(); - this.move(MoverType.SELF, this.getDeltaMovement()); - - if (!this.level().isClientSide()) { - if (this.verticalCollision) { - trySetBlock(); - } else if (this.tickCount > 100 && this.level().isOutsideBuildHeight(this.blockPosition())) { - this.dropAsItem(); - this.discard(); - } + if (!this.isNoGravity()) { + this.setDeltaMovement(this.getDeltaMovement().scale(0.98)); } - } - - @Override - public void move(MoverType movementType, Vec3 movement) { - super.move(movementType, movement); - if (movementType != MoverType.SELF) { - this.setDeltaMovement(movement); + // if we are standing still, anchor to center of block + if(this.getDeltaMovement().lengthSqr() == 0.0) { + BlockPos blockPos = this.blockPosition(); + this.setPos(blockPos.getX() + 0.5F, blockPos.getY(), blockPos.getZ() + 0.5F); } } - @Override - public boolean isPickable() { - return !this.isRemoved(); - } - @Override public InteractionResult interact(Player player, InteractionHand hand) { if (player.isShiftKeyDown()) { if (this.level().isClientSide()) { return InteractionResult.SUCCESS; } else { - Item item = this.blockState.getBlock().asItem(); + Item item = this.getBlockState().getBlock().asItem(); if (item != Items.AIR) { player.getInventory().placeItemBackInInventory(item.getDefaultInstance()); } @@ -184,7 +189,7 @@ public InteractionResult interact(Player player, InteractionHand hand) { @Override public ItemStack getPickResult() { - return this.blockState.getBlock().asItem().getDefaultInstance(); + return this.getBlockState().getBlock().asItem().getDefaultInstance(); } /** @@ -193,107 +198,73 @@ public ItemStack getPickResult() { */ public void onEntityCollision(Entity entity) { if (!(entity instanceof FloatBlockEntity)) { - this.blockState.entityInside(level(), this.blockPosition(), entity); + this.getBlockState().entityInside(level(), this.blockPosition(), entity); } } - public void dealDamage() { + @Override + public boolean causeFallDamage(float fallDistance, float multiplier, DamageSource source) { int traveledDistance = Math.abs(Mth.ceil(this.moveDist - 1.0F)); - if (traveledDistance > 0) { - int damage = (int) Math.min(Mth.floor(traveledDistance * DAMAGE_PER_FALLEN_BLOCK), MAX_DAMAGE); - if (damage > 0) { - // since the player position is tracked at its head and item entities are laying directly on the ground, we have to use a relatively big bounding box here - Predicate predicate = EntitySelector.NO_CREATIVE_OR_SPECTATOR.and(entity -> entity.isAlive() && (entity instanceof LivingEntity || entity instanceof ItemEntity)); - this.level().getEntities(this, this.getBoundingBox().inflate(0.5), predicate).forEach((entity) -> { - if (entity instanceof ItemEntity itemEntity) { - AnvilCrusher.crush(itemEntity, damage * 2); - } else { - entity.hurt(SpectrumDamageTypes.floatblock(entity.level()), damage); - } - }); - } + int damage = Math.min(Mth.floor(traveledDistance * DAMAGE_PER_FALLEN_BLOCK), MAX_DAMAGE); + if (damage <= 0) { + return false; + } + Block block = this.blockState.getBlock(); + DamageSource damageSource; + if (block instanceof Fallable fallable) { + damageSource = fallable.getFallDamageSource(this); + } else { + damageSource = this.damageSources().fallingBlock(this); } + + // since the player position is tracked at its head and item entities are laying directly on the ground, + // we have to use a relatively big bounding box here + this.level().getEntities(this, this.getBoundingBox().inflate(0.5), DAMAGE_SELECTOR).forEach((entity) -> { + if (entity instanceof ItemEntity itemEntity) { + if(level() instanceof ServerLevel serverLevel) { + AnvilCrusher.crush(serverLevel, itemEntity, damage * 2); + } + } else { + entity.hurt(damageSource, damage); + } + }); + + return false; } @Override protected void addAdditionalSaveData(CompoundTag compound) { - compound.put("BlockState", NbtUtils.writeBlockState(this.blockState)); - compound.putInt("Time", this.moveTime); - if (this.blockEntityData != null) { - compound.put("BlockEntityData", this.blockEntityData); - } + super.addAdditionalSaveData(compound); compound.putFloat("GravityModifier", (float) getDefaultGravity()); } @Override protected void readAdditionalSaveData(CompoundTag compound) { - this.blockState = NbtUtils.readBlockState(this.level().holderLookup(Registries.BLOCK), compound.getCompound("BlockState")); - this.moveTime = compound.getInt("Time"); - if (compound.contains("BlockEntityData", 10)) this.blockEntityData = compound.getCompound("BlockEntityData"); - if (this.blockState.isAir()) this.blockState = Blocks.STONE.defaultBlockState(); + super.readAdditionalSaveData(compound); if (compound.contains("GravityModifier", Tag.TAG_FLOAT)) setGravity(compound.getFloat("GravityModifier")); } - - @Override - public boolean displayFireAnimation() { - return false; - } - + // Sexy Piston on Floatblock action @Override - public void fillCrashReportCategory(CrashReportCategory section) { - super.fillCrashReportCategory(section); - section.setDetail("Imitating BlockState", this.blockState.toString()); - } - - public BlockState getBlockState() { - return this.blockState; - } - - public void trySetBlock() { - BlockPos blockPos = this.blockPosition(); - BlockState blockState = this.level().getBlockState(blockPos); - boolean canReplace = blockState.canBeReplaced(new DirectionalPlaceContext(this.level(), blockPos, Direction.UP, ItemStack.EMPTY, Direction.DOWN)); - boolean canPlace = this.blockState.canSurvive(this.level(), blockPos); - - if (!this.canSetBlock || !canPlace || !canReplace) { - return; - } + public void move(MoverType movementType, Vec3 movement) { + this.moveEntities(); - if (this.blockState.hasProperty(BlockStateProperties.WATERLOGGED) && this.level().getFluidState(blockPos).getType() == Fluids.WATER) { - this.blockState = this.blockState.setValue(BlockStateProperties.WATERLOGGED, true); - } + super.move(movementType, movement); - if (this.level().setBlock(blockPos, this.blockState, Block.UPDATE_ALL)) { - this.discard(); - if (this.blockEntityData != null && this.blockState.hasBlockEntity()) { - BlockEntity blockEntity = this.level().getBlockEntity(blockPos); - if (blockEntity != null) { - var registryLookup = level().registryAccess(); - CompoundTag compoundTag = blockEntity.saveWithoutMetadata(registryLookup); - for (String keyName : this.blockEntityData.getAllKeys()) { - Tag tag = this.blockEntityData.get(keyName); - if (tag != null && !"x".equals(keyName) && !"y".equals(keyName) && !"z".equals(keyName)) { - compoundTag.put(keyName, tag.copy()); - } - } - - blockEntity.loadWithComponents(compoundTag, registryLookup); - blockEntity.setChanged(); - } - } + if (movementType != MoverType.SELF) { + this.setDeltaMovement(movement); } } public void moveEntities() { - if (FallingBlock.isFree(this.blockState)) { + if (FallingBlock.isFree(this.getBlockState())) { return; } Level world = this.level(); - AABB collissionBox = getBoundingBox().inflate(0, 2D, 0); + AABB collisionBox = getBoundingBox().inflate(0, 2D, 0); - for (Entity entity : world.getEntities(this, collissionBox)) { + for (Entity entity : world.getEntities(this, collisionBox)) { if (entity instanceof FloatBlockEntity other && isPaltaeriaStratineCollision(other)) { world.explode(this, this.getX(), this.getY(), this.getZ(), 1.0F, Level.ExplosionInteraction.NONE); @@ -304,8 +275,8 @@ public void moveEntities() { this.discard(); other.discard(); - } else if (entity.isPushable() && entity.getPistonPushReaction() != PushReaction.IGNORE && entity.getBoundingBox().intersects(collissionBox)) { - entity.move(MoverType.SHULKER_BOX, this.getDeltaMovement()); + } else if (entity.isPushable() && entity.getPistonPushReaction() != PushReaction.IGNORE && entity.getBoundingBox().intersects(collisionBox)) { + entity.move(MoverType.PISTON, this.getDeltaMovement()); entity.setOnGround(true); entity.fallDistance = 0F; @@ -315,81 +286,22 @@ public void moveEntities() { } public boolean isPaltaeriaStratineCollision(FloatBlockEntity other) { - Block thisBlock = this.blockState.getBlock(); + Block thisBlock = this.getBlockState().getBlock(); Block otherBlock = other.getBlockState().getBlock(); return thisBlock == SpectrumBlocks.PALTAERIA_FLOATBLOCK.get() && otherBlock == SpectrumBlocks.STRATINE_FLOATBLOCK.get() || thisBlock == SpectrumBlocks.STRATINE_FLOATBLOCK.get() && otherBlock == SpectrumBlocks.PALTAERIA_FLOATBLOCK.get(); } - /** - * Break the block, spawn break particles, and drop stacks if it can. - */ - public void dropAsItem() { - if (this.isRemoved()) return; - - this.discard(); - if (this.level().getGameRules().getBoolean(GameRules.RULE_DOENTITYDROPS)) { - Block.dropResources(this.blockState, this.level(), this.blockPosition()); - } - - // spawn break particles - level().levelEvent(null, LevelEvent.PARTICLES_DESTROY_BLOCK, this.blockPosition(), Block.getId(blockState)); - } - - @Override - public boolean onlyOpCanSetNbt() { - return true; - } - - @Override - public Packet getAddEntityPacket(ServerEntity entityTrackerEntry) { - return new ClientboundAddEntityPacket(this, entityTrackerEntry, Block.getId(this.getBlockState())); - } - - @Override - public void recreateFromPacket(ClientboundAddEntityPacket packet) { - super.recreateFromPacket(packet); - this.blockState = Block.stateById(packet.getData()); - this.blocksBuilding = true; - double d = packet.getX(); - double e = packet.getY(); - double f = packet.getZ(); - this.setPos(d, e + (double) ((1.0F - this.getBbHeight()) / 2.0F), f); - this.setOrigin(this.blockPosition()); - } - - @Override - public boolean isAttackable() { - return false; - } - - public BlockPos getOrigin() { - return this.entityData.get(ORIGIN); - } - - public void setOrigin(BlockPos origin) { - this.entityData.set(ORIGIN, origin); - this.setPos(getX(), getY(), getZ()); - } - - public Long getLaunchTime() { - return this.entityData.get(LAUNCH_TIME); - } - - public void setLaunchTime(long spawnTime) { - this.entityData.set(LAUNCH_TIME, spawnTime); - } - @Override protected void defineSynchedData(SynchedEntityData.Builder builder) { - builder.define(ORIGIN, BlockPos.ZERO); + super.defineSynchedData(builder); builder.define(GRAVITY_MODIFIER, 0.0F); builder.define(LAUNCH_TIME, 0L); } @Override public boolean canBeCollidedWith() { - return collides; + return true; } @Override @@ -401,6 +313,18 @@ protected void setGravity(float modifier) { this.entityData.set(GRAVITY_MODIFIER, modifier); } + @Override + protected void applyGravity() { + double d0 = this.getDefaultGravity(); + this.moveDist = (float) this.position().y() - this.getStartPos().getY(); + long launchTime = level().getGameTime() - this.entityData.get(LAUNCH_TIME); + double additionalYVelocity = launchTime > 100 ? d0 / 10 : Math.min(Math.sin((Math.PI * launchTime) / 100D), 1) * (d0 / 10); + + if (additionalYVelocity != 0.0F) { + this.setDeltaMovement(this.getDeltaMovement().add(0.0F, additionalYVelocity,0.0F)); + } + } + @Override public boolean isNoGravity() { return this.getDefaultGravity() == 0.0 || super.isNoGravity(); diff --git a/src/main/java/de/dafuqs/spectrum/entity/entity/GlassArrowEntity.java b/src/main/java/de/dafuqs/spectrum/entity/entity/GlassArrowEntity.java index aaa81a012c..89f082aa71 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/entity/GlassArrowEntity.java +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/GlassArrowEntity.java @@ -2,8 +2,8 @@ import de.dafuqs.spectrum.entity.*; import de.dafuqs.spectrum.items.tools.*; -import de.dafuqs.spectrum.registries.*; import de.dafuqs.spectrum.magic.*; +import de.dafuqs.spectrum.registries.*; import net.minecraft.core.particles.*; import net.minecraft.nbt.*; import net.minecraft.network.syncher.*; @@ -18,7 +18,7 @@ import net.minecraft.world.item.enchantment.*; import net.minecraft.world.level.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class GlassArrowEntity extends AbstractArrow { @@ -156,10 +156,20 @@ public GlassArrowVariant getVariant() { return this.entityData.get(VARIANT); } + // Null when shot from a dispenser + @Override + public @Nullable ItemStack getWeaponItem() { + return super.getWeaponItem(); + } + @Override protected void doKnockback(LivingEntity target, DamageSource source) { double punch = getVariant() == GlassArrowVariant.CITRINE ? 5 : 0; - punch += this.level() instanceof ServerLevel serverWorld ? EnchantmentHelper.modifyKnockback(serverWorld, getWeaponItem(), target, source, 0.0F) : 0.0F; + if(this.level() instanceof ServerLevel serverWorld) { + ItemStack weapon = getWeaponItem(); + punch += weapon != null ? EnchantmentHelper.modifyKnockback(serverWorld, weapon, target, source, 0.0F) : 0.0F; + } + if (punch > 0.0) { double e = Math.max(0.0, 1.0 - target.getAttributeValue(Attributes.KNOCKBACK_RESISTANCE)); Vec3 vec3d = this.getDeltaMovement().multiply(1.0, 0.0, 1.0).normalize().scale(punch * 0.6 * e); diff --git a/src/main/java/de/dafuqs/spectrum/entity/entity/InkProjectileEntity.java b/src/main/java/de/dafuqs/spectrum/entity/entity/InkProjectileEntity.java index 0d7ab50bff..d0a64abf2a 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/entity/InkProjectileEntity.java +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/InkProjectileEntity.java @@ -1,7 +1,7 @@ package de.dafuqs.spectrum.entity.entity; import de.dafuqs.spectrum.api.block.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.api.interaction.*; import de.dafuqs.spectrum.compat.claims.*; import de.dafuqs.spectrum.entity.*; @@ -27,6 +27,7 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.gameevent.*; import net.minecraft.world.phys.*; +import org.jspecify.annotations.*; import java.util.*; @@ -108,7 +109,7 @@ private void spawnParticles(int amount) { InkColor inkColor = this.getInkColor(); if (amount > 0) { for (int j = 0; j < amount; ++j) { - this.level().addParticle(ColoredCraftingParticleEffect.of(inkColor.getColorInt()), this.getRandomX(0.5D), this.getRandomY(), this.getRandomZ(0.5D), 0, 0, 0); + this.level().addParticle(ColoredCraftingParticleEffect.of(inkColor.getColorARGB()), this.getRandomX(0.5D), this.getRandomY(), this.getRandomZ(0.5D), 0, 0, 0); } } } @@ -188,8 +189,8 @@ protected void onHitBlock(BlockHitResult blockHitResult) { continue; } if (dyeColor.isPresent()) { - BlockState coloredBlockState = BlockVariantHelper.getCursedBlockColorVariant(this.level(), blockPos, dyeColor.get()); - if (!coloredBlockState.isAir()) { + @Nullable BlockState coloredBlockState = VariantHelper.getColoredBlockState(this.level(), blockPos, inkColor); + if (coloredBlockState != null) { this.level().setBlockAndUpdate(blockPos, coloredBlockState); } } @@ -291,9 +292,9 @@ public void spawnImpactParticles() { Vec3 targetPos = position(); Vec3 velocity = getDeltaMovement(); - world.addParticle(ColoredExplosionParticleEffect.of(inkColor.getColorInt()), targetPos.x, targetPos.y, targetPos.z, 0, 0, 0); + world.addParticle(ColoredExplosionParticleEffect.of(inkColor.getColorARGB()), targetPos.x, targetPos.y, targetPos.z, 0, 0, 0); for (int i = 0; i < 10; i++) { - world.addParticle(ColoredCraftingParticleEffect.of(inkColor.getColorInt()), targetPos.x, targetPos.y, targetPos.z, -velocity.x * 3, -velocity.y * 3, -velocity.z * 3); + world.addParticle(ColoredCraftingParticleEffect.of(inkColor.getColorARGB()), targetPos.x, targetPos.y, targetPos.z, -velocity.x * 3, -velocity.y * 3, -velocity.z * 3); } } diff --git a/src/main/java/de/dafuqs/spectrum/entity/entity/ItemProjectileEntity.java b/src/main/java/de/dafuqs/spectrum/entity/entity/ItemProjectileEntity.java index d299f60053..d8154788d3 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/entity/ItemProjectileEntity.java +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/ItemProjectileEntity.java @@ -1,7 +1,7 @@ package de.dafuqs.spectrum.entity.entity; import de.dafuqs.spectrum.api.interaction.*; -import de.dafuqs.spectrum.entity.*; +import de.dafuqs.spectrum.registries.*; import net.minecraft.core.*; import net.minecraft.core.particles.*; import net.minecraft.world.*; diff --git a/src/main/java/de/dafuqs/spectrum/entity/entity/KindlingCoughEntity.java b/src/main/java/de/dafuqs/spectrum/entity/entity/KindlingCoughEntity.java index 1775df39b3..cef81201c6 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/entity/KindlingCoughEntity.java +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/KindlingCoughEntity.java @@ -2,7 +2,6 @@ import de.dafuqs.spectrum.attachment_types.*; import de.dafuqs.spectrum.blocks.*; -import de.dafuqs.spectrum.entity.*; import de.dafuqs.spectrum.particle.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.network.protocol.game.*; diff --git a/src/main/java/de/dafuqs/spectrum/entity/entity/KindlingEntity.java b/src/main/java/de/dafuqs/spectrum/entity/entity/KindlingEntity.java index c8a4a1f444..387e6051b1 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/entity/KindlingEntity.java +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/KindlingEntity.java @@ -39,7 +39,7 @@ import net.minecraft.world.level.storage.loot.parameters.*; import net.minecraft.world.phys.*; import net.neoforged.neoforge.common.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/entity/entity/Koi.java b/src/main/java/de/dafuqs/spectrum/entity/entity/Koi.java new file mode 100644 index 0000000000..71d7b819e9 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/Koi.java @@ -0,0 +1,110 @@ +package de.dafuqs.spectrum.entity.entity; + +import de.dafuqs.spectrum.blocks.fluid.*; +import de.dafuqs.spectrum.particle.*; +import de.dafuqs.spectrum.registries.*; +import net.minecraft.core.particles.*; +import net.minecraft.nbt.*; +import net.minecraft.sounds.*; +import net.minecraft.util.*; +import net.minecraft.world.*; +import net.minecraft.world.damagesource.*; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.ai.attributes.*; +import net.minecraft.world.entity.animal.*; +import net.minecraft.world.entity.monster.*; +import net.minecraft.world.item.*; +import net.minecraft.world.level.*; +import net.minecraft.world.level.block.*; +import net.minecraft.world.phys.*; +import net.neoforged.neoforge.common.*; +import net.neoforged.neoforge.fluids.*; +import org.jspecify.annotations.*; + +public class Koi extends AbstractFish { + + protected final int SCALE_DROP_TIME_BASE = 24000; + protected int scaleDropTime; + + public Koi(EntityType entityType, Level level) { + super(entityType, level); + this.scaleDropTime = SCALE_DROP_TIME_BASE + this.getRandom().nextInt(SCALE_DROP_TIME_BASE); + } + + @Override + public @Nullable SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnType, @Nullable SpawnGroupData spawnGroupData) { + this.getAttribute(Attributes.SCALE).setBaseValue(0.75 + level.getRandom().nextDouble() * 0.75); + return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); + } + + @Override + public ItemStack getBucketItemStack() { + return new ItemStack(SpectrumItems.BUCKET_OF_KOI.get()); + } + + @Override + protected SoundEvent getAmbientSound() { + return SpectrumSoundEvents.ENTITY_KOI_AMBIENT; + } + + @Override + protected SoundEvent getHurtSound(DamageSource damageSource) { + return SpectrumSoundEvents.ENTITY_KOI_HURT; + } + + @Override + protected SoundEvent getDeathSound() { + return SpectrumSoundEvents.ENTITY_KOI_DEATH; + } + + @Override + protected SoundEvent getFlopSound() { + return SpectrumSoundEvents.ENTITY_KOI_FLOP; + } + + public static AttributeSupplier.Builder createKoiAttributes() { + return Monster.createMonsterAttributes() + .add(Attributes.MAX_HEALTH, 6.0) + .add(Attributes.MOVEMENT_SPEED, 0.4); + } + + @Override + public void aiStep() { + super.aiStep(); + + if (this.isAlive() && isInFluidType(SpectrumFluids.LIQUID_CRYSTAL_TYPE.get())) { + Level level = this.level(); + if(level.isClientSide()) { + if(random.nextInt(6) == 0) { + level.addParticle(ParticleTypes.END_ROD, + this.getRandomX(0.5), this.getRandomY(), this.getRandomZ(0.5), + random.nextGaussian() * 0.005, random.nextGaussian() * 0.005, random.nextGaussian() * 0.005); + } + } else if(--this.scaleDropTime <= 0) { + // TODO: readd when they got textures & uses + //this.spawnAtLocation(SpectrumItems.SILVER_SCALE); + this.scaleDropTime = SCALE_DROP_TIME_BASE + this.getRandom().nextInt(SCALE_DROP_TIME_BASE); + } + } + } + + @Override + public boolean removeWhenFarAway(double distanceToClosestPlayer) { + return false; + } + + @Override + public void addAdditionalSaveData(CompoundTag nbt) { + super.addAdditionalSaveData(nbt); + nbt.putInt("scale_drop_time", this.scaleDropTime); + } + + @Override + public void readAdditionalSaveData(CompoundTag nbt) { + super.readAdditionalSaveData(nbt); + if (nbt.contains("scale_drop_time")) { + this.scaleDropTime = nbt.getInt("scale_drop_time"); + } + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/entity/entity/LagoonFishingHook.java b/src/main/java/de/dafuqs/spectrum/entity/entity/LagoonFishingHook.java index a1ddb8408f..4a51549a02 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/entity/LagoonFishingHook.java +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/LagoonFishingHook.java @@ -1,6 +1,6 @@ package de.dafuqs.spectrum.entity.entity; -import de.dafuqs.spectrum.entity.*; +import de.dafuqs.spectrum.registries.*; import net.minecraft.world.entity.*; import net.minecraft.world.entity.player.*; import net.minecraft.world.level.*; diff --git a/src/main/java/de/dafuqs/spectrum/entity/entity/LightMineEntity.java b/src/main/java/de/dafuqs/spectrum/entity/entity/LightMineEntity.java index e3278e0bb6..4570d57380 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/entity/LightMineEntity.java +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/LightMineEntity.java @@ -2,8 +2,8 @@ import com.google.common.collect.*; import de.dafuqs.spectrum.*; -import de.dafuqs.spectrum.entity.*; import de.dafuqs.spectrum.helpers.*; +import de.dafuqs.spectrum.registries.*; import net.minecraft.core.particles.*; import net.minecraft.nbt.*; import net.minecraft.network.syncher.*; @@ -15,7 +15,7 @@ import net.minecraft.world.item.alchemy.*; import net.minecraft.world.level.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; import java.util.function.*; diff --git a/src/main/java/de/dafuqs/spectrum/entity/entity/LightShardBaseEntity.java b/src/main/java/de/dafuqs/spectrum/entity/entity/LightShardBaseEntity.java index 043e46ce1a..65fe1efd23 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/entity/LightShardBaseEntity.java +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/LightShardBaseEntity.java @@ -17,7 +17,7 @@ import net.minecraft.world.entity.projectile.*; import net.minecraft.world.level.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; import java.util.function.*; diff --git a/src/main/java/de/dafuqs/spectrum/entity/entity/LightShardEntity.java b/src/main/java/de/dafuqs/spectrum/entity/entity/LightShardEntity.java index 0465bf50ff..c18d23ae88 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/entity/LightShardEntity.java +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/LightShardEntity.java @@ -1,14 +1,14 @@ package de.dafuqs.spectrum.entity.entity; import de.dafuqs.spectrum.*; -import de.dafuqs.spectrum.entity.*; +import de.dafuqs.spectrum.registries.*; import net.minecraft.resources.*; import net.minecraft.util.valueproviders.*; import net.minecraft.world.entity.*; import net.minecraft.world.entity.projectile.*; import net.minecraft.world.level.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.function.*; diff --git a/src/main/java/de/dafuqs/spectrum/entity/entity/LightSpearEntity.java b/src/main/java/de/dafuqs/spectrum/entity/entity/LightSpearEntity.java index ea5f3d19d5..5f3a15659f 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/entity/LightSpearEntity.java +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/LightSpearEntity.java @@ -1,7 +1,7 @@ package de.dafuqs.spectrum.entity.entity; import de.dafuqs.spectrum.*; -import de.dafuqs.spectrum.entity.*; +import de.dafuqs.spectrum.registries.*; import net.minecraft.commands.arguments.*; import net.minecraft.resources.*; import net.minecraft.util.valueproviders.*; @@ -9,7 +9,7 @@ import net.minecraft.world.entity.projectile.*; import net.minecraft.world.level.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.function.*; diff --git a/src/main/java/de/dafuqs/spectrum/entity/entity/LizardEntity.java b/src/main/java/de/dafuqs/spectrum/entity/entity/LizardEntity.java index 1ce86cbef3..17d0b004b6 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/entity/LizardEntity.java +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/LizardEntity.java @@ -1,7 +1,7 @@ package de.dafuqs.spectrum.entity.entity; -import de.dafuqs.spectrum.api.energy.color.*; import de.dafuqs.spectrum.api.entity.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.entity.*; import de.dafuqs.spectrum.entity.variants.*; import de.dafuqs.spectrum.registries.*; @@ -25,7 +25,7 @@ import net.minecraft.world.item.*; import net.minecraft.world.level.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/entity/entity/MagicProjectileEntity.java b/src/main/java/de/dafuqs/spectrum/entity/entity/MagicProjectileEntity.java index b65fbe15e6..f5a7710c08 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/entity/MagicProjectileEntity.java +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/MagicProjectileEntity.java @@ -1,6 +1,6 @@ package de.dafuqs.spectrum.entity.entity; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.registries.*; import de.dafuqs.spectrum.sound.*; import net.minecraft.core.particles.*; @@ -11,7 +11,7 @@ import net.minecraft.world.entity.projectile.*; import net.minecraft.world.level.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public abstract class MagicProjectileEntity extends Projectile { diff --git a/src/main/java/de/dafuqs/spectrum/entity/entity/Marrow.java b/src/main/java/de/dafuqs/spectrum/entity/entity/Marrow.java index 18b9eddb0e..96d9702581 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/entity/Marrow.java +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/Marrow.java @@ -10,7 +10,7 @@ import net.minecraft.world.entity.projectile.*; import net.minecraft.world.item.*; import net.minecraft.world.level.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class Marrow extends AbstractSkeleton { diff --git a/src/main/java/de/dafuqs/spectrum/entity/entity/MiningProjectileEntity.java b/src/main/java/de/dafuqs/spectrum/entity/entity/MiningProjectileEntity.java index dab4be2ee8..f4b63a5b98 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/entity/MiningProjectileEntity.java +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/MiningProjectileEntity.java @@ -1,10 +1,10 @@ package de.dafuqs.spectrum.entity.entity; -import de.dafuqs.spectrum.api.energy.color.*; -import de.dafuqs.spectrum.entity.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.helpers.*; -import de.dafuqs.spectrum.particle.effect.*; import de.dafuqs.spectrum.magic.*; +import de.dafuqs.spectrum.particle.effect.*; +import de.dafuqs.spectrum.registries.*; import net.minecraft.network.syncher.*; import net.minecraft.world.entity.*; import net.minecraft.world.entity.player.*; diff --git a/src/main/java/de/dafuqs/spectrum/entity/entity/MoltenFishingHook.java b/src/main/java/de/dafuqs/spectrum/entity/entity/MoltenFishingHook.java index 80c36a1677..a69795f7c3 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/entity/MoltenFishingHook.java +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/MoltenFishingHook.java @@ -1,7 +1,7 @@ package de.dafuqs.spectrum.entity.entity; import de.dafuqs.spectrum.blocks.idols.*; -import de.dafuqs.spectrum.entity.*; +import de.dafuqs.spectrum.registries.*; import net.minecraft.core.*; import net.minecraft.server.level.*; import net.minecraft.world.entity.*; diff --git a/src/main/java/de/dafuqs/spectrum/entity/entity/MonstrosityEntity.java b/src/main/java/de/dafuqs/spectrum/entity/entity/MonstrosityEntity.java index ec5aca58d9..8ebc012087 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/entity/MonstrosityEntity.java +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/MonstrosityEntity.java @@ -4,7 +4,6 @@ import de.dafuqs.additionalentityattributes.*; import de.dafuqs.revelationary.api.advancements.*; import de.dafuqs.spectrum.*; -import de.dafuqs.spectrum.entity.*; import de.dafuqs.spectrum.entity.ai.*; import de.dafuqs.spectrum.networking.s2c_payloads.*; import de.dafuqs.spectrum.particle.*; @@ -20,7 +19,6 @@ import net.minecraft.tags.*; import net.minecraft.util.*; import net.minecraft.util.valueproviders.*; -import net.minecraft.world.*; import net.minecraft.world.damagesource.*; import net.minecraft.world.effect.*; import net.minecraft.world.entity.*; @@ -36,7 +34,6 @@ import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.*; -import javax.annotation.*; import java.util.*; import java.util.function.*; diff --git a/src/main/java/de/dafuqs/spectrum/entity/entity/ParametricMiningDeviceEntity.java b/src/main/java/de/dafuqs/spectrum/entity/entity/ParametricMiningDeviceEntity.java index 2bc12fd1a3..9f72e3bb28 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/entity/ParametricMiningDeviceEntity.java +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/ParametricMiningDeviceEntity.java @@ -1,7 +1,6 @@ package de.dafuqs.spectrum.entity.entity; import de.dafuqs.spectrum.blocks.boom.*; -import de.dafuqs.spectrum.entity.*; import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.particle.*; import de.dafuqs.spectrum.registries.*; @@ -15,7 +14,6 @@ import net.minecraft.world.item.*; import net.minecraft.world.level.*; import net.minecraft.world.phys.*; -import javax.annotation.*; public class ParametricMiningDeviceEntity extends ThrowableItemProjectile { diff --git a/src/main/java/de/dafuqs/spectrum/entity/entity/PhantomFrameEntity.java b/src/main/java/de/dafuqs/spectrum/entity/entity/PhantomFrameEntity.java index b015190429..a2a4c34928 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/entity/PhantomFrameEntity.java +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/PhantomFrameEntity.java @@ -12,7 +12,6 @@ import net.minecraft.world.item.*; import net.minecraft.world.level.*; import net.minecraft.world.phys.*; -import javax.annotation.*; public class PhantomFrameEntity extends ItemFrame { diff --git a/src/main/java/de/dafuqs/spectrum/entity/entity/PhantomGlowFrameEntity.java b/src/main/java/de/dafuqs/spectrum/entity/entity/PhantomGlowFrameEntity.java index 9658b1044d..9db90aae70 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/entity/PhantomGlowFrameEntity.java +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/PhantomGlowFrameEntity.java @@ -1,6 +1,5 @@ package de.dafuqs.spectrum.entity.entity; -import de.dafuqs.spectrum.entity.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.core.*; import net.minecraft.sounds.*; @@ -8,7 +7,6 @@ import net.minecraft.world.entity.decoration.*; import net.minecraft.world.item.*; import net.minecraft.world.level.*; -import javax.annotation.*; public class PhantomGlowFrameEntity extends PhantomFrameEntity { diff --git a/src/main/java/de/dafuqs/spectrum/entity/entity/PreservationTurretEntity.java b/src/main/java/de/dafuqs/spectrum/entity/entity/PreservationTurretEntity.java index 7ae5bfe5e3..466c6f3ea7 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/entity/PreservationTurretEntity.java +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/PreservationTurretEntity.java @@ -1,7 +1,6 @@ package de.dafuqs.spectrum.entity.entity; import de.dafuqs.spectrum.*; -import de.dafuqs.spectrum.entity.*; import de.dafuqs.spectrum.entity.ai.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.*; @@ -31,10 +30,8 @@ import net.minecraft.world.level.gameevent.*; import net.minecraft.world.level.gameevent.vibrations.*; import net.minecraft.world.phys.*; - -import org.jetbrains.annotations.*; import org.joml.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.lang.Math; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/entity/entity/SeatEntity.java b/src/main/java/de/dafuqs/spectrum/entity/entity/SeatEntity.java index 286f3c7904..1e69bfe67c 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/entity/SeatEntity.java +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/SeatEntity.java @@ -1,6 +1,6 @@ package de.dafuqs.spectrum.entity.entity; -import de.dafuqs.spectrum.entity.*; +import de.dafuqs.spectrum.registries.*; import net.minecraft.core.*; import net.minecraft.core.registries.*; import net.minecraft.nbt.*; @@ -11,7 +11,7 @@ import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/entity/entity/ShootingStarEntity.java b/src/main/java/de/dafuqs/spectrum/entity/entity/ShootingStarEntity.java index 132f17eeaa..9f9d635931 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/entity/ShootingStarEntity.java +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/ShootingStarEntity.java @@ -1,7 +1,6 @@ package de.dafuqs.spectrum.entity.entity; import de.dafuqs.spectrum.blocks.shooting_star.*; -import de.dafuqs.spectrum.entity.*; import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.networking.s2c_payloads.*; import de.dafuqs.spectrum.particle.effect.*; @@ -27,7 +26,6 @@ import net.minecraft.world.level.storage.loot.*; import net.minecraft.world.level.storage.loot.parameters.*; import net.minecraft.world.phys.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/entity/entity/SpectrumBossEntity.java b/src/main/java/de/dafuqs/spectrum/entity/entity/SpectrumBossEntity.java index 5146256e27..834fbe50c2 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/entity/SpectrumBossEntity.java +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/SpectrumBossEntity.java @@ -17,7 +17,7 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.gameevent.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class SpectrumBossEntity extends FlyingMob { diff --git a/src/main/java/de/dafuqs/spectrum/entity/entity/SpectrumFishingHook.java b/src/main/java/de/dafuqs/spectrum/entity/entity/SpectrumFishingHook.java index 77d8e83d80..4e0c110bea 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/entity/SpectrumFishingHook.java +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/SpectrumFishingHook.java @@ -1,10 +1,8 @@ package de.dafuqs.spectrum.entity.entity; -import com.mojang.logging.*; import de.dafuqs.spectrum.blocks.fluid.*; import de.dafuqs.spectrum.data_loaders.*; import de.dafuqs.spectrum.data_loaders.EntityFishingDataLoader.*; -import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.helpers.enchantments.*; import de.dafuqs.spectrum.items.tools.*; import de.dafuqs.spectrum.loot.*; @@ -35,8 +33,7 @@ import net.minecraft.world.level.storage.loot.*; import net.minecraft.world.level.storage.loot.parameters.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; -import org.slf4j.*; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/entity/entity/package-info.java b/src/main/java/de/dafuqs/spectrum/entity/entity/package-info.java index edc09c9296..2601cd064e 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/entity/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/package-info.java @@ -3,6 +3,5 @@ @FieldsAreNonnullByDefault package de.dafuqs.spectrum.entity.entity; -import net.minecraft.FieldsAreNonnullByDefault; -import net.minecraft.MethodsReturnNonnullByDefault; -import org.jspecify.annotations.NullMarked; +import net.minecraft.*; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/entity/models/CrawfishModel.java b/src/main/java/de/dafuqs/spectrum/entity/models/CrawfishModel.java new file mode 100644 index 0000000000..4588b866a9 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/entity/models/CrawfishModel.java @@ -0,0 +1,68 @@ +package de.dafuqs.spectrum.entity.models; + +import de.dafuqs.spectrum.entity.entity.*; +import net.minecraft.client.model.*; +import net.minecraft.client.model.geom.*; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.util.*; +import net.minecraft.world.entity.*; + +public class CrawfishModel extends HierarchicalModel { + + private final ModelPart root; + private final ModelPart tail; + + public CrawfishModel(ModelPart root) { + super(); + this.root = root; + this.tail = root.getChild("tail"); + } + + public static LayerDefinition createBodyLayer() { + MeshDefinition meshdefinition = new MeshDefinition(); + PartDefinition partdefinition = meshdefinition.getRoot(); + + PartDefinition head = partdefinition.addOrReplaceChild("head", CubeListBuilder.create().texOffs(12, 9).addBox(-1.0F, -2.0F, -1.0F, 2.0F, 2.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 22.75F, -3.0F)); + + PartDefinition whiskers = head.addOrReplaceChild("whiskers", CubeListBuilder.create(), PartPose.offset(1.65F, -1.25F, -0.5F)); + whiskers.addOrReplaceChild("whisker_left_r1", CubeListBuilder.create().texOffs(0, 9).addBox(-0.865F, -2.0945F, -1.25F, 2.0F, 5.0F, 4.0F, new CubeDeformation(-1.0F)) + .texOffs(0, 9).mirror().addBox(-2.235F, -2.0945F, -1.25F, 2.0F, 5.0F, 4.0F, new CubeDeformation(-1.0F)).mirror(false), PartPose.offsetAndRotation(-1.1F, -2.0F, -2.1F, 0.2618F, 0.0F, 0.0F)); + whiskers.addOrReplaceChild("whisker_base_right_r1", CubeListBuilder.create().texOffs(8, 19).mirror().addBox(0.0F, -2.0F, -1.0F, 2.0F, 2.0F, 2.0F, new CubeDeformation(-0.75F)).mirror(false) + .texOffs(8, 19).addBox(1.3F, -2.0F, -1.0F, 2.0F, 2.0F, 2.0F, new CubeDeformation(-0.75F)), PartPose.offsetAndRotation(-3.3F, 0.0F, 0.0F, 0.2618F, 0.0F, 0.0F)); + + PartDefinition body = partdefinition.addOrReplaceChild("body", CubeListBuilder.create().texOffs(14, 0).addBox(-1.0F, -2.0F, -1.0F, 2.0F, 2.0F, 3.0F, new CubeDeformation(0.1F)), PartPose.offset(0.0F, 22.7F, -0.25F)); + body.addOrReplaceChild("butt_r1", CubeListBuilder.create().texOffs(0, 18).addBox(-1.0F, -2.0F, -1.0F, 2.0F, 2.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.05F, 2.5F, -0.2182F, 0.0F, 0.0F)); + body.addOrReplaceChild("legs_right_r1", CubeListBuilder.create().texOffs(0, 0).addBox(-3.0F, -4.0F, -1.0F, 2.0F, 4.0F, 5.0F, new CubeDeformation(-1.0F)), PartPose.offsetAndRotation(0.0F, 3.05F, 0.25F, 0.0F, 0.0F, 0.2793F)); + body.addOrReplaceChild("legs_left_r1", CubeListBuilder.create().texOffs(0, 0).mirror().addBox(1.0F, -4.0F, -1.0F, 2.0F, 4.0F, 5.0F, new CubeDeformation(-1.0F)).mirror(false), PartPose.offsetAndRotation(0.0F, 3.05F, 0.25F, 0.0F, 0.0F, -0.2793F)); + + PartDefinition claws = body.addOrReplaceChild("claws", CubeListBuilder.create(), PartPose.offset(-2.0F, 0.8F, -0.75F)); + claws.addOrReplaceChild("upper_claw_right_r1", CubeListBuilder.create().texOffs(0, 22).mirror().addBox(0.0F, -1.0F, -1.0F, 1.0F, 1.0F, 2.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.3981F, 0.1611F, 0.0674F)); + claws.addOrReplaceChild("upper_claw_left_r1", CubeListBuilder.create().texOffs(0, 22).addBox(-1.0F, -1.0F, -1.0F, 1.0F, 1.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(4.0F, 0.0F, 0.0F, 0.3981F, -0.1611F, -0.0674F)); + + PartDefinition claw_itself = claws.addOrReplaceChild("claw_itself", CubeListBuilder.create(), PartPose.offset(-0.5F, 0.5F, -2.0F)); + claw_itself.addOrReplaceChild("inner_claw_left_r1", CubeListBuilder.create().texOffs(12, 14).addBox(-2.0F, -2.0F, -1.0F, 2.0F, 2.0F, 3.0F, new CubeDeformation(-0.6F)), PartPose.offsetAndRotation(4.5F, 0.7F, -0.3F, 0.2657F, 0.1685F, 0.0456F)); + claw_itself.addOrReplaceChild("inner_claw_right_r1", CubeListBuilder.create().texOffs(12, 14).mirror().addBox(0.0F, -2.0F, -1.0F, 2.0F, 2.0F, 3.0F, new CubeDeformation(-0.6F)).mirror(false), PartPose.offsetAndRotation(0.5F, 0.7F, -0.3F, 0.2657F, -0.1685F, -0.0456F)); + claw_itself.addOrReplaceChild("outer_claw_left_r1", CubeListBuilder.create().texOffs(22, 7).mirror().addBox(-1.0F, -1.0F, -1.0F, 1.0F, 1.0F, 2.0F, new CubeDeformation(0.1F)).mirror(false), PartPose.offsetAndRotation(5.0F, 0.0F, 0.0F, 0.0F, -0.2618F, 0.0F)); + claw_itself.addOrReplaceChild("outer_claw_right_r1", CubeListBuilder.create().texOffs(22, 7).addBox(0.0F, -1.0F, -1.0F, 1.0F, 1.0F, 2.0F, new CubeDeformation(0.1F)), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.0F, 0.2618F, 0.0F)); + + PartDefinition tail = partdefinition.addOrReplaceChild("tail", CubeListBuilder.create().texOffs(14, 5).addBox(-2.0F, -0.25F, 0.75F, 4.0F, 0.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 22.75F, 4.25F)); + tail.addOrReplaceChild("tail_r1", CubeListBuilder.create().texOffs(16, 19).addBox(-1.0F, -1.0F, -1.0F, 2.0F, 1.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, -0.2618F, 0.0F, 0.0F)); + + return LayerDefinition.create(meshdefinition, 32, 32); + } + + @Override + public ModelPart root() { + return root; + } + + @Override + public void setupAnim(T entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + float f = 1.0F; + if (!entity.isInWater()) { + f = 1.5F; + } + this.tail.yRot = -f * 0.45F * Mth.sin(0.6F * ageInTicks); + } + +} \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/entity/models/KoiModel.java b/src/main/java/de/dafuqs/spectrum/entity/models/KoiModel.java new file mode 100644 index 0000000000..766351fff7 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/entity/models/KoiModel.java @@ -0,0 +1,43 @@ +package de.dafuqs.spectrum.entity.models; + +import com.mojang.blaze3d.vertex.*; +import de.dafuqs.spectrum.*; +import de.dafuqs.spectrum.entity.entity.*; +import net.minecraft.client.model.*; +import net.minecraft.client.model.geom.*; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.world.entity.*; + +public class KoiModel extends CodModel { + + public KoiModel(ModelPart root) { + super(root); + } + + public static LayerDefinition createBodyLayer() { + MeshDefinition meshdefinition = new MeshDefinition(); + PartDefinition partdefinition = meshdefinition.getRoot(); + + PartDefinition head = partdefinition.addOrReplaceChild("head", CubeListBuilder.create().texOffs(10, 8).addBox(-1.0F, -2.0F, -2.75F, 2.0F, 3.0F, 3.0F, new CubeDeformation(0.25F)), PartPose.offset(0.0F, 20.0F, -4.25F)); + PartDefinition whiskers = head.addOrReplaceChild("whiskers", CubeListBuilder.create(), PartPose.offset(0.0F, 1.0F, 4.25F)); + whiskers.addOrReplaceChild("whisker_right_r1", CubeListBuilder.create().texOffs(0, 0).addBox(-1.135F, -1.0945F, -1.25F, 2.0F, 4.0F, 4.0F, new CubeDeformation(-1.0F)), PartPose.offsetAndRotation(-1.15F, -1.0F, -7.0F, 0.0F, 0.0F, 0.3491F)); + whiskers.addOrReplaceChild("whisker_left_r1", CubeListBuilder.create().texOffs(0, 0).addBox(-0.865F, -1.0945F, -1.25F, 2.0F, 4.0F, 4.0F, new CubeDeformation(-1.0F)), PartPose.offsetAndRotation(1.15F, -1.0F, -7.0F, 0.0F, 0.0F, -0.3491F)); + + PartDefinition body_front = partdefinition.addOrReplaceChild("body_front", CubeListBuilder.create().texOffs(0, 8).addBox(-1.0F, -3.0F, -3.5F, 2.0F, 3.0F, 3.0F, new CubeDeformation(0.5F)), PartPose.offset(0.0F, 21.0F, -0.5F)); + PartDefinition frontfin = body_front.addOrReplaceChild("frontfin", CubeListBuilder.create(), PartPose.offset(3.5F, 1.75F, 0.25F)); + frontfin.addOrReplaceChild("frontfin_right_r1", CubeListBuilder.create().texOffs(6, 20).addBox(-0.0972F, -0.6039F, -0.5F, 0.0F, 3.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.9204F, -1.6188F, -3.5F, 0.0F, 0.0F, 0.48F)); + frontfin.addOrReplaceChild("frontfin_left_r1", CubeListBuilder.create().texOffs(6, 20).addBox(0.0972F, -0.6039F, -0.5F, 0.0F, 3.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-2.0796F, -1.6188F, -3.5F, 0.0F, 0.0F, -0.48F)); + + PartDefinition body_back = partdefinition.addOrReplaceChild("body_back", CubeListBuilder.create().texOffs(12, 0).addBox(-1.0F, -3.0F, -0.5F, 2.0F, 3.0F, 3.0F, new CubeDeformation(0.5F)) + .texOffs(10, 14).addBox(0.0F, -5.25F, -1.0F, 0.0F, 2.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 21.0F, 0.5F)); + PartDefinition backfin = body_back.addOrReplaceChild("backfin", CubeListBuilder.create(), PartPose.offset(-1.9395F, 0.9377F, 1.75F)); + backfin.addOrReplaceChild("backfin_right_r1", CubeListBuilder.create().texOffs(20, 6).addBox(0.0182F, -0.3038F, -0.3478F, 0.0F, 2.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.5F, -1.0F, -0.75F, -0.4363F, 0.0F, 0.48F)); + backfin.addOrReplaceChild("backfin_left_r1", CubeListBuilder.create().texOffs(20, 6).addBox(-0.0182F, -0.3038F, -0.3478F, 0.0F, 2.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(3.379F, -1.0F, -0.75F, -0.4363F, 0.0F, -0.48F)); + partdefinition.addOrReplaceChild("tail_fin", CubeListBuilder.create().texOffs(0, 14).addBox(-1.0F, -2.0F, -0.5F, 2.0F, 3.0F, 3.0F, new CubeDeformation(0.0F)) + .texOffs(18, 14).addBox(0.0F, -4.0F, 2.0F, 0.0F, 3.0F, 3.0F, new CubeDeformation(0.0F)) + .texOffs(0, 20).addBox(0.0F, 0.0F, 2.0F, 0.0F, 3.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 20.0F, 3.5F)); + + return LayerDefinition.create(meshdefinition, 32, 32); + } + +} \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/entity/models/PreservationTurretEntityModel.java b/src/main/java/de/dafuqs/spectrum/entity/models/PreservationTurretEntityModel.java index 6fb33dabcd..d4691c663d 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/models/PreservationTurretEntityModel.java +++ b/src/main/java/de/dafuqs/spectrum/entity/models/PreservationTurretEntityModel.java @@ -7,7 +7,6 @@ import net.minecraft.client.model.geom.builders.*; import net.minecraft.client.renderer.*; import net.minecraft.util.*; -import javax.annotation.*; public class PreservationTurretEntityModel extends ListModel { diff --git a/src/main/java/de/dafuqs/spectrum/entity/models/package-info.java b/src/main/java/de/dafuqs/spectrum/entity/models/package-info.java index 4aed6245e0..21e68f65ee 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/models/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/entity/models/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.entity.models; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/entity/package-info.java b/src/main/java/de/dafuqs/spectrum/entity/package-info.java index 2eb907b5d6..def77cfe80 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/entity/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.entity; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/entity/predicates/EggLayingWoolyPigPredicate.java b/src/main/java/de/dafuqs/spectrum/entity/predicates/EggLayingWoolyPigPredicate.java index 221088481d..d9743f3214 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/predicates/EggLayingWoolyPigPredicate.java +++ b/src/main/java/de/dafuqs/spectrum/entity/predicates/EggLayingWoolyPigPredicate.java @@ -9,7 +9,7 @@ import net.minecraft.world.entity.*; import net.minecraft.world.item.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/entity/predicates/KindlingPredicate.java b/src/main/java/de/dafuqs/spectrum/entity/predicates/KindlingPredicate.java index 5c87f336b4..ee28c29c44 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/predicates/KindlingPredicate.java +++ b/src/main/java/de/dafuqs/spectrum/entity/predicates/KindlingPredicate.java @@ -10,7 +10,7 @@ import net.minecraft.server.level.*; import net.minecraft.world.entity.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/entity/predicates/LizardPredicate.java b/src/main/java/de/dafuqs/spectrum/entity/predicates/LizardPredicate.java index 2b4f356c79..ec72af93a5 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/predicates/LizardPredicate.java +++ b/src/main/java/de/dafuqs/spectrum/entity/predicates/LizardPredicate.java @@ -2,7 +2,7 @@ import com.mojang.serialization.*; import com.mojang.serialization.codecs.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.entity.*; import de.dafuqs.spectrum.entity.entity.*; import de.dafuqs.spectrum.entity.variants.*; @@ -11,7 +11,7 @@ import net.minecraft.server.level.*; import net.minecraft.world.entity.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/entity/predicates/ShulkerPredicate.java b/src/main/java/de/dafuqs/spectrum/entity/predicates/ShulkerPredicate.java index 4b4163c0c4..068151e249 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/predicates/ShulkerPredicate.java +++ b/src/main/java/de/dafuqs/spectrum/entity/predicates/ShulkerPredicate.java @@ -9,7 +9,7 @@ import net.minecraft.world.entity.monster.*; import net.minecraft.world.item.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/entity/predicates/package-info.java b/src/main/java/de/dafuqs/spectrum/entity/predicates/package-info.java index b96a3237a9..3c71f4c2ae 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/predicates/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/entity/predicates/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.entity.predicates; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/entity/render/BidentEntityRenderer.java b/src/main/java/de/dafuqs/spectrum/entity/render/BidentEntityRenderer.java index dd662682ca..eec678b7ba 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/render/BidentEntityRenderer.java +++ b/src/main/java/de/dafuqs/spectrum/entity/render/BidentEntityRenderer.java @@ -39,8 +39,7 @@ public void render(BidentBaseEntity bidentBaseEntity, float yaw, float tickDelta } private void renderAsItemStack(BidentBaseEntity entity, float tickDelta, PoseStack poseStack, MultiBufferSource vertexConsumerProvider, int light, ItemStack itemStack) { - SpectrumModelPredicateProviders.DISPLAY_CONTEXT = ItemDisplayContext.FIRST_PERSON_LEFT_HAND; // allow for oversized shenanigans - BakedModel bakedModel = this.itemRenderer.getModel(itemStack, entity.level(), null, entity.getId()); + BakedModel bakedModel = this.itemRenderer.getModel(itemStack, entity.level(), null, SpectrumModelPredicateProviders.MAGIC_OVERSIZED_SEED); poseStack.pushPose(); poseStack.translate(0, entity.getBoundingBox().getSize() / 2, 0); diff --git a/src/main/java/de/dafuqs/spectrum/entity/render/CrawfishRenderer.java b/src/main/java/de/dafuqs/spectrum/entity/render/CrawfishRenderer.java new file mode 100644 index 0000000000..6ee89fdec4 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/entity/render/CrawfishRenderer.java @@ -0,0 +1,41 @@ +package de.dafuqs.spectrum.entity.render; + +import com.mojang.blaze3d.vertex.*; +import com.mojang.math.*; +import de.dafuqs.spectrum.*; +import de.dafuqs.spectrum.entity.entity.*; +import de.dafuqs.spectrum.entity.models.*; +import de.dafuqs.spectrum.registries.client.*; +import net.minecraft.client.renderer.entity.*; +import net.minecraft.resources.*; +import net.minecraft.util.*; +import net.minecraft.world.entity.monster.*; + +public class CrawfishRenderer extends MobRenderer> { + + public static final ResourceLocation TEXTURE = SpectrumCommon.locate("textures/entity/crawfish/crawfish.png"); + + public CrawfishRenderer(EntityRendererProvider.Context context) { + super(context, new CrawfishModel<>(context.bakeLayer(SpectrumModelLayerLocations.CRAWFISH)), 0.3F); + } + + @Override + public ResourceLocation getTextureLocation(Crawfish entity) { + return TEXTURE; + } + + @Override + protected void setupRotations(Crawfish entity, PoseStack poseStack, float bob, float yBodyRot, float partialTick, float scale) { + super.setupRotations(entity, poseStack, bob, yBodyRot, partialTick, scale); + float f = 4.3F * Mth.sin(0.6F * bob); + poseStack.mulPose(Axis.YP.rotationDegrees(f)); + } + + /*@Override + protected void scale(Crawfish crawfish, PoseStack poseStack, float partialTickTime) { + int collectedXP = crawfish.getCollectedXP(); + float scale = 1.0F + 0.2F * (float)collectedXP; + poseStack.scale(scale, scale, scale); + }*/ + +} diff --git a/src/main/java/de/dafuqs/spectrum/entity/render/FloatBlockEntityRenderer.java b/src/main/java/de/dafuqs/spectrum/entity/render/FloatBlockEntityRenderer.java deleted file mode 100644 index 0123708dd1..0000000000 --- a/src/main/java/de/dafuqs/spectrum/entity/render/FloatBlockEntityRenderer.java +++ /dev/null @@ -1,51 +0,0 @@ -package de.dafuqs.spectrum.entity.render; - -import com.mojang.blaze3d.vertex.*; -import de.dafuqs.spectrum.entity.entity.*; -import net.minecraft.client.*; -import net.minecraft.client.renderer.*; -import net.minecraft.client.renderer.block.*; -import net.minecraft.client.renderer.entity.*; -import net.minecraft.client.renderer.texture.*; -import net.minecraft.core.*; -import net.minecraft.resources.*; -import net.minecraft.util.*; -import net.minecraft.world.level.*; -import net.minecraft.world.level.block.*; -import net.minecraft.world.level.block.state.*; - - -public class FloatBlockEntityRenderer extends EntityRenderer { - private final RandomSource random = RandomSource.create(); - - public FloatBlockEntityRenderer(EntityRendererProvider.Context renderManager) { - super(renderManager); - this.shadowRadius = 0.5F; - } - - @Override - public void render(FloatBlockEntity entity, float yaw, float tickDelta, PoseStack matrices, MultiBufferSource vertexConsumers, int light) { - BlockState blockState = entity.getBlockState(); - - if (blockState.getRenderShape() == RenderShape.MODEL) { - Level world = entity.level(); - - if (blockState != world.getBlockState(BlockPos.containing(entity.position())) && blockState.getRenderShape() != RenderShape.INVISIBLE) { - matrices.pushPose(); - BlockPos blockpos = BlockPos.containing(entity.getX(), entity.getBoundingBox().maxY, entity.getZ()); - matrices.translate(-0.5, 0.0, -0.5); - BlockRenderDispatcher blockRenderManager = Minecraft.getInstance().getBlockRenderer(); - blockRenderManager.getModelRenderer().tesselateBlock(world, blockRenderManager.getBlockModel(blockState), blockState, blockpos, matrices, vertexConsumers.getBuffer(ItemBlockRenderTypes.getMovingBlockRenderType(blockState)), false, random, blockState.getSeed(entity.getOrigin()), OverlayTexture.NO_OVERLAY); - matrices.popPose(); - - super.render(entity, yaw, tickDelta, matrices, vertexConsumers, light); - } - } - } - - @SuppressWarnings("deprecation") - @Override - public ResourceLocation getTextureLocation(FloatBlockEntity entityIn) { - return TextureAtlas.LOCATION_BLOCKS; - } -} diff --git a/src/main/java/de/dafuqs/spectrum/entity/render/KindlingEntityRenderer.java b/src/main/java/de/dafuqs/spectrum/entity/render/KindlingEntityRenderer.java index 1210722381..59401acdea 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/render/KindlingEntityRenderer.java +++ b/src/main/java/de/dafuqs/spectrum/entity/render/KindlingEntityRenderer.java @@ -10,7 +10,6 @@ import net.minecraft.client.renderer.entity.*; import net.minecraft.client.renderer.entity.layers.*; import net.minecraft.resources.*; -import javax.annotation.*; public class KindlingEntityRenderer extends MobRenderer { diff --git a/src/main/java/de/dafuqs/spectrum/entity/render/KoiRenderer.java b/src/main/java/de/dafuqs/spectrum/entity/render/KoiRenderer.java new file mode 100644 index 0000000000..870d8e7623 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/entity/render/KoiRenderer.java @@ -0,0 +1,45 @@ +package de.dafuqs.spectrum.entity.render; + +import com.mojang.blaze3d.vertex.*; +import com.mojang.math.*; +import de.dafuqs.spectrum.*; +import de.dafuqs.spectrum.entity.entity.*; +import de.dafuqs.spectrum.entity.models.*; +import de.dafuqs.spectrum.registries.client.*; +import net.minecraft.client.renderer.entity.*; +import net.minecraft.resources.*; +import net.minecraft.util.*; +import net.minecraft.world.entity.animal.*; + +public class KoiRenderer extends MobRenderer> { + + public static final ResourceLocation TEXTURE = SpectrumCommon.locate("textures/entity/koi/koi.png"); + + public KoiRenderer(EntityRendererProvider.Context context) { + super(context, new KoiModel<>(context.bakeLayer(SpectrumModelLayerLocations.KOI)), 0.3F); + } + + @Override + public ResourceLocation getTextureLocation(Koi entity) { + return TEXTURE; + } + + @Override + protected void setupRotations(Koi entity, PoseStack poseStack, float bob, float yBodyRot, float partialTick, float scale) { + super.setupRotations(entity, poseStack, bob, yBodyRot, partialTick, scale); + + // if it is rendering at world origin render unmodified + // this is probably a fake entity (e.g. in a book) + // the entity should render as if in water, not flopping + if(entity.position().lengthSqr() == 0) { + return; + } + + float f = 4.3F * Mth.sin(0.6F * bob); + poseStack.mulPose(Axis.YP.rotationDegrees(f)); + if (!entity.isInWater()) { + poseStack.translate(0.1F, 0.1F, -0.1F); + poseStack.mulPose(Axis.ZP.rotationDegrees(90.0F)); + } + } +} diff --git a/src/main/java/de/dafuqs/spectrum/entity/render/LizardFrillsFeatureRenderer.java b/src/main/java/de/dafuqs/spectrum/entity/render/LizardFrillsFeatureRenderer.java index 5b6409d418..04e690a69f 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/render/LizardFrillsFeatureRenderer.java +++ b/src/main/java/de/dafuqs/spectrum/entity/render/LizardFrillsFeatureRenderer.java @@ -23,7 +23,7 @@ public void render(PoseStack matrices, MultiBufferSource vertexConsumers, int li LizardFrillVariant frills = lizard.getFrills().value(); VertexConsumer vertexConsumer = vertexConsumers.getBuffer(SpectrumRenderLayers.GlowInTheDarkRenderLayer.get(frills.getTextureLocation())); - var color = lizard.getColor().getColorInt(); + var color = lizard.getColor().getColorARGB(); this.getParentModel().renderToBuffer(matrices, vertexConsumer, 15728640, OverlayTexture.NO_OVERLAY, color); } diff --git a/src/main/java/de/dafuqs/spectrum/entity/render/LizardHornsFeatureRenderer.java b/src/main/java/de/dafuqs/spectrum/entity/render/LizardHornsFeatureRenderer.java index 529c7e4182..41537bc198 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/render/LizardHornsFeatureRenderer.java +++ b/src/main/java/de/dafuqs/spectrum/entity/render/LizardHornsFeatureRenderer.java @@ -24,7 +24,7 @@ public void render(PoseStack matrices, MultiBufferSource vertexConsumers, int li LizardHornVariant horns = lizard.getHorns().value(); VertexConsumer vertexConsumer = vertexConsumers.getBuffer(SpectrumRenderLayers.GlowInTheDarkRenderLayer.get(horns.getTextureLocation())); - var color = lizard.getColor().getColorInt(); + var color = lizard.getColor().getColorARGB(); this.getParentModel().renderToBuffer(matrices, vertexConsumer, 15728640, OverlayTexture.NO_OVERLAY, color); } diff --git a/src/main/java/de/dafuqs/spectrum/entity/render/MarrowRenderer.java b/src/main/java/de/dafuqs/spectrum/entity/render/MarrowRenderer.java index 77dc009f80..2b9ea674f4 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/render/MarrowRenderer.java +++ b/src/main/java/de/dafuqs/spectrum/entity/render/MarrowRenderer.java @@ -7,7 +7,6 @@ import net.minecraft.client.renderer.entity.layers.*; import net.minecraft.resources.*; import net.neoforged.api.distmarker.*; -import javax.annotation.*; @OnlyIn(Dist.CLIENT) public class MarrowRenderer extends SkeletonRenderer { diff --git a/src/main/java/de/dafuqs/spectrum/entity/render/MonstrosityEntityRenderer.java b/src/main/java/de/dafuqs/spectrum/entity/render/MonstrosityEntityRenderer.java index 7476d56394..5a205a2186 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/render/MonstrosityEntityRenderer.java +++ b/src/main/java/de/dafuqs/spectrum/entity/render/MonstrosityEntityRenderer.java @@ -3,8 +3,6 @@ import com.mojang.blaze3d.vertex.*; import de.dafuqs.spectrum.entity.entity.*; import net.minecraft.client.gui.*; -import de.dafuqs.spectrum.entity.models.*; -import de.dafuqs.spectrum.registries.client.*; import net.minecraft.client.renderer.*; import net.minecraft.client.renderer.entity.*; import net.minecraft.client.renderer.texture.*; @@ -12,7 +10,6 @@ import net.minecraft.resources.*; import net.minecraft.util.*; import net.neoforged.api.distmarker.*; -import javax.annotation.*; import org.joml.*; import java.lang.Math; diff --git a/src/main/java/de/dafuqs/spectrum/entity/render/PhantomFrameEntityRenderer.java b/src/main/java/de/dafuqs/spectrum/entity/render/PhantomFrameEntityRenderer.java index 4ac9b9befd..cbc0eb7992 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/render/PhantomFrameEntityRenderer.java +++ b/src/main/java/de/dafuqs/spectrum/entity/render/PhantomFrameEntityRenderer.java @@ -2,8 +2,8 @@ import com.mojang.blaze3d.vertex.*; import com.mojang.math.*; -import de.dafuqs.spectrum.entity.*; import de.dafuqs.spectrum.entity.entity.*; +import de.dafuqs.spectrum.registries.*; import net.minecraft.client.*; import net.minecraft.client.renderer.*; import net.minecraft.client.renderer.block.*; diff --git a/src/main/java/de/dafuqs/spectrum/entity/render/ShootingStarEntityRenderer.java b/src/main/java/de/dafuqs/spectrum/entity/render/ShootingStarEntityRenderer.java index e25b3343be..ed34a8fab9 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/render/ShootingStarEntityRenderer.java +++ b/src/main/java/de/dafuqs/spectrum/entity/render/ShootingStarEntityRenderer.java @@ -9,7 +9,6 @@ import net.minecraft.client.renderer.texture.*; import net.minecraft.core.*; import net.minecraft.resources.*; -import net.minecraft.util.*; import net.minecraft.world.inventory.*; import net.minecraft.world.level.*; import net.minecraft.world.level.block.*; diff --git a/src/main/java/de/dafuqs/spectrum/entity/render/SplinterspawnRenderer.java b/src/main/java/de/dafuqs/spectrum/entity/render/SplinterspawnRenderer.java index 356c086de1..f02f6c7296 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/render/SplinterspawnRenderer.java +++ b/src/main/java/de/dafuqs/spectrum/entity/render/SplinterspawnRenderer.java @@ -5,7 +5,6 @@ import net.minecraft.resources.*; import net.minecraft.world.entity.monster.*; import net.neoforged.api.distmarker.*; -import javax.annotation.*; @OnlyIn(Dist.CLIENT) public class SplinterspawnRenderer extends SilverfishRenderer { diff --git a/src/main/java/de/dafuqs/spectrum/entity/render/package-info.java b/src/main/java/de/dafuqs/spectrum/entity/render/package-info.java index d1d8871c88..557cdd9f6b 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/render/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/entity/render/package-info.java @@ -3,6 +3,5 @@ @FieldsAreNonnullByDefault package de.dafuqs.spectrum.entity.render; -import net.minecraft.FieldsAreNonnullByDefault; -import net.minecraft.MethodsReturnNonnullByDefault; -import org.jspecify.annotations.NullMarked; +import net.minecraft.*; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/entity/spawners/MonstrositySpawner.java b/src/main/java/de/dafuqs/spectrum/entity/spawners/MonstrositySpawner.java index 8d0686c667..cc60aea871 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/spawners/MonstrositySpawner.java +++ b/src/main/java/de/dafuqs/spectrum/entity/spawners/MonstrositySpawner.java @@ -1,7 +1,7 @@ package de.dafuqs.spectrum.entity.spawners; -import de.dafuqs.spectrum.entity.*; import de.dafuqs.spectrum.entity.entity.*; +import de.dafuqs.spectrum.registries.*; import net.minecraft.server.level.*; import net.minecraft.world.*; import net.minecraft.world.entity.*; diff --git a/src/main/java/de/dafuqs/spectrum/entity/spawners/ShootingStarSpawner.java b/src/main/java/de/dafuqs/spectrum/entity/spawners/ShootingStarSpawner.java index bf07436729..857e7fab51 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/spawners/ShootingStarSpawner.java +++ b/src/main/java/de/dafuqs/spectrum/entity/spawners/ShootingStarSpawner.java @@ -1,7 +1,6 @@ package de.dafuqs.spectrum.entity.spawners; import de.dafuqs.revelationary.api.advancements.*; -import de.dafuqs.spectrum.*; import de.dafuqs.spectrum.blocks.shooting_star.*; import de.dafuqs.spectrum.config.*; import de.dafuqs.spectrum.entity.entity.*; @@ -14,7 +13,6 @@ import net.minecraft.world.item.*; import net.minecraft.world.level.*; import net.minecraft.world.phys.*; -import javax.annotation.*; public class ShootingStarSpawner implements CustomSpawner { diff --git a/src/main/java/de/dafuqs/spectrum/entity/spawners/package-info.java b/src/main/java/de/dafuqs/spectrum/entity/spawners/package-info.java index 380e9d4ee9..06c8c97910 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/spawners/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/entity/spawners/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.entity.spawners; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/entity/variants/package-info.java b/src/main/java/de/dafuqs/spectrum/entity/variants/package-info.java index ba3d84c8b0..cb17e47165 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/variants/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/entity/variants/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.entity.variants; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/events/ExactPositionSource.java b/src/main/java/de/dafuqs/spectrum/events/ExactPositionSource.java index a48ff6bb47..1194d086fc 100644 --- a/src/main/java/de/dafuqs/spectrum/events/ExactPositionSource.java +++ b/src/main/java/de/dafuqs/spectrum/events/ExactPositionSource.java @@ -8,7 +8,6 @@ import net.minecraft.world.level.*; import net.minecraft.world.level.gameevent.*; import net.minecraft.world.phys.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/events/SpectrumPositionSources.java b/src/main/java/de/dafuqs/spectrum/events/SpectrumPositionSources.java index 8f483aa920..641eff91c9 100644 --- a/src/main/java/de/dafuqs/spectrum/events/SpectrumPositionSources.java +++ b/src/main/java/de/dafuqs/spectrum/events/SpectrumPositionSources.java @@ -1,7 +1,6 @@ package de.dafuqs.spectrum.events; import de.dafuqs.spectrum.*; -import net.minecraft.core.*; import net.minecraft.core.registries.*; import net.minecraft.world.level.gameevent.*; import net.neoforged.bus.api.*; diff --git a/src/main/java/de/dafuqs/spectrum/events/listeners/ItemAndExperienceEventQueue.java b/src/main/java/de/dafuqs/spectrum/events/listeners/ItemAndExperienceEventQueue.java index 14de9d3432..512109afe7 100644 --- a/src/main/java/de/dafuqs/spectrum/events/listeners/ItemAndExperienceEventQueue.java +++ b/src/main/java/de/dafuqs/spectrum/events/listeners/ItemAndExperienceEventQueue.java @@ -8,7 +8,6 @@ import net.minecraft.world.level.*; import net.minecraft.world.level.gameevent.*; import net.minecraft.world.phys.*; -import javax.annotation.*; /** * Since Sucking chests can react to both spawned items and experience diff --git a/src/main/java/de/dafuqs/spectrum/events/listeners/package-info.java b/src/main/java/de/dafuqs/spectrum/events/listeners/package-info.java index 6a91100585..ccfdab0f3f 100644 --- a/src/main/java/de/dafuqs/spectrum/events/listeners/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/events/listeners/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.events.listeners; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/events/package-info.java b/src/main/java/de/dafuqs/spectrum/events/package-info.java index d5adbc76a7..90bac3afb5 100644 --- a/src/main/java/de/dafuqs/spectrum/events/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/events/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.events; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/helpers/AoEHelper.java b/src/main/java/de/dafuqs/spectrum/helpers/AoEHelper.java index 70da2fd760..9d10e9c498 100644 --- a/src/main/java/de/dafuqs/spectrum/helpers/AoEHelper.java +++ b/src/main/java/de/dafuqs/spectrum/helpers/AoEHelper.java @@ -9,7 +9,7 @@ import net.minecraft.world.level.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.function.*; diff --git a/src/main/java/de/dafuqs/spectrum/helpers/BlockVariantHelper.java b/src/main/java/de/dafuqs/spectrum/helpers/BlockVariantHelper.java deleted file mode 100644 index 3ea9f914c7..0000000000 --- a/src/main/java/de/dafuqs/spectrum/helpers/BlockVariantHelper.java +++ /dev/null @@ -1,136 +0,0 @@ -package de.dafuqs.spectrum.helpers; - -import de.dafuqs.spectrum.registries.*; -import net.minecraft.core.*; -import net.minecraft.core.registries.*; -import net.minecraft.resources.*; -import net.minecraft.world.item.*; -import net.minecraft.world.level.*; -import net.minecraft.world.level.block.*; -import net.minecraft.world.level.block.entity.*; -import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; - -import java.util.*; - -public class BlockVariantHelper { - - // cache for cursedBlockColorVariant() - private static final Map> coloredStates = new HashMap<>(); - // ordered color strings so "light_" variants match before non-light - private static final List COLOR_STRINGS = List.of("light_blue", "light_gray", "white", "orange", "magenta", "yellow", "lime", "pink", "gray", "cyan", "purple", "blue", "brown", "green", "red", "black"); - - public static BlockState getCursedBlockColorVariant(Level world, BlockPos blockPos, DyeColor newColor) { - BlockEntity blockEntity = world.getBlockEntity(blockPos); - if (blockEntity != null) { - return Blocks.AIR.defaultBlockState(); - } - - BlockState blockState = world.getBlockState(blockPos); - - if (blockState.is(SpectrumBlockTags.INK_EFFECT_BLACKLISTED) || blockState.getDestroySpeed(world, blockPos) == -1) { - return Blocks.AIR.defaultBlockState(); - } - - Block block = blockState.getBlock(); - if (coloredStates.containsKey(block)) { - Map colorMap = coloredStates.get(block); - if (colorMap.containsKey(newColor)) { - Block newBlock = colorMap.get(newColor); - return newBlock.withPropertiesOf(blockState); - } - } - - ResourceLocation identifier = BuiltInRegistries.BLOCK.getKey(block); - - String newPath = null; - for (String colorString : COLOR_STRINGS) { - if (identifier.getPath().contains(colorString)) { - newPath = identifier.getPath().replace(colorString, newColor.toString()); - break; - } - } - - Block returnBlock = Blocks.AIR; - if (newPath != null) { - ResourceLocation newIdentifier = ResourceLocation.fromNamespaceAndPath(identifier.getNamespace(), newPath); - Block newIdentifierBlock = BuiltInRegistries.BLOCK.get(newIdentifier); - if (newIdentifierBlock != block) { - returnBlock = newIdentifierBlock; - } - } - - // cache - if (coloredStates.containsKey(block)) { - Map colorMap = coloredStates.get(block); - colorMap.put(newColor, returnBlock); - } else { - Map colorMap = new HashMap<>(); - colorMap.put(newColor, returnBlock); - coloredStates.put(block, colorMap); - } - - return returnBlock.withPropertiesOf(blockState); - } - - // cache for getCursedRepairedBlockVariant() - private static final Map repairedStates = new HashMap<>() {{ - put(Blocks.CRACKED_DEEPSLATE_BRICKS, Blocks.DEEPSLATE_BRICKS); - put(Blocks.CRACKED_DEEPSLATE_TILES, Blocks.DEEPSLATE_TILES); - put(Blocks.CRACKED_NETHER_BRICKS, Blocks.NETHER_BRICKS); - put(Blocks.CRACKED_POLISHED_BLACKSTONE_BRICKS, Blocks.POLISHED_BLACKSTONE_BRICKS); - put(Blocks.CRACKED_STONE_BRICKS, Blocks.STONE_BRICKS); - put(Blocks.INFESTED_CRACKED_STONE_BRICKS, Blocks.INFESTED_STONE_BRICKS); - - put(Blocks.DAMAGED_ANVIL, Blocks.CHIPPED_ANVIL); - put(Blocks.CHIPPED_ANVIL, Blocks.ANVIL); - - put(Blocks.EXPOSED_COPPER, Blocks.COPPER_BLOCK); - put(Blocks.WEATHERED_COPPER, Blocks.EXPOSED_COPPER); - put(Blocks.OXIDIZED_COPPER, Blocks.WEATHERED_COPPER); - put(Blocks.EXPOSED_CUT_COPPER, Blocks.CUT_COPPER); - put(Blocks.WEATHERED_CUT_COPPER, Blocks.EXPOSED_CUT_COPPER); - put(Blocks.OXIDIZED_CUT_COPPER, Blocks.WEATHERED_CUT_COPPER); - }}; - - //TODO: unused - public static @Nullable Block getCursedRepairedBlockVariant(Level world, BlockPos blockPos) { - BlockEntity blockEntity = world.getBlockEntity(blockPos); - if (blockEntity != null) { - return Blocks.AIR; - } - - BlockState blockState = world.getBlockState(blockPos); - if (blockState.is(SpectrumBlockTags.INK_EFFECT_BLACKLISTED)) { - return Blocks.AIR; - } - - Block block = blockState.getBlock(); - - if (repairedStates.containsKey(block)) { - return repairedStates.get(block); - } - - ResourceLocation identifier = BuiltInRegistries.BLOCK.getKey(block); - - String newPath = identifier.getPath(); - newPath = newPath.replace("cracked_", ""); - newPath = newPath.replace("damaged_", ""); - newPath = newPath.replace("chipped_", ""); - - Block returnBlock = Blocks.AIR; - if (!newPath.equals(identifier.getPath())) { - ResourceLocation newIdentifier = ResourceLocation.fromNamespaceAndPath(identifier.getNamespace(), newPath); - Block newIdentifierBlock = BuiltInRegistries.BLOCK.get(newIdentifier); - if (newIdentifierBlock != block) { - returnBlock = newIdentifierBlock; - } - } - - // cache - repairedStates.put(block, returnBlock); - - return returnBlock; - } - -} diff --git a/src/main/java/de/dafuqs/spectrum/helpers/BuildingHelper.java b/src/main/java/de/dafuqs/spectrum/helpers/BuildingHelper.java index 1ed63912bc..c2b059bdde 100644 --- a/src/main/java/de/dafuqs/spectrum/helpers/BuildingHelper.java +++ b/src/main/java/de/dafuqs/spectrum/helpers/BuildingHelper.java @@ -9,7 +9,6 @@ import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.shapes.*; -import javax.annotation.*; import oshi.util.tuples.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/helpers/CodecHelper.java b/src/main/java/de/dafuqs/spectrum/helpers/CodecHelper.java index 74fe08d04f..55a7ec6744 100644 --- a/src/main/java/de/dafuqs/spectrum/helpers/CodecHelper.java +++ b/src/main/java/de/dafuqs/spectrum/helpers/CodecHelper.java @@ -9,8 +9,7 @@ import net.minecraft.nbt.*; import net.minecraft.resources.*; import net.minecraft.util.*; -import org.apache.commons.lang3.math.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; import java.util.function.*; diff --git a/src/main/java/de/dafuqs/spectrum/helpers/EntityHelper.java b/src/main/java/de/dafuqs/spectrum/helpers/EntityHelper.java index b40c99c843..0b01647377 100644 --- a/src/main/java/de/dafuqs/spectrum/helpers/EntityHelper.java +++ b/src/main/java/de/dafuqs/spectrum/helpers/EntityHelper.java @@ -7,7 +7,7 @@ import net.minecraft.world.entity.player.*; import net.minecraft.world.entity.projectile.*; import net.neoforged.neoforge.common.util.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/helpers/FakePlayerHelper.java b/src/main/java/de/dafuqs/spectrum/helpers/FakePlayerHelper.java index 9f70755af1..46bd01c60e 100644 --- a/src/main/java/de/dafuqs/spectrum/helpers/FakePlayerHelper.java +++ b/src/main/java/de/dafuqs/spectrum/helpers/FakePlayerHelper.java @@ -6,22 +6,16 @@ import net.minecraft.server.level.*; import net.minecraft.world.entity.player.*; import net.neoforged.neoforge.common.util.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; public class FakePlayerHelper { - private static final Map FAKE_PLAYER_CACHE = new Object2ObjectArrayMap<>(); - public static @Nullable Player getFakePlayer(ServerLevel level, PlayerOwned playerOwned) { UUID ownerUUID = playerOwned.getOwnerUUID(); if(ownerUUID == null) return null; - - return FAKE_PLAYER_CACHE.computeIfAbsent(ownerUUID, uuid -> { - GameProfile fakeProfile = new GameProfile(ownerUUID, "[Spectrum Fake Player of " + ownerUUID + "]"); - return new FakePlayer(level, fakeProfile); - }); + return FakePlayerFactory.get(level, new GameProfile(ownerUUID, "[Spectrum Fake Player of " + ownerUUID + "]")); } } diff --git a/src/main/java/de/dafuqs/spectrum/helpers/InWorldInteractionHelper.java b/src/main/java/de/dafuqs/spectrum/helpers/InWorldInteractionHelper.java index ac291f2f8b..e57a10b4ea 100644 --- a/src/main/java/de/dafuqs/spectrum/helpers/InWorldInteractionHelper.java +++ b/src/main/java/de/dafuqs/spectrum/helpers/InWorldInteractionHelper.java @@ -1,13 +1,11 @@ package de.dafuqs.spectrum.helpers; import net.minecraft.server.level.*; -import net.minecraft.tags.*; import net.minecraft.world.*; import net.minecraft.world.entity.item.*; import net.minecraft.world.item.*; import net.minecraft.world.level.*; import net.minecraft.world.phys.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/helpers/InventoryHelper.java b/src/main/java/de/dafuqs/spectrum/helpers/InventoryHelper.java index ee92b07753..4277edc62d 100644 --- a/src/main/java/de/dafuqs/spectrum/helpers/InventoryHelper.java +++ b/src/main/java/de/dafuqs/spectrum/helpers/InventoryHelper.java @@ -9,10 +9,9 @@ import net.minecraft.world.item.*; import net.minecraft.world.item.crafting.*; import net.neoforged.neoforge.items.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; -import java.util.function.*; public class InventoryHelper { @@ -103,63 +102,63 @@ public static Tuple> getStackCountInInventory(ItemStack /** * Adds a single itemstack to an inventory * - * @param itemStack the itemstack to add. The stack can have a size > + * @param stackToAdd the itemstack to add. The stack can have a size > * maxStackSize and will be split accordingly * @param inventory the inventory to add to * @return The remaining stack that could not be added */ - public static ItemStack smartAddToInventory(ItemStack itemStack, Container inventory, @Nullable Direction side) { + public static ItemStack smartAddToInventory(ItemStack stackToAdd, Container inventory, @Nullable Direction side) { if (inventory instanceof WorldlyContainer sidedInventory && side != null) { int[] acceptableSlots = sidedInventory.getSlotsForFace(side); - for (int acceptableSlot : acceptableSlots) { - if (sidedInventory.canPlaceItemThroughFace(acceptableSlot, itemStack, side)) { - itemStack = setOrCombineStack(inventory, acceptableSlot, itemStack); - if (itemStack.isEmpty()) { + for (int slot : acceptableSlots) { + if (sidedInventory.canPlaceItemThroughFace(slot, stackToAdd, side)) { + stackToAdd = setOrCombineStack(inventory, slot, stackToAdd); + if (stackToAdd.isEmpty()) { break; } } } } else { - for (int i = 0; i < inventory.getContainerSize(); i++) { - itemStack = setOrCombineStack(inventory, i, itemStack); - if (itemStack.isEmpty()) { + for (int slot = 0; slot < inventory.getContainerSize(); slot++) { + stackToAdd = setOrCombineStack(inventory, slot, stackToAdd); + if (stackToAdd.isEmpty()) { break; } } } - return itemStack; + return stackToAdd; } - public static ItemStack setOrCombineStack(Container inventory, int slot, ItemStack addingStack) { - ItemStack existingStack = inventory.getItem(slot); - int max = Math.min(addingStack.getMaxStackSize(), inventory.getMaxStackSize(existingStack)); - if (existingStack.isEmpty()) { - if (addingStack.getCount() > max) { - ItemStack newStack = addingStack.copy(); + public static ItemStack setOrCombineStack(Container inventory, int slot, ItemStack stackToAdd) { + ItemStack slotStack = inventory.getItem(slot); + int max = inventory.getMaxStackSize(stackToAdd); + if (slotStack.isEmpty()) { + if (stackToAdd.getCount() > max) { + ItemStack newStack = stackToAdd.copy(); newStack.setCount(max); - addingStack.shrink(max); + stackToAdd.shrink(max); inventory.setItem(slot, newStack); } else { - inventory.setItem(slot, addingStack); + inventory.setItem(slot, stackToAdd); return ItemStack.EMPTY; } } else { - combineStacks(existingStack, addingStack, max); + combineStacks(slotStack, stackToAdd, max); } - return addingStack; + return stackToAdd; } - public static void combineStacks(ItemStack originalStack, ItemStack addingStack) { - combineStacks(originalStack, addingStack, originalStack.getMaxStackSize()); + public static void combineStacks(ItemStack originalStack, ItemStack stackToAdd) { + combineStacks(originalStack, stackToAdd, stackToAdd.getMaxStackSize()); } - public static void combineStacks(ItemStack originalStack, ItemStack addingStack, int max) { - if (ItemStack.isSameItemSameComponents(originalStack, addingStack)) { + private static void combineStacks(ItemStack originalStack, ItemStack stackToAdd, int max) { + if (ItemStack.isSameItemSameComponents(originalStack, stackToAdd)) { int leftOverAmountInExistingStack = max - originalStack.getCount(); if (leftOverAmountInExistingStack > 0) { - int addAmount = Math.min(leftOverAmountInExistingStack, addingStack.getCount()); + int addAmount = Math.min(leftOverAmountInExistingStack, stackToAdd.getCount()); originalStack.grow(addAmount); - addingStack.shrink(addAmount); + stackToAdd.shrink(addAmount); } } } @@ -175,12 +174,12 @@ public static void combineStacks(ItemStack originalStack, ItemStack addingStack, */ public static boolean addToInventory(Container inventory, ItemStack stackToAdd, int rangeStart, int rangeEnd) { for (int i = rangeStart; i < rangeEnd; i++) { - ItemStack currentStack = inventory.getItem(i); - if (currentStack.isEmpty()) { + ItemStack slotStack = inventory.getItem(i); + if (slotStack.isEmpty()) { inventory.setItem(i, stackToAdd); return true; } else if (stackToAdd.isStackable()) { - combineStacks(currentStack, stackToAdd, inventory.getMaxStackSize(currentStack)); + combineStacks(slotStack, stackToAdd, inventory.getMaxStackSize(stackToAdd)); if (stackToAdd.isEmpty()) { return true; } @@ -200,8 +199,8 @@ public static boolean addToInventory(Container inventory, ItemStack stackToAdd, */ public static boolean addToInventory(Container inventory, List stacksToAdd, int rangeStart, int rangeEnd) { for (int i = rangeStart; i < rangeEnd; i++) { - ItemStack inventoryStack = inventory.getItem(i); - if (inventoryStack.isEmpty()) { + ItemStack slotStack = inventory.getItem(i); + if (slotStack.isEmpty()) { inventory.setItem(i, stacksToAdd.getFirst()); stacksToAdd.removeFirst(); if (stacksToAdd.isEmpty()) { @@ -211,7 +210,7 @@ public static boolean addToInventory(Container inventory, List stacks for (int j = 0; j < stacksToAdd.size(); j++) { ItemStack stackToAdd = stacksToAdd.get(j); if (stackToAdd.isStackable()) { - combineStacks(inventoryStack, stackToAdd, inventory.getMaxStackSize(stackToAdd)); + combineStacks(slotStack, stackToAdd, inventory.getMaxStackSize(stackToAdd)); if (stackToAdd.isEmpty()) { stacksToAdd.remove(j); if (stacksToAdd.isEmpty()) { @@ -238,15 +237,15 @@ public static boolean hasIngredientStacksInInventory(List ingre requiredIngredientAmounts.add(ingredient.getCount()); } - for (int i = 0; i < inventory.getContainerSize(); i++) { + for (int slot = 0; slot < inventory.getContainerSize(); slot++) { if (ingredientsToFind.isEmpty()) { break; } - ItemStack currentStack = inventory.getItem(i); - if (!currentStack.isEmpty()) { - int amount = currentStack.getCount(); + ItemStack slotStack = inventory.getItem(slot); + if (!slotStack.isEmpty()) { + int amount = slotStack.getCount(); for (int j = 0; j < ingredientsToFind.size(); j++) { - if (ingredientsToFind.get(j).test(currentStack)) { + if (ingredientsToFind.get(j).test(slotStack)) { int ingredientCount = requiredIngredientAmounts.get(j); if (amount >= ingredientCount) { ingredientsToFind.remove(j); diff --git a/src/main/java/de/dafuqs/spectrum/helpers/LoreHelper.java b/src/main/java/de/dafuqs/spectrum/helpers/LoreHelper.java index 1bb8920e04..5c8484aba0 100644 --- a/src/main/java/de/dafuqs/spectrum/helpers/LoreHelper.java +++ b/src/main/java/de/dafuqs/spectrum/helpers/LoreHelper.java @@ -4,7 +4,7 @@ import net.minecraft.network.chat.*; import net.minecraft.world.item.*; import net.minecraft.world.item.component.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; @@ -44,13 +44,14 @@ public static void setLore(ItemStack itemStack, @Nullable List lore) } } - public static void setLore(ItemStack stack, @Nullable Component lore) { + public static ItemStack setLore(ItemStack stack, @Nullable Component lore) { if (lore == null) { stack.remove(DataComponents.LORE); } else { ItemLore component = new ItemLore(List.of(lore)); stack.set(DataComponents.LORE, component); } + return stack; } public static void removeLore(ItemStack itemStack) { diff --git a/src/main/java/de/dafuqs/spectrum/helpers/MobEffectHelper.java b/src/main/java/de/dafuqs/spectrum/helpers/MobEffectHelper.java index 4ce271ab78..b9d453871c 100644 --- a/src/main/java/de/dafuqs/spectrum/helpers/MobEffectHelper.java +++ b/src/main/java/de/dafuqs/spectrum/helpers/MobEffectHelper.java @@ -1,7 +1,6 @@ package de.dafuqs.spectrum.helpers; import de.dafuqs.spectrum.*; -import de.dafuqs.spectrum.api.energy.*; import de.dafuqs.spectrum.mixin.accessors.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.core.*; @@ -10,10 +9,10 @@ import net.minecraft.server.level.*; import net.minecraft.world.effect.*; import net.minecraft.world.entity.*; -import net.minecraft.world.level.Level; +import net.minecraft.world.level.*; import java.util.*; -import java.util.function.Predicate; +import java.util.function.*; public class MobEffectHelper { @@ -106,9 +105,9 @@ public ResourceLocation get(RenderType type) { private static final StatusEffectBackground NIGHT_ALCHEMY = new StatusEffectBackground("night_alchemy"); public static ResourceLocation getTextureLocation(ResourceLocation original, MobEffectInstance effect, RenderType renderType) { - var type = effect.getEffect(); + Holder type = effect.getEffect(); - if (type == SpectrumMobEffects.DIVINITY) + if (type.is(SpectrumMobEffects.DIVINITY)) return DIVINITY.get(renderType); if (type.is(SpectrumMobEffectTags.NIGHT_ALCHEMY)) diff --git a/src/main/java/de/dafuqs/spectrum/helpers/Orientation.java b/src/main/java/de/dafuqs/spectrum/helpers/Orientation.java index 8edac9f276..c7cb5eb646 100644 --- a/src/main/java/de/dafuqs/spectrum/helpers/Orientation.java +++ b/src/main/java/de/dafuqs/spectrum/helpers/Orientation.java @@ -40,7 +40,7 @@ public Orientation subtract(Orientation other) { } /** - * Phi my phucking phnuts + * Reference: http://www.vias.org/comp_geometry/math_coord_sphere.htm */ public static Orientation getVectorOrientation(Vec3 vector) { var r = vector.length(); diff --git a/src/main/java/de/dafuqs/spectrum/helpers/ParticleHelper.java b/src/main/java/de/dafuqs/spectrum/helpers/ParticleHelper.java index 225d2da5db..6ee8468936 100644 --- a/src/main/java/de/dafuqs/spectrum/helpers/ParticleHelper.java +++ b/src/main/java/de/dafuqs/spectrum/helpers/ParticleHelper.java @@ -6,7 +6,6 @@ import net.minecraft.world.level.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/helpers/RenderHelper.java b/src/main/java/de/dafuqs/spectrum/helpers/RenderHelper.java index cdea2c85ce..24bc1c2c31 100644 --- a/src/main/java/de/dafuqs/spectrum/helpers/RenderHelper.java +++ b/src/main/java/de/dafuqs/spectrum/helpers/RenderHelper.java @@ -13,7 +13,7 @@ public class RenderHelper { * Draws a filled triangle * Attention: The points specified have to be ordered in counter-clockwise order, or will now show up at all */ - public static void fillTriangle(PoseStack matrices, int p1x, int p1y, int p2x, int p2y, int p3x, int p3y, Vector3f color) { + public static void fillTriangle(PoseStack matrices, float p1x, float p1y, float p2x, float p2y, float p3x, float p3y, Vector3f color) { Matrix4f matrix = matrices.last().pose(); float red = color.x(); float green = color.y(); @@ -33,6 +33,7 @@ public static void fillTriangle(PoseStack matrices, int p1x, int p1y, int p2x, i /** * Draws a filled square + * The point at (x/y) is the top left */ public static void fillQuad(PoseStack matrices, int x, int y, int height, int width, Vector3f color) { Matrix4f matrix = matrices.last().pose(); diff --git a/src/main/java/de/dafuqs/spectrum/helpers/SchedulerMap.java b/src/main/java/de/dafuqs/spectrum/helpers/SchedulerMap.java index 51736a58f2..cab433e5d7 100644 --- a/src/main/java/de/dafuqs/spectrum/helpers/SchedulerMap.java +++ b/src/main/java/de/dafuqs/spectrum/helpers/SchedulerMap.java @@ -2,7 +2,6 @@ import com.mojang.datafixers.util.*; import com.mojang.serialization.*; -import javax.annotation.*; import java.util.*; @@ -53,8 +52,8 @@ public void tick() { if (next.getValue() >= 1) { next.setValue(next.getValue() - 1); } else { - if (key instanceof SchedulerMap.Callback) { - ((Callback) key).trigger(); + if (key instanceof SchedulerMap.Callback callback) { + callback.trigger(); } iterator.remove(); } diff --git a/src/main/java/de/dafuqs/spectrum/helpers/SpectrumColorHelper.java b/src/main/java/de/dafuqs/spectrum/helpers/SpectrumColorHelper.java index 262a1de397..b9a965419a 100644 --- a/src/main/java/de/dafuqs/spectrum/helpers/SpectrumColorHelper.java +++ b/src/main/java/de/dafuqs/spectrum/helpers/SpectrumColorHelper.java @@ -1,17 +1,16 @@ package de.dafuqs.spectrum.helpers; import com.mojang.serialization.*; -import de.dafuqs.spectrum.api.energy.color.*; import de.dafuqs.spectrum.items.*; +import de.dafuqs.spectrum.recipe.potion_workshop.*; import net.minecraft.util.*; import net.minecraft.world.item.*; -import javax.annotation.*; import org.joml.*; import java.awt.*; import java.lang.Math; -import java.util.List; import java.util.*; +import java.util.List; import java.util.regex.*; public class SpectrumColorHelper { @@ -101,4 +100,21 @@ public static int interpolate(Vector3f start, Vector3f end, float delta) { return (blendedRed & 255) << 16 | (blendedGreen & 255) << 8 | (blendedBlue & 255) | 0xFF000000; } + public static Optional blendColors(Optional first, Optional second) { + if(first.isEmpty()) { + return second; + } else if(second.isEmpty()) { + return first; + } + + int f = first.get(); + int s = second.get(); + + int r = FastColor.ARGB32.red(f) + FastColor.ARGB32.red(s); + int g = FastColor.ARGB32.green(f) + FastColor.ARGB32.green(s); + int b = FastColor.ARGB32.blue(f) + FastColor.ARGB32.blue(s); + + return Optional.of(FastColor.ARGB32.color(r / 2, g / 2, b / 2)); + } + } \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/helpers/SpectrumEnchantmentHelper.java b/src/main/java/de/dafuqs/spectrum/helpers/SpectrumEnchantmentHelper.java index 088bff06eb..ef52eea292 100644 --- a/src/main/java/de/dafuqs/spectrum/helpers/SpectrumEnchantmentHelper.java +++ b/src/main/java/de/dafuqs/spectrum/helpers/SpectrumEnchantmentHelper.java @@ -14,7 +14,7 @@ import net.minecraft.world.entity.player.*; import net.minecraft.world.item.*; import net.minecraft.world.item.enchantment.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; import java.util.concurrent.atomic.*; @@ -165,13 +165,17 @@ public static ItemStack getEnchantedStack(HolderLookup.Provider lookup, Item ite return stack; } - public static int getLevel(HolderLookup.Provider provider, ResourceKey enchantment, ItemStack stack) { + public static int getLevel(HolderLookup.@Nullable Provider provider, ResourceKey enchantment, ItemStack stack) { + if(provider == null) return 0; // TooltipContext.getRegistries() can be null - see https://github.com/DaFuqs/Spectrum/issues/960 + HolderLookup.RegistryLookup lookup = provider.lookup(Registries.ENCHANTMENT).get(); Optional> ench = lookup.get(enchantment); return ench.isEmpty() ? 0 : stack.getEnchantmentLevel(ench.get()); } - public static int getTagLevel(HolderLookup.Provider provider, ResourceKey enchantment, ItemStack stack) { + public static int getTagLevel(HolderLookup.@Nullable Provider provider, ResourceKey enchantment, ItemStack stack) { + if(provider == null) return 0; // TooltipContext.getRegistries() can be null - see https://github.com/DaFuqs/Spectrum/issues/960 + HolderLookup.RegistryLookup lookup = provider.lookup(Registries.ENCHANTMENT).get(); Optional> ench = lookup.get(enchantment); return ench.isEmpty() ? 0 : stack.getTagEnchantments().getLevel(ench.get()); @@ -214,4 +218,12 @@ public static boolean canEntityUse(@Nullable Entity entity, String idAsString) { } } + public static ItemStack getEnchantedBookStackWith(Holder enchant, int level) { + var enchStack = new ItemStack(Items.ENCHANTED_BOOK); + var builder = new ItemEnchantments.Mutable(ItemEnchantments.EMPTY); + builder.set(enchant, level); + enchStack.set(DataComponents.STORED_ENCHANTMENTS, builder.toImmutable()); + return enchStack; + } + } diff --git a/src/main/java/de/dafuqs/spectrum/helpers/Support.java b/src/main/java/de/dafuqs/spectrum/helpers/Support.java index 9dff05b35f..d15926d8ec 100644 --- a/src/main/java/de/dafuqs/spectrum/helpers/Support.java +++ b/src/main/java/de/dafuqs/spectrum/helpers/Support.java @@ -17,6 +17,7 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.*; import org.jetbrains.annotations.*; +import org.jspecify.annotations.*; import org.jspecify.annotations.Nullable; import java.math.*; @@ -220,7 +221,6 @@ public static Direction directionFromRotation(Rotation blockRotation) { } } - @Contract(pure = true) public static Rotation rotationFromDirection(Direction direction) { switch (direction) { case EAST -> { diff --git a/src/main/java/de/dafuqs/spectrum/helpers/TimeHelper.java b/src/main/java/de/dafuqs/spectrum/helpers/TimeHelper.java index 096e3a85ee..ff7e4054d0 100644 --- a/src/main/java/de/dafuqs/spectrum/helpers/TimeHelper.java +++ b/src/main/java/de/dafuqs/spectrum/helpers/TimeHelper.java @@ -2,7 +2,6 @@ import net.minecraft.util.*; import net.minecraft.world.level.*; -import javax.annotation.*; public class TimeHelper { diff --git a/src/main/java/de/dafuqs/spectrum/helpers/TooltipHelper.java b/src/main/java/de/dafuqs/spectrum/helpers/TooltipHelper.java index 20d04cb404..ec86a578ae 100644 --- a/src/main/java/de/dafuqs/spectrum/helpers/TooltipHelper.java +++ b/src/main/java/de/dafuqs/spectrum/helpers/TooltipHelper.java @@ -3,9 +3,11 @@ import com.google.common.collect.*; import com.mojang.datafixers.util.*; import net.minecraft.*; +import net.minecraft.client.*; +import net.minecraft.core.*; import net.minecraft.core.component.*; import net.minecraft.network.chat.*; -import net.minecraft.util.*; +import net.minecraft.world.effect.*; import net.minecraft.world.entity.ai.attributes.*; import net.minecraft.world.food.*; import net.minecraft.world.inventory.tooltip.*; @@ -16,25 +18,25 @@ public class TooltipHelper { - public static void addFoodComponentEffectTooltip(ItemStack stack, List> tooltip, float updateTickRate) { + public static void addFoodComponentEffectTooltip(Minecraft minecraft, ItemStack stack, List> tooltip, float updateTickRate) { FoodProperties foodComponent = stack.get(DataComponents.FOOD); if (foodComponent != null) { - buildEffectTooltipWithChance(tooltip, foodComponent.effects(), stack.getUseAnimation() == UseAnim.DRINK ? Component.translatable("spectrum.food.whenDrunk") : Component.translatable("spectrum.food.whenEaten"), updateTickRate); + buildEffectTooltipWithChance(minecraft, tooltip, foodComponent.effects(), stack.getUseAnimation() == UseAnim.DRINK ? Component.translatable("spectrum.food.whenDrunk") : Component.translatable("spectrum.food.whenEaten"), updateTickRate); } } - public static void buildEffectTooltipWithChance(List> tooltip, List entries, MutableComponent attributeModifierText, float updateTickRate) { + public static void buildEffectTooltipWithChance(Minecraft minecraft, List> tooltip, List entries, MutableComponent attributeModifierText, float updateTickRate) { if (entries.isEmpty()) { return; } List> modifiersList = Lists.newArrayList(); - for (var entry : entries) { - var statusEffectInstance = entry.effect(); - var chance = entry.probability(); + for (FoodProperties.PossibleEffect entry : entries) { + MobEffectInstance statusEffectInstance = entry.effect(); + float chance = entry.probability(); + MutableComponent translatableText = Component.translatable(statusEffectInstance.getDescriptionId()); + Holder statusEffect = statusEffectInstance.getEffect(); - var translatableText = Component.translatable(statusEffectInstance.getDescriptionId()); - var statusEffect = statusEffectInstance.getEffect(); statusEffect.value().createModifiers(statusEffectInstance.getAmplifier(), (attribute, modifier) -> modifiersList.add(new Pair<>(attribute.value(), modifier))); @@ -42,7 +44,7 @@ public static void buildEffectTooltipWithChance(List 20) { - translatableText = Component.translatable("potion.withDuration", translatableText, StringUtil.formatTickDuration(statusEffectInstance.getDuration(), updateTickRate)); + translatableText = Component.translatable("potion.withDuration", translatableText, MobEffectUtil.formatDuration(entry.effect(), 1.0F, minecraft.level.tickRateManager().tickrate())); } if (chance < 1.0F) { translatableText = Component.translatable("spectrum.food.withChance", translatableText, Math.round(chance * 100)); diff --git a/src/main/java/de/dafuqs/spectrum/helpers/VariantHelper.java b/src/main/java/de/dafuqs/spectrum/helpers/VariantHelper.java new file mode 100644 index 0000000000..56e4ec3393 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/helpers/VariantHelper.java @@ -0,0 +1,133 @@ +package de.dafuqs.spectrum.helpers; + +import de.dafuqs.spectrum.api.ink.color.*; +import de.dafuqs.spectrum.registries.*; +import net.minecraft.core.*; +import net.minecraft.core.registries.*; +import net.minecraft.resources.*; +import net.minecraft.world.item.*; +import net.minecraft.world.level.*; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.entity.*; +import net.minecraft.world.level.block.state.*; +import org.jspecify.annotations.*; + +import java.util.*; +import java.util.function.*; +import java.util.regex.*; + +public class VariantHelper { + + private static final Map> COLORED_STATE_CACHE = new HashMap<>(); + private static final Map> COLORED_ITEM_CACHE = new HashMap<>(); + private static final Map REPAIRED_STATE_CACHE = new HashMap<>(); + + public static @Nullable BlockState getColoredBlockState(Level world, BlockPos pos, InkColor newColor) { + if (world.getBlockEntity(pos) != null) { + return null; + } + + BlockState state = world.getBlockState(pos); + if (state.is(SpectrumBlockTags.COLORING_BLACKLISTED) || state.getDestroySpeed(world, pos) == -1) { + return null; + } + + Block block = state.getBlock(); + Block result = recolorRegistryObject(block, newColor, COLORED_STATE_CACHE, BuiltInRegistries.BLOCK::getKey, BuiltInRegistries.BLOCK::get, Blocks.AIR); + return result != null ? result.withPropertiesOf(state) : null; + } + + public static @Nullable Item getColoredItem(ItemStack stack, InkColor newColor) { + if (stack.is(SpectrumItemTags.COLORING_BLACKLISTED)) { + return null; + } + + Item item = stack.getItem(); + return recolorRegistryObject(item, newColor, COLORED_ITEM_CACHE, BuiltInRegistries.ITEM::getKey, BuiltInRegistries.ITEM::get, Items.AIR); + } + + public static @Nullable T recolorRegistryObject(T original, InkColor newColor, Map> cache, Function idGetter, Function lookup, T defaultToIgnore) { + Map colorMap = cache.computeIfAbsent(original, k -> new HashMap<>()); + + return colorMap.computeIfAbsent(newColor, color -> { + ResourceLocation id = idGetter.apply(original); + String path = id.getPath(); + + // Option 1: try replacing an existing color + // "red_concrete" -> "light_blue_concrete" + // "light_blue_planks" -> "orange_planks" + for (InkColor existingColor : SpectrumRegistries.INK_COLOR) { + String existing = existingColor.getID().getPath(); + + // Match the color as a complete "_" delimited component + String regex = "(^|_)" + Pattern.quote(existing) + "(_|$)"; + if (path.matches(".*" + regex + ".*")) { + String newPath = path.replaceFirst(regex, "$1" + Matcher.quoteReplacement(color.getID().getPath()) + "$2"); + ResourceLocation newId = ResourceLocation.fromNamespaceAndPath(id.getNamespace(), newPath); + T newObj = lookup.apply(newId); + if (newObj != defaultToIgnore && !newObj.equals(original)) { + return newObj; + } + break; + } + } + + // Option 2: prefix the color ("concrete" => "light_blue_concrete") + T newObj = lookup.apply(ResourceLocation.fromNamespaceAndPath(id.getNamespace(), color.getID().getPath() + "_" + path)); + if(newObj != defaultToIgnore && !newObj.equals(original)) { + return newObj; + } + + // Option 3: prefix the color + "_stained_" ("glass" => "red_stained_glass") + newObj = lookup.apply(ResourceLocation.fromNamespaceAndPath(id.getNamespace(), color.getID().getPath() + "_stained_" + path)); + return (newObj != defaultToIgnore && !newObj.equals(original)) ? newObj : null; + }); + } + + public static void invalidateCaches() { + COLORED_STATE_CACHE.clear(); + COLORED_ITEM_CACHE.clear(); + REPAIRED_STATE_CACHE.clear(); + } + + //TODO: unused + public static Block getRepairedBlockVariant(Level world, BlockPos blockPos) { + BlockEntity blockEntity = world.getBlockEntity(blockPos); + if (blockEntity != null) { + return Blocks.AIR; + } + + BlockState blockState = world.getBlockState(blockPos); + if (blockState.is(SpectrumBlockTags.COLORING_BLACKLISTED)) { + return Blocks.AIR; + } + + Block block = blockState.getBlock(); + + if (REPAIRED_STATE_CACHE.containsKey(block)) { + return REPAIRED_STATE_CACHE.get(block); + } + + ResourceLocation identifier = BuiltInRegistries.BLOCK.getKey(block); + + String newPath = identifier.getPath(); + newPath = newPath.replace("cracked_", ""); + newPath = newPath.replace("damaged_", ""); + newPath = newPath.replace("chipped_", ""); + + Block returnBlock = Blocks.AIR; + if (!newPath.equals(identifier.getPath())) { + ResourceLocation newIdentifier = ResourceLocation.fromNamespaceAndPath(identifier.getNamespace(), newPath); + Block newIdentifierBlock = BuiltInRegistries.BLOCK.get(newIdentifier); + if (newIdentifierBlock != block) { + returnBlock = newIdentifierBlock; + } + } + + // cache + REPAIRED_STATE_CACHE.put(block, returnBlock); + + return returnBlock; + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/helpers/enchantments/CloversFavorHelper.java b/src/main/java/de/dafuqs/spectrum/helpers/enchantments/CloversFavorHelper.java deleted file mode 100644 index 07633e3c47..0000000000 --- a/src/main/java/de/dafuqs/spectrum/helpers/enchantments/CloversFavorHelper.java +++ /dev/null @@ -1,20 +0,0 @@ -package de.dafuqs.spectrum.helpers.enchantments; - -import de.dafuqs.additionalentityattributes.*; -import net.minecraft.world.entity.*; -import net.minecraft.world.entity.player.*; -import org.jspecify.annotations.Nullable; - -public class CloversFavorHelper { - - public static float rollChance(float baseChance, @Nullable Entity entity) { - if (entity instanceof Player player) { - float rareLootLevel = (float) player.getAttributeValue(AdditionalEntityAttributes.BONUS_RARE_LOOT_ROLLS); - if (rareLootLevel > 0) { - return baseChance * rareLootLevel; - } - } - return 0; - } - -} diff --git a/src/main/java/de/dafuqs/spectrum/helpers/enchantments/FoundryHelper.java b/src/main/java/de/dafuqs/spectrum/helpers/enchantments/FoundryHelper.java index e24662e234..9513a19522 100644 --- a/src/main/java/de/dafuqs/spectrum/helpers/enchantments/FoundryHelper.java +++ b/src/main/java/de/dafuqs/spectrum/helpers/enchantments/FoundryHelper.java @@ -3,7 +3,6 @@ import net.minecraft.world.item.*; import net.minecraft.world.item.crafting.*; import net.minecraft.world.level.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/helpers/enchantments/InexorableHelper.java b/src/main/java/de/dafuqs/spectrum/helpers/enchantments/InexorableHelper.java index 5a783cc585..f5eb09d0ef 100644 --- a/src/main/java/de/dafuqs/spectrum/helpers/enchantments/InexorableHelper.java +++ b/src/main/java/de/dafuqs/spectrum/helpers/enchantments/InexorableHelper.java @@ -13,41 +13,31 @@ public static void checkAndRemoveSlowdownModifiers(LivingEntity entity) { var armorInexorable = isArmorActive(entity); var toolInexorable = SpectrumEnchantmentHelper.hasEnchantment(entity.level().registryAccess(), SpectrumEnchantmentKeys.INEXORABLE, entity.getItemInHand(entity.getUsedItemHand())); - var armorAttributes = BuiltInRegistries.ATTRIBUTE.getTag(SpectrumAttributeKeys.INEXORABLE_ARMOR_EFFECTIVE); - var toolAttributes = BuiltInRegistries.ATTRIBUTE.getTag(SpectrumAttributeKeys.INEXORABLE_HANDHELD_EFFECTIVE); + var armorAttributes = BuiltInRegistries.ATTRIBUTE.getTag(SpectrumEntityAttributeKeys.INEXORABLE_ARMOR_EFFECTIVE); + var toolAttributes = BuiltInRegistries.ATTRIBUTE.getTag(SpectrumEntityAttributeKeys.INEXORABLE_HANDHELD_EFFECTIVE); if (armorInexorable && armorAttributes.isPresent()) { - for (Holder attributeRegistryEntry : armorAttributes.get()) { - - var attributeInstance = entity.getAttribute(attributeRegistryEntry); - - if (attributeInstance == null) - continue; - - var badMods = attributeInstance.getModifiers() - .stream() - .filter(modifier -> modifier.amount() < 0) - .toList(); - - badMods.forEach(modifier -> attributeInstance.removeModifier(modifier.id())); - } + removeAttributes(entity, armorAttributes.get()); } if (toolInexorable && toolAttributes.isPresent()) { - for (Holder attributeRegistryEntry : toolAttributes.get()) { - + removeAttributes(entity, toolAttributes.get()); + } + } + + private static void removeAttributes(LivingEntity entity, HolderSet.Named entries) { + for (Holder attributeRegistryEntry : entries) { var attributeInstance = entity.getAttribute(attributeRegistryEntry); - if (attributeInstance == null) - continue; - - var badMods = attributeInstance.getModifiers() - .stream() - .filter(modifier -> modifier.amount() < 0) - .toList(); - - badMods.forEach(modifier -> attributeInstance.removeModifier(modifier.id())); - } + if (attributeInstance == null) + return; + + var badMods = attributeInstance.getModifiers() + .stream() + .filter(modifier -> modifier.amount() < 0) + .toList(); + + badMods.forEach(modifier -> attributeInstance.removeModifier(modifier.id())); } } diff --git a/src/main/java/de/dafuqs/spectrum/helpers/enchantments/package-info.java b/src/main/java/de/dafuqs/spectrum/helpers/enchantments/package-info.java index c82b78340f..44e6fe4d42 100644 --- a/src/main/java/de/dafuqs/spectrum/helpers/enchantments/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/helpers/enchantments/package-info.java @@ -3,6 +3,5 @@ @FieldsAreNonnullByDefault package de.dafuqs.spectrum.helpers.enchantments; -import net.minecraft.FieldsAreNonnullByDefault; -import net.minecraft.MethodsReturnNonnullByDefault; -import org.jspecify.annotations.NullMarked; +import net.minecraft.*; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/helpers/package-info.java b/src/main/java/de/dafuqs/spectrum/helpers/package-info.java index f9dd344d21..f4ea731752 100644 --- a/src/main/java/de/dafuqs/spectrum/helpers/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/helpers/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.helpers; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/injectors/package-info.java b/src/main/java/de/dafuqs/spectrum/injectors/package-info.java index 5278ca4b9b..b1f99f75ce 100644 --- a/src/main/java/de/dafuqs/spectrum/injectors/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/injectors/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.injectors; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/inventories/AutoCraftingMode.java b/src/main/java/de/dafuqs/spectrum/inventories/AutoCraftingMode.java index 00295da7d3..b0ee35f765 100644 --- a/src/main/java/de/dafuqs/spectrum/inventories/AutoCraftingMode.java +++ b/src/main/java/de/dafuqs/spectrum/inventories/AutoCraftingMode.java @@ -1,6 +1,5 @@ package de.dafuqs.spectrum.inventories; -import net.minecraft.resources.*; import net.minecraft.world.item.*; import net.minecraft.world.item.crafting.*; @@ -76,7 +75,7 @@ public boolean equals(Object obj) { } } - public static void clearCache() { + public static void invalidateCache() { CACHE.clear(); } diff --git a/src/main/java/de/dafuqs/spectrum/inventories/BagOfHoldingScreenHandler.java b/src/main/java/de/dafuqs/spectrum/inventories/BagOfHoldingScreenHandler.java index 19ca0ce9a4..5779eb30bb 100644 --- a/src/main/java/de/dafuqs/spectrum/inventories/BagOfHoldingScreenHandler.java +++ b/src/main/java/de/dafuqs/spectrum/inventories/BagOfHoldingScreenHandler.java @@ -5,7 +5,6 @@ import net.minecraft.world.entity.player.*; import net.minecraft.world.inventory.*; import net.minecraft.world.item.*; -import javax.annotation.*; public class BagOfHoldingScreenHandler extends ChestMenu { @@ -14,7 +13,7 @@ public BagOfHoldingScreenHandler(int syncId, Inventory playerInventory) { } public BagOfHoldingScreenHandler(int syncId, Inventory playerInventory, Container inventory) { - super(SpectrumScreenHandlerTypes.BAG_OF_HOLDING, syncId, playerInventory, inventory, 3); + super(SpectrumMenuTypes.BAG_OF_HOLDING, syncId, playerInventory, inventory, 3); } @Override diff --git a/src/main/java/de/dafuqs/spectrum/inventories/BaseInkScreen.java b/src/main/java/de/dafuqs/spectrum/inventories/BaseInkScreen.java new file mode 100644 index 0000000000..db7fd1ed49 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/inventories/BaseInkScreen.java @@ -0,0 +1,73 @@ +package de.dafuqs.spectrum.inventories; + +import de.dafuqs.spectrum.*; +import de.dafuqs.spectrum.api.ink.color.*; +import de.dafuqs.spectrum.blocks.ink.*; +import de.dafuqs.spectrum.helpers.*; +import de.dafuqs.spectrum.inventories.widgets.*; +import de.dafuqs.spectrum.networking.c2s_payloads.*; +import net.minecraft.client.gui.*; +import net.minecraft.client.gui.screens.inventory.*; +import net.minecraft.core.*; +import net.minecraft.network.chat.*; +import net.minecraft.resources.*; +import net.minecraft.world.entity.player.*; +import net.neoforged.neoforge.network.*; + +import java.util.*; +import java.util.function.*; + +public class BaseInkScreen extends AbstractContainerScreen implements Consumer>> { + + protected static final ResourceLocation DEFAULT_BACKGROUND = SpectrumCommon.locate("textures/gui/container/color_picker.png"); + + protected ColorSelectionWidget colorSelectionWidget; + protected final ResourceLocation background; + + public BaseInkScreen(T handler, Inventory playerInventory, Component title) { + this(handler, playerInventory, title, DEFAULT_BACKGROUND); + } + + public BaseInkScreen(T handler, Inventory playerInventory, Component title, ResourceLocation background) { + super(handler, playerInventory, title); + this.background = background; + this.imageHeight = 166; + } + + @Override + protected void renderLabels(GuiGraphics drawContext, int mouseX, int mouseY) { + int titleX = (imageWidth - font.width(title)) / 2; + int titleY = 6; + drawContext.drawString(this.font, this.title.getVisualOrderText(), titleX, titleY, RenderHelper.SPECTRUM_CONTAINER_TEXT_COLOR, false); + drawContext.drawString(this.font, this.playerInventoryTitle, BaseInkScreenHandler.PLAYER_INVENTORY_START_X, BaseInkScreenHandler.PLAYER_INVENTORY_START_Y - 10, RenderHelper.SPECTRUM_CONTAINER_TEXT_COLOR, false); + } + + @Override + protected void renderBg(GuiGraphics guiGraphics, float partialTick, int mouseX, int mouseY) { + guiGraphics.blit(background, getGuiLeft(), getGuiTop(), 0, 0, imageWidth, imageHeight); + } + + @Override + public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float delta) { + super.render(guiGraphics, mouseX, mouseY, delta); + guiGraphics.blit(background, getGuiLeft() + 52, getGuiTop() + 18, 176, 0, 46, 46); // gauge blanket + renderTooltip(guiGraphics, mouseX, mouseY); + } + + @Override + public void accept(Optional> inkColor) { + BaseInkBlockEntity inkBlockEntity = this.menu.getBlockEntity(); + inkBlockEntity.setSelectedColor(inkColor); + PacketDistributor.sendToServer(new InkColorSelectedC2SPayload(inkColor)); + } + + @Override + protected void renderTooltip(GuiGraphics guiGraphics, int x, int y) { + super.renderTooltip(guiGraphics, x, y); + + if (this.colorSelectionWidget.isMouseOver(x, y)) { + this.colorSelectionWidget.drawMouseoverTooltip(guiGraphics, x, y); + } + } + +} \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/inventories/BaseInkScreenHandler.java b/src/main/java/de/dafuqs/spectrum/inventories/BaseInkScreenHandler.java new file mode 100644 index 0000000000..796a9ed751 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/inventories/BaseInkScreenHandler.java @@ -0,0 +1,140 @@ +package de.dafuqs.spectrum.inventories; + +import de.dafuqs.spectrum.api.block.*; +import de.dafuqs.spectrum.api.ink.color.*; +import de.dafuqs.spectrum.blocks.ink.*; +import de.dafuqs.spectrum.inventories.slots.*; +import de.dafuqs.spectrum.networking.s2c_payloads.*; +import de.dafuqs.spectrum.registries.*; +import net.minecraft.core.*; +import net.minecraft.network.*; +import net.minecraft.network.codec.*; +import net.minecraft.server.level.*; +import net.minecraft.world.entity.player.*; +import net.minecraft.world.inventory.*; +import net.minecraft.world.item.*; +import net.minecraft.world.level.*; + +import javax.annotation.*; +import java.util.*; + +public abstract class BaseInkScreenHandler extends AbstractContainerMenu implements InkColorSelectedPacketReceiver { + + public record ScreenOpeningData(BlockPos pos, Optional> inkColor) { + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + BlockPos.STREAM_CODEC, ScreenOpeningData::pos, + ByteBufCodecs.optional(ByteBufCodecs.holderRegistry(SpectrumRegistryKeys.INK_COLOR)), ScreenOpeningData::inkColor, + ScreenOpeningData::new + ); + } + + public static final int PLAYER_INVENTORY_START_X = 8; + public static final int PLAYER_INVENTORY_START_Y = 84; + + protected final Level world; + public final @Nullable ServerPlayer serverPlayer; + protected BaseInkBlockEntity blockEntity; + protected int inventorySize; + + // clientside + public BaseInkScreenHandler(int syncId, Inventory playerInventory, RegistryFriendlyByteBuf buf) { + this(SpectrumMenuTypes.INK_STORAGE, syncId, playerInventory, ScreenOpeningData.STREAM_CODEC.decode(buf), 1); + } + + protected BaseInkScreenHandler(@Nullable MenuType menuType, int syncId, Inventory playerInventory, ScreenOpeningData screenOpeningData, int inventorySize) { + this(menuType, syncId, playerInventory, (BaseInkBlockEntity) playerInventory.player.level().getBlockEntity(screenOpeningData.pos()), screenOpeningData.inkColor, inventorySize); + } + + // serverside + public BaseInkScreenHandler(int syncId, Inventory playerInventory, BaseInkBlockEntity blockEntity, Optional> selectedColor) { + this(SpectrumMenuTypes.INK_STORAGE, syncId, playerInventory, blockEntity, selectedColor, 1); + } + + protected BaseInkScreenHandler(@Nullable MenuType menuType, int syncId, Inventory playerInventory, BaseInkBlockEntity blockEntity, Optional> selectedColor, int inventorySize) { + super(menuType, syncId); + + this.inventorySize = inventorySize; + this.blockEntity = blockEntity; + this.blockEntity.setSelectedColor(selectedColor); + this.serverPlayer = playerInventory.player instanceof ServerPlayer serverPlayerEntity ? serverPlayerEntity : null; + this.world = playerInventory.player.level(); + + checkContainerSize(blockEntity, inventorySize); + blockEntity.startOpen(playerInventory.player); + + addBlockEntitySlots(); + + // player inventory + for (int j = 0; j < 3; ++j) { + for (int k = 0; k < 9; ++k) { + this.addSlot(new Slot(playerInventory, k + j * 9 + 9, PLAYER_INVENTORY_START_X + k * 18, PLAYER_INVENTORY_START_Y + j * 18)); + } + } + + // player hotbar + for (int j = 0; j < 9; ++j) { + this.addSlot(new Slot(playerInventory, j, PLAYER_INVENTORY_START_X + j * 18, PLAYER_INVENTORY_START_Y + 58)); + } + + if (this.serverPlayer != null) { + UpdateBlockEntityInkPayload.updateBlockEntityInk(blockEntity.getBlockPos(), this.blockEntity.getInkStorage(), serverPlayer); + } + } + + public abstract void addBlockEntitySlots(); + + public BaseInkBlockEntity getBlockEntity() { + return this.blockEntity; + } + + @Override + public boolean stillValid(Player player) { + return this.blockEntity.stillValid(player); + } + + @Override + public void removed(Player player) { + super.removed(player); + this.blockEntity.stopOpen(player); + } + + @Override + public ItemStack quickMoveStack(Player player, int index) { + ItemStack itemStack = ItemStack.EMPTY; + Slot slot = this.slots.get(index); + if (slot.hasItem()) { + ItemStack slotStack = slot.getItem(); + itemStack = slotStack.copy(); + if (index < inventorySize) { + if (!this.moveItemStackTo(slotStack, inventorySize, this.slots.size(), true)) { + return ItemStack.EMPTY; + } + } else if (!this.moveItemStackTo(slotStack, 0, inventorySize, false)) { + return ItemStack.EMPTY; + } + + if (slotStack.isEmpty()) { + slot.setByPlayer(ItemStack.EMPTY); + } else { + slot.setChanged(); + } + } + + return itemStack; + } + + @Override + public void broadcastChanges() { + super.broadcastChanges(); + + if (this.serverPlayer != null && this.blockEntity.getInkDirty()) { + UpdateBlockEntityInkPayload.updateBlockEntityInk(blockEntity.getBlockPos(), blockEntity.getInkStorage(), serverPlayer); + } + } + + @Override + public void onInkColorSelectedPacket(Optional> inkColor) { + this.blockEntity.setSelectedColor(inkColor); + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/inventories/BedrockAnvilScreen.java b/src/main/java/de/dafuqs/spectrum/inventories/BedrockAnvilScreen.java index 24230cc3a1..e0a26e0e05 100644 --- a/src/main/java/de/dafuqs/spectrum/inventories/BedrockAnvilScreen.java +++ b/src/main/java/de/dafuqs/spectrum/inventories/BedrockAnvilScreen.java @@ -15,7 +15,6 @@ import net.minecraft.world.entity.player.*; import net.minecraft.world.inventory.*; import net.minecraft.world.item.*; -import net.neoforged.api.distmarker.*; import net.neoforged.neoforge.network.*; import org.lwjgl.glfw.*; @@ -39,10 +38,7 @@ public BedrockAnvilScreen(BedrockAnvilScreenHandler handler, Inventory inventory @Override protected void subInit() { - int i = (this.width - this.imageWidth) / 2; - int j = (this.height - this.imageHeight) / 2; - - this.nameField = new EditBox(this.font, i + 62, j + 24, 98, 12, Component.translatable("container.spectrum.bedrock_anvil")); + this.nameField = new EditBox(this.font, getGuiLeft() + 62, getGuiTop() + 24, 98, 12, Component.translatable("container.spectrum.bedrock_anvil")); this.nameField.setTextColor(-1); this.nameField.setTextColorUneditable(-1); this.nameField.setBordered(false); @@ -52,7 +48,7 @@ protected void subInit() { this.addWidget(this.nameField); this.nameField.setEditable((this.menu).getSlot(0).hasItem()); - this.loreField = new EditBox(this.font, i + 45, j + 76, 116, 12, Component.translatable("container.spectrum.bedrock_anvil.lore")); + this.loreField = new EditBox(this.font, getGuiLeft() + 45, getGuiTop() + 76, 116, 12, Component.translatable("container.spectrum.bedrock_anvil.lore")); this.loreField.setTextColor(-1); this.loreField.setTextColorUneditable(-1); this.loreField.setBordered(false); @@ -200,7 +196,7 @@ public void slotChanged(AbstractContainerMenu handler, int slotId, ItemStack sta } if (slotId == 1) { if (stack.getItem() instanceof PigmentItem pigmentItem) { - this.nameField.setTextColor(pigmentItem.getInkColor().getColorInt()); + this.nameField.setTextColor(pigmentItem.getInkColor().getColorRGB()); } else { if (this.menu.getSlot(0).getItem().getHoverName() instanceof MutableComponent mutableText) { if (mutableText.getStyle().getColor() == null) { diff --git a/src/main/java/de/dafuqs/spectrum/inventories/BedrockAnvilScreenHandler.java b/src/main/java/de/dafuqs/spectrum/inventories/BedrockAnvilScreenHandler.java index ef3cbb0b57..bba64610f4 100644 --- a/src/main/java/de/dafuqs/spectrum/inventories/BedrockAnvilScreenHandler.java +++ b/src/main/java/de/dafuqs/spectrum/inventories/BedrockAnvilScreenHandler.java @@ -38,7 +38,7 @@ public BedrockAnvilScreenHandler(int syncId, Inventory inventory) { } public BedrockAnvilScreenHandler(int syncId, Inventory inventory, ContainerLevelAccess context) { - super(SpectrumScreenHandlerTypes.BEDROCK_ANVIL, syncId, inventory, context); + super(SpectrumMenuTypes.BEDROCK_ANVIL, syncId, inventory, context); this.levelCost = DataSlot.standalone(); this.addDataSlot(this.levelCost); } @@ -117,7 +117,8 @@ public void createResult() { ItemEnchantments.Mutable builder = new ItemEnchantments.Mutable(EnchantmentHelper.getEnchantmentsForCrafting(outputStack)); repairLevelCost += (long) inputStack.getOrDefault(DataComponents.REPAIR_COST, 0) + (long) repairSlotStack.getOrDefault(DataComponents.REPAIR_COST, 0); this.repairItemCount = 0; - boolean pigmentInRepairSlot = repairSlotStack.getItem() instanceof PigmentItem; + PigmentItem pigment = repairSlotStack.getItem() instanceof PigmentItem pigmentItem ? pigmentItem : null; + boolean pigmentInRepairSlot = pigment != null; if (pigmentInRepairSlot) { repairItemCount = 1; } @@ -229,7 +230,7 @@ public void createResult() { } if (pigmentInRepairSlot) { - int newColor = ((PigmentItem) repairSlotStack.getItem()).getInkColor().getColorInt(); + int newColor = pigment.getInkColor().getColorRGB(); newName = newName.setStyle(newName.getStyle().withColor(newColor)); outputStack.set(DataComponents.CUSTOM_NAME, newName); } else if(this.newItemName.equals(inputStack.getHoverName().getString())) { diff --git a/src/main/java/de/dafuqs/spectrum/inventories/BlackHoleChestScreenHandler.java b/src/main/java/de/dafuqs/spectrum/inventories/BlackHoleChestScreenHandler.java index f90dfa4ec2..58598b6974 100644 --- a/src/main/java/de/dafuqs/spectrum/inventories/BlackHoleChestScreenHandler.java +++ b/src/main/java/de/dafuqs/spectrum/inventories/BlackHoleChestScreenHandler.java @@ -22,7 +22,7 @@ public class BlackHoleChestScreenHandler extends AbstractContainerMenu { // clientside public BlackHoleChestScreenHandler(int syncId, Inventory playerInventory, RegistryFriendlyByteBuf buf) { - this(syncId, playerInventory, FilterConfigurable.ExtendedDataWithPos.PACKET_CODEC.decode(buf)); + this(syncId, playerInventory, FilterConfigurable.ExtendedDataWithPos.STREAM_CODEC.decode(buf)); } protected BlackHoleChestScreenHandler(int syncId, Inventory playerInventory, FilterConfigurable.ExtendedDataWithPos data) { @@ -31,7 +31,7 @@ protected BlackHoleChestScreenHandler(int syncId, Inventory playerInventory, Fil // serverside public BlackHoleChestScreenHandler(int syncId, Inventory playerInventory, BlackHoleChestBlockEntity blockEntity, FilterConfigurable.ExtendedDataWithPos data) { - super(SpectrumScreenHandlerTypes.BLACK_HOLE_CHEST, syncId); + super(SpectrumMenuTypes.BLACK_HOLE_CHEST, syncId); this.world = playerInventory.player.level(); this.filterInventory = FilterConfigurable.getFilterInventoryFromExtendedData(syncId, playerInventory, data.data(), this); this.blockEntity = blockEntity; diff --git a/src/main/java/de/dafuqs/spectrum/inventories/CinderhearthScreen.java b/src/main/java/de/dafuqs/spectrum/inventories/CinderhearthScreen.java index 5878dc09ed..867bb1e0c3 100644 --- a/src/main/java/de/dafuqs/spectrum/inventories/CinderhearthScreen.java +++ b/src/main/java/de/dafuqs/spectrum/inventories/CinderhearthScreen.java @@ -1,21 +1,23 @@ package de.dafuqs.spectrum.inventories; import de.dafuqs.spectrum.*; -import de.dafuqs.spectrum.api.energy.color.*; -import de.dafuqs.spectrum.blocks.cinderhearth.*; +import de.dafuqs.spectrum.api.ink.capability.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.helpers.*; -import de.dafuqs.spectrum.inventories.widgets.*; +import de.dafuqs.spectrum.inventories.widgets.ink.*; import net.minecraft.client.gui.*; import net.minecraft.client.gui.screens.inventory.*; import net.minecraft.network.chat.*; import net.minecraft.resources.*; import net.minecraft.world.entity.player.*; +import java.util.*; + public class CinderhearthScreen extends AbstractContainerScreen { protected final ResourceLocation BACKGROUND = SpectrumCommon.locate("textures/gui/container/cinderhearth.png"); - protected InkMeterWidget inkMeterWidget; + protected InkListWidget inkListWidget; public CinderhearthScreen(CinderhearthScreenHandler handler, Inventory playerInventory, Component title) { super(handler, playerInventory, title); @@ -25,11 +27,10 @@ public CinderhearthScreen(CinderhearthScreenHandler handler, Inventory playerInv @Override protected void init() { super.init(); - - int startX = (this.width - this.imageWidth) / 2; - int startY = (this.height - this.imageHeight) / 2; - - this.inkMeterWidget = new InkMeterWidget(startX + 140, startY + 34, 40, this, this.menu.getBlockEntity()); + this.inkListWidget = new InkListWidget(getGuiLeft() + 140, getGuiTop() + 34, + () -> menu.getBlockEntity().getLevel().getCapability(InkCapabilities.BLOCK, menu.getBlockEntity().getBlockPos()), + List.of(InkColors.ORANGE, InkColors.MAGENTA, InkColors.LIGHT_BLUE, InkColors.PURPLE, InkColors.BLACK)); + addRenderableWidget(inkListWidget); } @Override @@ -40,32 +41,27 @@ protected void renderLabels(GuiGraphics drawContext, int mouseX, int mouseY) { Component title = this.title; drawContext.drawString(this.font, title, titleX, titleY, RenderHelper.SPECTRUM_CONTAINER_TEXT_COLOR, false); - drawContext.drawString(this.font, this.playerInventoryTitle, ColorPickerScreenHandler.PLAYER_INVENTORY_START_X, ColorPickerScreenHandler.PLAYER_INVENTORY_START_Y - 10, RenderHelper.SPECTRUM_CONTAINER_TEXT_COLOR, false); + drawContext.drawString(this.font, this.playerInventoryTitle, BaseInkScreenHandler.PLAYER_INVENTORY_START_X, BaseInkScreenHandler.PLAYER_INVENTORY_START_Y - 10, RenderHelper.SPECTRUM_CONTAINER_TEXT_COLOR, false); } @Override - protected void renderBg(GuiGraphics drawContext, float delta, int mouseX, int mouseY) { - int startX = (this.width - this.imageWidth) / 2; - int startY = (this.height - this.imageHeight) / 2; - + protected void renderBg(GuiGraphics guiGraphics, float partialTick, int mouseX, int mouseY) { // main background - drawContext.blit(BACKGROUND, startX, startY, 0, 0, imageWidth, imageHeight); - - this.inkMeterWidget.draw(drawContext, CinderhearthBlockEntity.USED_INK_COLORS); + guiGraphics.blit(BACKGROUND, getGuiLeft(), getGuiTop(), 0, 0, imageWidth, imageHeight); int craftingTime = this.menu.getCraftingTime(); int craftingTimeTotal = this.menu.getCraftingTimeTotal(); - if (this.menu.getBlockEntity().getEnergyStorage().getEnergy(InkColors.ORANGE) > 0) { - drawContext.blit(BACKGROUND, this.leftPos + 14, this.topPos + 62, 176, 14, 15, 2); + if (this.menu.getBlockEntity().getInkStorage().getEnergy(InkColors.ORANGE) > 0) { + guiGraphics.blit(BACKGROUND, this.leftPos + 14, this.topPos + 62, 176, 14, 15, 2); } if (craftingTimeTotal > 0) { // the fire - drawContext.blit(BACKGROUND, this.leftPos + 15, this.topPos + 48, 176, 0, 14, 14); + guiGraphics.blit(BACKGROUND, this.leftPos + 15, this.topPos + 48, 176, 0, 14, 14); // the arrow - drawContext.blit(BACKGROUND, this.leftPos + 35, this.topPos + 32, 176, 16, (craftingTime * 22) / craftingTimeTotal, 16); + guiGraphics.blit(BACKGROUND, this.leftPos + 35, this.topPos + 32, 176, 16, (craftingTime * 22) / craftingTimeTotal, 16); } } @@ -79,10 +75,10 @@ public void render(GuiGraphics drawContext, int mouseX, int mouseY, float delta) @Override protected void renderTooltip(GuiGraphics drawContext, int x, int y) { - if (this.inkMeterWidget.isMouseOver(x, y)) { - this.inkMeterWidget.drawMouseoverTooltip(drawContext, x, y); - } else { - super.renderTooltip(drawContext, x, y); + super.renderTooltip(drawContext, x, y); + + if (this.inkListWidget.isHoveredOrFocused()) { + drawContext.renderTooltip(this.font, this.inkListWidget.getTooltip().toCharSequence(this.minecraft), x, y); } } diff --git a/src/main/java/de/dafuqs/spectrum/inventories/CinderhearthScreenHandler.java b/src/main/java/de/dafuqs/spectrum/inventories/CinderhearthScreenHandler.java index 3cee16579e..3c43e6b2e0 100644 --- a/src/main/java/de/dafuqs/spectrum/inventories/CinderhearthScreenHandler.java +++ b/src/main/java/de/dafuqs/spectrum/inventories/CinderhearthScreenHandler.java @@ -1,6 +1,6 @@ package de.dafuqs.spectrum.inventories; -import de.dafuqs.spectrum.blocks.cinderhearth.*; +import de.dafuqs.spectrum.blocks.ink.sink.*; import de.dafuqs.spectrum.inventories.slots.*; import de.dafuqs.spectrum.networking.s2c_payloads.*; import de.dafuqs.spectrum.registries.*; @@ -11,7 +11,7 @@ import net.minecraft.world.inventory.*; import net.minecraft.world.item.*; import net.minecraft.world.level.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class CinderhearthScreenHandler extends AbstractContainerMenu { @@ -31,7 +31,7 @@ public CinderhearthScreenHandler(int syncId, Inventory playerInventory, Registry // serverside public CinderhearthScreenHandler(int syncId, Inventory playerInventory, CinderhearthBlockEntity blockEntity, ContainerData propertyDelegate) { - super(SpectrumScreenHandlerTypes.CINDERHEARTH, syncId); + super(SpectrumMenuTypes.CINDERHEARTH, syncId); this.player = playerInventory.player instanceof ServerPlayer serverPlayerEntity ? serverPlayerEntity : null; this.world = playerInventory.player.level(); @@ -65,7 +65,7 @@ public CinderhearthScreenHandler(int syncId, Inventory playerInventory, Cinderhe } if (this.player != null) { - UpdateBlockEntityInkPayload.updateBlockEntityInk(blockEntity.getBlockPos(), this.blockEntity.getEnergyStorage(), player); + UpdateBlockEntityInkPayload.updateBlockEntityInk(blockEntity.getBlockPos(), this.blockEntity.getInkStorage(), player); } this.addDataSlots(propertyDelegate); @@ -124,7 +124,7 @@ public void broadcastChanges() { super.broadcastChanges(); if (this.player != null && this.blockEntity.getInkDirty()) { - UpdateBlockEntityInkPayload.updateBlockEntityInk(blockEntity.getBlockPos(), blockEntity.getEnergyStorage(), player); + UpdateBlockEntityInkPayload.updateBlockEntityInk(blockEntity.getBlockPos(), blockEntity.getInkStorage(), player); } } diff --git a/src/main/java/de/dafuqs/spectrum/inventories/ColorPickerScreen.java b/src/main/java/de/dafuqs/spectrum/inventories/ColorPickerScreen.java index 25b4d9ee75..d4f35a8785 100644 --- a/src/main/java/de/dafuqs/spectrum/inventories/ColorPickerScreen.java +++ b/src/main/java/de/dafuqs/spectrum/inventories/ColorPickerScreen.java @@ -1,31 +1,22 @@ package de.dafuqs.spectrum.inventories; import de.dafuqs.spectrum.*; -import de.dafuqs.spectrum.api.energy.color.*; -import de.dafuqs.spectrum.blocks.energy.*; -import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.inventories.widgets.*; -import de.dafuqs.spectrum.networking.c2s_payloads.*; +import de.dafuqs.spectrum.inventories.widgets.ink.*; import net.minecraft.client.gui.*; -import net.minecraft.client.gui.screens.inventory.*; -import net.minecraft.core.*; import net.minecraft.network.chat.*; import net.minecraft.resources.*; import net.minecraft.world.entity.player.*; -import net.neoforged.neoforge.network.*; -import java.util.*; -import java.util.function.*; - -public class ColorPickerScreen extends AbstractContainerScreen implements Consumer>> { +public class ColorPickerScreen extends BaseInkScreen { + + protected static final ResourceLocation BACKGROUND = SpectrumCommon.locate("textures/gui/container/color_picker.png"); - protected final ResourceLocation BACKGROUND = SpectrumCommon.locate("textures/gui/container/color_picker.png"); - protected ColorSelectionWidget colorSelectionWidget; - protected InkGaugeWidget inkGaugeWidget; - protected StackedInkMeterWidget inkMeterWidget; + protected StackedInkBarWidget stackedInkBarWidget; + protected InkPieWidget inkPieWidget; public ColorPickerScreen(ColorPickerScreenHandler handler, Inventory playerInventory, Component title) { - super(handler, playerInventory, title); + super(handler, playerInventory, title, BACKGROUND); this.imageHeight = 166; } @@ -33,70 +24,26 @@ public ColorPickerScreen(ColorPickerScreenHandler handler, Inventory playerInven protected void init() { super.init(); - int startX = (this.width - this.imageWidth) / 2; - int startY = (this.height - this.imageHeight) / 2; - - this.colorSelectionWidget = new ColorSelectionWidget(startX + 113, startY + 55, startX + 139, startY + 25, this, this.menu.getBlockEntity()); - this.inkGaugeWidget = new InkGaugeWidget(startX + 54, startY + 21, 42, 42, this, this.menu.getBlockEntity()); - this.inkMeterWidget = new StackedInkMeterWidget(startX + 100, startY + 21, 4, 40, this, this.menu.getBlockEntity()); - + this.colorSelectionWidget = new ColorSelectionWidget(getGuiLeft() + 113, getGuiTop() + 55, getGuiLeft() + 139, getGuiTop() + 25, this.menu.getBlockEntity()); this.colorSelectionWidget.setChangedListener(this); + addRenderableWidget(this.colorSelectionWidget); - addWidget(this.colorSelectionWidget); - } - - @Override - protected void renderLabels(GuiGraphics drawContext, int mouseX, int mouseY) { - // draw "title" and "inventory" texts - int titleX = (imageWidth - font.width(title)) / 2; - int titleY = 6; - Component title = this.title; - - drawContext.drawString(this.font, title.getVisualOrderText(), titleX, titleY, RenderHelper.SPECTRUM_CONTAINER_TEXT_COLOR, false); - drawContext.drawString(this.font, this.playerInventoryTitle, ColorPickerScreenHandler.PLAYER_INVENTORY_START_X, ColorPickerScreenHandler.PLAYER_INVENTORY_START_Y - 10, RenderHelper.SPECTRUM_CONTAINER_TEXT_COLOR, false); + this.inkPieWidget = new InkPieWidget(getGuiLeft() + 54, getGuiTop() + 20, () -> menu.getBlockEntity().getInkCapability()); + addRenderableWidget(this.inkPieWidget); + this.stackedInkBarWidget = new StackedInkBarWidget(getGuiLeft() + 99, getGuiTop() + 20, () -> this.menu.getBlockEntity().getInkCapability()); + addRenderableWidget(stackedInkBarWidget); } @Override - protected void renderBg(GuiGraphics drawContext, float delta, int mouseX, int mouseY) { - int startX = (this.width - this.imageWidth) / 2; - int startY = (this.height - this.imageHeight) / 2; - - // main background - drawContext.blit(BACKGROUND, startX, startY, 0, 0, imageWidth, imageHeight); - - this.inkGaugeWidget.draw(drawContext); - this.inkMeterWidget.draw(drawContext); - this.colorSelectionWidget.render(drawContext, mouseX, mouseY, delta); + protected void renderTooltip(GuiGraphics guiGraphics, int x, int y) { + super.renderTooltip(guiGraphics, x, y); - // gauge blanket - drawContext.blit(BACKGROUND, startX + 52, startY + 18, 176, 0, 46, 46); - } - - @Override - public void render(GuiGraphics drawContext, int mouseX, int mouseY, float delta) { - renderBackground(drawContext, mouseX, mouseY, delta); - super.render(drawContext, mouseX, mouseY, delta); - renderTooltip(drawContext, mouseX, mouseY); - } - - @Override - protected void renderTooltip(GuiGraphics drawContext, int x, int y) { - if (this.inkGaugeWidget.isMouseOver(x, y)) { - this.inkGaugeWidget.drawMouseoverTooltip(drawContext, x, y); - } else if (this.inkMeterWidget.isMouseOver(x, y)) { - this.inkMeterWidget.drawMouseoverTooltip(drawContext, x, y); - } else if (this.colorSelectionWidget.isMouseOver(x, y)) { - this.colorSelectionWidget.drawMouseoverTooltip(drawContext, x, y); - } else { - super.renderTooltip(drawContext, x, y); + if (this.inkPieWidget.isHoveredOrFocused()) { + guiGraphics.renderTooltip(this.font, this.inkPieWidget.getTooltip().toCharSequence(this.minecraft), x, y); + } + if (this.stackedInkBarWidget.isHoveredOrFocused()) { + guiGraphics.renderTooltip(this.font, this.stackedInkBarWidget.getTooltip().toCharSequence(this.minecraft), x, y); } - } - - @Override - public void accept(Optional> inkColor) { - ColorPickerBlockEntity colorPicker = this.menu.getBlockEntity(); - colorPicker.setSelectedColor(inkColor); - PacketDistributor.sendToServer(new InkColorSelectedC2SPayload(inkColor)); } } \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/inventories/ColorPickerScreenHandler.java b/src/main/java/de/dafuqs/spectrum/inventories/ColorPickerScreenHandler.java index a9b0de3358..0466d6bbaf 100644 --- a/src/main/java/de/dafuqs/spectrum/inventories/ColorPickerScreenHandler.java +++ b/src/main/java/de/dafuqs/spectrum/inventories/ColorPickerScreenHandler.java @@ -1,136 +1,31 @@ package de.dafuqs.spectrum.inventories; -import de.dafuqs.spectrum.api.block.*; -import de.dafuqs.spectrum.api.energy.color.*; -import de.dafuqs.spectrum.blocks.energy.*; +import de.dafuqs.spectrum.api.ink.color.*; +import de.dafuqs.spectrum.blocks.ink.*; +import de.dafuqs.spectrum.blocks.ink.gen.*; import de.dafuqs.spectrum.inventories.slots.*; -import de.dafuqs.spectrum.networking.s2c_payloads.*; -import de.dafuqs.spectrum.registries.*; import net.minecraft.core.*; import net.minecraft.network.*; -import net.minecraft.network.codec.*; -import net.minecraft.server.level.*; import net.minecraft.world.entity.player.*; -import net.minecraft.world.inventory.*; -import net.minecraft.world.item.*; -import net.minecraft.world.level.*; -import org.jspecify.annotations.Nullable; import java.util.*; -public class ColorPickerScreenHandler extends AbstractContainerMenu implements InkColorSelectedPacketReceiver { - - public record ScreenOpeningData(BlockPos pos, Optional> inkColor) { - public static final StreamCodec PACKET_CODEC = StreamCodec.composite( - BlockPos.STREAM_CODEC, ScreenOpeningData::pos, - ByteBufCodecs.optional(ByteBufCodecs.holderRegistry(SpectrumRegistryKeys.INK_COLOR)), ScreenOpeningData::inkColor, - ScreenOpeningData::new - ); - } - - public static final int PLAYER_INVENTORY_START_X = 8; - public static final int PLAYER_INVENTORY_START_Y = 84; - - protected final Level world; - public final @Nullable ServerPlayer player; - protected ColorPickerBlockEntity blockEntity; +public class ColorPickerScreenHandler extends BaseInkScreenHandler { // clientside public ColorPickerScreenHandler(int syncId, Inventory playerInventory, RegistryFriendlyByteBuf buf) { - this(syncId, playerInventory, ScreenOpeningData.PACKET_CODEC.decode(buf)); - } - - private ColorPickerScreenHandler(int syncId, Inventory playerInventory, ScreenOpeningData screenOpeningData) { - this(syncId, playerInventory, playerInventory.player.level().getBlockEntity(screenOpeningData.pos(), SpectrumBlockEntities.COLOR_PICKER.get()).orElseThrow(), screenOpeningData.inkColor()); + super(SpectrumMenuTypes.COLOR_PICKER, syncId, playerInventory, ScreenOpeningData.STREAM_CODEC.decode(buf), 2); } // serverside - public ColorPickerScreenHandler(int syncId, Inventory playerInventory, ColorPickerBlockEntity blockEntity, Optional> selectedColor) { - super(SpectrumScreenHandlerTypes.COLOR_PICKER, syncId); - - this.player = playerInventory.player instanceof ServerPlayer serverPlayerEntity ? serverPlayerEntity : null; - this.world = playerInventory.player.level(); - this.blockEntity = blockEntity; - - this.blockEntity.setSelectedColor(selectedColor); - - checkContainerSize(blockEntity, ColorPickerBlockEntity.INVENTORY_SIZE); - blockEntity.startOpen(playerInventory.player); - - // color picker slots - this.addSlot(new ColorPickerInputSlot(blockEntity, 0, 26, 33)); - this.addSlot(new InkStorageSlot(blockEntity, 1, 133, 33)); - - // player inventory - for (int j = 0; j < 3; ++j) { - for (int k = 0; k < 9; ++k) { - this.addSlot(new Slot(playerInventory, k + j * 9 + 9, PLAYER_INVENTORY_START_X + k * 18, PLAYER_INVENTORY_START_Y + j * 18)); - } - } - - // player hotbar - for (int j = 0; j < 9; ++j) { - this.addSlot(new Slot(playerInventory, j, PLAYER_INVENTORY_START_X + j * 18, PLAYER_INVENTORY_START_Y + 58)); - } - - if (this.player != null) { - UpdateBlockEntityInkPayload.updateBlockEntityInk(blockEntity.getBlockPos(), this.blockEntity.getEnergyStorage(), player); - } - } - - @Override - public ColorPickerBlockEntity getBlockEntity() { - return this.blockEntity; - } - - @Override - public boolean stillValid(Player player) { - return this.blockEntity.stillValid(player); - } - - @Override - public void removed(Player player) { - super.removed(player); - this.blockEntity.stopOpen(player); - } - - @Override - public ItemStack quickMoveStack(Player player, int index) { - ItemStack itemStack = ItemStack.EMPTY; - Slot slot = this.slots.get(index); - if (slot.hasItem()) { - ItemStack itemStack2 = slot.getItem(); - itemStack = itemStack2.copy(); - if (index < ColorPickerBlockEntity.INVENTORY_SIZE) { - if (!this.moveItemStackTo(itemStack2, ColorPickerBlockEntity.INVENTORY_SIZE, this.slots.size(), true)) { - return ItemStack.EMPTY; - } - } else if (!this.moveItemStackTo(itemStack2, 0, ColorPickerBlockEntity.INVENTORY_SIZE, false)) { - return ItemStack.EMPTY; - } - - if (itemStack2.isEmpty()) { - slot.setByPlayer(ItemStack.EMPTY); - } else { - slot.setChanged(); - } - } - - return itemStack; - } - - @Override - public void onInkColorSelectedPacket(Optional> inkColor) { - this.blockEntity.setSelectedColor(inkColor); + public ColorPickerScreenHandler(int syncId, Inventory playerInventory, BaseInkBlockEntity blockEntity, Optional> selectedColor) { + super(SpectrumMenuTypes.COLOR_PICKER, syncId, playerInventory, blockEntity, selectedColor, 2); } @Override - public void broadcastChanges() { - super.broadcastChanges(); - - if (this.player != null && this.blockEntity.getInkDirty()) { - UpdateBlockEntityInkPayload.updateBlockEntityInk(blockEntity.getBlockPos(), blockEntity.getEnergyStorage(), player); - } + public void addBlockEntitySlots() { + this.addSlot(new ColorPickerInputSlot(blockEntity, ColorPickerBlockEntity.INPUT_SLOT_ID, 26, 33)); + this.addSlot(new InkStorageSlot(blockEntity, ColorPickerBlockEntity.INK_SLOT_ID, 133, 33)); } } diff --git a/src/main/java/de/dafuqs/spectrum/inventories/CompactingChestScreen.java b/src/main/java/de/dafuqs/spectrum/inventories/CompactingChestScreen.java index a6455d02ed..fd713b3d04 100644 --- a/src/main/java/de/dafuqs/spectrum/inventories/CompactingChestScreen.java +++ b/src/main/java/de/dafuqs/spectrum/inventories/CompactingChestScreen.java @@ -8,7 +8,6 @@ import net.minecraft.network.chat.*; import net.minecraft.resources.*; import net.minecraft.world.entity.player.*; -import javax.annotation.*; public class CompactingChestScreen extends AbstractContainerScreen { @@ -26,12 +25,9 @@ protected void init() { } protected void setupInputFields() { - int x = (this.width - this.imageWidth) / 2 + 3; - int y = (this.height - this.imageHeight) / 2 + 3; - addWidget(Button.builder(Component.literal("Mode"), this::craftingModeButtonPressed) .size(16, 16) - .pos(x + 154, y + 6) + .pos(getGuiLeft() + 157, getGuiTop() + 9) .build()); } @@ -42,7 +38,7 @@ private void craftingModeButtonPressed(Button buttonWidget) { @Override protected void renderLabels(GuiGraphics drawContext, int mouseX, int mouseY) { // draw "title" and "inventory" texts - int titleX = (imageWidth - font.width(title)) / 2; // 8; + int titleX = (imageWidth - font.width(title)) / 2; int titleY = 6; Component title = this.title; int inventoryX = 8; diff --git a/src/main/java/de/dafuqs/spectrum/inventories/CompactingChestScreenHandler.java b/src/main/java/de/dafuqs/spectrum/inventories/CompactingChestScreenHandler.java index e2f0f05a1a..baf3a722d1 100644 --- a/src/main/java/de/dafuqs/spectrum/inventories/CompactingChestScreenHandler.java +++ b/src/main/java/de/dafuqs/spectrum/inventories/CompactingChestScreenHandler.java @@ -2,7 +2,6 @@ import de.dafuqs.spectrum.blocks.chests.*; import de.dafuqs.spectrum.networking.c2s_payloads.*; -import de.dafuqs.spectrum.registries.*; import net.minecraft.core.*; import net.minecraft.network.*; import net.minecraft.world.*; @@ -24,7 +23,7 @@ public CompactingChestScreenHandler(int syncId, Inventory playerInventory, Regis // serverside public CompactingChestScreenHandler(int syncId, Inventory playerInventory, CompactingChestBlockEntity blockEntity, ContainerData propertyDelegate) { - super(SpectrumScreenHandlerTypes.COMPACTING_CHEST, syncId); + super(SpectrumMenuTypes.COMPACTING_CHEST, syncId); this.blockEntity = blockEntity; this.propertyDelegate = propertyDelegate; diff --git a/src/main/java/de/dafuqs/spectrum/inventories/CraftingTabletScreenHandler.java b/src/main/java/de/dafuqs/spectrum/inventories/CraftingTabletScreenHandler.java index 9c6e81f092..df63a71c0a 100644 --- a/src/main/java/de/dafuqs/spectrum/inventories/CraftingTabletScreenHandler.java +++ b/src/main/java/de/dafuqs/spectrum/inventories/CraftingTabletScreenHandler.java @@ -15,7 +15,6 @@ import net.minecraft.world.item.*; import net.minecraft.world.item.crafting.*; import net.minecraft.world.level.*; -import javax.annotation.*; import java.util.*; @@ -36,7 +35,7 @@ public CraftingTabletScreenHandler(int syncId, Inventory playerInventory) { } public CraftingTabletScreenHandler(int syncId, Inventory playerInventory, ContainerLevelAccess context, ItemStack craftingTabletItemStack) { - super(SpectrumScreenHandlerTypes.CRAFTING_TABLET, syncId); + super(SpectrumMenuTypes.CRAFTING_TABLET, syncId); this.craftingInventory = new CraftingTabletInventory(this); this.craftingResultInventory = new ResultContainer(); this.context = context; diff --git a/src/main/java/de/dafuqs/spectrum/inventories/FabricationChestScreenHandler.java b/src/main/java/de/dafuqs/spectrum/inventories/FabricationChestScreenHandler.java index 4b2f865dd2..ba83002906 100644 --- a/src/main/java/de/dafuqs/spectrum/inventories/FabricationChestScreenHandler.java +++ b/src/main/java/de/dafuqs/spectrum/inventories/FabricationChestScreenHandler.java @@ -15,7 +15,7 @@ public class FabricationChestScreenHandler extends AbstractContainerMenu { private final Container inventory; public FabricationChestScreenHandler(int syncId, Inventory playerInventory) { - this(SpectrumScreenHandlerTypes.FABRICATION_CHEST, syncId, playerInventory); + this(SpectrumMenuTypes.FABRICATION_CHEST, syncId, playerInventory); } protected FabricationChestScreenHandler(MenuType type, int i, Inventory playerInventory) { @@ -23,7 +23,7 @@ protected FabricationChestScreenHandler(MenuType type, int i, Inventory playe } public FabricationChestScreenHandler(int syncId, Inventory playerInventory, Container inventory) { - this(SpectrumScreenHandlerTypes.FABRICATION_CHEST, syncId, playerInventory, inventory); + this(SpectrumMenuTypes.FABRICATION_CHEST, syncId, playerInventory, inventory); } protected FabricationChestScreenHandler(MenuType type, int syncId, Inventory playerInventory, Container inventory) { diff --git a/src/main/java/de/dafuqs/spectrum/inventories/FilteringScreenHandler.java b/src/main/java/de/dafuqs/spectrum/inventories/FilteringScreenHandler.java index efbc1c7ce3..6e95d29133 100644 --- a/src/main/java/de/dafuqs/spectrum/inventories/FilteringScreenHandler.java +++ b/src/main/java/de/dafuqs/spectrum/inventories/FilteringScreenHandler.java @@ -9,7 +9,7 @@ import net.minecraft.world.inventory.*; import net.minecraft.world.item.*; import net.minecraft.world.level.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.function.*; @@ -22,11 +22,11 @@ public class FilteringScreenHandler extends AbstractContainerMenu { // clientside public FilteringScreenHandler(int syncId, Inventory playerInventory, RegistryFriendlyByteBuf buf) { - this(syncId, playerInventory, FilterConfigurable.ExtendedDataWithPos.PACKET_CODEC.decode(buf)); + this(syncId, playerInventory, FilterConfigurable.ExtendedDataWithPos.STREAM_CODEC.decode(buf)); } public FilteringScreenHandler(int syncId, Inventory playerInventory, FilterConfigurable.ExtendedDataWithPos data) { - this(SpectrumScreenHandlerTypes.FILTERING, syncId, playerInventory, data, + this(SpectrumMenuTypes.FILTERING, syncId, playerInventory, data, (handler) -> new Tuple<>(FilterConfigurable.getFilterInventoryFromItemsHandler(syncId, playerInventory, data.data().filterItems(), handler), new Integer[]{ data.data().rows(), data.data().slotsPerRow(), diff --git a/src/main/java/de/dafuqs/spectrum/inventories/GenericSpectrumContainerScreenHandler.java b/src/main/java/de/dafuqs/spectrum/inventories/GenericSpectrumContainerScreenHandler.java index 5986befc26..ec3c59097b 100644 --- a/src/main/java/de/dafuqs/spectrum/inventories/GenericSpectrumContainerScreenHandler.java +++ b/src/main/java/de/dafuqs/spectrum/inventories/GenericSpectrumContainerScreenHandler.java @@ -3,9 +3,6 @@ import net.minecraft.world.*; import net.minecraft.world.entity.player.*; import net.minecraft.world.inventory.*; -import org.jetbrains.annotations.*; - -import javax.annotation.*; public class GenericSpectrumContainerScreenHandler extends ChestMenu { @@ -20,62 +17,54 @@ public GenericSpectrumContainerScreenHandler(MenuType type, int syncId, Inven this.tier = tier; } - @Contract("_, _ -> new") public static GenericSpectrumContainerScreenHandler createGeneric9x3_Tier1(int syncId, Inventory playerInventory) { - return new GenericSpectrumContainerScreenHandler(SpectrumScreenHandlerTypes.GENERIC_TIER1_9X3, syncId, playerInventory, 9, 3, ScreenBackgroundVariant.EARLYGAME); + return new GenericSpectrumContainerScreenHandler(SpectrumMenuTypes.GENERIC_TIER1_9X3, syncId, playerInventory, 9, 3, ScreenBackgroundVariant.EARLYGAME); } - @Contract("_, _ -> new") public static GenericSpectrumContainerScreenHandler createGeneric9x3_Tier2(int syncId, Inventory playerInventory) { - return new GenericSpectrumContainerScreenHandler(SpectrumScreenHandlerTypes.GENERIC_TIER2_9X3, syncId, playerInventory, 9, 3, ScreenBackgroundVariant.MIDGAME); + return new GenericSpectrumContainerScreenHandler(SpectrumMenuTypes.GENERIC_TIER2_9X3, syncId, playerInventory, 9, 3, ScreenBackgroundVariant.MIDGAME); } - @Contract("_, _ -> new") public static GenericSpectrumContainerScreenHandler createGeneric9x3_Tier3(int syncId, Inventory playerInventory) { - return new GenericSpectrumContainerScreenHandler(SpectrumScreenHandlerTypes.GENERIC_TIER3_9X3, syncId, playerInventory, 9, 3, ScreenBackgroundVariant.LATEGAME); + return new GenericSpectrumContainerScreenHandler(SpectrumMenuTypes.GENERIC_TIER3_9X3, syncId, playerInventory, 9, 3, ScreenBackgroundVariant.LATEGAME); } - @Contract("_, _ -> new") public static GenericSpectrumContainerScreenHandler createGeneric9x6_Tier1(int syncId, Inventory playerInventory) { - return new GenericSpectrumContainerScreenHandler(SpectrumScreenHandlerTypes.GENERIC_TIER1_9X6, syncId, playerInventory, 9, 6, ScreenBackgroundVariant.EARLYGAME); + return new GenericSpectrumContainerScreenHandler(SpectrumMenuTypes.GENERIC_TIER1_9X6, syncId, playerInventory, 9, 6, ScreenBackgroundVariant.EARLYGAME); } - @Contract("_, _ -> new") public static GenericSpectrumContainerScreenHandler createGeneric9x6_Tier2(int syncId, Inventory playerInventory) { - return new GenericSpectrumContainerScreenHandler(SpectrumScreenHandlerTypes.GENERIC_TIER2_9X6, syncId, playerInventory, 9, 6, ScreenBackgroundVariant.MIDGAME); + return new GenericSpectrumContainerScreenHandler(SpectrumMenuTypes.GENERIC_TIER2_9X6, syncId, playerInventory, 9, 6, ScreenBackgroundVariant.MIDGAME); } - @Contract("_, _ -> new") public static GenericSpectrumContainerScreenHandler createGeneric9x6_Tier3(int syncId, Inventory playerInventory) { - return new GenericSpectrumContainerScreenHandler(SpectrumScreenHandlerTypes.GENERIC_TIER3_9X6, syncId, playerInventory, 9, 6, ScreenBackgroundVariant.LATEGAME); + return new GenericSpectrumContainerScreenHandler(SpectrumMenuTypes.GENERIC_TIER3_9X6, syncId, playerInventory, 9, 6, ScreenBackgroundVariant.LATEGAME); } - @Contract("_, _, _, _ -> new") public static GenericSpectrumContainerScreenHandler createGeneric9x3(int syncId, Inventory playerInventory, Container inventory, ScreenBackgroundVariant tier) { switch (tier) { case EARLYGAME -> { - return new GenericSpectrumContainerScreenHandler(SpectrumScreenHandlerTypes.GENERIC_TIER1_9X3, syncId, playerInventory, inventory, 3, tier); + return new GenericSpectrumContainerScreenHandler(SpectrumMenuTypes.GENERIC_TIER1_9X3, syncId, playerInventory, inventory, 3, tier); } case MIDGAME -> { - return new GenericSpectrumContainerScreenHandler(SpectrumScreenHandlerTypes.GENERIC_TIER2_9X3, syncId, playerInventory, inventory, 3, tier); + return new GenericSpectrumContainerScreenHandler(SpectrumMenuTypes.GENERIC_TIER2_9X3, syncId, playerInventory, inventory, 3, tier); } default -> { - return new GenericSpectrumContainerScreenHandler(SpectrumScreenHandlerTypes.GENERIC_TIER3_9X3, syncId, playerInventory, inventory, 3, tier); + return new GenericSpectrumContainerScreenHandler(SpectrumMenuTypes.GENERIC_TIER3_9X3, syncId, playerInventory, inventory, 3, tier); } } } - @Contract("_, _, _, _ -> new") public static GenericSpectrumContainerScreenHandler createGeneric9x6(int syncId, Inventory playerInventory, Container inventory, ScreenBackgroundVariant tier) { switch (tier) { case EARLYGAME -> { - return new GenericSpectrumContainerScreenHandler(SpectrumScreenHandlerTypes.GENERIC_TIER1_9X6, syncId, playerInventory, inventory, 6, tier); + return new GenericSpectrumContainerScreenHandler(SpectrumMenuTypes.GENERIC_TIER1_9X6, syncId, playerInventory, inventory, 6, tier); } case MIDGAME -> { - return new GenericSpectrumContainerScreenHandler(SpectrumScreenHandlerTypes.GENERIC_TIER2_9X6, syncId, playerInventory, inventory, 6, tier); + return new GenericSpectrumContainerScreenHandler(SpectrumMenuTypes.GENERIC_TIER2_9X6, syncId, playerInventory, inventory, 6, tier); } default -> { - return new GenericSpectrumContainerScreenHandler(SpectrumScreenHandlerTypes.GENERIC_TIER3_9X6, syncId, playerInventory, inventory, 6, tier); + return new GenericSpectrumContainerScreenHandler(SpectrumMenuTypes.GENERIC_TIER3_9X6, syncId, playerInventory, inventory, 6, tier); } } } diff --git a/src/main/java/de/dafuqs/spectrum/inventories/InkStorageScreen.java b/src/main/java/de/dafuqs/spectrum/inventories/InkStorageScreen.java new file mode 100644 index 0000000000..516a19fff4 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/inventories/InkStorageScreen.java @@ -0,0 +1,49 @@ +package de.dafuqs.spectrum.inventories; + +import de.dafuqs.spectrum.*; +import de.dafuqs.spectrum.inventories.widgets.*; +import de.dafuqs.spectrum.inventories.widgets.ink.*; +import net.minecraft.client.gui.*; +import net.minecraft.network.chat.*; +import net.minecraft.resources.*; +import net.minecraft.world.entity.player.*; + +public class InkStorageScreen extends BaseInkScreen { + + protected static final ResourceLocation BACKGROUND = SpectrumCommon.locate("textures/gui/container/ink_storage.png"); + + protected StackedInkBarWidget stackedInkBarWidget; + protected InkPieWidget inkPieWidget; + + public InkStorageScreen(InkStorageScreenHandler handler, Inventory playerInventory, Component title) { + super(handler, playerInventory, title, BACKGROUND); + this.imageHeight = 166; + } + + @Override + protected void init() { + super.init(); + + this.colorSelectionWidget = new ColorSelectionWidget(getGuiLeft() + 113 - 16, getGuiTop() + 55, getGuiLeft() + 139 - 16, getGuiTop() + 25, this.menu.getBlockEntity()); + this.colorSelectionWidget.setChangedListener(this); + addRenderableWidget(this.colorSelectionWidget); + + this.inkPieWidget = new InkPieWidget(getGuiLeft() + 54 - 32, getGuiTop() + 21, () -> menu.getBlockEntity().getInkCapability()); + addRenderableWidget(this.inkPieWidget); + this.stackedInkBarWidget = new StackedInkBarWidget(getGuiLeft() + 100 - 32, getGuiTop() + 21, () -> this.menu.getBlockEntity().getInkCapability()); + addRenderableWidget(stackedInkBarWidget); + } + + @Override + protected void renderTooltip(GuiGraphics guiGraphics, int x, int y) { + super.renderTooltip(guiGraphics, x, y); + + if (this.inkPieWidget.isHoveredOrFocused()) { + guiGraphics.renderTooltip(this.font, this.inkPieWidget.getTooltip().toCharSequence(this.minecraft), x, y); + } + if (this.stackedInkBarWidget.isHoveredOrFocused()) { + guiGraphics.renderTooltip(this.font, this.stackedInkBarWidget.getTooltip().toCharSequence(this.minecraft), x, y); + } + } + +} \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/inventories/InkStorageScreenHandler.java b/src/main/java/de/dafuqs/spectrum/inventories/InkStorageScreenHandler.java new file mode 100644 index 0000000000..d9f6ddf923 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/inventories/InkStorageScreenHandler.java @@ -0,0 +1,30 @@ +package de.dafuqs.spectrum.inventories; + +import de.dafuqs.spectrum.api.ink.color.*; +import de.dafuqs.spectrum.blocks.ink.*; +import de.dafuqs.spectrum.blocks.ink.sink.*; +import de.dafuqs.spectrum.inventories.slots.*; +import net.minecraft.core.*; +import net.minecraft.network.*; +import net.minecraft.world.entity.player.*; + +import java.util.*; + +public class InkStorageScreenHandler extends BaseInkScreenHandler { + + // clientside + public InkStorageScreenHandler(int syncId, Inventory playerInventory, RegistryFriendlyByteBuf buf) { + super(SpectrumMenuTypes.INK_STORAGE, syncId, playerInventory, ScreenOpeningData.STREAM_CODEC.decode(buf), 1); + } + + // serverside + public InkStorageScreenHandler(int syncId, Inventory playerInventory, BaseInkBlockEntity blockEntity, Optional> selectedColor) { + super(SpectrumMenuTypes.INK_STORAGE, syncId, playerInventory, blockEntity, selectedColor, 1); + } + + @Override + public void addBlockEntitySlots() { + this.addSlot(new InkStorageSlot(blockEntity, 0, 109 + 7, 33)); + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/inventories/PaintbrushScreen.java b/src/main/java/de/dafuqs/spectrum/inventories/PaintbrushScreen.java index 881a638150..4e8284ceb9 100644 --- a/src/main/java/de/dafuqs/spectrum/inventories/PaintbrushScreen.java +++ b/src/main/java/de/dafuqs/spectrum/inventories/PaintbrushScreen.java @@ -1,15 +1,14 @@ package de.dafuqs.spectrum.inventories; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.networking.c2s_payloads.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.client.*; import net.minecraft.network.chat.*; import net.minecraft.sounds.*; import net.minecraft.world.entity.player.*; -import net.neoforged.api.distmarker.*; import net.neoforged.neoforge.network.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/inventories/PaintbrushScreenHandler.java b/src/main/java/de/dafuqs/spectrum/inventories/PaintbrushScreenHandler.java index da113d6805..4fb217b112 100644 --- a/src/main/java/de/dafuqs/spectrum/inventories/PaintbrushScreenHandler.java +++ b/src/main/java/de/dafuqs/spectrum/inventories/PaintbrushScreenHandler.java @@ -2,13 +2,13 @@ import de.dafuqs.revelationary.api.advancements.*; import de.dafuqs.spectrum.api.block.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.items.magic_items.*; import net.minecraft.core.*; import net.minecraft.world.entity.player.*; import net.minecraft.world.item.*; import net.minecraft.world.level.block.entity.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; @@ -23,7 +23,7 @@ public PaintbrushScreenHandler(int syncId, Inventory playerInventory) { } public PaintbrushScreenHandler(int syncId, Inventory playerInventory, ItemStack paintBrushStack) { - super(SpectrumScreenHandlerTypes.PAINTBRUSH, syncId); + super(SpectrumMenuTypes.PAINTBRUSH, syncId); this.player = playerInventory.player; this.paintBrushStack = paintBrushStack; this.hasAccessToWhites = AdvancementHelper.hasAdvancement(playerInventory.player, InkColors.WHITE.getRequiredAdvancement()); diff --git a/src/main/java/de/dafuqs/spectrum/inventories/ParticleSpawnerScreen.java b/src/main/java/de/dafuqs/spectrum/inventories/ParticleSpawnerScreen.java index 468fa057da..ac073503e4 100644 --- a/src/main/java/de/dafuqs/spectrum/inventories/ParticleSpawnerScreen.java +++ b/src/main/java/de/dafuqs/spectrum/inventories/ParticleSpawnerScreen.java @@ -3,7 +3,7 @@ import com.mojang.blaze3d.systems.*; import de.dafuqs.spectrum.*; import de.dafuqs.spectrum.blocks.particle_spawner.*; -import de.dafuqs.spectrum.data_loaders.client.ParticleSpawnerParticlesDataLoader; +import de.dafuqs.spectrum.data_loaders.client.*; import de.dafuqs.spectrum.mixin.client.accessors.*; import de.dafuqs.spectrum.networking.c2s_payloads.*; import net.minecraft.*; @@ -18,7 +18,6 @@ import net.minecraft.world.entity.player.*; import net.minecraft.world.phys.*; import net.neoforged.neoforge.network.*; -import javax.annotation.*; import org.lwjgl.glfw.*; import java.util.*; @@ -164,8 +163,8 @@ protected void renderLabels(GuiGraphics drawContext, int mouseX, int mouseY) { @Override protected void renderBg(GuiGraphics drawContext, float delta, int mouseX, int mouseY) { - int x = (this.width - this.imageWidth) / 2; - int y = (this.height - this.imageHeight) / 2; + int x = getGuiLeft(); + int y = getGuiTop(); // the background drawContext.blit(GUI_TEXTURE, x, y, 0, 0, this.imageWidth, this.imageHeight); @@ -204,8 +203,8 @@ protected void renderBg(GuiGraphics drawContext, float delta, int mouseX, int mo } protected void setupInputFields(ParticleSpawnerBlockEntity blockEntity) { - int startX = (this.width - this.imageWidth) / 2 + 3; - int startY = (this.height - this.imageHeight) / 2 + 3; + int startX = getGuiLeft() + 3; + int startY = getGuiTop() + 3; ParticleSpawnerConfiguration configuration = blockEntity.getConfiguration(); cyanField = addTextFieldWidget(startX + 16, startY + 51, Component.literal("Cyan"), String.valueOf(configuration.cmyColor().getX()), this::isPositiveDecimalNumber100); diff --git a/src/main/java/de/dafuqs/spectrum/inventories/ParticleSpawnerScreenHandler.java b/src/main/java/de/dafuqs/spectrum/inventories/ParticleSpawnerScreenHandler.java index e00234fd70..3aa1bcbff5 100644 --- a/src/main/java/de/dafuqs/spectrum/inventories/ParticleSpawnerScreenHandler.java +++ b/src/main/java/de/dafuqs/spectrum/inventories/ParticleSpawnerScreenHandler.java @@ -20,7 +20,7 @@ public ParticleSpawnerScreenHandler(int syncId, Inventory inventory, RegistryFri // serverside public ParticleSpawnerScreenHandler(int syncId, Inventory playerInventory, ParticleSpawnerBlockEntity blockEntity) { - super(SpectrumScreenHandlerTypes.PARTICLE_SPAWNER, syncId); + super(SpectrumMenuTypes.PARTICLE_SPAWNER, syncId); this.player = playerInventory.player; this.blockEntity = blockEntity; diff --git a/src/main/java/de/dafuqs/spectrum/inventories/PedestalScreen.java b/src/main/java/de/dafuqs/spectrum/inventories/PedestalScreen.java index fea78c5fc9..c80dc3b347 100644 --- a/src/main/java/de/dafuqs/spectrum/inventories/PedestalScreen.java +++ b/src/main/java/de/dafuqs/spectrum/inventories/PedestalScreen.java @@ -14,9 +14,6 @@ import net.minecraft.resources.*; import net.minecraft.world.entity.player.*; import net.minecraft.world.level.block.*; -import org.jetbrains.annotations.*; - -import javax.annotation.*; public class PedestalScreen extends AbstractContainerScreen { @@ -39,7 +36,6 @@ public PedestalScreen(PedestalScreenHandler handler, Inventory playerInventory, this.structureUpdateAvailable = this.maxPedestalRecipeTierForVariant != maxPedestalRecipeTier; } - @Contract(pure = true) public static ResourceLocation getBackgroundTextureForTier(PedestalRecipeTier recipeTier) { switch (recipeTier) { case COMPLEX -> { diff --git a/src/main/java/de/dafuqs/spectrum/inventories/PedestalScreenHandler.java b/src/main/java/de/dafuqs/spectrum/inventories/PedestalScreenHandler.java index f76939f493..d0971b16c9 100644 --- a/src/main/java/de/dafuqs/spectrum/inventories/PedestalScreenHandler.java +++ b/src/main/java/de/dafuqs/spectrum/inventories/PedestalScreenHandler.java @@ -45,7 +45,7 @@ private PedestalScreenHandler(int syncId, Inventory playerInventory, ScreenOpeni // serverside public PedestalScreenHandler(int syncId, Inventory playerInventory, PedestalBlockEntity blockEntity, ContainerData propertyDelegate, PedestalRecipeTier pedestalRecipeTier, PedestalRecipeTier maxRecipeTier) { - super(SpectrumScreenHandlerTypes.PEDESTAL, syncId); + super(SpectrumMenuTypes.PEDESTAL, syncId); this.category = RecipeBookType.CRAFTING; this.propertyDelegate = propertyDelegate; this.world = playerInventory.player.level(); diff --git a/src/main/java/de/dafuqs/spectrum/inventories/PotionWorkshopScreen.java b/src/main/java/de/dafuqs/spectrum/inventories/PotionWorkshopScreen.java index 1d9b717ab1..4d88ee5340 100644 --- a/src/main/java/de/dafuqs/spectrum/inventories/PotionWorkshopScreen.java +++ b/src/main/java/de/dafuqs/spectrum/inventories/PotionWorkshopScreen.java @@ -47,18 +47,15 @@ protected void renderLabels(GuiGraphics drawContext, int mouseX, int mouseY) { @Override protected void renderBg(GuiGraphics drawContext, float delta, int mouseX, int mouseY) { - int startX = (this.width - this.imageWidth) / 2; - int startY = (this.height - this.imageHeight) / 2; - // main background - drawContext.blit(background, startX, startY, 0, 0, imageWidth, imageHeight); + drawContext.blit(background, getGuiLeft(), getGuiTop(), 0, 0, imageWidth, imageHeight); int brewTime = (this.menu).getBrewTime(); if (brewTime > 0) { // the rising bubbles int progress = BUBBLE_PROGRESS[brewTime / 2 % 13]; if (progress > 0) { - drawContext.blit(background, startX + 29, startY + 39 + 43 - progress, 176, 40 - progress, 11, progress); + drawContext.blit(background, getGuiLeft() + 29, getGuiTop() + 39 + 43 - progress, 176, 40 - progress, 11, progress); } int maxBrewTime = (this.menu).getMaxBrewTime(); @@ -67,7 +64,7 @@ protected void renderBg(GuiGraphics drawContext, float delta, int mouseX, int mo // the brew progress = (int) (100.0F * ((float) brewTime / maxBrewTime)); RenderSystem.setShaderColor(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F, 1.0F); - drawContext.blit(background, startX + 45, startY + 22, 0, 212, progress, 44); + drawContext.blit(background, getGuiLeft() + 45, getGuiTop() + 22, 0, 212, progress, 44); RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); } diff --git a/src/main/java/de/dafuqs/spectrum/inventories/PotionWorkshopScreenHandler.java b/src/main/java/de/dafuqs/spectrum/inventories/PotionWorkshopScreenHandler.java index 486d13914d..2dd198fa6e 100644 --- a/src/main/java/de/dafuqs/spectrum/inventories/PotionWorkshopScreenHandler.java +++ b/src/main/java/de/dafuqs/spectrum/inventories/PotionWorkshopScreenHandler.java @@ -17,11 +17,11 @@ public class PotionWorkshopScreenHandler extends AbstractContainerMenu { private final ContainerData propertyDelegate; public PotionWorkshopScreenHandler(int syncId, Inventory playerInventory) { - this(SpectrumScreenHandlerTypes.POTION_WORKSHOP, syncId, playerInventory); + this(SpectrumMenuTypes.POTION_WORKSHOP, syncId, playerInventory); } public PotionWorkshopScreenHandler(int syncId, Inventory playerInventory, PotionWorkshopBlockEntity potionWorkshopBlockEntity, ContainerData propertyDelegate) { - this(SpectrumScreenHandlerTypes.POTION_WORKSHOP, syncId, playerInventory, potionWorkshopBlockEntity, propertyDelegate); + this(SpectrumMenuTypes.POTION_WORKSHOP, syncId, playerInventory, potionWorkshopBlockEntity, propertyDelegate); } public PotionWorkshopScreenHandler(MenuType type, int i, Inventory playerInventory) { diff --git a/src/main/java/de/dafuqs/spectrum/inventories/QuickNavigationGridScreen.java b/src/main/java/de/dafuqs/spectrum/inventories/QuickNavigationGridScreen.java index 60479a6591..77955ff8c3 100644 --- a/src/main/java/de/dafuqs/spectrum/inventories/QuickNavigationGridScreen.java +++ b/src/main/java/de/dafuqs/spectrum/inventories/QuickNavigationGridScreen.java @@ -16,7 +16,7 @@ import net.minecraft.world.inventory.*; import net.minecraft.world.item.*; import org.joml.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/inventories/QuickNavigationGridScreenHandler.java b/src/main/java/de/dafuqs/spectrum/inventories/QuickNavigationGridScreenHandler.java index 0e33beb4ec..b1fc4cc9f4 100644 --- a/src/main/java/de/dafuqs/spectrum/inventories/QuickNavigationGridScreenHandler.java +++ b/src/main/java/de/dafuqs/spectrum/inventories/QuickNavigationGridScreenHandler.java @@ -3,7 +3,7 @@ import net.minecraft.world.entity.player.*; import net.minecraft.world.inventory.*; import net.minecraft.world.item.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public abstract class QuickNavigationGridScreenHandler extends AbstractContainerMenu { diff --git a/src/main/java/de/dafuqs/spectrum/inventories/Spectrum3x3ContainerScreen.java b/src/main/java/de/dafuqs/spectrum/inventories/Spectrum3x3ContainerScreen.java index ebdd6aa6e3..aa61529f13 100644 --- a/src/main/java/de/dafuqs/spectrum/inventories/Spectrum3x3ContainerScreen.java +++ b/src/main/java/de/dafuqs/spectrum/inventories/Spectrum3x3ContainerScreen.java @@ -6,9 +6,6 @@ import net.minecraft.network.chat.*; import net.minecraft.resources.*; import net.minecraft.world.entity.player.*; -import org.jetbrains.annotations.*; - -import javax.annotation.*; public class Spectrum3x3ContainerScreen extends AbstractContainerScreen { @@ -31,10 +28,10 @@ protected void init() { } @Override - public void render(GuiGraphics drawContext, int mouseX, int mouseY, float delta) { - this.renderBackground(drawContext, mouseX, mouseY, delta); - super.render(drawContext, mouseX, mouseY, delta); - this.renderTooltip(drawContext, mouseX, mouseY); + public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float delta) { + this.renderBackground(guiGraphics, mouseX, mouseY, delta); + super.render(guiGraphics, mouseX, mouseY, delta); + this.renderTooltip(guiGraphics, mouseX, mouseY); } /** @@ -42,12 +39,9 @@ public void render(GuiGraphics drawContext, int mouseX, int mouseY, float delta) */ @Override protected void renderBg(GuiGraphics drawContext, float delta, int mouseX, int mouseY) { - int i = (this.width - this.imageWidth) / 2; - int j = (this.height - this.imageHeight) / 2; - drawContext.blit(backgroundTexture, i, j, 0, 0, this.imageWidth, this.imageHeight); + drawContext.blit(backgroundTexture, getGuiLeft(), getGuiTop(), 0, 0, this.imageWidth, this.imageHeight); } - @Contract(pure = true) private ResourceLocation getBackground(ScreenBackgroundVariant tier) { switch (tier) { case EARLYGAME -> { diff --git a/src/main/java/de/dafuqs/spectrum/inventories/Spectrum3x3ContainerScreenHandler.java b/src/main/java/de/dafuqs/spectrum/inventories/Spectrum3x3ContainerScreenHandler.java index 44f0b07bc7..434b67e8bb 100644 --- a/src/main/java/de/dafuqs/spectrum/inventories/Spectrum3x3ContainerScreenHandler.java +++ b/src/main/java/de/dafuqs/spectrum/inventories/Spectrum3x3ContainerScreenHandler.java @@ -5,9 +5,6 @@ import net.minecraft.world.entity.player.*; import net.minecraft.world.inventory.*; import net.minecraft.world.item.*; -import org.jetbrains.annotations.*; - -import javax.annotation.*; public class Spectrum3x3ContainerScreenHandler extends AbstractContainerMenu { @@ -15,7 +12,7 @@ public class Spectrum3x3ContainerScreenHandler extends AbstractContainerMenu { private final Container inventory; public Spectrum3x3ContainerScreenHandler(int syncId, Inventory playerInventory, ScreenBackgroundVariant screenBackgroundVariant) { - this(SpectrumScreenHandlerTypes.GENERIC_TIER1_3X3, syncId, playerInventory, new SimpleContainer(9), screenBackgroundVariant); + this(SpectrumMenuTypes.GENERIC_TIER1_3X3, syncId, playerInventory, new SimpleContainer(9), screenBackgroundVariant); } public Spectrum3x3ContainerScreenHandler(MenuType screenHandlerType, int syncId, Inventory playerInventory, Container inventory, ScreenBackgroundVariant screenBackgroundVariant) { @@ -44,34 +41,28 @@ public Spectrum3x3ContainerScreenHandler(MenuType new") public static Spectrum3x3ContainerScreenHandler createTier1(int syncId, Inventory playerInventory) { return new Spectrum3x3ContainerScreenHandler(syncId, playerInventory, ScreenBackgroundVariant.EARLYGAME); } - @Contract("_, _, _ -> new") public static AbstractContainerMenu createTier1(int syncId, Inventory playerInventory, BlockPlacerBlockEntity blockEntity) { - return new Spectrum3x3ContainerScreenHandler(SpectrumScreenHandlerTypes.GENERIC_TIER1_3X3, syncId, playerInventory, blockEntity, ScreenBackgroundVariant.EARLYGAME); + return new Spectrum3x3ContainerScreenHandler(SpectrumMenuTypes.GENERIC_TIER1_3X3, syncId, playerInventory, blockEntity, ScreenBackgroundVariant.EARLYGAME); } - @Contract("_, _ -> new") public static Spectrum3x3ContainerScreenHandler createTier2(int syncId, Inventory playerInventory) { return new Spectrum3x3ContainerScreenHandler(syncId, playerInventory, ScreenBackgroundVariant.MIDGAME); } - @Contract("_, _, _ -> new") public static AbstractContainerMenu createTier2(int syncId, Inventory playerInventory, BlockPlacerBlockEntity blockEntity) { - return new Spectrum3x3ContainerScreenHandler(SpectrumScreenHandlerTypes.GENERIC_TIER1_3X3, syncId, playerInventory, blockEntity, ScreenBackgroundVariant.MIDGAME); + return new Spectrum3x3ContainerScreenHandler(SpectrumMenuTypes.GENERIC_TIER1_3X3, syncId, playerInventory, blockEntity, ScreenBackgroundVariant.MIDGAME); } - @Contract("_, _ -> new") public static Spectrum3x3ContainerScreenHandler createTier3(int syncId, Inventory playerInventory) { return new Spectrum3x3ContainerScreenHandler(syncId, playerInventory, ScreenBackgroundVariant.LATEGAME); } - @Contract("_, _, _ -> new") public static AbstractContainerMenu createTier3(int syncId, Inventory playerInventory, BlockPlacerBlockEntity blockEntity) { - return new Spectrum3x3ContainerScreenHandler(SpectrumScreenHandlerTypes.GENERIC_TIER1_3X3, syncId, playerInventory, blockEntity, ScreenBackgroundVariant.LATEGAME); + return new Spectrum3x3ContainerScreenHandler(SpectrumMenuTypes.GENERIC_TIER1_3X3, syncId, playerInventory, blockEntity, ScreenBackgroundVariant.LATEGAME); } @Override diff --git a/src/main/java/de/dafuqs/spectrum/inventories/SpectrumGenericContainerScreen.java b/src/main/java/de/dafuqs/spectrum/inventories/SpectrumGenericContainerScreen.java index bc5c5c717b..76d6da1206 100644 --- a/src/main/java/de/dafuqs/spectrum/inventories/SpectrumGenericContainerScreen.java +++ b/src/main/java/de/dafuqs/spectrum/inventories/SpectrumGenericContainerScreen.java @@ -7,9 +7,6 @@ import net.minecraft.network.chat.*; import net.minecraft.resources.*; import net.minecraft.world.entity.player.*; -import org.jetbrains.annotations.*; - -import javax.annotation.*; public class SpectrumGenericContainerScreen extends AbstractContainerScreen { @@ -53,13 +50,12 @@ protected void renderLabels(GuiGraphics drawContext, int mouseX, int mouseY) { @Override protected void renderBg(GuiGraphics drawContext, float delta, int mouseX, int mouseY) { - int i = (this.width - this.imageWidth) / 2; - int j = (this.height - this.imageHeight) / 2; + int i = getGuiLeft(); + int j = getGuiTop(); drawContext.blit(backgroundTexture, i, j, 0, 0, this.imageWidth, this.rows * 18 + 17); drawContext.blit(backgroundTexture, i, j + this.rows * 18 + 17, 0, 126, this.imageWidth, 96); } - @Contract(pure = true) private ResourceLocation getBackground(int rows, ScreenBackgroundVariant tier) { switch (tier) { case EARLYGAME -> { diff --git a/src/main/java/de/dafuqs/spectrum/inventories/SpectrumMenuTypes.java b/src/main/java/de/dafuqs/spectrum/inventories/SpectrumMenuTypes.java new file mode 100644 index 0000000000..ce1957b800 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/inventories/SpectrumMenuTypes.java @@ -0,0 +1,97 @@ +package de.dafuqs.spectrum.inventories; + +import de.dafuqs.spectrum.*; +import net.minecraft.client.gui.screens.inventory.*; +import net.minecraft.core.registries.*; +import net.minecraft.resources.*; +import net.minecraft.world.flag.*; +import net.minecraft.world.inventory.*; +import net.neoforged.bus.api.*; +import net.neoforged.neoforge.client.event.*; +import net.neoforged.neoforge.common.extensions.*; +import net.neoforged.neoforge.network.*; +import net.neoforged.neoforge.registries.*; + +public class SpectrumMenuTypes { + + private static final DeferredRegister> REGISTRAR = DeferredRegister.create(Registries.MENU, SpectrumCommon.MOD_ID); + + public static MenuType PAINTBRUSH = registerSimple(SpectrumCommon.locate("paintbrush"), PaintbrushScreenHandler::new); + public static MenuType WORKSTAFF = registerSimple(SpectrumCommon.locate("workstaff"), WorkstaffScreenHandler::new); + public static MenuType PEDESTAL = registerExtended(SpectrumCommon.locate("pedestal"), PedestalScreenHandler::new); + public static MenuType CRAFTING_TABLET = registerSimple(SpectrumCommon.locate("crafting_tablet"), CraftingTabletScreenHandler::new); + public static MenuType FABRICATION_CHEST = registerSimple(SpectrumCommon.locate("fabrication_chest"), FabricationChestScreenHandler::new); + public static MenuType BEDROCK_ANVIL = registerSimple(SpectrumCommon.locate("bedrock_anvil"), BedrockAnvilScreenHandler::new); + public static MenuType PARTICLE_SPAWNER = registerExtended(SpectrumCommon.locate("particle_spawner"), ParticleSpawnerScreenHandler::new); + public static MenuType COMPACTING_CHEST = registerExtended(SpectrumCommon.locate("compacting_chest"), CompactingChestScreenHandler::new); + public static MenuType BLACK_HOLE_CHEST = registerExtended(SpectrumCommon.locate("black_hole_chest"), BlackHoleChestScreenHandler::new); + public static MenuType POTION_WORKSHOP = registerSimple(SpectrumCommon.locate("potion_workshop"), PotionWorkshopScreenHandler::new); + public static MenuType FILTERING = registerExtended(SpectrumCommon.locate("filtering"), FilteringScreenHandler::new); + public static MenuType BAG_OF_HOLDING = registerSimple(SpectrumCommon.locate("bag_of_holding"), BagOfHoldingScreenHandler::new); + + // Ink + public static MenuType INK_STORAGE = registerExtended(SpectrumCommon.locate("ink_storage"), InkStorageScreenHandler::new); + public static MenuType COLOR_PICKER = registerExtended(SpectrumCommon.locate("color_picker"), ColorPickerScreenHandler::new); + public static MenuType TINTING_STATION = registerExtended(SpectrumCommon.locate("tinting_station"), TintingStationScreenHandler::new); + public static MenuType CINDERHEARTH = registerExtended(SpectrumCommon.locate("cinderhearth"), CinderhearthScreenHandler::new); + + // Generic + public static MenuType GENERIC_TIER1_9X3 = registerSimple(SpectrumCommon.locate("generic_tier1_9x3"), GenericSpectrumContainerScreenHandler::createGeneric9x3_Tier1); + public static MenuType GENERIC_TIER2_9X3 = registerSimple(SpectrumCommon.locate("generic_tier2_9x3"), GenericSpectrumContainerScreenHandler::createGeneric9x3_Tier2); + public static MenuType GENERIC_TIER3_9X3 = registerSimple(SpectrumCommon.locate("generic_tier3_9x3"), GenericSpectrumContainerScreenHandler::createGeneric9x3_Tier3); + public static MenuType GENERIC_TIER1_9X6 = registerSimple(SpectrumCommon.locate("generic_tier1_9x6"), GenericSpectrumContainerScreenHandler::createGeneric9x6_Tier1); + public static MenuType GENERIC_TIER2_9X6 = registerSimple(SpectrumCommon.locate("generic_tier2_9x6"), GenericSpectrumContainerScreenHandler::createGeneric9x6_Tier2); + public static MenuType GENERIC_TIER3_9X6 = registerSimple(SpectrumCommon.locate("generic_tier3_9x6"), GenericSpectrumContainerScreenHandler::createGeneric9x6_Tier3); + public static MenuType GENERIC_TIER1_3X3 = registerSimple(SpectrumCommon.locate("generic_tier1_3x3"), Spectrum3x3ContainerScreenHandler::createTier1); + public static MenuType GENERIC_TIER2_3X3 = registerSimple(SpectrumCommon.locate("generic_tier2_3x3"), Spectrum3x3ContainerScreenHandler::createTier2); + public static MenuType GENERIC_TIER3_3X3 = registerSimple(SpectrumCommon.locate("generic_tier3_3x3"), Spectrum3x3ContainerScreenHandler::createTier3); + + public static MenuType registerSimple(ResourceLocation id, MenuType.MenuSupplier factory) { + MenuType type = new MenuType<>(factory, FeatureFlags.VANILLA_SET); + REGISTRAR.register(id.getPath(), () -> type); + return type; + } + + public static MenuType registerExtended(ResourceLocation id, IContainerFactory factory) { + MenuType type = IMenuTypeExtension.create(factory); + REGISTRAR.register(id.getPath(), () -> type); + return type; + } + + public static void register(IEventBus eventBus) { + REGISTRAR.register(eventBus); + } + + public static void registerClient(RegisterMenuScreensEvent event) { + event.register(SpectrumMenuTypes.PAINTBRUSH, PaintbrushScreen::new); + event.register(SpectrumMenuTypes.WORKSTAFF, WorkstaffScreen::new); + event.register(SpectrumMenuTypes.PEDESTAL, PedestalScreen::new); + event.register(SpectrumMenuTypes.CRAFTING_TABLET, CraftingTabletScreen::new); + event.register(SpectrumMenuTypes.FABRICATION_CHEST, FabricationChestScreen::new); + event.register(SpectrumMenuTypes.BEDROCK_ANVIL, BedrockAnvilScreen::new); + event.register(SpectrumMenuTypes.PARTICLE_SPAWNER, ParticleSpawnerScreen::new); + event.register(SpectrumMenuTypes.COMPACTING_CHEST, CompactingChestScreen::new); + event.register(SpectrumMenuTypes.BLACK_HOLE_CHEST, BlackHoleChestScreen::new); + event.register(SpectrumMenuTypes.POTION_WORKSHOP, PotionWorkshopScreen::new); + event.register(SpectrumMenuTypes.FILTERING, FilteringScreen::new); + event.register(SpectrumMenuTypes.BAG_OF_HOLDING, ContainerScreen::new); + + // Ink + event.register(SpectrumMenuTypes.INK_STORAGE, InkStorageScreen::new); + event.register(SpectrumMenuTypes.COLOR_PICKER, ColorPickerScreen::new); + event.register(SpectrumMenuTypes.TINTING_STATION, TintingStationScreen::new); + event.register(SpectrumMenuTypes.CINDERHEARTH, CinderhearthScreen::new); + + // Generic + event.register(SpectrumMenuTypes.GENERIC_TIER1_9X3, SpectrumGenericContainerScreen::new); + event.register(SpectrumMenuTypes.GENERIC_TIER2_9X3, SpectrumGenericContainerScreen::new); + event.register(SpectrumMenuTypes.GENERIC_TIER3_9X3, SpectrumGenericContainerScreen::new); + event.register(SpectrumMenuTypes.GENERIC_TIER1_9X6, SpectrumGenericContainerScreen::new); + event.register(SpectrumMenuTypes.GENERIC_TIER2_9X6, SpectrumGenericContainerScreen::new); + event.register(SpectrumMenuTypes.GENERIC_TIER3_9X6, SpectrumGenericContainerScreen::new); + event.register(SpectrumMenuTypes.GENERIC_TIER1_3X3, Spectrum3x3ContainerScreen::new); + event.register(SpectrumMenuTypes.GENERIC_TIER2_3X3, Spectrum3x3ContainerScreen::new); + event.register(SpectrumMenuTypes.GENERIC_TIER3_3X3, Spectrum3x3ContainerScreen::new); + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/inventories/SpectrumScreenHandlerIDs.java b/src/main/java/de/dafuqs/spectrum/inventories/SpectrumScreenHandlerIDs.java deleted file mode 100644 index 48acb59629..0000000000 --- a/src/main/java/de/dafuqs/spectrum/inventories/SpectrumScreenHandlerIDs.java +++ /dev/null @@ -1,36 +0,0 @@ -package de.dafuqs.spectrum.inventories; - -import de.dafuqs.spectrum.*; -import net.minecraft.resources.*; - -public class SpectrumScreenHandlerIDs { - - public static final ResourceLocation PAINTBRUSH = SpectrumCommon.locate("paintbrush"); - public static final ResourceLocation WORKSTAFF = SpectrumCommon.locate("workstaff"); - - public static final ResourceLocation PEDESTAL = SpectrumCommon.locate("pedestal"); - public static final ResourceLocation CRAFTING_TABLET = SpectrumCommon.locate("crafting_tablet"); - public static final ResourceLocation FABRICATION_CHEST = SpectrumCommon.locate("fabrication_chest"); - public static final ResourceLocation BEDROCK_ANVIL = SpectrumCommon.locate("bedrock_anvil"); - public static final ResourceLocation PARTICLE_SPAWNER = SpectrumCommon.locate("particle_spawner"); - public static final ResourceLocation COMPACTING_CHEST = SpectrumCommon.locate("compacting_chest"); - public static final ResourceLocation BLACK_HOLE_CHEST = SpectrumCommon.locate("black_hole_chest"); - public static final ResourceLocation POTION_WORKSHOP = SpectrumCommon.locate("potion_workshop"); - public static final ResourceLocation COLOR_PICKER = SpectrumCommon.locate("color_picker"); - public static final ResourceLocation CINDERHEARTH = SpectrumCommon.locate("cinderhearth"); - public static final ResourceLocation FILTERING = SpectrumCommon.locate("filtering"); - public static final ResourceLocation BAG_OF_HOLDING = SpectrumCommon.locate("bag_of_holding"); - - public static final ResourceLocation GENERIC_TIER1_9x3 = SpectrumCommon.locate("generic_tier1_9x3"); - public static final ResourceLocation GENERIC_TIER2_9x3 = SpectrumCommon.locate("generic_tier2_9x3"); - public static final ResourceLocation GENERIC_TIER3_9x3 = SpectrumCommon.locate("generic_tier3_9x3"); - - public static final ResourceLocation GENERIC_TIER1_9x6 = SpectrumCommon.locate("generic_tier1_9x6"); - public static final ResourceLocation GENERIC_TIER2_9x6 = SpectrumCommon.locate("generic_tier2_9x6"); - public static final ResourceLocation GENERIC_TIER3_9x6 = SpectrumCommon.locate("generic_tier3_9x6"); - - public static final ResourceLocation GENERIC_TIER1_3X3 = SpectrumCommon.locate("generic_tier1_3x3"); - public static final ResourceLocation GENERIC_TIER2_3X3 = SpectrumCommon.locate("generic_tier2_3x3"); - public static final ResourceLocation GENERIC_TIER3_3X3 = SpectrumCommon.locate("generic_tier3_3x3"); - -} diff --git a/src/main/java/de/dafuqs/spectrum/inventories/SpectrumScreenHandlerTypes.java b/src/main/java/de/dafuqs/spectrum/inventories/SpectrumScreenHandlerTypes.java deleted file mode 100644 index 809cb3eb9b..0000000000 --- a/src/main/java/de/dafuqs/spectrum/inventories/SpectrumScreenHandlerTypes.java +++ /dev/null @@ -1,94 +0,0 @@ -package de.dafuqs.spectrum.inventories; - -import de.dafuqs.spectrum.*; -import de.dafuqs.spectrum.api.block.*; -import net.minecraft.client.gui.screens.inventory.*; -import net.minecraft.core.*; -import net.minecraft.core.registries.*; -import net.minecraft.network.*; -import net.minecraft.network.codec.*; -import net.minecraft.resources.*; -import net.minecraft.world.flag.*; -import net.minecraft.world.inventory.*; -import net.neoforged.bus.api.*; -import net.neoforged.neoforge.client.event.*; -import net.neoforged.neoforge.common.extensions.*; -import net.neoforged.neoforge.network.*; -import net.neoforged.neoforge.registries.*; - -public class SpectrumScreenHandlerTypes { - - private static final DeferredRegister> REGISTRAR = DeferredRegister.create(Registries.MENU, SpectrumCommon.MOD_ID); - - public static MenuType PAINTBRUSH = registerSimple(SpectrumScreenHandlerIDs.PAINTBRUSH, PaintbrushScreenHandler::new); - public static MenuType WORKSTAFF = registerSimple(SpectrumScreenHandlerIDs.WORKSTAFF, WorkstaffScreenHandler::new); - public static MenuType PEDESTAL = registerExtended(SpectrumScreenHandlerIDs.PEDESTAL, PedestalScreenHandler::new, PedestalScreenHandler.ScreenOpeningData.PACKET_CODEC); - public static MenuType CRAFTING_TABLET = registerSimple(SpectrumScreenHandlerIDs.CRAFTING_TABLET, CraftingTabletScreenHandler::new); - public static MenuType FABRICATION_CHEST = registerSimple(SpectrumScreenHandlerIDs.FABRICATION_CHEST, FabricationChestScreenHandler::new); - public static MenuType BEDROCK_ANVIL = registerSimple(SpectrumScreenHandlerIDs.BEDROCK_ANVIL, BedrockAnvilScreenHandler::new); - public static MenuType PARTICLE_SPAWNER = registerExtended(SpectrumScreenHandlerIDs.PARTICLE_SPAWNER, ParticleSpawnerScreenHandler::new, BlockPos.STREAM_CODEC); - public static MenuType COMPACTING_CHEST = registerExtended(SpectrumScreenHandlerIDs.COMPACTING_CHEST, CompactingChestScreenHandler::new, BlockPos.STREAM_CODEC); - public static MenuType BLACK_HOLE_CHEST = registerExtended(SpectrumScreenHandlerIDs.BLACK_HOLE_CHEST, BlackHoleChestScreenHandler::new, FilterConfigurable.ExtendedDataWithPos.PACKET_CODEC); - public static MenuType POTION_WORKSHOP = registerSimple(SpectrumScreenHandlerIDs.POTION_WORKSHOP, PotionWorkshopScreenHandler::new); - public static MenuType COLOR_PICKER = registerExtended(SpectrumScreenHandlerIDs.COLOR_PICKER, ColorPickerScreenHandler::new, ColorPickerScreenHandler.ScreenOpeningData.PACKET_CODEC); - public static MenuType CINDERHEARTH = registerExtended(SpectrumScreenHandlerIDs.CINDERHEARTH, CinderhearthScreenHandler::new, BlockPos.STREAM_CODEC); - public static MenuType FILTERING = registerExtended(SpectrumScreenHandlerIDs.FILTERING, FilteringScreenHandler::new, FilterConfigurable.ExtendedData.PACKET_CODEC); - public static MenuType BAG_OF_HOLDING = registerSimple(SpectrumScreenHandlerIDs.BAG_OF_HOLDING, BagOfHoldingScreenHandler::new); - - public static MenuType GENERIC_TIER1_9X3 = registerSimple(SpectrumScreenHandlerIDs.GENERIC_TIER1_9x3, GenericSpectrumContainerScreenHandler::createGeneric9x3_Tier1); - public static MenuType GENERIC_TIER2_9X3 = registerSimple(SpectrumScreenHandlerIDs.GENERIC_TIER2_9x3, GenericSpectrumContainerScreenHandler::createGeneric9x3_Tier2); - public static MenuType GENERIC_TIER3_9X3 = registerSimple(SpectrumScreenHandlerIDs.GENERIC_TIER3_9x3, GenericSpectrumContainerScreenHandler::createGeneric9x3_Tier3); - - public static MenuType GENERIC_TIER1_9X6 = registerSimple(SpectrumScreenHandlerIDs.GENERIC_TIER1_9x6, GenericSpectrumContainerScreenHandler::createGeneric9x6_Tier1); - public static MenuType GENERIC_TIER2_9X6 = registerSimple(SpectrumScreenHandlerIDs.GENERIC_TIER2_9x6, GenericSpectrumContainerScreenHandler::createGeneric9x6_Tier2); - public static MenuType GENERIC_TIER3_9X6 = registerSimple(SpectrumScreenHandlerIDs.GENERIC_TIER3_9x6, GenericSpectrumContainerScreenHandler::createGeneric9x6_Tier3); - - public static MenuType GENERIC_TIER1_3X3 = registerSimple(SpectrumScreenHandlerIDs.GENERIC_TIER1_3X3, Spectrum3x3ContainerScreenHandler::createTier1); - public static MenuType GENERIC_TIER2_3X3 = registerSimple(SpectrumScreenHandlerIDs.GENERIC_TIER2_3X3, Spectrum3x3ContainerScreenHandler::createTier2); - public static MenuType GENERIC_TIER3_3X3 = registerSimple(SpectrumScreenHandlerIDs.GENERIC_TIER3_3X3, Spectrum3x3ContainerScreenHandler::createTier3); - - public static MenuType registerSimple(ResourceLocation id, MenuType.MenuSupplier factory) { - MenuType type = new MenuType<>(factory, FeatureFlags.VANILLA_SET); - REGISTRAR.register(id.getPath(), () -> type); - return type; - } - - public static MenuType registerExtended(ResourceLocation id, IContainerFactory factory, StreamCodec packetCodec) { - MenuType type = IMenuTypeExtension.create(factory); - REGISTRAR.register(id.getPath(), () -> type); - return type; - } - - public static void register(IEventBus eventBus) { - REGISTRAR.register(eventBus); - } - - public static void registerClient(RegisterMenuScreensEvent event) { - event.register(SpectrumScreenHandlerTypes.PAINTBRUSH, PaintbrushScreen::new); - event.register(SpectrumScreenHandlerTypes.WORKSTAFF, WorkstaffScreen::new); - - event.register(SpectrumScreenHandlerTypes.PEDESTAL, PedestalScreen::new); - event.register(SpectrumScreenHandlerTypes.CRAFTING_TABLET, CraftingTabletScreen::new); - event.register(SpectrumScreenHandlerTypes.FABRICATION_CHEST, FabricationChestScreen::new); - event.register(SpectrumScreenHandlerTypes.BEDROCK_ANVIL, BedrockAnvilScreen::new); - event.register(SpectrumScreenHandlerTypes.PARTICLE_SPAWNER, ParticleSpawnerScreen::new); - event.register(SpectrumScreenHandlerTypes.COMPACTING_CHEST, CompactingChestScreen::new); - event.register(SpectrumScreenHandlerTypes.BLACK_HOLE_CHEST, BlackHoleChestScreen::new); - event.register(SpectrumScreenHandlerTypes.POTION_WORKSHOP, PotionWorkshopScreen::new); - event.register(SpectrumScreenHandlerTypes.COLOR_PICKER, ColorPickerScreen::new); - event.register(SpectrumScreenHandlerTypes.CINDERHEARTH, CinderhearthScreen::new); - event.register(SpectrumScreenHandlerTypes.FILTERING, FilteringScreen::new); - event.register(SpectrumScreenHandlerTypes.BAG_OF_HOLDING, ContainerScreen::new); - - event.register(SpectrumScreenHandlerTypes.GENERIC_TIER1_9X3, SpectrumGenericContainerScreen::new); - event.register(SpectrumScreenHandlerTypes.GENERIC_TIER2_9X3, SpectrumGenericContainerScreen::new); - event.register(SpectrumScreenHandlerTypes.GENERIC_TIER3_9X3, SpectrumGenericContainerScreen::new); - event.register(SpectrumScreenHandlerTypes.GENERIC_TIER1_9X6, SpectrumGenericContainerScreen::new); - event.register(SpectrumScreenHandlerTypes.GENERIC_TIER2_9X6, SpectrumGenericContainerScreen::new); - event.register(SpectrumScreenHandlerTypes.GENERIC_TIER3_9X6, SpectrumGenericContainerScreen::new); - event.register(SpectrumScreenHandlerTypes.GENERIC_TIER1_3X3, Spectrum3x3ContainerScreen::new); - event.register(SpectrumScreenHandlerTypes.GENERIC_TIER2_3X3, Spectrum3x3ContainerScreen::new); - event.register(SpectrumScreenHandlerTypes.GENERIC_TIER3_3X3, Spectrum3x3ContainerScreen::new); - } - -} diff --git a/src/main/java/de/dafuqs/spectrum/inventories/TintingStationScreen.java b/src/main/java/de/dafuqs/spectrum/inventories/TintingStationScreen.java new file mode 100644 index 0000000000..9d12c2b7be --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/inventories/TintingStationScreen.java @@ -0,0 +1,43 @@ +package de.dafuqs.spectrum.inventories; + +import de.dafuqs.spectrum.*; +import de.dafuqs.spectrum.inventories.widgets.*; +import de.dafuqs.spectrum.inventories.widgets.ink.*; +import net.minecraft.client.gui.*; +import net.minecraft.network.chat.*; +import net.minecraft.resources.*; +import net.minecraft.world.entity.player.*; + +public class TintingStationScreen extends BaseInkScreen { + + protected static final ResourceLocation BACKGROUND = SpectrumCommon.locate("textures/gui/container/tinting_station.png"); + + protected InkListWidget inkListWidget; + + public TintingStationScreen(TintingStationScreenHandler handler, Inventory playerInventory, Component title) { + super(handler, playerInventory, title, BACKGROUND); + } + + @Override + protected void init() { + super.init(); + + this.colorSelectionWidget = new ColorSelectionWidget(getGuiLeft() + 113, getGuiTop() + 55, getGuiLeft() + 139, getGuiTop() + 25, this.menu.getBlockEntity()); + this.colorSelectionWidget.setChangedListener(this); + addRenderableWidget(this.colorSelectionWidget); + + this.inkListWidget = new InkListWidgetWithBorderAndTitle(getGuiLeft() + 140, getGuiTop() + 40, () -> menu.getBlockEntity().getInkCapability()); + inkListWidget.setPosition(getGuiLeft() - this.inkListWidget.getWidth(), getGuiTop() + 40); + addRenderableWidget(inkListWidget); + } + + @Override + protected void renderTooltip(GuiGraphics guiGraphics, int x, int y) { + super.renderTooltip(guiGraphics, x, y); + + if (this.inkListWidget.isHoveredOrFocused()) { + guiGraphics.renderTooltip(this.font, this.inkListWidget.getTooltip().toCharSequence(this.minecraft), x, y); + } + } + +} \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/inventories/TintingStationScreenHandler.java b/src/main/java/de/dafuqs/spectrum/inventories/TintingStationScreenHandler.java new file mode 100644 index 0000000000..8528072219 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/inventories/TintingStationScreenHandler.java @@ -0,0 +1,31 @@ +package de.dafuqs.spectrum.inventories; + +import de.dafuqs.spectrum.api.ink.color.*; +import de.dafuqs.spectrum.blocks.ink.sink.*; +import de.dafuqs.spectrum.inventories.slots.*; +import net.minecraft.core.*; +import net.minecraft.network.*; +import net.minecraft.world.entity.player.*; +import net.minecraft.world.inventory.*; + +import java.util.*; + +public class TintingStationScreenHandler extends BaseInkScreenHandler { + + // clientside + public TintingStationScreenHandler(int syncId, Inventory playerInventory, RegistryFriendlyByteBuf buf) { + super(SpectrumMenuTypes.TINTING_STATION, syncId, playerInventory, ScreenOpeningData.STREAM_CODEC.decode(buf), 2); + } + + // serverside + public TintingStationScreenHandler(int syncId, Inventory playerInventory, TintingStationBlockEntity blockEntity, Optional> selectedColor) { + super(SpectrumMenuTypes.TINTING_STATION, syncId, playerInventory, blockEntity, selectedColor, 2); + } + + @Override + public void addBlockEntitySlots() { + this.addSlot(new Slot(blockEntity, 0, 26, 33)); + this.addSlot(new InkStorageSlot(blockEntity, 1, 133, 33)); + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/inventories/WorkstaffScreen.java b/src/main/java/de/dafuqs/spectrum/inventories/WorkstaffScreen.java index 619a1ac9d6..820406e8f9 100644 --- a/src/main/java/de/dafuqs/spectrum/inventories/WorkstaffScreen.java +++ b/src/main/java/de/dafuqs/spectrum/inventories/WorkstaffScreen.java @@ -10,7 +10,6 @@ import net.minecraft.world.entity.player.*; import net.minecraft.world.item.*; import net.minecraft.world.item.enchantment.*; -import net.neoforged.api.distmarker.*; import net.neoforged.neoforge.network.*; diff --git a/src/main/java/de/dafuqs/spectrum/inventories/WorkstaffScreenHandler.java b/src/main/java/de/dafuqs/spectrum/inventories/WorkstaffScreenHandler.java index c4a3b6af18..b4f8cec65c 100644 --- a/src/main/java/de/dafuqs/spectrum/inventories/WorkstaffScreenHandler.java +++ b/src/main/java/de/dafuqs/spectrum/inventories/WorkstaffScreenHandler.java @@ -14,7 +14,7 @@ public WorkstaffScreenHandler(int syncId, Inventory playerInventory) { } public WorkstaffScreenHandler(int syncId, Inventory playerInventory, ItemStack workstaffStack) { - super(SpectrumScreenHandlerTypes.WORKSTAFF, syncId); + super(SpectrumMenuTypes.WORKSTAFF, syncId); this.workstaffStack = workstaffStack; this.player = playerInventory.player; } diff --git a/src/main/java/de/dafuqs/spectrum/inventories/package-info.java b/src/main/java/de/dafuqs/spectrum/inventories/package-info.java index 02696ac791..524dd3efa4 100644 --- a/src/main/java/de/dafuqs/spectrum/inventories/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/inventories/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.inventories; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/inventories/slots/ColorPickerInputSlot.java b/src/main/java/de/dafuqs/spectrum/inventories/slots/ColorPickerInputSlot.java index d69bb7313b..3651b13c4e 100644 --- a/src/main/java/de/dafuqs/spectrum/inventories/slots/ColorPickerInputSlot.java +++ b/src/main/java/de/dafuqs/spectrum/inventories/slots/ColorPickerInputSlot.java @@ -1,6 +1,6 @@ package de.dafuqs.spectrum.inventories.slots; -import de.dafuqs.spectrum.recipe.color_picker.InkConvertingRecipe; +import de.dafuqs.spectrum.recipe.color_picker.*; import net.minecraft.world.*; import net.minecraft.world.inventory.*; import net.minecraft.world.item.*; diff --git a/src/main/java/de/dafuqs/spectrum/inventories/slots/ExtractOnlySlot.java b/src/main/java/de/dafuqs/spectrum/inventories/slots/ExtractOnlySlot.java index 37a80d89c7..c4247f7b7b 100644 --- a/src/main/java/de/dafuqs/spectrum/inventories/slots/ExtractOnlySlot.java +++ b/src/main/java/de/dafuqs/spectrum/inventories/slots/ExtractOnlySlot.java @@ -1,7 +1,6 @@ package de.dafuqs.spectrum.inventories.slots; import net.minecraft.world.*; -import net.minecraft.world.entity.player.*; import net.minecraft.world.inventory.*; import net.minecraft.world.item.*; diff --git a/src/main/java/de/dafuqs/spectrum/inventories/slots/InkInputSlot.java b/src/main/java/de/dafuqs/spectrum/inventories/slots/InkInputSlot.java index 6cda311980..b911054e2b 100644 --- a/src/main/java/de/dafuqs/spectrum/inventories/slots/InkInputSlot.java +++ b/src/main/java/de/dafuqs/spectrum/inventories/slots/InkInputSlot.java @@ -1,6 +1,6 @@ package de.dafuqs.spectrum.inventories.slots; -import de.dafuqs.spectrum.api.energy.*; +import de.dafuqs.spectrum.api.ink.capability.*; import net.minecraft.world.*; import net.minecraft.world.inventory.*; import net.minecraft.world.item.*; @@ -13,9 +13,9 @@ public InkInputSlot(Container inventory, int index, int x, int y) { @Override public boolean mayPlace(ItemStack stack) { - return super.mayPlace(stack) - && stack.getItem() instanceof InkStorageItem inkStorageItem - && (inkStorageItem.getDrainability() == InkStorageItem.Drainability.ALWAYS || inkStorageItem.getDrainability() == InkStorageItem.Drainability.MACHINE_ONLY); + InkCapability inkCapability = InkCapabilities.ITEM.getCapability(stack, null); + if(inkCapability == null) return false; + return super.mayPlace(stack); } } diff --git a/src/main/java/de/dafuqs/spectrum/inventories/slots/InkStorageSlot.java b/src/main/java/de/dafuqs/spectrum/inventories/slots/InkStorageSlot.java index 175dccc808..ca26a38170 100644 --- a/src/main/java/de/dafuqs/spectrum/inventories/slots/InkStorageSlot.java +++ b/src/main/java/de/dafuqs/spectrum/inventories/slots/InkStorageSlot.java @@ -1,6 +1,6 @@ package de.dafuqs.spectrum.inventories.slots; -import de.dafuqs.spectrum.api.energy.*; +import de.dafuqs.spectrum.api.ink.storage.*; import net.minecraft.world.*; import net.minecraft.world.inventory.*; import net.minecraft.world.item.*; diff --git a/src/main/java/de/dafuqs/spectrum/inventories/slots/PedestalPreviewSlot.java b/src/main/java/de/dafuqs/spectrum/inventories/slots/PedestalPreviewSlot.java index 0775c789d7..2275640972 100644 --- a/src/main/java/de/dafuqs/spectrum/inventories/slots/PedestalPreviewSlot.java +++ b/src/main/java/de/dafuqs/spectrum/inventories/slots/PedestalPreviewSlot.java @@ -8,7 +8,6 @@ import net.minecraft.world.entity.player.*; import net.minecraft.world.inventory.*; import net.minecraft.world.item.*; -import javax.annotation.*; public class PedestalPreviewSlot extends NonInteractiveResultSlot implements SlotWithOnClickAction { public PedestalPreviewSlot(Container inventory, int index, int x, int y) { diff --git a/src/main/java/de/dafuqs/spectrum/inventories/slots/package-info.java b/src/main/java/de/dafuqs/spectrum/inventories/slots/package-info.java index d77a40f75b..94bd9cf391 100644 --- a/src/main/java/de/dafuqs/spectrum/inventories/slots/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/inventories/slots/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.inventories.slots; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/inventories/widgets/ColorSelectionWidget.java b/src/main/java/de/dafuqs/spectrum/inventories/widgets/ColorSelectionWidget.java index 4c1881ffd4..ac4b05bddf 100644 --- a/src/main/java/de/dafuqs/spectrum/inventories/widgets/ColorSelectionWidget.java +++ b/src/main/java/de/dafuqs/spectrum/inventories/widgets/ColorSelectionWidget.java @@ -1,18 +1,19 @@ package de.dafuqs.spectrum.inventories.widgets; import de.dafuqs.revelationary.api.advancements.*; -import de.dafuqs.spectrum.api.energy.color.*; -import de.dafuqs.spectrum.blocks.energy.*; +import de.dafuqs.spectrum.*; +import de.dafuqs.spectrum.api.ink.color.*; +import de.dafuqs.spectrum.blocks.ink.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.client.*; import net.minecraft.client.gui.*; import net.minecraft.client.gui.components.*; import net.minecraft.client.gui.narration.*; -import net.minecraft.client.gui.screens.*; import net.minecraft.core.*; import net.minecraft.network.chat.*; +import net.minecraft.resources.*; import net.minecraft.util.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; import java.util.function.*; @@ -22,27 +23,28 @@ public class ColorSelectionWidget extends AbstractWidget { - protected final ColorPickerBlockEntity colorPicker; + protected static final ResourceLocation LARGE_SPRITE = SpectrumCommon.locate("widget/color_selection_16"); + protected static final ResourceLocation SINGLE_SPRITE = SpectrumCommon.locate("widget/color_selection_1"); + + protected final BaseInkBlockEntity blockEntity; @Nullable private Consumer>> changedListener; - protected final Screen screen; final List> usableColors = new ArrayList<>(); // stores if a certain color should be displayed - final int selectedDotX; - final int selectedDotY; + final int selectedIndexX; + final int selectedIndexY; - public ColorSelectionWidget(int x, int y, int selectedDotX, int selectedDotY, Screen screen, ColorPickerBlockEntity colorPicker) { - this(x, y, selectedDotX, selectedDotY, screen, colorPicker, InkColors.BUILTIN_COLORS); + public ColorSelectionWidget(int x, int y, int selectedIndexX, int selectedIndexY, BaseInkBlockEntity blockEntity) { + this(x, y, selectedIndexX, selectedIndexY, blockEntity, blockEntity.getInkStorage().acceptedColors()); } - public ColorSelectionWidget(int x, int y, int selectedDotX, int selectedDotY, Screen screen, ColorPickerBlockEntity colorPicker, List availableColors) { + public ColorSelectionWidget(int x, int y, int selectedIndexX, int selectedIndexY, BaseInkBlockEntity blockEntity, Iterable availableColors) { super(x, y, 56, 14, Component.literal("")); - this.colorPicker = colorPicker; - this.selectedDotX = selectedDotX; - this.selectedDotY = selectedDotY; - this.screen = screen; + this.blockEntity = blockEntity; + this.selectedIndexX = selectedIndexX; + this.selectedIndexY = selectedIndexY; for (InkColor inkColor : availableColors) { usableColors.add(new Tuple<>(inkColor, AdvancementHelper.hasAdvancementClient(inkColor.getRequiredAdvancement()))); @@ -59,8 +61,16 @@ private void onChanged(Optional> newColor) { } } + @Override + public boolean isMouseOver(double mouseX, double mouseY) { + return super.isMouseOver(mouseX, mouseY) || (this.active && this.visible && isUnselection(mouseX, mouseY)); + } + @Override protected void renderWidget(GuiGraphics context, int mouseX, int mouseY, float delta) { + context.blitSprite(LARGE_SPRITE, this.getX(), this.getY(), 56, 14); + context.blitSprite(SINGLE_SPRITE, selectedIndexX - 1, selectedIndexY - 1, 6, 6); + // draw selection icons int i = -1; int currentX = this.getX() + 1; @@ -77,8 +87,7 @@ protected void renderWidget(GuiGraphics context, int mouseX, int mouseY, float d } } - // draw currently selected icon - this.colorPicker.getSelectedColor().ifPresent(inkColor -> fillQuad(context.pose(), selectedDotX, selectedDotY, 4, 4, inkColor.value().getColorVec())); + this.blockEntity.getSelectedColor().ifPresent(inkColor -> fillQuad(context.pose(), selectedIndexX, selectedIndexY, 4, 4, inkColor.value().getColorVec())); } @Override @@ -119,17 +128,12 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) { protected void updateWidgetNarration(NarrationElementOutput builder) { } private boolean isUnselection(double mouseX, double mouseY) { - return mouseX >= (double) selectedDotX && mouseX < (double) (selectedDotX + 4) && mouseY >= (double) selectedDotY && mouseY < (double) (selectedDotY + 4); - } - - public boolean isMouseOver(double mouseX, double mouseY) { - return super.isMouseOver(mouseX, mouseY) || (this.active && this.visible && isUnselection(mouseX, mouseY)); + return mouseX >= (double) selectedIndexX && mouseX < (double) (selectedIndexX + 4) && mouseY >= (double) selectedIndexY && mouseY < (double) (selectedIndexY + 4); } public void drawMouseoverTooltip(GuiGraphics drawContext, int mouseX, int mouseY) { Minecraft client = Minecraft.getInstance(); - boolean overUnselection = mouseX >= (double) selectedDotX && mouseX < (double) (selectedDotX + 4) && mouseY >= (double) selectedDotY && mouseY < (double) (selectedDotY + 4); - if (overUnselection) { + if (isUnselection(mouseX, mouseY)) { drawContext.renderTooltip(client.font, List.of(Component.translatable("spectrum.tooltip.ink_powered.unselect_color")), Optional.empty(), getX(), getY()); } else { int xOffset = Mth.floor(mouseX) - this.getX(); @@ -139,6 +143,10 @@ public void drawMouseoverTooltip(GuiGraphics drawContext, int mouseX, int mouseY int verticalColorOffset = yOffset / 7; int newColorIndex = horizontalColorOffset + verticalColorOffset * 8; + if(newColorIndex < 0 || newColorIndex >= usableColors.size()) { + return; + } + var hoveredColor = usableColors.get(newColorIndex); if (hoveredColor.getB()) { drawContext.renderTooltip(client.font, List.of(hoveredColor.getA().getName()), Optional.empty(), getX(), getY()); @@ -147,4 +155,5 @@ public void drawMouseoverTooltip(GuiGraphics drawContext, int mouseX, int mouseY } } } + } diff --git a/src/main/java/de/dafuqs/spectrum/inventories/widgets/InkGaugeWidget.java b/src/main/java/de/dafuqs/spectrum/inventories/widgets/InkGaugeWidget.java deleted file mode 100644 index f983d24b76..0000000000 --- a/src/main/java/de/dafuqs/spectrum/inventories/widgets/InkGaugeWidget.java +++ /dev/null @@ -1,131 +0,0 @@ -package de.dafuqs.spectrum.inventories.widgets; - -import de.dafuqs.spectrum.api.energy.*; -import de.dafuqs.spectrum.api.energy.color.*; -import de.dafuqs.spectrum.helpers.*; -import net.minecraft.client.*; -import net.minecraft.client.gui.*; -import net.minecraft.client.gui.components.*; -import net.minecraft.client.gui.components.events.*; -import net.minecraft.client.gui.narration.*; -import net.minecraft.client.gui.screens.*; -import net.minecraft.network.chat.*; - -import java.util.*; - - -public class InkGaugeWidget implements Renderable, GuiEventListener, NarratableEntry { - - public final int x; - public final int y; - public final int width; - public final int height; - protected boolean focused; - protected boolean hovered; - - protected final Screen screen; - protected final InkStorageBlockEntity blockEntity; - - public InkGaugeWidget(int x, int y, int width, int height, Screen screen, InkStorageBlockEntity blockEntity) { - this.x = x; - this.y = y; - this.width = width; - this.height = height; - - this.screen = screen; - this.blockEntity = blockEntity; - } - - @Override - public boolean isMouseOver(double mouseX, double mouseY) { - return mouseX >= (double) this.x && mouseX < (double) (this.x + this.width) && mouseY >= (double) this.y && mouseY < (double) (this.y + this.height); - } - - @Override - public void setFocused(boolean focused) { - this.focused = focused; - } - - @Override - public boolean isFocused() { - return focused; - } - - @Override - public void render(GuiGraphics drawContext, int mouseX, int mouseY, float delta) { - this.hovered = mouseX >= this.x && mouseY >= this.y && mouseX < this.x + this.width && mouseY < this.y + this.height; - } - - @Override - public NarrationPriority narrationPriority() { - return this.hovered ? NarrationPriority.HOVERED : NarrationPriority.NONE; - } - - @Override - public void updateNarration(NarrationElementOutput builder) { - - } - - public void drawMouseoverTooltip(GuiGraphics drawContext, int x, int y) { - Minecraft client = Minecraft.getInstance(); - List tooltip = new ArrayList<>(); - for (InkColor color : InkColors.all()) { - long amount = blockEntity.getEnergyStorage().getEnergy(color); - if (amount > 0) { - InkStorage.addInkStoreBulletTooltip(tooltip, color, amount); - } - } - if (tooltip.isEmpty()) { - tooltip.add(Component.translatable("spectrum.tooltip.ink_powered.empty")); - } else { - tooltip.add(0, Component.translatable("spectrum.tooltip.ink_powered.stored")); - } - drawContext.renderTooltip(client.font, tooltip, Optional.empty(), x, y); - } - - public void draw(GuiGraphics drawContext) { - long totalInk = blockEntity.getEnergyStorage().getCurrentTotal(); - - if (totalInk > 0) { - int centerX = x + width / 2; - int centerY = y + width / 2; - int radius = 22; - - double startRad = -0.5 * Math.PI; - for (InkColor color : InkColors.all()) { - long currentInk = blockEntity.getEnergyStorage().getEnergy(color); - if (currentInk > 0) { - double thisPart = ((double) currentInk / (double) totalInk); - while (thisPart > 0) { - double curr = Math.min(0.20, thisPart); - thisPart -= curr; - - double endRad = startRad + curr * 2 * Math.PI; - - int p2x = (int) (radius * Math.cos(startRad)); - int p2y = (int) (radius * Math.sin(startRad)); - int p3x = (int) (radius * Math.cos(endRad)); - int p3y = (int) (radius * Math.sin(endRad)); - - RenderHelper.fillTriangle(drawContext.pose(), - centerX, centerY, // center point - centerX + p3x, centerY + p3y, // end point - centerX + p2x, centerY + p2y, // start point - color.getColorVec()); - - double middleRad = startRad + curr * Math.PI; - int pmx = (int) (radius * Math.cos(middleRad)); - int pmy = (int) (radius * Math.sin(middleRad)); - RenderHelper.fillTriangle(drawContext.pose(), - centerX + p3x, centerY + p3y, - centerX + pmx, centerY + pmy, - centerX + p2x, centerY + p2y, - color.getColorVec()); - - startRad = endRad; - } - } - } - } - } -} diff --git a/src/main/java/de/dafuqs/spectrum/inventories/widgets/InkMeterWidget.java b/src/main/java/de/dafuqs/spectrum/inventories/widgets/InkMeterWidget.java deleted file mode 100644 index 9744ba7538..0000000000 --- a/src/main/java/de/dafuqs/spectrum/inventories/widgets/InkMeterWidget.java +++ /dev/null @@ -1,96 +0,0 @@ -package de.dafuqs.spectrum.inventories.widgets; - -import de.dafuqs.spectrum.api.energy.*; -import de.dafuqs.spectrum.api.energy.color.*; -import de.dafuqs.spectrum.api.energy.storage.*; -import de.dafuqs.spectrum.helpers.*; -import net.minecraft.client.*; -import net.minecraft.client.gui.*; -import net.minecraft.client.gui.components.*; -import net.minecraft.client.gui.components.events.*; -import net.minecraft.client.gui.narration.*; -import net.minecraft.client.gui.screens.*; -import net.minecraft.network.chat.*; - -import java.util.*; - - -public class InkMeterWidget implements Renderable, GuiEventListener, NarratableEntry { - - public static final int WIDTH_PER_COLOR = 4; - public static final int SPACE_BETWEEN_COLORS = 2; - - public final int x; - public final int y; - public final int width; - public final int height; - protected boolean hovered; - protected boolean focused; - - protected final Screen screen; - protected final InkStorageBlockEntity inkStorageBlockEntity; - - public InkMeterWidget(int x, int y, int height, Screen screen, InkStorageBlockEntity inkStorageBlockEntity) { - this.x = x; - this.y = y; - this.width = inkStorageBlockEntity.getEnergyStorage().getSupportedColors().size() * (WIDTH_PER_COLOR + SPACE_BETWEEN_COLORS) - SPACE_BETWEEN_COLORS; - this.height = height; - - this.screen = screen; - this.inkStorageBlockEntity = inkStorageBlockEntity; - } - - @Override - public boolean isMouseOver(double mouseX, double mouseY) { - return mouseX >= (double) this.x && mouseX < (double) (this.x + this.width) && mouseY >= (double) this.y && mouseY < (double) (this.y + this.height); - } - - @Override - public void setFocused(boolean focused) { - this.focused = focused; - } - - @Override - public boolean isFocused() { - return focused; - } - - @Override - public NarrationPriority narrationPriority() { - return this.hovered ? NarrationPriority.HOVERED : NarrationPriority.NONE; - } - - @Override - public void updateNarration(NarrationElementOutput builder) { - - } - - public void drawMouseoverTooltip(GuiGraphics drawContext, int x, int y) { - Minecraft client = Minecraft.getInstance(); - List tooltip = new ArrayList<>(); - inkStorageBlockEntity.getEnergyStorage().addTooltip(tooltip); - drawContext.renderTooltip(client.font, tooltip, Optional.empty(), x, y); - } - - public void draw(GuiGraphics drawContext, List colors) { - int startHeight = this.y + this.height; - int currentXOffset = 0; - - IndividualCappedInkStorage inkStorage = inkStorageBlockEntity.getEnergyStorage(); - long total = inkStorage.getMaxPerColor(); - for (InkColor color : colors) { - long amount = inkStorage.getEnergy(color); - if (amount > 0) { - int height = Math.max(1, Math.round(((float) amount / ((float) total / this.height)))); - RenderHelper.fillQuad(drawContext.pose(), this.x + currentXOffset, startHeight - height, height, WIDTH_PER_COLOR, color.getColorVec()); - } - currentXOffset = currentXOffset + WIDTH_PER_COLOR + SPACE_BETWEEN_COLORS; - } - } - - @Override - public void render(GuiGraphics drawContext, int mouseX, int mouseY, float delta) { - this.hovered = mouseX >= this.x && mouseY >= this.y && mouseX < this.x + this.width && mouseY < this.y + this.height; - } - -} diff --git a/src/main/java/de/dafuqs/spectrum/inventories/widgets/StackedInkMeterWidget.java b/src/main/java/de/dafuqs/spectrum/inventories/widgets/StackedInkMeterWidget.java deleted file mode 100644 index e607cec9c6..0000000000 --- a/src/main/java/de/dafuqs/spectrum/inventories/widgets/StackedInkMeterWidget.java +++ /dev/null @@ -1,100 +0,0 @@ -package de.dafuqs.spectrum.inventories.widgets; - -import de.dafuqs.spectrum.api.energy.*; -import de.dafuqs.spectrum.api.energy.color.*; -import de.dafuqs.spectrum.helpers.*; -import net.minecraft.client.*; -import net.minecraft.client.gui.*; -import net.minecraft.client.gui.components.*; -import net.minecraft.client.gui.components.events.*; -import net.minecraft.client.gui.narration.*; -import net.minecraft.client.gui.screens.*; -import net.minecraft.network.chat.*; - -import java.util.*; - - -public class StackedInkMeterWidget implements Renderable, GuiEventListener, NarratableEntry { - - public final int x; - public final int y; - public final int width; - public final int height; - protected boolean hovered; - protected boolean focused; - - protected final Screen screen; - protected final InkStorageBlockEntity blockEntity; - - public StackedInkMeterWidget(int x, int y, int width, int height, Screen screen, InkStorageBlockEntity blockEntity) { - this.x = x; - this.y = y; - this.width = width; - this.height = height; - - this.screen = screen; - this.blockEntity = blockEntity; - } - - @Override - public boolean isMouseOver(double mouseX, double mouseY) { - return mouseX >= (double) this.x && mouseX < (double) (this.x + this.width) && mouseY >= (double) this.y && mouseY < (double) (this.y + this.height); - } - - @Override - public void setFocused(boolean focused) { - this.focused = focused; - } - - @Override - public boolean isFocused() { - return focused; - } - - @Override - public void render(GuiGraphics drawContext, int mouseX, int mouseY, float delta) { - this.hovered = mouseX >= this.x && mouseY >= this.y && mouseX < this.x + this.width && mouseY < this.y + this.height; - } - - @Override - public NarrationPriority narrationPriority() { - return this.hovered ? NarrationPriority.HOVERED : NarrationPriority.NONE; - } - - @Override - public void updateNarration(NarrationElementOutput builder) { - - } - - public void drawMouseoverTooltip(GuiGraphics drawContext, int x, int y) { - Minecraft client = Minecraft.getInstance(); - InkStorage inkStorage = this.blockEntity.getEnergyStorage(); - long currentTotal = inkStorage.getCurrentTotal(); - String readableCurrentTotalString = Support.getShortenedNumberString(currentTotal); - String percent = Support.getSensiblePercentString(inkStorage.getCurrentTotal(), (inkStorage.getMaxTotal())); - drawContext.renderTooltip(client.font, List.of(Component.translatable("spectrum.tooltip.ink_powered.percent_filled", readableCurrentTotalString, percent)), - Optional.empty(), x, y); - } - - public void draw(GuiGraphics drawContext) { - InkStorage inkStorage = this.blockEntity.getEnergyStorage(); - long currentTotal = inkStorage.getCurrentTotal(); - - if (currentTotal > 0) { - long maxTotal = inkStorage.getMaxTotal(); - - int currentHeight = this.y + this.height; - for (InkColor color : InkColors.all()) { - long amount = inkStorage.getEnergy(color); - if (amount > 0) { - int height = Math.round(((float) amount / (float) maxTotal * this.height)); - if (height > 0) { - RenderHelper.fillQuad(drawContext.pose(), this.x, currentHeight - height, height, this.width, color.getColorVec()); - } - currentHeight -= height; - } - } - } - } - -} diff --git a/src/main/java/de/dafuqs/spectrum/inventories/widgets/ink/InkListWidget.java b/src/main/java/de/dafuqs/spectrum/inventories/widgets/ink/InkListWidget.java new file mode 100644 index 0000000000..322c745dab --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/inventories/widgets/ink/InkListWidget.java @@ -0,0 +1,73 @@ +package de.dafuqs.spectrum.inventories.widgets.ink; + +import de.dafuqs.spectrum.api.ink.capability.*; +import de.dafuqs.spectrum.api.ink.color.*; +import de.dafuqs.spectrum.api.ink.storage.*; +import de.dafuqs.spectrum.helpers.*; +import net.minecraft.client.gui.*; +import net.minecraft.client.gui.components.*; +import net.minecraft.client.gui.narration.*; +import net.minecraft.network.chat.*; +import org.jspecify.annotations.*; + +import java.util.*; +import java.util.function.*; + +public class InkListWidget extends AbstractWidget { + + protected static final int CHART_HEIGHT = 40; + protected final int widthPerColor; + protected final int spaceBetweenColors; + protected final Collection colors; + protected final Supplier inkCapability; + + public InkListWidget(int x, int y, Supplier inkCapability) { + this(x, y, inkCapability, 4, 2); + } + + public InkListWidget(int x, int y, Supplier inkCapability, Collection colors) { + this(x, y, inkCapability, 4, 2, colors); + } + + public InkListWidget(int x, int y, Supplier inkCapability, int widthPerColor, int spaceBetweenColors) { + this(x, y, inkCapability, widthPerColor, spaceBetweenColors, inkCapability.get().getStorage().acceptedColors()); + } + + public InkListWidget(int x, int y, Supplier inkCapability, int widthPerColor, int spaceBetweenColors, Collection colors) { + super(x, y, colors.size() * (widthPerColor + spaceBetweenColors) - spaceBetweenColors, CHART_HEIGHT, Component.empty()); + this.widthPerColor = widthPerColor; + this.spaceBetweenColors = spaceBetweenColors; + this.inkCapability = inkCapability; + this.colors = colors; + } + + @Override + protected void updateWidgetNarration(NarrationElementOutput narrationElementOutput) { + + } + + @Override + protected void renderWidget(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { + InkStorage inkStorage = inkCapability.get().getStorage(); + drawLines(guiGraphics, inkStorage, colors, getX(), getY()); + } + + protected void drawLines(GuiGraphics guiGraphics, InkStorage inkStorage, Collection colors, int x, int y) { + long maxPerColor = inkStorage.getMaxPerColor(); + int currentX = x; + for (InkColor color : colors) { + long amount = inkStorage.getEnergy(color); + if (amount > 0) { + int h = Math.max(1, (int) Math.floor(((float) amount / ((float) maxPerColor / CHART_HEIGHT)))); + RenderHelper.fillQuad(guiGraphics.pose(), currentX, y + CHART_HEIGHT - h, h, widthPerColor, color.getColorVec()); + } + currentX = currentX + widthPerColor + spaceBetweenColors; + } + } + + @Nullable + public Tooltip getTooltip() { + return inkCapability.get().getStorage().getWidgetTooltip(); + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/inventories/widgets/ink/InkListWidgetWithBorderAndTitle.java b/src/main/java/de/dafuqs/spectrum/inventories/widgets/ink/InkListWidgetWithBorderAndTitle.java new file mode 100644 index 0000000000..e8bcc99f7b --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/inventories/widgets/ink/InkListWidgetWithBorderAndTitle.java @@ -0,0 +1,55 @@ +package de.dafuqs.spectrum.inventories.widgets.ink; + +import de.dafuqs.spectrum.*; +import de.dafuqs.spectrum.api.ink.capability.*; +import de.dafuqs.spectrum.api.ink.color.*; +import de.dafuqs.spectrum.api.ink.storage.*; +import de.dafuqs.spectrum.helpers.*; +import net.minecraft.client.gui.*; +import net.minecraft.resources.*; +import net.minecraft.util.*; + +import java.util.*; +import java.util.function.*; + +public class InkListWidgetWithBorderAndTitle extends InkListWidget { + + protected static final ResourceLocation BACKGROUND_SPRITE = SpectrumCommon.locate("widget/ink_list"); + protected static final ResourceLocation INK_SPRITE = SpectrumCommon.locate("widget/ink_text"); + protected static final int TITLE_HEIGHT = 18; + protected static final int PADDING = 5; + + public InkListWidgetWithBorderAndTitle(int x, int y, Supplier inkCapability) { + super(x, y, inkCapability, 4, 1); + } + + @Override + protected void renderWidget(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { + // We first collect the colors we need to draw + // this widget does skip ink colors that the player has no access to yet + InkStorage inkStorage = inkCapability.get().getStorage(); + List inkColorAmountsOverZero = new ArrayList<>(); + for (InkColor color : colors) { + long amount = inkStorage.getEnergy(color); + if(amount > 0) { + inkColorAmountsOverZero.add(color); + } + } + + int prevWidth = getWidth(); + int newWidth = Math.max(45, inkColorAmountsOverZero.size() * (widthPerColor + spaceBetweenColors)); + setWidth(newWidth); + setX(getX() + prevWidth - newWidth); + + // background and title + // we exceed the widgets size here so the mouseover still only shows up when hovering the gauges + guiGraphics.blitSprite(BACKGROUND_SPRITE, this.getX() - PADDING, this.getY() - PADDING - TITLE_HEIGHT, this.getWidth() + PADDING, this.getHeight() + TITLE_HEIGHT + PADDING + PADDING); + guiGraphics.blitSprite(INK_SPRITE, this.getX() - PADDING + 4, this.getY() - PADDING - 12, 40, 14); + + // foreground bars + int x = getX(); + int y = getY(); + drawLines(guiGraphics, inkStorage, inkColorAmountsOverZero, x, y); + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/inventories/widgets/ink/InkPieWidget.java b/src/main/java/de/dafuqs/spectrum/inventories/widgets/ink/InkPieWidget.java new file mode 100644 index 0000000000..77500f2edb --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/inventories/widgets/ink/InkPieWidget.java @@ -0,0 +1,110 @@ +package de.dafuqs.spectrum.inventories.widgets.ink; + +import de.dafuqs.spectrum.*; +import de.dafuqs.spectrum.api.ink.capability.*; +import de.dafuqs.spectrum.api.ink.color.*; +import de.dafuqs.spectrum.api.ink.storage.*; +import de.dafuqs.spectrum.helpers.*; +import net.minecraft.client.*; +import net.minecraft.client.gui.*; +import net.minecraft.client.gui.components.*; +import net.minecraft.client.gui.narration.*; +import net.minecraft.network.chat.*; +import net.minecraft.resources.*; +import org.jspecify.annotations.*; + +import java.util.function.*; + + +public class InkPieWidget extends AbstractWidget { + + public static final double TICKS_PER_ROTATION = 400D; + + protected static final ResourceLocation BACKGROUND_SPRITE = SpectrumCommon.locate("widget/ink_pie_background"); + protected static final ResourceLocation FOREGROUND_SPRITE = SpectrumCommon.locate("widget/ink_pie_foreground"); + protected static final ResourceLocation FOREGROUND_SPRITE_THICK = SpectrumCommon.locate("widget/ink_pie_foreground_thick"); + + protected final Supplier inkCapability; + protected boolean thickOutline; + + public InkPieWidget(int x, int y, Supplier inkCapability) { + super(x, y, 42, 42, Component.empty()); + this.inkCapability = inkCapability; + } + + public InkPieWidget setThickOutline() { + this.thickOutline = true; + return this; + } + + @Override + protected void renderWidget(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { + guiGraphics.blitSprite(BACKGROUND_SPRITE, this.getX(), this.getY(), 42, 42); + + InkStorage inkStorage = inkCapability.get().getStorage(); + long currentTotal = inkStorage.getCurrentTotal(); + if (currentTotal <= 0) return; + + int centerX = getX() + width / 2; + int centerY = getY() + width / 2; + int radius = 20; + + // --- Smooth, double-precision rotation source --- + double time = Minecraft.getInstance().level.getGameTime(); + double base = time % TICKS_PER_ROTATION; + double startRad = -(base / TICKS_PER_ROTATION) * Math.PI; + + for (InkColor color : InkColors.all()) { + long currentInk = inkStorage.getEnergy(color); + if (currentInk <= 0) continue; + + double remaining = (double) currentInk / (double) currentTotal; + + while (remaining > 0.0) { + double curr = Math.min(0.20, remaining); + remaining -= curr; + + double endRad = startRad + curr * 2.0 * Math.PI; + float p2x = (float) (radius * Math.cos(startRad)); + float p2y = (float) (radius * Math.sin(startRad)); + float p3x = (float) (radius * Math.cos(endRad)); + float p3y = (float) (radius * Math.sin(endRad)); + + RenderHelper.fillTriangle(guiGraphics.pose(), + centerX, centerY, + centerX + p3x, centerY + p3y, + centerX + p2x, centerY + p2y, + color.getColorVec()); + + double middleRad = startRad + curr * Math.PI; + float pmx = (float) (radius * Math.cos(middleRad)); + float pmy = (float) (radius * Math.sin(middleRad)); + + RenderHelper.fillTriangle(guiGraphics.pose(), + centerX + p3x, centerY + p3y, + centerX + pmx, centerY + pmy, + centerX + p2x, centerY + p2y, + color.getColorVec()); + + startRad = endRad; + } + } + + if(thickOutline) { + guiGraphics.blitSprite(FOREGROUND_SPRITE_THICK, this.getX() - 1, this.getY() - 1, 44, 44); + } else { + guiGraphics.blitSprite(FOREGROUND_SPRITE, this.getX(), this.getY(), 42, 42); + } + } + + @Nullable + public Tooltip getTooltip() { + return inkCapability.get().getStorage().getWidgetTooltip(); + } + + @Override + protected void updateWidgetNarration(NarrationElementOutput narrationElementOutput) { + + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/inventories/widgets/ink/StackedInkBarWidget.java b/src/main/java/de/dafuqs/spectrum/inventories/widgets/ink/StackedInkBarWidget.java new file mode 100644 index 0000000000..6a04006282 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/inventories/widgets/ink/StackedInkBarWidget.java @@ -0,0 +1,78 @@ +package de.dafuqs.spectrum.inventories.widgets.ink; + +import de.dafuqs.spectrum.*; +import de.dafuqs.spectrum.api.ink.capability.*; +import de.dafuqs.spectrum.api.ink.color.*; +import de.dafuqs.spectrum.api.ink.storage.*; +import de.dafuqs.spectrum.helpers.*; +import net.minecraft.client.gui.*; +import net.minecraft.client.gui.components.*; +import net.minecraft.client.gui.narration.*; +import net.minecraft.network.chat.*; +import net.minecraft.resources.*; +import org.jspecify.annotations.*; + +import java.util.function.*; + + +public class StackedInkBarWidget extends AbstractWidget { + + protected static final ResourceLocation BACKGROUND_SPRITE = SpectrumCommon.locate("widget/stacked_ink_bar"); + protected static final ResourceLocation BACKGROUND_SPRITE_THICK = SpectrumCommon.locate("widget/stacked_ink_bar_thick"); + + protected final Supplier inkCapability; + protected boolean thickOutline; + + public StackedInkBarWidget(int x, int y, Supplier inkCapability) { + super(x, y, 6, 42, Component.empty()); + this.inkCapability = inkCapability; + } + + public StackedInkBarWidget setThickOutline() { + this.thickOutline = true; + return this; + } + + @Override + protected void renderWidget(GuiGraphics guiGraphics, int mouseX, int mouseY, float delta) { + if(thickOutline) { + guiGraphics.blitSprite(BACKGROUND_SPRITE_THICK, this.getX() - 1, this.getY() - 1, 8, 44); + } else { + guiGraphics.blitSprite(BACKGROUND_SPRITE, this.getX(), this.getY(), 6, 42); + } + + InkStorage inkStorage = inkCapability.get().getStorage(); + if (inkStorage.getCurrentTotal() <= 0) { + return; + } + + long maxTotal = inkStorage.getMaxTotal(); + + // drawn from bottom to top + int currentHeight = getY() + getHeight() - 1; + for (InkColor color : InkColors.all()) { + long amount = inkStorage.getEnergy(color); + if (amount > 0) { + int height = Math.round(((float) amount / (float) maxTotal * getHeight())); + if (height > 0) { + RenderHelper.fillQuad(guiGraphics.pose(), getX() + 1, currentHeight - height, height, getWidth() - 2, color.getColorVec()); + } + currentHeight -= height; + } + } + } + + @Override + protected void updateWidgetNarration(NarrationElementOutput narrationElementOutput) { + + } + + @Nullable + public Tooltip getTooltip() { + InkStorage inkStorage = inkCapability.get().getStorage(); + String readableCurrentTotalString = Support.getShortenedNumberString(inkStorage.getCurrentTotal()); + String percent = Support.getSensiblePercentString(inkStorage.getCurrentTotal(), (inkStorage.getMaxTotal())); + return Tooltip.create(Component.translatable("spectrum.tooltip.ink_powered.percent_filled", readableCurrentTotalString, percent)); + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/inventories/widgets/ink/package-info.java b/src/main/java/de/dafuqs/spectrum/inventories/widgets/ink/package-info.java new file mode 100644 index 0000000000..ca47539c2e --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/inventories/widgets/ink/package-info.java @@ -0,0 +1,7 @@ +@NullMarked +@MethodsReturnNonnullByDefault +@FieldsAreNonnullByDefault +package de.dafuqs.spectrum.inventories.widgets.ink; + +import net.minecraft.*; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/inventories/widgets/package-info.java b/src/main/java/de/dafuqs/spectrum/inventories/widgets/package-info.java index 2781b3d3e5..65702bee92 100644 --- a/src/main/java/de/dafuqs/spectrum/inventories/widgets/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/inventories/widgets/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.inventories.widgets; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/ConcealingOilsItem.java b/src/main/java/de/dafuqs/spectrum/items/ConcealingOilsItem.java index 6e006de9bf..796d8a660b 100644 --- a/src/main/java/de/dafuqs/spectrum/items/ConcealingOilsItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/ConcealingOilsItem.java @@ -1,8 +1,8 @@ package de.dafuqs.spectrum.items; -import de.dafuqs.spectrum.api.energy.*; +import de.dafuqs.spectrum.api.ink.*; import de.dafuqs.spectrum.api.item.*; -import de.dafuqs.spectrum.items.food.*; +import de.dafuqs.spectrum.components.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.*; import net.minecraft.core.component.*; @@ -28,7 +28,7 @@ public ConcealingOilsItem(Properties settings) { @Override public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip, TooltipFlag type) { - if (!InkPoweredPotionFillable.getEffects(stack).isEmpty()) { + if (!InkPoweredPotionContentsComponent.getEffects(stack).isEmpty()) { tooltip.add(Component.translatable("item.spectrum.concealing_oils.tooltip").withStyle(s -> s.applyFormat(ChatFormatting.GRAY).withItalic(true))); } appendPotionFillableTooltip(stack, tooltip, Component.translatable("item.spectrum.concealing_oils.when_poisoned"), true, context.tickRate()); @@ -58,9 +58,9 @@ public boolean overrideStackedOnOther(ItemStack oilsStack, Slot slot, ClickActio return false; } - InkPoweredStatusEffectInstance effect = InkPoweredPotionFillable.getEffects(oilsStack).getFirst(); + InkPoweredMobEffectInstance effect = InkPoweredPotionContentsComponent.getEffects(oilsStack).getFirst(); if (InkPowered.tryDrainEnergy(player, effect.getInkCost().color(), effect.getInkCost().amount())) { - stackToApplyTo.set(SpectrumDataComponentTypes.CONCEALED_EFFECT, effect.getStatusEffectInstance()); + stackToApplyTo.set(SpectrumDataComponentTypes.CONCEALED_EFFECT, effect.getFreshStatusEffectInstance()); stackToApplyTo.set(SpectrumDataComponentTypes.CONCEALED_EFFECT_PROFILE, new ResolvableProfile(player.getGameProfile())); if (!player.getAbilities().instabuild) { diff --git a/src/main/java/de/dafuqs/spectrum/items/CookbookItem.java b/src/main/java/de/dafuqs/spectrum/items/CookbookItem.java index c5f748a7ef..332936172a 100644 --- a/src/main/java/de/dafuqs/spectrum/items/CookbookItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/CookbookItem.java @@ -1,7 +1,6 @@ package de.dafuqs.spectrum.items; import com.klikli_dev.modonomicon.client.gui.book.*; -import de.dafuqs.spectrum.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.*; import net.minecraft.network.chat.*; @@ -10,7 +9,6 @@ import net.minecraft.world.entity.player.*; import net.minecraft.world.item.*; import net.minecraft.world.level.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/GuidebookItem.java b/src/main/java/de/dafuqs/spectrum/items/GuidebookItem.java index 0076a7e796..d958b17175 100644 --- a/src/main/java/de/dafuqs/spectrum/items/GuidebookItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/GuidebookItem.java @@ -37,7 +37,7 @@ public GuidebookItem(Properties settings) { } public static void reprocessAdvancementUnlocks(ServerPlayer serverPlayerEntity) { - if (serverPlayerEntity.getServer() == null || SpectrumCommon.minecraftServer == null) { + if (serverPlayerEntity.getServer() == null) { return; } @@ -55,7 +55,7 @@ public static void reprocessAdvancementUnlocks(ServerPlayer serverPlayerEntity) for (var criterionEntry : advancement.value().criteria().entrySet()) { var conditions = criterionEntry.getValue().triggerInstance(); if (conditions instanceof AdvancementGottenCriterion.Conditions hasAdvancementConditions) { - var advancementCriterionAdvancement = SpectrumCommon.minecraftServer.getAdvancements().get(hasAdvancementConditions.getAdvancementIdentifier()); + var advancementCriterionAdvancement = serverPlayerEntity.getServer().getAdvancements().get(hasAdvancementConditions.getAdvancementIdentifier()); if (advancementCriterionAdvancement != null) { var hasAdvancementCriterionAdvancement = tracker.getOrStartProgress(advancementCriterionAdvancement); if (hasAdvancementCriterionAdvancement.isDone()) { diff --git a/src/main/java/de/dafuqs/spectrum/items/MidnightAberrationItem.java b/src/main/java/de/dafuqs/spectrum/items/MidnightAberrationItem.java index f4932c51e9..e8e67a6b70 100644 --- a/src/main/java/de/dafuqs/spectrum/items/MidnightAberrationItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/MidnightAberrationItem.java @@ -13,7 +13,7 @@ import net.minecraft.world.entity.*; import net.minecraft.world.item.*; import net.minecraft.world.level.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/MysteriousCompassItem.java b/src/main/java/de/dafuqs/spectrum/items/MysteriousCompassItem.java index e0637c0685..2cb23b3fff 100644 --- a/src/main/java/de/dafuqs/spectrum/items/MysteriousCompassItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/MysteriousCompassItem.java @@ -8,7 +8,7 @@ import net.minecraft.world.entity.player.*; import net.minecraft.world.item.*; import net.minecraft.world.level.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class MysteriousCompassItem extends StructureCompassItem implements SlotBackgroundEffectProvider { diff --git a/src/main/java/de/dafuqs/spectrum/items/PigmentItem.java b/src/main/java/de/dafuqs/spectrum/items/PigmentItem.java index 22cd22e570..2d367d6f6f 100644 --- a/src/main/java/de/dafuqs/spectrum/items/PigmentItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/PigmentItem.java @@ -1,7 +1,7 @@ package de.dafuqs.spectrum.items; import de.dafuqs.spectrum.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.api.item.*; import de.dafuqs.spectrum.items.conditional.*; import de.dafuqs.spectrum.registries.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/armor/package-info.java b/src/main/java/de/dafuqs/spectrum/items/armor/package-info.java index 5cf3d0e60c..311b0c9619 100644 --- a/src/main/java/de/dafuqs/spectrum/items/armor/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/items/armor/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.items.armor; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/conditional/package-info.java b/src/main/java/de/dafuqs/spectrum/items/conditional/package-info.java index 7ab3040e3d..0c890c4d36 100644 --- a/src/main/java/de/dafuqs/spectrum/items/conditional/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/items/conditional/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.items.conditional; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/energy/package-info.java b/src/main/java/de/dafuqs/spectrum/items/energy/package-info.java deleted file mode 100644 index d5ff0a9b13..0000000000 --- a/src/main/java/de/dafuqs/spectrum/items/energy/package-info.java +++ /dev/null @@ -1,8 +0,0 @@ -@NullMarked -@MethodsReturnNonnullByDefault -@FieldsAreNonnullByDefault -package de.dafuqs.spectrum.items.energy; - -import net.minecraft.FieldsAreNonnullByDefault; -import net.minecraft.MethodsReturnNonnullByDefault; -import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/de/dafuqs/spectrum/items/food/ClottedCreamItem.java b/src/main/java/de/dafuqs/spectrum/items/food/ClottedCreamItem.java index 0e4620dc72..6f771c96c5 100644 --- a/src/main/java/de/dafuqs/spectrum/items/food/ClottedCreamItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/food/ClottedCreamItem.java @@ -5,7 +5,6 @@ import net.minecraft.server.level.*; import net.minecraft.stats.*; import net.minecraft.world.entity.*; -import net.minecraft.world.entity.player.*; import net.minecraft.world.item.*; import net.minecraft.world.level.*; import net.neoforged.neoforge.common.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/food/DrinkItem.java b/src/main/java/de/dafuqs/spectrum/items/food/DrinkItem.java index 093184177a..1010bc764b 100644 --- a/src/main/java/de/dafuqs/spectrum/items/food/DrinkItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/food/DrinkItem.java @@ -10,7 +10,7 @@ import net.minecraft.world.entity.player.*; import net.minecraft.world.item.*; import net.minecraft.world.level.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/food/NectardewBurgeonItem.java b/src/main/java/de/dafuqs/spectrum/items/food/NectardewBurgeonItem.java index dfe8813b3f..893bcbab02 100644 --- a/src/main/java/de/dafuqs/spectrum/items/food/NectardewBurgeonItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/food/NectardewBurgeonItem.java @@ -8,7 +8,7 @@ import net.minecraft.resources.*; import net.minecraft.world.entity.player.*; import net.minecraft.world.item.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/food/RockCandyItem.java b/src/main/java/de/dafuqs/spectrum/items/food/RockCandyItem.java index 4cdcb35279..209f4ffda9 100644 --- a/src/main/java/de/dafuqs/spectrum/items/food/RockCandyItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/food/RockCandyItem.java @@ -1,24 +1,16 @@ package de.dafuqs.spectrum.items.food; -import de.dafuqs.spectrum.api.item.*; -import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.particle.effect.*; import de.dafuqs.spectrum.registries.*; -import net.minecraft.core.component.*; -import net.minecraft.core.particles.*; -import net.minecraft.network.chat.*; import net.minecraft.sounds.*; import net.minecraft.util.*; import net.minecraft.world.entity.item.*; import net.minecraft.world.item.*; -import net.minecraft.world.item.component.*; -import net.minecraft.world.item.crafting.*; import net.minecraft.world.level.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; -import java.util.function.*; public class RockCandyItem extends Item { diff --git a/src/main/java/de/dafuqs/spectrum/items/food/SedativesItem.java b/src/main/java/de/dafuqs/spectrum/items/food/SedativesItem.java index eaf98cd07f..39cbb104eb 100644 --- a/src/main/java/de/dafuqs/spectrum/items/food/SedativesItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/food/SedativesItem.java @@ -5,7 +5,6 @@ import net.minecraft.advancements.*; import net.minecraft.server.level.*; import net.minecraft.stats.*; -import net.minecraft.world.effect.*; import net.minecraft.world.entity.*; import net.minecraft.world.item.*; import net.minecraft.world.level.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/food/StarCandyItem.java b/src/main/java/de/dafuqs/spectrum/items/food/StarCandyItem.java index f8da415464..9dc955f5cd 100644 --- a/src/main/java/de/dafuqs/spectrum/items/food/StarCandyItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/food/StarCandyItem.java @@ -2,10 +2,8 @@ import de.dafuqs.spectrum.*; import de.dafuqs.spectrum.helpers.*; -import de.dafuqs.spectrum.items.trinkets.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.*; -import net.minecraft.core.component.*; import net.minecraft.network.chat.*; import net.minecraft.resources.*; import net.minecraft.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/food/package-info.java b/src/main/java/de/dafuqs/spectrum/items/food/package-info.java index 6db9ef0cdb..c3d1307970 100644 --- a/src/main/java/de/dafuqs/spectrum/items/food/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/items/food/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.items.food; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/energy/ArtistsPaletteItem.java b/src/main/java/de/dafuqs/spectrum/items/ink/ArtistsPaletteItem.java similarity index 89% rename from src/main/java/de/dafuqs/spectrum/items/energy/ArtistsPaletteItem.java rename to src/main/java/de/dafuqs/spectrum/items/ink/ArtistsPaletteItem.java index 0ce8903004..cda1e49553 100644 --- a/src/main/java/de/dafuqs/spectrum/items/energy/ArtistsPaletteItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/ink/ArtistsPaletteItem.java @@ -1,9 +1,8 @@ -package de.dafuqs.spectrum.items.energy; +package de.dafuqs.spectrum.items.ink; import de.dafuqs.spectrum.*; -import de.dafuqs.spectrum.api.energy.*; -import de.dafuqs.spectrum.api.energy.color.*; -import de.dafuqs.spectrum.api.energy.storage.*; +import de.dafuqs.spectrum.api.ink.color.*; +import de.dafuqs.spectrum.api.ink.storage.*; import de.dafuqs.spectrum.api.item.*; import de.dafuqs.spectrum.api.render.*; import de.dafuqs.spectrum.helpers.*; @@ -16,7 +15,7 @@ import net.minecraft.world.entity.player.*; import net.minecraft.world.item.*; import net.minecraft.world.level.block.entity.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; @@ -30,8 +29,8 @@ public ArtistsPaletteItem(Properties settings, long maxEnergyTotal) { } @Override - public Drainability getDrainability() { - return Drainability.PLAYER_ONLY; + public boolean canDrain(boolean player) { + return player; } @Override @@ -52,7 +51,7 @@ public ItemStack getDefaultInstance() { public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip, TooltipFlag type) { super.appendHoverText(stack, context, tooltip, type); tooltip.add(Component.translatable("item.spectrum.pigment_palette.tooltip.target").withStyle(ChatFormatting.GRAY)); - getEnergyStorage(stack).addTooltip(tooltip); + tooltip.addAll(getEnergyStorage(stack).getTooltip()); addBannerPatternProviderTooltip(tooltip); } @@ -84,7 +83,7 @@ public ExtendedItemBarProvider.BarSignature getSignature(@Nullable Player player var progress = Support.getSensiblePercent(storage.getCurrentTotal(), storage.getMaxTotal(), 14); if (colors.size() == 1) { var color = colors.getFirst(); - return new ExtendedItemBarProvider.BarSignature(1, 13, 14, progress, 1, color.getColorInt() | 0xFF000000, 2, DEFAULT_BACKGROUND_COLOR); + return new ExtendedItemBarProvider.BarSignature(1, 13, 14, progress, 1, color.getColorARGB() | 0xFF000000, 2, DEFAULT_BACKGROUND_COLOR); } if (colors.isEmpty()) return new ExtendedItemBarProvider.BarSignature(1, 13, 14, progress, 1, 0xFF000000, 2, DEFAULT_BACKGROUND_COLOR); diff --git a/src/main/java/de/dafuqs/spectrum/items/energy/CreativeInkAssortmentItem.java b/src/main/java/de/dafuqs/spectrum/items/ink/CreativeInkAssortmentItem.java similarity index 85% rename from src/main/java/de/dafuqs/spectrum/items/energy/CreativeInkAssortmentItem.java rename to src/main/java/de/dafuqs/spectrum/items/ink/CreativeInkAssortmentItem.java index 7c7814e532..509c48c7f2 100644 --- a/src/main/java/de/dafuqs/spectrum/items/energy/CreativeInkAssortmentItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/ink/CreativeInkAssortmentItem.java @@ -1,8 +1,7 @@ -package de.dafuqs.spectrum.items.energy; +package de.dafuqs.spectrum.items.ink; -import de.dafuqs.spectrum.api.energy.*; -import de.dafuqs.spectrum.api.energy.color.*; -import de.dafuqs.spectrum.api.energy.storage.*; +import de.dafuqs.spectrum.api.ink.color.*; +import de.dafuqs.spectrum.api.ink.storage.*; import de.dafuqs.spectrum.api.item.*; import de.dafuqs.spectrum.api.render.*; import de.dafuqs.spectrum.helpers.*; @@ -14,7 +13,7 @@ import net.minecraft.world.item.context.*; import net.minecraft.world.level.*; import net.minecraft.world.level.block.entity.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; @@ -30,19 +29,13 @@ public InteractionResult useOn(UseOnContext context) { if (!world.isClientSide()) { BlockEntity blockEntity = world.getBlockEntity(context.getClickedPos()); if (blockEntity instanceof InkStorageBlockEntity inkStorageBlockEntity) { - inkStorageBlockEntity.getEnergyStorage().fillCompletely(); + inkStorageBlockEntity.getInkStorage().fillCompletely(); inkStorageBlockEntity.setInkDirty(); - blockEntity.setChanged(); } } return super.useOn(context); } - @Override - public Drainability getDrainability() { - return Drainability.ALWAYS; - } - @Override public CreativeInkStorage getEnergyStorage(ItemStack itemStack) { return new CreativeInkStorage(); @@ -62,7 +55,7 @@ public void setEnergyStorage(ItemStack itemStack, InkStorage storage) { public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip, TooltipFlag type) { super.appendHoverText(stack, context, tooltip, type); CreativeOnlyItem.appendTooltip(tooltip); - getEnergyStorage(stack).addTooltip(tooltip); + tooltip.addAll(getEnergyStorage(stack).getTooltip()); } @Override diff --git a/src/main/java/de/dafuqs/spectrum/items/energy/InkAssortmentItem.java b/src/main/java/de/dafuqs/spectrum/items/ink/InkAssortmentItem.java similarity index 88% rename from src/main/java/de/dafuqs/spectrum/items/energy/InkAssortmentItem.java rename to src/main/java/de/dafuqs/spectrum/items/ink/InkAssortmentItem.java index be93e2c76f..76484c4580 100644 --- a/src/main/java/de/dafuqs/spectrum/items/energy/InkAssortmentItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/ink/InkAssortmentItem.java @@ -1,8 +1,7 @@ -package de.dafuqs.spectrum.items.energy; +package de.dafuqs.spectrum.items.ink; -import de.dafuqs.spectrum.api.energy.*; -import de.dafuqs.spectrum.api.energy.color.*; -import de.dafuqs.spectrum.api.energy.storage.*; +import de.dafuqs.spectrum.api.ink.color.*; +import de.dafuqs.spectrum.api.ink.storage.*; import de.dafuqs.spectrum.api.render.*; import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.registries.*; @@ -10,7 +9,7 @@ import net.minecraft.network.chat.*; import net.minecraft.world.entity.player.*; import net.minecraft.world.item.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; @@ -23,11 +22,6 @@ public InkAssortmentItem(Properties settings, long maxEnergy) { this.maxEnergy = maxEnergy; } - @Override - public Drainability getDrainability() { - return Drainability.ALWAYS; - } - @Override public IndividualCappedInkStorage getEnergyStorage(ItemStack itemStack) { var storage = itemStack.get(SpectrumDataComponentTypes.INK_STORAGE); @@ -45,7 +39,7 @@ public ItemStack getDefaultInstance() { @Override public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip, TooltipFlag type) { super.appendHoverText(stack, context, tooltip, type); - getEnergyStorage(stack).addTooltip(tooltip); + tooltip.addAll(getEnergyStorage(stack).getTooltip()); } @Override diff --git a/src/main/java/de/dafuqs/spectrum/items/energy/InkFlaskItem.java b/src/main/java/de/dafuqs/spectrum/items/ink/InkFlaskItem.java similarity index 84% rename from src/main/java/de/dafuqs/spectrum/items/energy/InkFlaskItem.java rename to src/main/java/de/dafuqs/spectrum/items/ink/InkFlaskItem.java index cd50a3fde9..46a4f17613 100644 --- a/src/main/java/de/dafuqs/spectrum/items/energy/InkFlaskItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/ink/InkFlaskItem.java @@ -1,8 +1,7 @@ -package de.dafuqs.spectrum.items.energy; +package de.dafuqs.spectrum.items.ink; -import de.dafuqs.spectrum.api.energy.*; -import de.dafuqs.spectrum.api.energy.color.*; -import de.dafuqs.spectrum.api.energy.storage.*; +import de.dafuqs.spectrum.api.ink.color.*; +import de.dafuqs.spectrum.api.ink.storage.*; import de.dafuqs.spectrum.api.item.*; import de.dafuqs.spectrum.api.render.*; import de.dafuqs.spectrum.helpers.*; @@ -12,7 +11,7 @@ import net.minecraft.world.entity.player.*; import net.minecraft.world.item.*; import net.minecraft.world.level.block.entity.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; @@ -25,11 +24,6 @@ public InkFlaskItem(Properties settings, long maxEnergy) { this.maxEnergy = maxEnergy; } - @Override - public Drainability getDrainability() { - return Drainability.ALWAYS; - } - @Override public SingleInkStorage getEnergyStorage(ItemStack itemStack) { var storage = itemStack.get(SpectrumDataComponentTypes.INK_STORAGE); @@ -48,7 +42,7 @@ public ItemStack getDefaultInstance() { @Override public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip, TooltipFlag type) { super.appendHoverText(stack, context, tooltip, type); - getEnergyStorage(stack).addTooltip(tooltip); + tooltip.addAll(getEnergyStorage(stack).getTooltip()); addBannerPatternProviderTooltip(tooltip); } @@ -80,6 +74,6 @@ public BarSignature getSignature(@Nullable Player player, ItemStack stack, int i var color = storage.getStoredColor(); var progress = Support.getSensiblePercent(storage.getCurrentTotal(), storage.getMaxTotal(), 14); - return new BarSignature(1, 13, 14, progress, 1, color.getColorInt(), 2, ExtendedItemBarProvider.DEFAULT_BACKGROUND_COLOR); + return new BarSignature(1, 13, 14, progress, 1, color.getColorARGB(), 2, ExtendedItemBarProvider.DEFAULT_BACKGROUND_COLOR); } } diff --git a/src/main/java/de/dafuqs/spectrum/items/energy/PigmentPaletteItem.java b/src/main/java/de/dafuqs/spectrum/items/ink/PigmentPaletteItem.java similarity index 88% rename from src/main/java/de/dafuqs/spectrum/items/energy/PigmentPaletteItem.java rename to src/main/java/de/dafuqs/spectrum/items/ink/PigmentPaletteItem.java index 89baf26348..adae563dbe 100644 --- a/src/main/java/de/dafuqs/spectrum/items/energy/PigmentPaletteItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/ink/PigmentPaletteItem.java @@ -1,9 +1,8 @@ -package de.dafuqs.spectrum.items.energy; +package de.dafuqs.spectrum.items.ink; import de.dafuqs.spectrum.*; -import de.dafuqs.spectrum.api.energy.*; -import de.dafuqs.spectrum.api.energy.color.*; -import de.dafuqs.spectrum.api.energy.storage.*; +import de.dafuqs.spectrum.api.ink.color.*; +import de.dafuqs.spectrum.api.ink.storage.*; import de.dafuqs.spectrum.api.item.*; import de.dafuqs.spectrum.api.render.*; import de.dafuqs.spectrum.helpers.*; @@ -16,7 +15,7 @@ import net.minecraft.world.entity.player.*; import net.minecraft.world.item.*; import net.minecraft.world.level.block.entity.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; @@ -30,8 +29,8 @@ public PigmentPaletteItem(Properties settings, long maxEnergyPerColor) { } @Override - public Drainability getDrainability() { - return Drainability.PLAYER_ONLY; + public boolean canDrain(boolean player) { + return player; } @Override @@ -52,7 +51,7 @@ public ItemStack getDefaultInstance() { public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip, TooltipFlag type) { super.appendHoverText(stack, context, tooltip, type); tooltip.add(Component.translatable("item.spectrum.pigment_palette.tooltip.target").withStyle(ChatFormatting.GRAY)); - getEnergyStorage(stack).addTooltip(tooltip); + tooltip.addAll(getEnergyStorage(stack).getTooltip()); addBannerPatternProviderTooltip(tooltip); } @@ -84,7 +83,7 @@ public ExtendedItemBarProvider.BarSignature getSignature(@Nullable Player player var progress = Support.getSensiblePercent(storage.getCurrentTotal(), storage.getMaxTotal(), 14); if (colors.size() == 1) { var color = colors.getFirst(); - return new ExtendedItemBarProvider.BarSignature(1, 13, 14, progress, 1, color.getColorInt() | 0xFF000000, 2, DEFAULT_BACKGROUND_COLOR); + return new ExtendedItemBarProvider.BarSignature(1, 13, 14, progress, 1, color.getColorARGB() | 0xFF000000, 2, DEFAULT_BACKGROUND_COLOR); } var delta = Minecraft.getInstance().getTimer().getGameTimeDeltaPartialTick(false); diff --git a/src/main/java/de/dafuqs/spectrum/items/ink/package-info.java b/src/main/java/de/dafuqs/spectrum/items/ink/package-info.java new file mode 100644 index 0000000000..bd007e343d --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/items/ink/package-info.java @@ -0,0 +1,7 @@ +@NullMarked +@MethodsReturnNonnullByDefault +@FieldsAreNonnullByDefault +package de.dafuqs.spectrum.items.energy; + +import net.minecraft.*; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/item_frame/PhantomFrameItem.java b/src/main/java/de/dafuqs/spectrum/items/item_frame/PhantomFrameItem.java index 6bf04be3ba..3affff9da7 100644 --- a/src/main/java/de/dafuqs/spectrum/items/item_frame/PhantomFrameItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/item_frame/PhantomFrameItem.java @@ -1,7 +1,7 @@ package de.dafuqs.spectrum.items.item_frame; -import de.dafuqs.spectrum.entity.*; import de.dafuqs.spectrum.entity.entity.*; +import de.dafuqs.spectrum.registries.*; import net.minecraft.core.*; import net.minecraft.world.entity.*; import net.minecraft.world.entity.decoration.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/item_frame/PhantomGlowFrameItem.java b/src/main/java/de/dafuqs/spectrum/items/item_frame/PhantomGlowFrameItem.java index 74268b9966..66acd360f5 100644 --- a/src/main/java/de/dafuqs/spectrum/items/item_frame/PhantomGlowFrameItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/item_frame/PhantomGlowFrameItem.java @@ -1,7 +1,7 @@ package de.dafuqs.spectrum.items.item_frame; -import de.dafuqs.spectrum.entity.*; import de.dafuqs.spectrum.entity.entity.*; +import de.dafuqs.spectrum.registries.*; import net.minecraft.core.*; import net.minecraft.world.entity.*; import net.minecraft.world.entity.decoration.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/item_frame/package-info.java b/src/main/java/de/dafuqs/spectrum/items/item_frame/package-info.java index e84a42087d..aaa2211a26 100644 --- a/src/main/java/de/dafuqs/spectrum/items/item_frame/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/items/item_frame/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.items.item_frame; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/magic_items/BuildingStaffItem.java b/src/main/java/de/dafuqs/spectrum/items/magic_items/BuildingStaffItem.java index b79d8e5ffb..88ac7ae784 100644 --- a/src/main/java/de/dafuqs/spectrum/items/magic_items/BuildingStaffItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/magic_items/BuildingStaffItem.java @@ -1,7 +1,7 @@ package de.dafuqs.spectrum.items.magic_items; -import de.dafuqs.spectrum.api.energy.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.api.item.*; import de.dafuqs.spectrum.compat.claims.*; import de.dafuqs.spectrum.helpers.*; @@ -15,7 +15,7 @@ import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import oshi.util.tuples.*; public abstract class BuildingStaffItem extends Item implements PrioritizedBlockInteraction, InkPowered { @@ -49,13 +49,10 @@ protected static Triplet countSuitableReplacementItems(Pla return new Triplet<>(targetBlock, targetBlock.asItem(), single ? 1 : Integer.MAX_VALUE); } - long blocksToPlace; - if (single) { - blocksToPlace = InkPowered.getAvailableInk(player, USED_COLOR) >= inkCostPerBlock ? 1 : 0; - } else { - blocksToPlace = InkPowered.getAvailableInk(player, USED_COLOR) / inkCostPerBlock; + long blocksToPlace = single ? 1 : 1024; // to not yeet performance out the window + if(inkCostPerBlock > 0) { + blocksToPlace = Math.min(blocksToPlace, InkPowered.getAvailableInk(player, USED_COLOR) / inkCostPerBlock); } - blocksToPlace = Math.min(1024, blocksToPlace); // to not yeet performance out the window return BuildingHelper.getBuildingItemCountInInventoryIncludingSimilars(player, targetBlock, blocksToPlace); } diff --git a/src/main/java/de/dafuqs/spectrum/items/magic_items/CelestialPocketWatchItem.java b/src/main/java/de/dafuqs/spectrum/items/magic_items/CelestialPocketWatchItem.java index e8f0f71688..f6d6e0f2f0 100644 --- a/src/main/java/de/dafuqs/spectrum/items/magic_items/CelestialPocketWatchItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/magic_items/CelestialPocketWatchItem.java @@ -1,7 +1,7 @@ package de.dafuqs.spectrum.items.magic_items; -import de.dafuqs.spectrum.api.energy.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.networking.s2c_payloads.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.*; @@ -12,7 +12,6 @@ import net.minecraft.world.entity.player.*; import net.minecraft.world.item.*; import net.minecraft.world.level.*; -import javax.annotation.*; import java.util.*; @@ -34,7 +33,7 @@ public CelestialPocketWatchItem(Properties settings) { } @Override - public List getUsedColors() { + public List getUsedColors(ItemStack stack) { return List.of(COST.color()); } @@ -100,7 +99,7 @@ public void appendHoverText(ItemStack stack, TooltipContext context, List 0) { + addInkPoweredTooltip(stack, tooltip); + } } @Override @@ -86,7 +88,7 @@ public InteractionResult useOn(UseOnContext context) { itemToConsume = blockToPlace.asItem(); count = Integer.MAX_VALUE; } else { - Triplet replaceData = countSuitableReplacementItems(player, blockToPlace, false, INK_COST_PER_BLOCK); + Triplet replaceData = countSuitableReplacementItems(player, blockToPlace, false, SpectrumConfig.CONFIG.ConstructorsStaffInkCostPerBlock.get()); blockToPlace = replaceData.getA(); itemToConsume = replaceData.getB(); count = replaceData.getC(); @@ -141,12 +143,12 @@ protected static void placeBlocksAndDecrementInventory(Player player, Level worl if (!player.isCreative()) { InventoryHelper.decrementInPlayerInventory(player, new ItemStack(itemToConsume, placedBlocks)); - InkPowered.tryDrainEnergy(player, USED_COLOR, (long) targetPositions.size() * ConstructorsStaffItem.INK_COST_PER_BLOCK); + InkPowered.tryDrainEnergy(player, USED_COLOR, (long) targetPositions.size() * SpectrumConfig.CONFIG.ConstructorsStaffInkCostPerBlock.get()); } } @Override - public List getUsedColors() { + public List getUsedColors(ItemStack stack) { return List.of(USED_COLOR); } diff --git a/src/main/java/de/dafuqs/spectrum/items/magic_items/CraftingTabletItem.java b/src/main/java/de/dafuqs/spectrum/items/magic_items/CraftingTabletItem.java index f909c6c897..053701a133 100644 --- a/src/main/java/de/dafuqs/spectrum/items/magic_items/CraftingTabletItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/magic_items/CraftingTabletItem.java @@ -21,7 +21,7 @@ import net.minecraft.world.level.*; import net.minecraft.world.level.block.entity.*; import net.neoforged.api.distmarker.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/magic_items/EnchantmentCanvasItem.java b/src/main/java/de/dafuqs/spectrum/items/magic_items/EnchantmentCanvasItem.java index e669a4138d..9a820c9e46 100644 --- a/src/main/java/de/dafuqs/spectrum/items/magic_items/EnchantmentCanvasItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/magic_items/EnchantmentCanvasItem.java @@ -9,7 +9,7 @@ import net.minecraft.world.inventory.*; import net.minecraft.world.item.*; import net.minecraft.world.item.enchantment.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/magic_items/EnderSpliceItem.java b/src/main/java/de/dafuqs/spectrum/items/magic_items/EnderSpliceItem.java index cfa8ff4c83..54bd0ece11 100644 --- a/src/main/java/de/dafuqs/spectrum/items/magic_items/EnderSpliceItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/magic_items/EnderSpliceItem.java @@ -27,7 +27,6 @@ import net.minecraft.world.phys.*; import net.neoforged.api.distmarker.*; import net.neoforged.neoforge.network.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/magic_items/ExchangeStaffItem.java b/src/main/java/de/dafuqs/spectrum/items/magic_items/ExchangeStaffItem.java index c74f07a7d2..0d0ed2f24c 100644 --- a/src/main/java/de/dafuqs/spectrum/items/magic_items/ExchangeStaffItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/magic_items/ExchangeStaffItem.java @@ -1,8 +1,9 @@ package de.dafuqs.spectrum.items.magic_items; -import de.dafuqs.spectrum.api.energy.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.compat.claims.*; +import de.dafuqs.spectrum.config.*; import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.networking.s2c_payloads.*; import de.dafuqs.spectrum.particle.*; @@ -27,14 +28,13 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.*; import net.neoforged.api.distmarker.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import oshi.util.tuples.*; import java.util.*; public class ExchangeStaffItem extends BuildingStaffItem { - public static final int INK_COST_PER_BLOCK = 5; public static final int CREATIVE_RANGE = 5; public ExchangeStaffItem(Properties settings) { @@ -79,8 +79,7 @@ public static boolean exchange(Level world, BlockPos pos, Player player, Block t } public static boolean exchange(Level world, BlockPos pos, Player player, Block targetBlock, ItemStack exchangeStaffItemStack, boolean single, Direction side) { - Triplet replaceData = countSuitableReplacementItems(player, targetBlock, single, - INK_COST_PER_BLOCK); + Triplet replaceData = countSuitableReplacementItems(player, targetBlock, single, SpectrumConfig.CONFIG.ExchangingStaffInkCostPerBlock.get()); long blocksToReplaceCount = replaceData.getC(); if (blocksToReplaceCount == 0) { @@ -135,7 +134,7 @@ public static boolean exchange(Level world, BlockPos pos, Player player, Block t for (ItemStack stack : stacks) { player.getInventory().placeItemBackInInventory(stack); } - InkPowered.tryDrainEnergy(player, USED_COLOR, (long) targetPositions.size() * INK_COST_PER_BLOCK); + InkPowered.tryDrainEnergy(player, USED_COLOR, (long) targetPositions.size() * SpectrumConfig.CONFIG.ExchangingStaffInkCostPerBlock.get()); } } @@ -164,7 +163,9 @@ public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip.add(Component.translatable("item.spectrum.exchanging_staff.tooltip.target", block.getName()).withStyle(ChatFormatting.GRAY))); - addInkPoweredTooltip(tooltip); + if(SpectrumConfig.CONFIG.ExchangingStaffInkCostPerBlock.get() > 0) { + addInkPoweredTooltip(stack, tooltip); + } } @Override @@ -231,7 +232,7 @@ public int getEnchantmentValue(ItemStack stack) { } @Override - public List getUsedColors() { + public List getUsedColors(ItemStack stack) { return List.of(USED_COLOR); } diff --git a/src/main/java/de/dafuqs/spectrum/items/magic_items/GildedBookItem.java b/src/main/java/de/dafuqs/spectrum/items/magic_items/GildedBookItem.java index ef0546907e..96a9c3308d 100644 --- a/src/main/java/de/dafuqs/spectrum/items/magic_items/GildedBookItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/magic_items/GildedBookItem.java @@ -3,7 +3,6 @@ import net.minecraft.*; import net.minecraft.network.chat.*; import net.minecraft.world.item.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/magic_items/KnowledgeGemItem.java b/src/main/java/de/dafuqs/spectrum/items/magic_items/KnowledgeGemItem.java index 758c497406..5efc673cc2 100644 --- a/src/main/java/de/dafuqs/spectrum/items/magic_items/KnowledgeGemItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/magic_items/KnowledgeGemItem.java @@ -17,7 +17,7 @@ import net.minecraft.world.item.enchantment.*; import net.minecraft.world.level.*; import net.minecraft.world.level.block.entity.*; -import javax.annotation.*; +import org.jspecify.annotations.*; import java.util.*; @@ -37,12 +37,14 @@ public KnowledgeGemItem(Properties settings, int maxStorageBase) { public static ItemStack getKnowledgeDropStackWithXP(int experience, boolean noStoreTooltip) { ItemStack stack = new ItemStack(SpectrumItems.KNOWLEDGE_GEM.get()); stack.set(SpectrumDataComponentTypes.STORED_EXPERIENCE, experience); - if (noStoreTooltip) stack.set(SpectrumDataComponentTypes.HIDE_USAGE_TOOLTIP, Unit.INSTANCE); + if (noStoreTooltip) { + stack.set(SpectrumDataComponentTypes.HIDE_USAGE_TOOLTIP, Unit.INSTANCE); + } return stack; } @Override - public int getMaxStoredExperience(HolderLookup.Provider lookup, ItemStack itemStack) { + public int getMaxStoredExperience(HolderLookup.@Nullable Provider lookup, ItemStack itemStack) { int efficiencyLevel = SpectrumEnchantmentHelper.getLevel(lookup, Enchantments.EFFICIENCY, itemStack); return maxStorageBase * (int) Math.pow(10, Math.min(5, efficiencyLevel)); // to not exceed int max } @@ -120,16 +122,12 @@ public void appendHoverText(ItemStack stack, TooltipContext context, List convert + BlockState destinationState = NaturesStaffConversionDataLoader.getConvertedBlockState(sourceState.getBlock()); + if (destinationState != null) { + if (destinationState.getBlock() instanceof SimpleWaterloggedBlock) { + if (touchesWater(world, clickedPos)) { + destinationState = destinationState.setValue(CoralPlantBlock.WATERLOGGED, true); + } else { + destinationState = destinationState.setValue(CoralPlantBlock.WATERLOGGED, false); + } + } + world.setBlock(clickedPos, destinationState, 3); - boolean success = false; - BlockState sourceState = world.getBlockState(blockPos); + payForUse(user, stack, INK_COST, ITEM_COST); + success = true; + } else if (sourceState.is(SpectrumBlockTags.NATURES_STAFF_STACKABLE)) { + // blockstate marked as stackable => stack more on top! + int i = 0; + BlockState state; + do { + state = world.getBlockState(clickedPos.above(i)); + i++; + } while (state.is(sourceState.getBlock())); - if (sourceState.getBlock() instanceof NaturesStaffTriggered naturesStaffTriggered && naturesStaffTriggered.canUseNaturesStaff(world, blockPos, sourceState)) { - if (naturesStaffTriggered.onNaturesStaffUse(world, blockPos, sourceState, player)) { - success = true; - } - } else { - // loaded as convertible? => convert - BlockState destinationState = NaturesStaffConversionDataLoader.getConvertedBlockState(sourceState.getBlock()); - if (destinationState != null) { - if (destinationState.getBlock() instanceof SimpleWaterloggedBlock) { - if (touchesWater(world, blockPos)) { - destinationState = destinationState.setValue(CoralPlantBlock.WATERLOGGED, true); - } else { - destinationState = destinationState.setValue(CoralPlantBlock.WATERLOGGED, false); - } - } - world.setBlock(blockPos, destinationState, 3); - - payForUse(player, stack, INK_COST, ITEM_COST); - success = true; - } else if (sourceState.is(SpectrumBlockTags.NATURES_STAFF_STACKABLE)) { - // blockstate marked as stackable => stack more on top! - int i = 0; - BlockState state; - do { - state = world.getBlockState(context.getClickedPos().above(i)); - i++; - } while (state.is(sourceState.getBlock())); - - BlockPos targetPos = context.getClickedPos().above(i - 1); - if (tryPlaceBlock(sourceState, world, targetPos, Direction.DOWN, Direction.UP)) { - success = true; - } - } else if (sourceState.is(SpectrumBlockTags.NATURES_STAFF_SPREADABLE)) { - RandomSource random = world.getRandom(); - - for (int i = 0; i < 5; i++) { - BlockPos randomOffsetPos = blockPos.offset(random.nextIntBetweenInclusive(-3, 3), random.nextIntBetweenInclusive(-3, 3), random.nextIntBetweenInclusive(-3, 3)); - if (tryPlaceBlock(sourceState, world, randomOffsetPos, Direction.getRandom(random), Direction.getRandom(random))) { - success = true; - break; - } - } - } else if (sourceState.isRandomlyTicking() && sourceState.is(SpectrumBlockTags.NATURES_STAFF_TICKABLE)) { - // random tickable and whitelisted? => tick - // without whitelist we would be able to tick budding blocks, ... - - if (world instanceof ServerLevel) { - sourceState.randomTick((ServerLevel) world, blockPos, world.getRandom()); - } - success = true; - } else if (BoneMealItem.growCrop(Items.BONE_MEAL.getDefaultInstance(), world, blockPos)) { - // fertilizable => grow! + BlockPos targetPos = clickedPos.above(i - 1); + if (tryPlaceBlock(sourceState, world, targetPos, Direction.DOWN, Direction.UP)) { + success = true; + } + } else if (sourceState.is(SpectrumBlockTags.NATURES_STAFF_SPREADABLE)) { + RandomSource random = world.getRandom(); + + for (int i = 0; i < 5; i++) { + BlockPos randomOffsetPos = clickedPos.offset(random.nextIntBetweenInclusive(-3, 3), random.nextIntBetweenInclusive(-3, 3), random.nextIntBetweenInclusive(-3, 3)); + if (tryPlaceBlock(sourceState, world, randomOffsetPos, Direction.getRandom(random), Direction.getRandom(random))) { success = true; - } else { - if (sourceState.isFaceSturdy(world, blockPos, context.getClickedFace()) && BoneMealItem.growWaterPlant(Items.BONE_MEAL.getDefaultInstance(), world, blockPos.relative(context.getClickedFace()), context.getClickedFace())) { - success = true; - } + break; } } + } else if (sourceState.isRandomlyTicking() && sourceState.is(SpectrumBlockTags.NATURES_STAFF_TICKABLE)) { + // random tickable and whitelisted? => tick + // without whitelist we would be able to tick budding blocks, ... - if (success) { - payForUse(player, stack, INK_COST, ITEM_COST); - SpectrumAdvancementCriteria.NATURES_STAFF_CONVERSION.trigger(player, sourceState, world.getBlockState(blockPos)); - return InteractionResult.CONSUME; + if (world instanceof ServerLevel) { + sourceState.randomTick((ServerLevel) world, clickedPos, world.getRandom()); + } + success = true; + } else if (BoneMealItem.growCrop(Items.BONE_MEAL.getDefaultInstance(), world, clickedPos)) { + // fertilizable => grow! + success = true; + } else { + if (sourceState.isFaceSturdy(world, clickedPos, context.getClickedFace()) && BoneMealItem.growWaterPlant(Items.BONE_MEAL.getDefaultInstance(), world, clickedPos.relative(context.getClickedFace()), context.getClickedFace())) { + success = true; } } - } + if (success && user instanceof ServerPlayer serverPlayer) { + payForUse(user, stack, INK_COST, ITEM_COST); + PlayNaturesStaffParticlesPayload.sendPlayParticles(world, clickedPos); + SpectrumAdvancementCriteria.NATURES_STAFF_CONVERSION.trigger(serverPlayer, sourceState, world.getBlockState(clickedPos)); + return InteractionResult.CONSUME; + } return InteractionResult.PASS; } @@ -241,21 +238,20 @@ private static boolean touchesWater(Level world, BlockPos blockPos) { || world.getFluidState(blockPos.west()).is(FluidTags.WATER); } - private static void spawnParticlesAndEffect(Level world, BlockPos blockPos) { + public static void spawnParticlesAndEffect(Level world, BlockPos blockPos) { BlockState blockState = world.getBlockState(blockPos); if (blockState.is(SpectrumBlockTags.NATURES_STAFF_STACKABLE)) { int i = 0; while (world.getBlockState(blockPos.above(i)).is(blockState.getBlock())) { - world.levelEvent(LevelEvent.PARTICLES_AND_SOUND_PLANT_GROWTH, blockPos.above(i), 15); - i++; + ParticleUtils.spawnParticleInBlock(world, blockPos.above(i), 15, ParticleTypes.HAPPY_VILLAGER); + i++; } - world.levelEvent(LevelEvent.PARTICLES_AND_SOUND_PLANT_GROWTH, blockPos, 15); - BoneMealItem.addGrowthParticles(world, blockPos.above(i + 1), 5); + ParticleUtils.spawnParticleInBlock(world, blockPos.above(i + 1), 15, ParticleTypes.HAPPY_VILLAGER); for (int j = 1; world.getBlockState(blockPos.below(j)).is(blockState.getBlock()); j++) { - world.levelEvent(LevelEvent.PARTICLES_AND_SOUND_PLANT_GROWTH, blockPos.below(j), 15); + ParticleUtils.spawnParticleInBlock(world, blockPos.below(j), 15, ParticleTypes.HAPPY_VILLAGER); } } else { - world.levelEvent(LevelEvent.PARTICLES_AND_SOUND_PLANT_GROWTH, blockPos, 15); + ParticleUtils.spawnParticleInBlock(world, blockPos, 15, ParticleTypes.HAPPY_VILLAGER); } } @@ -268,7 +264,7 @@ private void playDenySound(Level world, Player playerEntity) { } @Override - public List getUsedColors() { + public List getUsedColors(ItemStack stack) { return List.of(INK_COST.color()); } diff --git a/src/main/java/de/dafuqs/spectrum/items/magic_items/PaintbrushItem.java b/src/main/java/de/dafuqs/spectrum/items/magic_items/PaintbrushItem.java index e12a925030..290d09f3d0 100644 --- a/src/main/java/de/dafuqs/spectrum/items/magic_items/PaintbrushItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/magic_items/PaintbrushItem.java @@ -2,8 +2,8 @@ import de.dafuqs.revelationary.api.advancements.*; import de.dafuqs.spectrum.api.block.*; -import de.dafuqs.spectrum.api.energy.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.api.interaction.*; import de.dafuqs.spectrum.compat.claims.*; import de.dafuqs.spectrum.entity.entity.*; @@ -27,7 +27,7 @@ import net.minecraft.world.level.block.state.*; import net.neoforged.api.distmarker.*; import net.neoforged.fml.loading.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; @@ -150,14 +150,8 @@ private boolean cursedColor(UseOnContext context) { } InkColor inkColor = optionalInkColor.get(); - Optional optionalDyeColor = inkColor.getDyeColor(); - if (optionalDyeColor.isEmpty()) { - return false; - } - DyeColor dyeColor = optionalDyeColor.get(); - - BlockState newBlockState = BlockVariantHelper.getCursedBlockColorVariant(context.getLevel(), context.getClickedPos(), dyeColor); - if (newBlockState.isAir()) { + @Nullable BlockState newBlockState = VariantHelper.getColoredBlockState(context.getLevel(), context.getClickedPos(), inkColor); + if (newBlockState == null) { return false; } diff --git a/src/main/java/de/dafuqs/spectrum/items/magic_items/PipeBombItem.java b/src/main/java/de/dafuqs/spectrum/items/magic_items/PipeBombItem.java index cccd2f2d58..51394fcf4f 100644 --- a/src/main/java/de/dafuqs/spectrum/items/magic_items/PipeBombItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/magic_items/PipeBombItem.java @@ -20,7 +20,7 @@ import net.minecraft.world.level.*; import net.minecraft.world.phys.*; import net.neoforged.api.distmarker.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/magic_items/RadianceStaffItem.java b/src/main/java/de/dafuqs/spectrum/items/magic_items/RadianceStaffItem.java index 4441a65610..62c52651c3 100644 --- a/src/main/java/de/dafuqs/spectrum/items/magic_items/RadianceStaffItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/magic_items/RadianceStaffItem.java @@ -1,7 +1,7 @@ package de.dafuqs.spectrum.items.magic_items; -import de.dafuqs.spectrum.api.energy.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.blocks.decoration.*; import de.dafuqs.spectrum.compat.claims.*; import de.dafuqs.spectrum.networking.s2c_payloads.*; @@ -24,7 +24,6 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.phys.*; import net.neoforged.api.distmarker.*; -import javax.annotation.*; import java.util.*; @@ -99,9 +98,7 @@ public UseAnim getUseAnimation(ItemStack stack) { @Override public InteractionResultHolder use(Level world, Player user, InteractionHand hand) { - if (!world.isClientSide()) { - world.playSound(null, user.getX(), user.getY(), user.getZ(), SpectrumSoundEvents.RADIANCE_STAFF_CHARGING, SoundSource.PLAYERS, 1.0F, 1.0F); - } + world.playSound(user, user.getX(), user.getY(), user.getZ(), SpectrumSoundEvents.RADIANCE_STAFF_CHARGING, SoundSource.PLAYERS, 1.0F, 1.0F); return ItemUtils.startUsingInstantly(world, user, hand); } @@ -189,6 +186,11 @@ public void usage(Level world, ServerPlayer user, ItemStack radianceStaff) { } } } + + @Override + public boolean isEnchantable(ItemStack stack) { + return stack.getMaxStackSize() == 1; + } @Override public int getEnchantmentValue(ItemStack stack) { @@ -201,7 +203,7 @@ public boolean supportsEnchantment(ItemStack stack, Holder enchantm } @Override - public List getUsedColors() { + public List getUsedColors(ItemStack stack) { return List.of(INK_COST.color()); } } diff --git a/src/main/java/de/dafuqs/spectrum/items/magic_items/StaffOfRemembranceItem.java b/src/main/java/de/dafuqs/spectrum/items/magic_items/StaffOfRemembranceItem.java index 69ff929af2..a15a35cf4d 100644 --- a/src/main/java/de/dafuqs/spectrum/items/magic_items/StaffOfRemembranceItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/magic_items/StaffOfRemembranceItem.java @@ -1,8 +1,8 @@ package de.dafuqs.spectrum.items.magic_items; import de.dafuqs.revelationary.api.advancements.*; -import de.dafuqs.spectrum.api.energy.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.api.item.*; import de.dafuqs.spectrum.blocks.memory.*; import de.dafuqs.spectrum.compat.claims.*; @@ -39,7 +39,7 @@ public void appendHoverText(ItemStack stack, TooltipContext context, List getUsedColors() { + public List getUsedColors(ItemStack stack) { return List.of(USED_COLOR); } diff --git a/src/main/java/de/dafuqs/spectrum/items/magic_items/StructureCompassItem.java b/src/main/java/de/dafuqs/spectrum/items/magic_items/StructureCompassItem.java index 1d2919d741..ba81bca059 100644 --- a/src/main/java/de/dafuqs/spectrum/items/magic_items/StructureCompassItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/magic_items/StructureCompassItem.java @@ -10,7 +10,7 @@ import net.minecraft.world.item.*; import net.minecraft.world.level.*; import net.minecraft.world.level.levelgen.structure.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/magic_items/ampoules/AzuriteGlassAmpouleItem.java b/src/main/java/de/dafuqs/spectrum/items/magic_items/ampoules/AzuriteGlassAmpouleItem.java index 54896118e5..15e2e81394 100644 --- a/src/main/java/de/dafuqs/spectrum/items/magic_items/ampoules/AzuriteGlassAmpouleItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/magic_items/ampoules/AzuriteGlassAmpouleItem.java @@ -10,7 +10,7 @@ import net.minecraft.world.item.*; import net.minecraft.world.level.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/magic_items/ampoules/BloodstoneGlassAmpouleItem.java b/src/main/java/de/dafuqs/spectrum/items/magic_items/ampoules/BloodstoneGlassAmpouleItem.java index e7af3cffaa..20651f9b5c 100644 --- a/src/main/java/de/dafuqs/spectrum/items/magic_items/ampoules/BloodstoneGlassAmpouleItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/magic_items/ampoules/BloodstoneGlassAmpouleItem.java @@ -15,7 +15,7 @@ import net.minecraft.world.item.component.*; import net.minecraft.world.level.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/magic_items/ampoules/GlassAmpouleItem.java b/src/main/java/de/dafuqs/spectrum/items/magic_items/ampoules/GlassAmpouleItem.java index 35f21f2411..1999e2fb00 100644 --- a/src/main/java/de/dafuqs/spectrum/items/magic_items/ampoules/GlassAmpouleItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/magic_items/ampoules/GlassAmpouleItem.java @@ -6,7 +6,7 @@ import net.minecraft.world.item.*; import net.minecraft.world.level.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public abstract class GlassAmpouleItem extends Item { diff --git a/src/main/java/de/dafuqs/spectrum/items/magic_items/ampoules/MalachiteGlassAmpouleItem.java b/src/main/java/de/dafuqs/spectrum/items/magic_items/ampoules/MalachiteGlassAmpouleItem.java index 5f96895a70..d08a06b1a6 100644 --- a/src/main/java/de/dafuqs/spectrum/items/magic_items/ampoules/MalachiteGlassAmpouleItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/magic_items/ampoules/MalachiteGlassAmpouleItem.java @@ -1,7 +1,8 @@ package de.dafuqs.spectrum.items.magic_items.ampoules; -import de.dafuqs.spectrum.api.energy.*; +import de.dafuqs.spectrum.api.ink.*; import de.dafuqs.spectrum.api.item.*; +import de.dafuqs.spectrum.components.*; import de.dafuqs.spectrum.entity.entity.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.*; @@ -14,7 +15,7 @@ import net.minecraft.world.item.*; import net.minecraft.world.level.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; @@ -28,10 +29,10 @@ public MalachiteGlassAmpouleItem(Properties settings) { public boolean trigger(Level world, ItemStack stack, @Nullable LivingEntity attacker, @Nullable LivingEntity target, Vec3 position) { List e = new ArrayList<>(); if (attacker instanceof Player player) { - List effects = InkPoweredPotionFillable.getEffects(stack); - for (InkPoweredStatusEffectInstance effect : effects) { + List effects = InkPoweredPotionContentsComponent.getEffects(stack); + for (InkPoweredMobEffectInstance effect : effects) { if (InkPowered.tryDrainEnergy(player, effect.getInkCost())) { - e.add(effect.getStatusEffectInstance()); + e.add(effect.getFreshStatusEffectInstance()); } } } diff --git a/src/main/java/de/dafuqs/spectrum/items/magic_items/ampoules/package-info.java b/src/main/java/de/dafuqs/spectrum/items/magic_items/ampoules/package-info.java index 05b3d95296..4ebef7dd5a 100644 --- a/src/main/java/de/dafuqs/spectrum/items/magic_items/ampoules/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/items/magic_items/ampoules/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.items.magic_items.ampoules; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/magic_items/package-info.java b/src/main/java/de/dafuqs/spectrum/items/magic_items/package-info.java index 642273cca5..f13f87756d 100644 --- a/src/main/java/de/dafuqs/spectrum/items/magic_items/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/items/magic_items/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.items.magic_items; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/map/ArtisansAtlasItem.java b/src/main/java/de/dafuqs/spectrum/items/map/ArtisansAtlasItem.java index 9871aa1307..f53f7b95f9 100644 --- a/src/main/java/de/dafuqs/spectrum/items/map/ArtisansAtlasItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/map/ArtisansAtlasItem.java @@ -2,7 +2,6 @@ import com.mojang.datafixers.util.*; import de.dafuqs.spectrum.registries.*; -import net.minecraft.client.*; import net.minecraft.core.*; import net.minecraft.core.component.*; import net.minecraft.network.chat.*; @@ -22,9 +21,8 @@ import net.minecraft.world.level.material.*; import net.minecraft.world.level.saveddata.maps.*; import net.minecraft.world.phys.*; -import net.neoforged.api.distmarker.*; import net.neoforged.neoforge.common.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/map/ArtisansAtlasState.java b/src/main/java/de/dafuqs/spectrum/items/map/ArtisansAtlasState.java index 05c417f6ee..c5ef3d8e22 100644 --- a/src/main/java/de/dafuqs/spectrum/items/map/ArtisansAtlasState.java +++ b/src/main/java/de/dafuqs/spectrum/items/map/ArtisansAtlasState.java @@ -15,7 +15,7 @@ import net.minecraft.world.level.*; import net.minecraft.world.level.levelgen.structure.*; import net.minecraft.world.level.saveddata.maps.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/map/package-info.java b/src/main/java/de/dafuqs/spectrum/items/map/package-info.java index 6d94bf0f61..99b90fa97a 100644 --- a/src/main/java/de/dafuqs/spectrum/items/map/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/items/map/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.items.map; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/misc/AetherVestigesItem.java b/src/main/java/de/dafuqs/spectrum/items/misc/AetherVestigesItem.java index daf8258536..11804b3fde 100644 --- a/src/main/java/de/dafuqs/spectrum/items/misc/AetherVestigesItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/misc/AetherVestigesItem.java @@ -4,7 +4,7 @@ import de.dafuqs.spectrum.items.*; import net.minecraft.world.entity.player.*; import net.minecraft.world.item.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class AetherVestigesItem extends ItemWithTooltip implements SlotBackgroundEffectProvider { diff --git a/src/main/java/de/dafuqs/spectrum/items/misc/AshItem.java b/src/main/java/de/dafuqs/spectrum/items/misc/AshItem.java index 349423d2fa..9d2393a020 100644 --- a/src/main/java/de/dafuqs/spectrum/items/misc/AshItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/misc/AshItem.java @@ -1,6 +1,5 @@ package de.dafuqs.spectrum.items.misc; -import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.particle.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.sounds.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/misc/package-info.java b/src/main/java/de/dafuqs/spectrum/items/misc/package-info.java index 40f1d9ebcb..25603846a5 100644 --- a/src/main/java/de/dafuqs/spectrum/items/misc/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/items/misc/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.items.misc; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/package-info.java b/src/main/java/de/dafuqs/spectrum/items/package-info.java index 729c862bd1..94f1a1a654 100644 --- a/src/main/java/de/dafuqs/spectrum/items/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/items/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.items; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/tools/BedrockShearsItem.java b/src/main/java/de/dafuqs/spectrum/items/tools/BedrockShearsItem.java index 80c5842df0..f859ee17f0 100644 --- a/src/main/java/de/dafuqs/spectrum/items/tools/BedrockShearsItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/tools/BedrockShearsItem.java @@ -1,6 +1,7 @@ package de.dafuqs.spectrum.items.tools; import de.dafuqs.spectrum.api.item.*; +import de.dafuqs.spectrum.registries.*; import net.minecraft.resources.*; import net.minecraft.world.item.*; import net.minecraft.world.item.enchantment.*; @@ -22,4 +23,9 @@ public Map, Integer> getDefaultEnchantments() { public boolean isEnchantable(ItemStack stack) { return true; } + + @Override + public int getEnchantmentValue(ItemStack stack) { + return SpectrumToolTiers.BEDROCK.getEnchantmentValue(); + } } \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/items/tools/DraconicTwinswordItem.java b/src/main/java/de/dafuqs/spectrum/items/tools/DraconicTwinswordItem.java index 120b9826c6..e2a717c2a7 100644 --- a/src/main/java/de/dafuqs/spectrum/items/tools/DraconicTwinswordItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/tools/DraconicTwinswordItem.java @@ -1,14 +1,13 @@ package de.dafuqs.spectrum.items.tools; import de.dafuqs.spectrum.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.api.item.*; import de.dafuqs.spectrum.api.render.*; import de.dafuqs.spectrum.entity.entity.*; import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.*; -import net.minecraft.advancements.critereon.*; import net.minecraft.core.*; import net.minecraft.core.component.*; import net.minecraft.network.chat.*; @@ -25,9 +24,10 @@ import net.minecraft.world.item.component.*; import net.minecraft.world.item.enchantment.*; import net.minecraft.world.level.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; +import java.util.function.*; public class DraconicTwinswordItem extends SwordItem implements SplittableItem, SlotReservingItem, Preenchanted, ExtendedItemBarProvider, SlotBackgroundEffectProvider { @@ -107,26 +107,9 @@ public void appendHoverText(ItemStack stack, TooltipContext context, List { - ItemAttributeModifiers.Builder builder = ItemAttributeModifiers.builder(); - for (ItemAttributeModifiers.Entry entry : comp.modifiers()) { - if (!entry.modifier().is(COOLDOWN_ATTRIBUTE_ID)) { - builder.add(entry.attribute(), entry.modifier(), entry.slot()); - } - } - return builder.build(); - }); - } - } + SlotReservingItem.inventoryTick(entity, stack); } @Override diff --git a/src/main/java/de/dafuqs/spectrum/items/tools/DragonTalonItem.java b/src/main/java/de/dafuqs/spectrum/items/tools/DragonTalonItem.java index 5a4f5dcbdb..33ce613203 100644 --- a/src/main/java/de/dafuqs/spectrum/items/tools/DragonTalonItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/tools/DragonTalonItem.java @@ -1,6 +1,6 @@ package de.dafuqs.spectrum.items.tools; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.api.item.*; import de.dafuqs.spectrum.api.render.*; import de.dafuqs.spectrum.entity.entity.*; @@ -21,7 +21,7 @@ import net.minecraft.world.item.component.*; import net.minecraft.world.item.enchantment.*; import net.minecraft.world.level.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; import java.util.function.*; @@ -146,13 +146,7 @@ public static ItemStack findThrownStack(Player player, UUID id) { @Override public void inventoryTick(ItemStack stack, Level world, Entity entity, int slot, boolean selected) { - if (entity instanceof Player player) { - if (player.getCooldowns().isOnCooldown(stack.getItem()) || SlotReservingItem.isReservingSlot(stack)) { - stack.remove(DataComponents.ATTRIBUTE_MODIFIERS); - } else { - stack.set(DataComponents.ATTRIBUTE_MODIFIERS, modifiers); - } - } + SlotReservingItem.inventoryTick(entity, stack); } @Override diff --git a/src/main/java/de/dafuqs/spectrum/items/tools/DreamflayerItem.java b/src/main/java/de/dafuqs/spectrum/items/tools/DreamflayerItem.java index 34a77eb528..9c47c50918 100644 --- a/src/main/java/de/dafuqs/spectrum/items/tools/DreamflayerItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/tools/DreamflayerItem.java @@ -1,7 +1,7 @@ package de.dafuqs.spectrum.items.tools; -import de.dafuqs.spectrum.api.energy.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.api.item.*; import de.dafuqs.spectrum.api.render.*; import de.dafuqs.spectrum.particle.effect.*; @@ -20,7 +20,7 @@ import net.minecraft.world.item.component.*; import net.minecraft.world.level.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; @@ -148,13 +148,13 @@ public void setActivated(ItemStack stack, boolean active) { } @Override - public List getUsedColors() { + public List getUsedColors(ItemStack stack) { return List.of(USED_COLOR); } @Override - public void addInkPoweredTooltip(List tooltip) { - InkPowered.super.addInkPoweredTooltip(tooltip); + public void addInkPoweredTooltip(ItemStack stack, List tooltip) { + InkPowered.super.addInkPoweredTooltip(stack, tooltip); } @Override diff --git a/src/main/java/de/dafuqs/spectrum/items/tools/FerociousBidentItem.java b/src/main/java/de/dafuqs/spectrum/items/tools/FerociousBidentItem.java index 938892d4e8..79da1a89ce 100644 --- a/src/main/java/de/dafuqs/spectrum/items/tools/FerociousBidentItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/tools/FerociousBidentItem.java @@ -1,7 +1,7 @@ package de.dafuqs.spectrum.items.tools; -import de.dafuqs.spectrum.api.energy.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.api.item.*; import de.dafuqs.spectrum.api.render.*; import de.dafuqs.spectrum.helpers.*; @@ -14,7 +14,7 @@ import net.minecraft.world.item.enchantment.*; import net.minecraft.world.level.*; import net.minecraft.world.level.entity.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; @@ -29,7 +29,7 @@ public FerociousBidentItem(Item.Properties settings, double attackSpeed, double } @Override - public List getUsedColors() { + public List getUsedColors(ItemStack stack) { return List.of(RIPTIDE_COST.color()); } @@ -75,7 +75,7 @@ public void appendHoverText(ItemStack stack, TooltipContext context, List getUsedColors() { + public List getUsedColors(ItemStack stack) { return List.of(MIRROR_IMAGE_COST.color()); } @@ -46,7 +46,7 @@ public void appendHoverText(ItemStack stack, TooltipContext context, List getUsedColors() { + public List getUsedColors(ItemStack stack) { return List.of(OVERCHARGE_COST.color()); } @@ -109,7 +109,7 @@ public void appendHoverText(ItemStack stack, TooltipContext context, List getUsedColors() { + public List getUsedColors(ItemStack stack) { return List.of(GROUND_SLAM_COST.color()); } diff --git a/src/main/java/de/dafuqs/spectrum/items/tools/GlassCrestWorkstaffItem.java b/src/main/java/de/dafuqs/spectrum/items/tools/GlassCrestWorkstaffItem.java index 12cb876b26..35f31973a6 100644 --- a/src/main/java/de/dafuqs/spectrum/items/tools/GlassCrestWorkstaffItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/tools/GlassCrestWorkstaffItem.java @@ -1,7 +1,7 @@ package de.dafuqs.spectrum.items.tools; -import de.dafuqs.spectrum.api.energy.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.api.render.*; import de.dafuqs.spectrum.components.*; import de.dafuqs.spectrum.entity.entity.*; @@ -16,7 +16,7 @@ import net.minecraft.world.item.*; import net.minecraft.world.item.enchantment.*; import net.minecraft.world.level.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/tools/LightGreatswordItem.java b/src/main/java/de/dafuqs/spectrum/items/tools/LightGreatswordItem.java index 700b005d95..1d7c624a21 100644 --- a/src/main/java/de/dafuqs/spectrum/items/tools/LightGreatswordItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/tools/LightGreatswordItem.java @@ -24,19 +24,19 @@ public LightGreatswordItem(Tier material, int attackDamage, float attackSpeed, f } @Override - public float getBlockingMultiplier(DamageSource source, ItemStack stack, LivingEntity entity, int usedTime) { + public float getBlockedDamageMultiplier(DamageSource source, ItemStack stack, LivingEntity entity, int usedTime) { if (source.is(DamageTypeTags.IS_PROJECTILE)) - return 0; + return 1.0F; if (canPerfectParry(stack, entity, usedTime)) { - return 0.05F; + return 0.95F; } else if (canBluffParry(stack, entity, usedTime)) { - return 0.2F; + return 0.8F; } else if (usedTime <= getMaxShieldingTime(entity, stack) / 2F) { return 0.5F; } - return 0.75F; + return 0.25F; } @Override diff --git a/src/main/java/de/dafuqs/spectrum/items/tools/MalachiteBidentItem.java b/src/main/java/de/dafuqs/spectrum/items/tools/MalachiteBidentItem.java index 2c0ed564ab..b4fee23251 100644 --- a/src/main/java/de/dafuqs/spectrum/items/tools/MalachiteBidentItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/tools/MalachiteBidentItem.java @@ -20,13 +20,12 @@ import net.minecraft.world.entity.ai.attributes.*; import net.minecraft.world.entity.player.*; import net.minecraft.world.entity.projectile.*; -import net.minecraft.world.inventory.*; import net.minecraft.world.item.*; import net.minecraft.world.item.component.*; import net.minecraft.world.item.enchantment.*; import net.minecraft.world.level.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; import java.util.function.*; @@ -205,10 +204,8 @@ public float getProtReduction(LivingEntity target, ItemStack stack) { @Override public DamageComposition getDamageComposition(LivingEntity attacker, LivingEntity target, ItemStack stack, float damage) { - var composition = new DamageComposition(); - var source = composition.getPlayerOrEntity(attacker); - SpectrumDamageTypes.wrapWithStackTracking(source, stack); - composition.add(source, damage); + DamageComposition composition = new DamageComposition(); + composition.add(composition.getPlayerOrEntity(attacker), damage); return composition; } diff --git a/src/main/java/de/dafuqs/spectrum/items/tools/MalachiteCrossbowItem.java b/src/main/java/de/dafuqs/spectrum/items/tools/MalachiteCrossbowItem.java index 7bda8b16bb..eb365cce8e 100644 --- a/src/main/java/de/dafuqs/spectrum/items/tools/MalachiteCrossbowItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/tools/MalachiteCrossbowItem.java @@ -10,7 +10,6 @@ import net.minecraft.world.item.*; import net.minecraft.world.item.component.*; import net.minecraft.world.item.enchantment.*; -import javax.annotation.*; import java.util.*; import java.util.function.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/tools/MultiToolItem.java b/src/main/java/de/dafuqs/spectrum/items/tools/MultiToolItem.java index 1e9a7a80c6..a6d1c345ac 100644 --- a/src/main/java/de/dafuqs/spectrum/items/tools/MultiToolItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/tools/MultiToolItem.java @@ -7,7 +7,6 @@ import net.minecraft.world.item.*; import net.minecraft.world.item.context.*; import net.neoforged.neoforge.common.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/tools/NectarLanceItem.java b/src/main/java/de/dafuqs/spectrum/items/tools/NectarLanceItem.java index 26190946a8..634af65f02 100644 --- a/src/main/java/de/dafuqs/spectrum/items/tools/NectarLanceItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/tools/NectarLanceItem.java @@ -1,9 +1,9 @@ package de.dafuqs.spectrum.items.tools; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.api.render.*; -import de.dafuqs.spectrum.registries.*; import de.dafuqs.spectrum.mob_effect.*; +import de.dafuqs.spectrum.registries.*; import net.minecraft.core.*; import net.minecraft.server.level.*; import net.minecraft.tags.*; @@ -14,7 +14,7 @@ import net.minecraft.world.entity.player.*; import net.minecraft.world.item.*; import net.minecraft.world.item.enchantment.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class NectarLanceItem extends LightGreatswordItem implements SlotBackgroundEffectProvider { @@ -23,18 +23,18 @@ public NectarLanceItem(Tier material, int attackDamage, float attackSpeed, float } @Override - public float getBlockingMultiplier(DamageSource source, ItemStack stack, LivingEntity entity, int usedTime) { + public float getBlockedDamageMultiplier(DamageSource source, ItemStack stack, LivingEntity entity, int usedTime) { if (source.is(DamageTypeTags.IS_PROJECTILE)) { - return 0; + return 1.0F; } if (canPerfectParry(stack, entity, usedTime)) { - return 0.0F; + return 1.0F; } else if (canBluffParry(stack, entity, usedTime)) { - return 0.1F; + return 0.9F; } else if (usedTime <= getMaxShieldingTime(entity, stack) / 2F) { - return 0.25F; + return 0.75F; } - return 0.6F; + return 0.4F; } @Override diff --git a/src/main/java/de/dafuqs/spectrum/items/tools/NightSaltsItem.java b/src/main/java/de/dafuqs/spectrum/items/tools/NightSaltsItem.java index 273334292a..d02b29c9cc 100644 --- a/src/main/java/de/dafuqs/spectrum/items/tools/NightSaltsItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/tools/NightSaltsItem.java @@ -1,21 +1,15 @@ package de.dafuqs.spectrum.items.tools; -import de.dafuqs.spectrum.api.item.*; import de.dafuqs.spectrum.attachment_types.*; import de.dafuqs.spectrum.items.food.*; import de.dafuqs.spectrum.registries.*; -import net.minecraft.*; -import net.minecraft.network.chat.*; import net.minecraft.sounds.*; -import net.minecraft.world.*; import net.minecraft.world.effect.*; import net.minecraft.world.entity.*; import net.minecraft.world.entity.player.*; import net.minecraft.world.item.*; import net.minecraft.world.level.*; -import java.util.*; - public class NightSaltsItem extends DrinkItem { public NightSaltsItem(Properties settings) { @@ -49,4 +43,9 @@ public int getUseDuration(ItemStack stack, LivingEntity user) { return 40; } + @Override + public UseAnim getUseAnimation(ItemStack stack) { + return UseAnim.TOOT_HORN; + } + } diff --git a/src/main/java/de/dafuqs/spectrum/items/tools/NightfallsBladeItem.java b/src/main/java/de/dafuqs/spectrum/items/tools/NightfallsBladeItem.java index f3cf4996bd..4480dad0d3 100644 --- a/src/main/java/de/dafuqs/spectrum/items/tools/NightfallsBladeItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/tools/NightfallsBladeItem.java @@ -2,9 +2,10 @@ import de.dafuqs.revelationary.api.advancements.*; import de.dafuqs.spectrum.*; -import de.dafuqs.spectrum.api.energy.*; +import de.dafuqs.spectrum.api.ink.*; import de.dafuqs.spectrum.api.item.*; import de.dafuqs.spectrum.api.render.*; +import de.dafuqs.spectrum.components.*; import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.particle.effect.*; import de.dafuqs.spectrum.registries.*; @@ -12,6 +13,7 @@ import net.minecraft.core.particles.*; import net.minecraft.network.chat.*; import net.minecraft.resources.*; +import net.minecraft.world.effect.*; import net.minecraft.world.entity.*; import net.minecraft.world.entity.ai.attributes.*; import net.minecraft.world.entity.player.*; @@ -19,7 +21,7 @@ import net.minecraft.world.item.alchemy.*; import net.minecraft.world.item.component.*; import net.minecraft.world.level.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; @@ -51,7 +53,7 @@ public boolean isWeapon() { } @Override - public long adjustFinalCostFor(InkPoweredStatusEffectInstance instance) { + public long adjustFinalCostFor(InkPoweredMobEffectInstance instance) { return Math.round(Math.pow(instance.getInkCost().amount(), 1.75 + instance.getStatusEffectInstance().getAmplifier())); } @@ -59,8 +61,8 @@ public long adjustFinalCostFor(InkPoweredStatusEffectInstance instance) { public boolean hurtEnemy(ItemStack stack, LivingEntity target, LivingEntity attacker) { if (target.isAlive() && attacker instanceof Player player) { if (AdvancementHelper.hasAdvancement(player, UNLOCK_IDENTIFIER)) { - List effects = InkPoweredPotionFillable.getEffects(stack); - for (InkPoweredStatusEffectInstance instance : effects) { + List effects = InkPoweredPotionContentsComponent.getEffects(stack); + for (InkPoweredMobEffectInstance instance : effects) { if (InkPowered.tryDrainEnergy(player, instance.getInkCost().color(), instance.getInkCost().amount())) { Level world = attacker.level(); if (world.isClientSide()) { @@ -69,7 +71,7 @@ public boolean hurtEnemy(ItemStack stack, LivingEntity target, LivingEntity atta world.getRandom().nextFloat() - 0.5, world.getRandom().nextFloat() - 0.5, world.getRandom().nextFloat() - 0.5 ); } else { - target.addEffect(instance.getStatusEffectInstance(), attacker); + target.addEffect((instance.getFreshStatusEffectInstance()), attacker); } } } @@ -91,7 +93,7 @@ public void appendHoverText(ItemStack stack, TooltipContext context, List effects = InkPoweredPotionFillable.getEffects(stack); + List effects = InkPoweredPotionContentsComponent.getEffects(stack); if (effects.isEmpty()) { return SlotBackgroundEffectProvider.SlotEffect.NONE; } @@ -103,16 +105,16 @@ public SlotBackgroundEffectProvider.SlotEffect backgroundType(@Nullable Player p @Override public int getBackgroundColor(@Nullable Player player, ItemStack stack, float tickDelta) { - List effects = InkPoweredPotionFillable.getEffects(stack); - if (effects.isEmpty()) - return 0x000000; - - return effects.getFirst().getColor(); + InkPoweredPotionContentsComponent effects = stack.get(SpectrumDataComponentTypes.INK_POWERED_POTION_CONTENTS); + if (effects == null) { + return 0x0; + } + return effects.getColor().orElse(0x0); } @Override public float getEffectOpacity(@Nullable Player player, ItemStack stack, float tickDelta) { - List effects = InkPoweredPotionFillable.getEffects(stack); + List effects = InkPoweredPotionContentsComponent.getEffects(stack); if (effects.isEmpty()) return 0F; diff --git a/src/main/java/de/dafuqs/spectrum/items/tools/OmniAcceleratorItem.java b/src/main/java/de/dafuqs/spectrum/items/tools/OmniAcceleratorItem.java index a4212ea8c6..425afe4cd8 100644 --- a/src/main/java/de/dafuqs/spectrum/items/tools/OmniAcceleratorItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/tools/OmniAcceleratorItem.java @@ -1,15 +1,10 @@ package de.dafuqs.spectrum.items.tools; -import com.mojang.blaze3d.vertex.*; -import de.dafuqs.spectrum.api.energy.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.api.interaction.*; import de.dafuqs.spectrum.api.render.*; import de.dafuqs.spectrum.registries.*; -import net.minecraft.client.*; -import net.minecraft.client.renderer.*; -import net.minecraft.client.renderer.entity.*; -import net.minecraft.client.resources.model.*; import net.minecraft.core.*; import net.minecraft.core.component.*; import net.minecraft.network.chat.*; @@ -22,7 +17,7 @@ import net.minecraft.world.item.*; import net.minecraft.world.item.component.*; import net.minecraft.world.level.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; @@ -101,40 +96,14 @@ public static Optional getFirstStack(HolderLookup.Provider wrapperLoo } @Override - public List getUsedColors() { + public List getUsedColors(ItemStack stack) { return List.of(COST.color()); } @Override public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip, TooltipFlag type) { super.appendHoverText(stack, context, tooltip, type); - addInkPoweredTooltip(tooltip); - } - - public static class Renderer implements DynamicItemRenderer { - public Renderer() { - } - - @Override - public void render(ItemRenderer renderer, ItemStack stack, ItemDisplayContext mode, boolean leftHanded, PoseStack matrices, MultiBufferSource vertexConsumers, int light, int overlay, BakedModel model) { - renderer.render(stack, mode, leftHanded, matrices, vertexConsumers, light, overlay, model); - Minecraft client = Minecraft.getInstance(); - if (mode != ItemDisplayContext.GUI || client.level == null) return; - - Optional optionalStack = getFirstStack(client.level.registryAccess(), stack); - if (optionalStack.isEmpty()) { - return; - } - ItemStack bundledStack = optionalStack.get(); - - BakedModel bundledModel = renderer.getModel(bundledStack, client.level, client.player, 0); - - matrices.pushPose(); - matrices.scale(0.5F, 0.5F, 0.5F); - matrices.translate(0.5F, 0.5F, 0.5F); - renderer.render(bundledStack, mode, leftHanded, matrices, vertexConsumers, light, overlay, bundledModel); - matrices.popPose(); - } + addInkPoweredTooltip(stack, tooltip); } @Override diff --git a/src/main/java/de/dafuqs/spectrum/items/tools/ParryingSwordItem.java b/src/main/java/de/dafuqs/spectrum/items/tools/ParryingSwordItem.java index 3a3b11db8a..01f0fb754e 100644 --- a/src/main/java/de/dafuqs/spectrum/items/tools/ParryingSwordItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/tools/ParryingSwordItem.java @@ -14,7 +14,7 @@ import net.minecraft.world.item.component.*; import net.minecraft.world.level.*; import net.neoforged.neoforge.common.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public abstract class ParryingSwordItem extends SwordItem implements ExtendedItemBarProvider { @@ -59,7 +59,7 @@ public InteractionResultHolder use(Level world, Player user, Interact return ItemUtils.startUsingInstantly(world, user, hand); } - public abstract float getBlockingMultiplier(DamageSource source, ItemStack stack, LivingEntity entity, int usedTime); + public abstract float getBlockedDamageMultiplier(DamageSource source, ItemStack stack, LivingEntity entity, int usedTime); public boolean canPerfectParry(ItemStack stack, LivingEntity entity, int usedTime) { return usedTime <= getPerfectParryWindow(entity, stack); diff --git a/src/main/java/de/dafuqs/spectrum/items/tools/PrimordialLighterItem.java b/src/main/java/de/dafuqs/spectrum/items/tools/PrimordialLighterItem.java index 9d270d4b14..c4eb739362 100644 --- a/src/main/java/de/dafuqs/spectrum/items/tools/PrimordialLighterItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/tools/PrimordialLighterItem.java @@ -19,7 +19,6 @@ import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.gameevent.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/tools/SoothingBouquetItem.java b/src/main/java/de/dafuqs/spectrum/items/tools/SoothingBouquetItem.java index d651db7ea4..b1787918b8 100644 --- a/src/main/java/de/dafuqs/spectrum/items/tools/SoothingBouquetItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/tools/SoothingBouquetItem.java @@ -1,6 +1,5 @@ package de.dafuqs.spectrum.items.tools; -import de.dafuqs.spectrum.api.item.*; import de.dafuqs.spectrum.api.render.*; import de.dafuqs.spectrum.attachment_types.*; import de.dafuqs.spectrum.registries.*; @@ -13,7 +12,7 @@ import net.minecraft.world.entity.player.*; import net.minecraft.world.item.*; import net.minecraft.world.level.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/tools/SpectrumFishingRodItem.java b/src/main/java/de/dafuqs/spectrum/items/tools/SpectrumFishingRodItem.java index 371ee4dac1..002ce6a952 100644 --- a/src/main/java/de/dafuqs/spectrum/items/tools/SpectrumFishingRodItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/tools/SpectrumFishingRodItem.java @@ -1,6 +1,5 @@ package de.dafuqs.spectrum.items.tools; -import de.dafuqs.spectrum.api.entity.*; import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/tools/WorkstaffItem.java b/src/main/java/de/dafuqs/spectrum/items/tools/WorkstaffItem.java index ce9133b1e0..d8031e7c2a 100644 --- a/src/main/java/de/dafuqs/spectrum/items/tools/WorkstaffItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/tools/WorkstaffItem.java @@ -1,8 +1,8 @@ package de.dafuqs.spectrum.items.tools; import de.dafuqs.revelationary.api.advancements.*; -import de.dafuqs.spectrum.api.energy.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.api.item.*; import de.dafuqs.spectrum.components.*; import de.dafuqs.spectrum.helpers.*; @@ -10,6 +10,7 @@ import de.dafuqs.spectrum.registries.*; import net.minecraft.*; import net.minecraft.core.component.*; +import net.minecraft.core.registries.*; import net.minecraft.network.chat.*; import net.minecraft.resources.*; import net.minecraft.server.level.*; @@ -151,7 +152,7 @@ private static void enchantAndRemoveOthers(Player player, ItemStack stack, Compo if (enchantment == Enchantments.FORTUNE) { level = stack.getOrDefault(SpectrumDataComponentTypes.WORKSTAFF, WorkstaffComponent.DEFAULT).fortuneLevel(); } else { - int fortuneLevel = SpectrumEnchantmentHelper.getLevel(registryLookup, Enchantments.FORTUNE, stack); + int fortuneLevel = stack.getEnchantmentLevel(registryLookup.lookup(Registries.ENCHANTMENT).get().get(Enchantments.FORTUNE).get()); stack.update(SpectrumDataComponentTypes.WORKSTAFF, WorkstaffComponent.DEFAULT, comp -> new WorkstaffComponent(comp.canTill(), comp.canShoot(), Math.max(comp.fortuneLevel(), Math.max(fortuneLevel, 1)))); } diff --git a/src/main/java/de/dafuqs/spectrum/items/tools/package-info.java b/src/main/java/de/dafuqs/spectrum/items/tools/package-info.java index 79798f292f..0171eb4a23 100644 --- a/src/main/java/de/dafuqs/spectrum/items/tools/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/items/tools/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.items.tools; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/tooltip/BottomlessBundleTooltipComponent.java b/src/main/java/de/dafuqs/spectrum/items/tooltip/BottomlessBundleTooltipComponent.java index 12d14f2cdb..3beebad4d9 100644 --- a/src/main/java/de/dafuqs/spectrum/items/tooltip/BottomlessBundleTooltipComponent.java +++ b/src/main/java/de/dafuqs/spectrum/items/tooltip/BottomlessBundleTooltipComponent.java @@ -5,7 +5,6 @@ import net.minecraft.client.gui.*; import net.minecraft.core.*; import net.minecraft.world.item.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/tooltip/BottomlessBundleTooltipData.java b/src/main/java/de/dafuqs/spectrum/items/tooltip/BottomlessBundleTooltipData.java index 5b54a3c4f0..d225bff033 100644 --- a/src/main/java/de/dafuqs/spectrum/items/tooltip/BottomlessBundleTooltipData.java +++ b/src/main/java/de/dafuqs/spectrum/items/tooltip/BottomlessBundleTooltipData.java @@ -2,7 +2,6 @@ import de.dafuqs.spectrum.blocks.bottomless_bundle.*; import net.minecraft.world.inventory.tooltip.*; -import net.minecraft.world.item.*; public record BottomlessBundleTooltipData(BottomlessItemHandler itemHandler) implements TooltipComponent { } diff --git a/src/main/java/de/dafuqs/spectrum/items/tooltip/package-info.java b/src/main/java/de/dafuqs/spectrum/items/tooltip/package-info.java index 4ed7b5980e..d70296258d 100644 --- a/src/main/java/de/dafuqs/spectrum/items/tooltip/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/items/tooltip/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.items.tooltip; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/trinkets/AetherGracedNectarGlovesItem.java b/src/main/java/de/dafuqs/spectrum/items/trinkets/AetherGracedNectarGlovesItem.java index 417f5bf4d0..77192c4eae 100644 --- a/src/main/java/de/dafuqs/spectrum/items/trinkets/AetherGracedNectarGlovesItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/trinkets/AetherGracedNectarGlovesItem.java @@ -13,7 +13,7 @@ import net.minecraft.world.entity.ai.attributes.*; import net.minecraft.world.entity.player.*; import net.minecraft.world.item.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import top.theillusivec4.curios.api.*; import java.util.*; @@ -21,7 +21,6 @@ public class AetherGracedNectarGlovesItem extends AzureDikeCurioItem implements SlotBackgroundEffectProvider { public static final int HARMFUL_EFFECT_COST = 7; - public static ResourceLocation MENTAL_PRESENCE_ATTRIBUTE_ID = SpectrumCommon.locate("nectar_gloves_sleep"); public AetherGracedNectarGlovesItem(Properties settings, ResourceLocation unlockIdentifier) { super(settings, unlockIdentifier); @@ -39,13 +38,6 @@ public void appendHoverText(ItemStack stack, TooltipContext context, List, AttributeModifier> getAttributeModifiers(SlotContext slotContext, ResourceLocation id, ItemStack stack) { - Multimap, AttributeModifier> modifiers = super.getAttributeModifiers(slotContext, id, stack); - modifiers.put(SpectrumEntityAttributes.MENTAL_PRESENCE, new AttributeModifier(MENTAL_PRESENCE_ATTRIBUTE_ID, -1F, AttributeModifier.Operation.ADD_VALUE)); - return modifiers; - } - public static boolean testEffectFor(LivingEntity entity, Holder effect) { if (effect.value().isBeneficial()) return false; @@ -53,7 +45,7 @@ public static boolean testEffectFor(LivingEntity entity, Holder effec if (effect.is(SpectrumMobEffectTags.BYPASSES_NECTAR_GLOVES)) return false; - return hasEquipped(entity, SpectrumItems.AETHER_GRACED_NECTAR_GLOVES.get()) && (effect.value().getCategory() == MobEffectCategory.HARMFUL || effect == SpectrumMobEffects.FRENZY); + return hasEquipped(entity, SpectrumItems.AETHER_GRACED_NECTAR_GLOVES.get()) && (effect.value().getCategory() == MobEffectCategory.HARMFUL || effect.is(SpectrumMobEffects.FRENZY)); } public static boolean tryBlockEffect(LivingEntity entity, int cost) { diff --git a/src/main/java/de/dafuqs/spectrum/items/trinkets/AshenCircletItem.java b/src/main/java/de/dafuqs/spectrum/items/trinkets/AshenCircletItem.java index 40d54ffcb8..56be2456ba 100644 --- a/src/main/java/de/dafuqs/spectrum/items/trinkets/AshenCircletItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/trinkets/AshenCircletItem.java @@ -15,7 +15,6 @@ import net.minecraft.world.entity.ai.attributes.*; import net.minecraft.world.item.*; import net.minecraft.world.level.*; -import javax.annotation.*; import top.theillusivec4.curios.api.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/trinkets/AttackRingItem.java b/src/main/java/de/dafuqs/spectrum/items/trinkets/AttackRingItem.java deleted file mode 100644 index 8db0e4c1ee..0000000000 --- a/src/main/java/de/dafuqs/spectrum/items/trinkets/AttackRingItem.java +++ /dev/null @@ -1,60 +0,0 @@ -package de.dafuqs.spectrum.items.trinkets; - -import com.google.common.collect.*; -import de.dafuqs.spectrum.*; -import net.minecraft.client.*; -import net.minecraft.core.*; -import net.minecraft.network.chat.*; -import net.minecraft.resources.*; -import net.minecraft.world.entity.*; -import net.minecraft.world.entity.ai.attributes.*; -import net.minecraft.world.item.*; -import net.neoforged.api.distmarker.*; -import org.jspecify.annotations.Nullable; -import top.theillusivec4.curios.api.*; - -import java.util.*; - -public class AttackRingItem extends SpectrumCurioItem { - - public static final ResourceLocation ATTACK_RING_DAMAGE_ID = SpectrumCommon.locate("jeopardant"); - - public AttackRingItem(Properties settings) { - super(settings, SpectrumCommon.locate("unlocks/trinkets/jeopardant")); - } - - public static double getAttackModifierForEntity(@Nullable LivingEntity entity) { - if (entity == null) { - return 0; - } else { - double mod = entity.getMaxHealth() / (entity.getHealth() * entity.getHealth() + 1); // starting with 1 % damage at 14 health up to 300 % damage at 1/20 health - return Math.max(0, 1 + Math.log10(mod)); - } - } - - @Override - public void onUnequip(SlotContext slotContext, ItemStack newStack, ItemStack stack) { - super.onUnequip(slotContext, newStack, stack); - - LivingEntity entity = slotContext.entity(); - if (entity.getAttributes().hasModifier(Attributes.ATTACK_DAMAGE, AttackRingItem.ATTACK_RING_DAMAGE_ID)) { - Multimap, AttributeModifier> map = Multimaps.newMultimap(Maps.newLinkedHashMap(), ArrayList::new); - map.put(Attributes.ATTACK_DAMAGE, new AttributeModifier(AttackRingItem.ATTACK_RING_DAMAGE_ID, AttackRingItem.getAttackModifierForEntity(entity), AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL)); - entity.getAttributes().removeAttributeModifiers(map); - } - } - - @OnlyIn(Dist.CLIENT) - @Override - public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip, TooltipFlag type) { - super.appendHoverText(stack, context, tooltip, type); - Minecraft client = Minecraft.getInstance(); - long mod = Math.round(getAttackModifierForEntity(client.player) * 100); - if (mod == 0) { - tooltip.add(Component.translatable("item.spectrum.jeopardant.tooltip.damage_zero")); - } else { - tooltip.add(Component.translatable("item.spectrum.jeopardant.tooltip.damage", mod)); - } - } - -} diff --git a/src/main/java/de/dafuqs/spectrum/items/trinkets/AzureDikeAmuletItem.java b/src/main/java/de/dafuqs/spectrum/items/trinkets/AzureDikeAmuletItem.java index 016175264d..dd345c8d9b 100644 --- a/src/main/java/de/dafuqs/spectrum/items/trinkets/AzureDikeAmuletItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/trinkets/AzureDikeAmuletItem.java @@ -1,7 +1,7 @@ package de.dafuqs.spectrum.items.trinkets; -import de.dafuqs.spectrum.api.energy.color.*; -import de.dafuqs.spectrum.api.energy.storage.*; +import de.dafuqs.spectrum.api.ink.color.*; +import de.dafuqs.spectrum.api.ink.storage.*; import de.dafuqs.spectrum.api.item.*; import de.dafuqs.spectrum.attachment_types.*; import de.dafuqs.spectrum.progression.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/trinkets/AzureDikeCurioItem.java b/src/main/java/de/dafuqs/spectrum/items/trinkets/AzureDikeCurioItem.java index bb415e1967..0e72077545 100644 --- a/src/main/java/de/dafuqs/spectrum/items/trinkets/AzureDikeCurioItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/trinkets/AzureDikeCurioItem.java @@ -1,7 +1,7 @@ package de.dafuqs.spectrum.items.trinkets; import de.dafuqs.spectrum.api.item.*; -import de.dafuqs.spectrum.attachment_types.AzureDikeAttachmentType; +import de.dafuqs.spectrum.attachment_types.*; import de.dafuqs.spectrum.progression.*; import net.minecraft.network.chat.*; import net.minecraft.resources.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/trinkets/CircletOfArroganceItem.java b/src/main/java/de/dafuqs/spectrum/items/trinkets/CircletOfArroganceItem.java index 4240becd52..75fc517c1b 100644 --- a/src/main/java/de/dafuqs/spectrum/items/trinkets/CircletOfArroganceItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/trinkets/CircletOfArroganceItem.java @@ -1,9 +1,9 @@ package de.dafuqs.spectrum.items.trinkets; import de.dafuqs.spectrum.*; +import de.dafuqs.spectrum.mob_effect.*; import de.dafuqs.spectrum.networking.s2c_payloads.*; import de.dafuqs.spectrum.registries.*; -import de.dafuqs.spectrum.mob_effect.*; import net.minecraft.*; import net.minecraft.network.chat.*; import net.minecraft.server.level.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/trinkets/ExtraHealthRingItem.java b/src/main/java/de/dafuqs/spectrum/items/trinkets/ExtraHealthRingItem.java index 56cfa1aa89..536b24c293 100644 --- a/src/main/java/de/dafuqs/spectrum/items/trinkets/ExtraHealthRingItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/trinkets/ExtraHealthRingItem.java @@ -2,8 +2,8 @@ import com.google.common.collect.*; import de.dafuqs.spectrum.*; -import de.dafuqs.spectrum.api.energy.color.*; -import de.dafuqs.spectrum.api.energy.storage.*; +import de.dafuqs.spectrum.api.ink.color.*; +import de.dafuqs.spectrum.api.ink.storage.*; import net.minecraft.*; import net.minecraft.core.*; import net.minecraft.network.chat.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/trinkets/ExtraMiningSpeedRingItem.java b/src/main/java/de/dafuqs/spectrum/items/trinkets/ExtraMiningSpeedRingItem.java index 9cba1133c0..5d1cdf6584 100644 --- a/src/main/java/de/dafuqs/spectrum/items/trinkets/ExtraMiningSpeedRingItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/trinkets/ExtraMiningSpeedRingItem.java @@ -2,8 +2,8 @@ import com.google.common.collect.*; import de.dafuqs.spectrum.*; -import de.dafuqs.spectrum.api.energy.color.*; -import de.dafuqs.spectrum.api.energy.storage.*; +import de.dafuqs.spectrum.api.ink.color.*; +import de.dafuqs.spectrum.api.ink.storage.*; import net.minecraft.*; import net.minecraft.core.*; import net.minecraft.network.chat.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/trinkets/ExtraReachGlovesItem.java b/src/main/java/de/dafuqs/spectrum/items/trinkets/ExtraReachGlovesItem.java index 5daf8d9a89..ad78ec6b54 100644 --- a/src/main/java/de/dafuqs/spectrum/items/trinkets/ExtraReachGlovesItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/trinkets/ExtraReachGlovesItem.java @@ -2,8 +2,8 @@ import com.google.common.collect.*; import de.dafuqs.spectrum.*; -import de.dafuqs.spectrum.api.energy.color.*; -import de.dafuqs.spectrum.api.energy.storage.*; +import de.dafuqs.spectrum.api.ink.color.*; +import de.dafuqs.spectrum.api.ink.storage.*; import net.minecraft.*; import net.minecraft.core.*; import net.minecraft.network.chat.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/trinkets/GleamingPinItem.java b/src/main/java/de/dafuqs/spectrum/items/trinkets/GleamingPinItem.java index aa920ab59c..7839d97b5c 100644 --- a/src/main/java/de/dafuqs/spectrum/items/trinkets/GleamingPinItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/trinkets/GleamingPinItem.java @@ -13,7 +13,6 @@ import net.minecraft.world.entity.player.*; import net.minecraft.world.item.*; import net.minecraft.world.phys.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/trinkets/GlowVisionGogglesItem.java b/src/main/java/de/dafuqs/spectrum/items/trinkets/GlowVisionGogglesItem.java index d357f16e27..417236130b 100644 --- a/src/main/java/de/dafuqs/spectrum/items/trinkets/GlowVisionGogglesItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/trinkets/GlowVisionGogglesItem.java @@ -1,8 +1,8 @@ package de.dafuqs.spectrum.items.trinkets; import de.dafuqs.spectrum.*; -import de.dafuqs.spectrum.api.energy.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.config.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.network.chat.*; @@ -75,7 +75,7 @@ public void appendHoverText(ItemStack stack, TooltipContext context, List getUsedColors() { + public List getUsedColors(ItemStack stack) { return List.of(INK_COST.color()); } } diff --git a/src/main/java/de/dafuqs/spectrum/items/trinkets/GravityRingItem.java b/src/main/java/de/dafuqs/spectrum/items/trinkets/GravityRingItem.java index 01d06bdccb..8fd96597d5 100644 --- a/src/main/java/de/dafuqs/spectrum/items/trinkets/GravityRingItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/trinkets/GravityRingItem.java @@ -1,8 +1,8 @@ package de.dafuqs.spectrum.items.trinkets; import com.google.common.collect.*; -import de.dafuqs.spectrum.api.energy.color.*; -import de.dafuqs.spectrum.api.energy.storage.*; +import de.dafuqs.spectrum.api.ink.color.*; +import de.dafuqs.spectrum.api.ink.storage.*; import net.minecraft.core.*; import net.minecraft.resources.*; import net.minecraft.world.entity.ai.attributes.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/trinkets/InkDrainCurioItem.java b/src/main/java/de/dafuqs/spectrum/items/trinkets/InkDrainCurioItem.java index 885d2b9357..8f1d41e4c2 100644 --- a/src/main/java/de/dafuqs/spectrum/items/trinkets/InkDrainCurioItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/trinkets/InkDrainCurioItem.java @@ -1,8 +1,7 @@ package de.dafuqs.spectrum.items.trinkets; -import de.dafuqs.spectrum.api.energy.*; -import de.dafuqs.spectrum.api.energy.color.*; -import de.dafuqs.spectrum.api.energy.storage.*; +import de.dafuqs.spectrum.api.ink.color.*; +import de.dafuqs.spectrum.api.ink.storage.*; import de.dafuqs.spectrum.api.render.*; import de.dafuqs.spectrum.components.*; import de.dafuqs.spectrum.helpers.*; @@ -14,7 +13,7 @@ import net.minecraft.util.*; import net.minecraft.world.entity.player.*; import net.minecraft.world.item.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; @@ -69,8 +68,8 @@ public ItemStack getDefaultInstance() { } @Override - public Drainability getDrainability() { - return Drainability.NEVER; + public boolean canDrain(boolean player) { + return false; } @Override @@ -128,6 +127,6 @@ public SlotEffect backgroundType(@Nullable Player player, ItemStack stack) { @Override public int getBackgroundColor(@Nullable Player player, ItemStack stack, float tickDelta) { - return inkColor.getColorInt(); + return inkColor.getColorARGB(); } } diff --git a/src/main/java/de/dafuqs/spectrum/items/trinkets/JeopardantItem.java b/src/main/java/de/dafuqs/spectrum/items/trinkets/JeopardantItem.java new file mode 100644 index 0000000000..6f0520617a --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/items/trinkets/JeopardantItem.java @@ -0,0 +1,47 @@ +package de.dafuqs.spectrum.items.trinkets; + +import de.dafuqs.spectrum.*; +import net.minecraft.client.*; +import net.minecraft.network.chat.*; +import net.minecraft.world.entity.*; +import net.minecraft.world.item.*; +import net.neoforged.api.distmarker.*; +import org.jspecify.annotations.*; +import top.theillusivec4.curios.api.*; + +import java.util.*; + +public class JeopardantItem extends SpectrumCurioItem { + + public JeopardantItem(Properties settings) { + super(settings, SpectrumCommon.locate("unlocks/trinkets/jeopardant")); + } + + public static double getAttackModifierForWearer(@Nullable LivingEntity entity) { + if (entity == null) { + return 0; + } else { + double mod = entity.getMaxHealth() / (entity.getHealth() * entity.getHealth() + 1); // starting with 1 % damage at 14 health up to 300 % damage at 1/20 health + return Math.max(0, 1 + Math.log10(mod)); + } + } + + @Override + public void onUnequip(SlotContext slotContext, ItemStack newStack, ItemStack stack) { + super.onUnequip(slotContext, newStack, stack); + } + + @OnlyIn(Dist.CLIENT) + @Override + public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip, TooltipFlag type) { + super.appendHoverText(stack, context, tooltip, type); + Minecraft client = Minecraft.getInstance(); + long mod = Math.round(getAttackModifierForWearer(client.player) * 100); + if (mod == 0) { + tooltip.add(Component.translatable("item.spectrum.jeopardant.tooltip.damage_zero")); + } else { + tooltip.add(Component.translatable("item.spectrum.jeopardant.tooltip.damage", mod)); + } + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/items/trinkets/LaurelsOfSerenityItem.java b/src/main/java/de/dafuqs/spectrum/items/trinkets/LaurelsOfSerenityItem.java index a242495865..a15c303033 100644 --- a/src/main/java/de/dafuqs/spectrum/items/trinkets/LaurelsOfSerenityItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/trinkets/LaurelsOfSerenityItem.java @@ -3,8 +3,8 @@ import com.google.common.collect.*; import de.dafuqs.additionalentityattributes.*; import de.dafuqs.spectrum.*; -import de.dafuqs.spectrum.api.energy.color.*; -import de.dafuqs.spectrum.api.energy.storage.*; +import de.dafuqs.spectrum.api.ink.color.*; +import de.dafuqs.spectrum.api.ink.storage.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.*; import net.minecraft.core.*; @@ -29,7 +29,6 @@ public void appendHoverText(ItemStack stack, TooltipContext context, List, AttributeModifier> getAttributeModifiers(SlotContext slotContext, ResourceLocation id, ItemStack stack) { @@ -44,11 +43,6 @@ public Multimap, AttributeModifier> getAttributeModifiers(Slot // so it shows up red in tooltips. Hmmmm modifiers.put(AdditionalEntityAttributes.MOB_DETECTION_RANGE, new AttributeModifier(DETECTION_RANGE_ATTRIBUTE_ID, -detectionRangeMod, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL)); } - double sleepResistanceMod = getInducedSleepResistanceMod(storedInk); - if (sleepResistanceMod != 0) { - modifiers.put(SpectrumEntityAttributes.MENTAL_PRESENCE, new AttributeModifier(MENTAL_PRESENCE_ATTRIBUTE_ID, sleepResistanceMod, AttributeModifier.Operation.ADD_VALUE)); - } - return modifiers; } @@ -60,12 +54,4 @@ public float getDetectionRangeMultiplier(long storedInk) { } } - public float getInducedSleepResistanceMod(long storedInk) { - if (storedInk < 100) { - return 0; - } else { - return 0.15F * (int) (Math.log(storedInk / 100.0f) / Math.log(8)); //TODO: reduce once the ink trinket cap is set back to 1.6 billion - } - } - } diff --git a/src/main/java/de/dafuqs/spectrum/items/trinkets/PotionPendantItem.java b/src/main/java/de/dafuqs/spectrum/items/trinkets/PotionPendantItem.java index dd3fd6a36a..0bc4fed6a7 100644 --- a/src/main/java/de/dafuqs/spectrum/items/trinkets/PotionPendantItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/trinkets/PotionPendantItem.java @@ -1,7 +1,8 @@ package de.dafuqs.spectrum.items.trinkets; -import de.dafuqs.spectrum.api.energy.*; +import de.dafuqs.spectrum.api.ink.*; import de.dafuqs.spectrum.api.item.*; +import de.dafuqs.spectrum.components.*; import net.minecraft.core.component.*; import net.minecraft.network.chat.*; import net.minecraft.resources.*; @@ -70,7 +71,7 @@ public void curioTick(SlotContext slotContext, ItemStack stack) { } private void grantEffects(ItemStack stack, Player player) { - for (InkPoweredStatusEffectInstance inkPoweredEffect : InkPoweredPotionFillable.getEffects(stack)) { + for (InkPoweredMobEffectInstance inkPoweredEffect : InkPoweredPotionContentsComponent.getEffects(stack)) { if (InkPowered.tryDrainEnergy(player, inkPoweredEffect.getInkCost())) { MobEffectInstance effect = inkPoweredEffect.getStatusEffectInstance(); player.addEffect(new MobEffectInstance(effect.getEffect(), EFFECT_DURATION, effect.getAmplifier(), effect.isAmbient(), effect.isVisible(), true)); diff --git a/src/main/java/de/dafuqs/spectrum/items/trinkets/RingOfAerialGraceItem.java b/src/main/java/de/dafuqs/spectrum/items/trinkets/RingOfAerialGraceItem.java index 9f057810ef..506d19b7f3 100644 --- a/src/main/java/de/dafuqs/spectrum/items/trinkets/RingOfAerialGraceItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/trinkets/RingOfAerialGraceItem.java @@ -1,7 +1,7 @@ package de.dafuqs.spectrum.items.trinkets; import de.dafuqs.spectrum.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import net.minecraft.*; import net.minecraft.network.chat.*; import net.minecraft.resources.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/trinkets/RingOfDenserStepsItem.java b/src/main/java/de/dafuqs/spectrum/items/trinkets/RingOfDenserStepsItem.java index 007c51943a..c5dc866d17 100644 --- a/src/main/java/de/dafuqs/spectrum/items/trinkets/RingOfDenserStepsItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/trinkets/RingOfDenserStepsItem.java @@ -1,7 +1,7 @@ package de.dafuqs.spectrum.items.trinkets; import de.dafuqs.spectrum.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import net.minecraft.*; import net.minecraft.network.chat.*; import net.minecraft.resources.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/trinkets/SevenLeagueBootsItem.java b/src/main/java/de/dafuqs/spectrum/items/trinkets/SevenLeagueBootsItem.java index f18cf9409f..6da14d5571 100644 --- a/src/main/java/de/dafuqs/spectrum/items/trinkets/SevenLeagueBootsItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/trinkets/SevenLeagueBootsItem.java @@ -8,7 +8,6 @@ import net.minecraft.world.entity.ai.attributes.*; import net.minecraft.world.item.*; import net.minecraft.world.item.enchantment.*; -import javax.annotation.*; import top.theillusivec4.curios.api.*; public class SevenLeagueBootsItem extends SpectrumCurioItem { diff --git a/src/main/java/de/dafuqs/spectrum/items/trinkets/TakeOffBeltItem.java b/src/main/java/de/dafuqs/spectrum/items/trinkets/TakeOffBeltItem.java index 93264b85ac..4687810a24 100644 --- a/src/main/java/de/dafuqs/spectrum/items/trinkets/TakeOffBeltItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/trinkets/TakeOffBeltItem.java @@ -18,7 +18,6 @@ import net.minecraft.world.item.enchantment.*; import net.minecraft.world.level.*; import net.minecraft.world.phys.*; -import javax.annotation.*; import top.theillusivec4.curios.api.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/trinkets/WeepingCircletItem.java b/src/main/java/de/dafuqs/spectrum/items/trinkets/WeepingCircletItem.java index 6ff9ed08c3..78872b1a8c 100644 --- a/src/main/java/de/dafuqs/spectrum/items/trinkets/WeepingCircletItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/trinkets/WeepingCircletItem.java @@ -13,7 +13,6 @@ import net.minecraft.world.item.*; import net.minecraft.world.level.*; import net.minecraft.world.phys.*; -import javax.annotation.*; import top.theillusivec4.curios.api.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/trinkets/WhispyCircletItem.java b/src/main/java/de/dafuqs/spectrum/items/trinkets/WhispyCircletItem.java index b6120d0ff0..d2603f6c98 100644 --- a/src/main/java/de/dafuqs/spectrum/items/trinkets/WhispyCircletItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/trinkets/WhispyCircletItem.java @@ -15,7 +15,7 @@ import net.minecraft.world.entity.ai.attributes.*; import net.minecraft.world.item.*; import net.minecraft.world.level.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; import top.theillusivec4.curios.api.*; import java.util.*; @@ -66,11 +66,4 @@ public void curioTick(SlotContext slotContext, ItemStack stack) { } } - @Override - public Multimap, AttributeModifier> getAttributeModifiers(SlotContext slotContext, ResourceLocation id, ItemStack stack) { - Multimap, AttributeModifier> modifiers = super.getAttributeModifiers(slotContext, id, stack); - modifiers.put(SpectrumEntityAttributes.MENTAL_PRESENCE, new AttributeModifier(ATTRIBUTE_ID, 0.3, AttributeModifier.Operation.ADD_VALUE)); - return modifiers; - } - } diff --git a/src/main/java/de/dafuqs/spectrum/items/trinkets/package-info.java b/src/main/java/de/dafuqs/spectrum/items/trinkets/package-info.java index 9d85e4afe1..86256910ad 100644 --- a/src/main/java/de/dafuqs/spectrum/items/trinkets/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/items/trinkets/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.items.trinkets; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/loot/SpectrumLootFunctionTypes.java b/src/main/java/de/dafuqs/spectrum/loot/SpectrumLootFunctionTypes.java index 51c31fdcd5..e618b708d5 100644 --- a/src/main/java/de/dafuqs/spectrum/loot/SpectrumLootFunctionTypes.java +++ b/src/main/java/de/dafuqs/spectrum/loot/SpectrumLootFunctionTypes.java @@ -15,7 +15,6 @@ public class SpectrumLootFunctionTypes { public static final LootItemFunctionType DYE_RANDOMLY = register("dye_randomly", DyeRandomlyLootFunction.CODEC); public static final LootItemFunctionType FERMENT_RANDOMLY = register("ferment_randomly", FermentRandomlyLootFunction.CODEC); public static final LootItemFunctionType SET_COMPONENTS_RANDOMLY = register("set_components_randomly", SetComponentsRandomlyLootFunction.CODEC); - public static final LootItemFunctionType FILL_POTION_FILLABLE = register("fill_potion_fillable", FillPotionFillableLootFunction.CODEC); public static final LootItemFunctionType GRANT_ADVANCEMENT = register("grant_advancement", GrantAdvancementLootFunction.CODEC); private static LootItemFunctionType register(String id, MapCodec codec) { diff --git a/src/main/java/de/dafuqs/spectrum/loot/functions/DyeRandomlyLootFunction.java b/src/main/java/de/dafuqs/spectrum/loot/functions/DyeRandomlyLootFunction.java index 0d42259245..ed7076de21 100644 --- a/src/main/java/de/dafuqs/spectrum/loot/functions/DyeRandomlyLootFunction.java +++ b/src/main/java/de/dafuqs/spectrum/loot/functions/DyeRandomlyLootFunction.java @@ -12,7 +12,6 @@ import net.minecraft.world.level.storage.loot.*; import net.minecraft.world.level.storage.loot.functions.*; import net.minecraft.world.level.storage.loot.predicates.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/loot/functions/FermentRandomlyLootFunction.java b/src/main/java/de/dafuqs/spectrum/loot/functions/FermentRandomlyLootFunction.java index b53cbfb1af..625f7f93d6 100644 --- a/src/main/java/de/dafuqs/spectrum/loot/functions/FermentRandomlyLootFunction.java +++ b/src/main/java/de/dafuqs/spectrum/loot/functions/FermentRandomlyLootFunction.java @@ -19,7 +19,6 @@ import net.minecraft.world.level.storage.loot.predicates.*; import net.minecraft.world.level.storage.loot.providers.number.*; import net.minecraft.world.phys.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/loot/functions/FillPotionFillableLootFunction.java b/src/main/java/de/dafuqs/spectrum/loot/functions/FillPotionFillableLootFunction.java deleted file mode 100644 index 9be8fe2a40..0000000000 --- a/src/main/java/de/dafuqs/spectrum/loot/functions/FillPotionFillableLootFunction.java +++ /dev/null @@ -1,86 +0,0 @@ -package de.dafuqs.spectrum.loot.functions; - -import com.mojang.serialization.*; -import com.mojang.serialization.codecs.*; -import de.dafuqs.spectrum.api.energy.*; -import de.dafuqs.spectrum.api.energy.color.*; -import de.dafuqs.spectrum.api.item.*; -import de.dafuqs.spectrum.helpers.*; -import de.dafuqs.spectrum.loot.*; -import net.minecraft.core.*; -import net.minecraft.core.registries.*; -import net.minecraft.world.effect.*; -import net.minecraft.world.item.*; -import net.minecraft.world.level.storage.loot.*; -import net.minecraft.world.level.storage.loot.functions.*; -import net.minecraft.world.level.storage.loot.predicates.*; -import net.minecraft.world.level.storage.loot.providers.number.*; -import javax.annotation.*; - -import java.util.*; - -public class FillPotionFillableLootFunction extends LootItemConditionalFunction { - - public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(i -> commonFields(i).and( - InkPoweredPotionTemplate.CODEC.forGetter(c -> c.template) - ).apply(i, FillPotionFillableLootFunction::new)); - - public record InkPoweredPotionTemplate( - boolean ambient, boolean showParticles, NumberProvider duration, - List> statusEffects, int color, NumberProvider amplifier, - List inkColors, NumberProvider inkCost, boolean unidentifiable - ) { - - public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(i -> i.group( - Codec.BOOL.optionalFieldOf("ambient", false).forGetter(InkPoweredPotionTemplate::ambient), - Codec.BOOL.optionalFieldOf("show_particles", false).forGetter(InkPoweredPotionTemplate::showParticles), - NumberProviders.CODEC.fieldOf("duration").forGetter(InkPoweredPotionTemplate::duration), - CodecHelper.singleOrList(BuiltInRegistries.MOB_EFFECT.holderByNameCodec()).fieldOf("status_effect").forGetter(InkPoweredPotionTemplate::statusEffects), - Codec.INT.optionalFieldOf("color", -1).forGetter(InkPoweredPotionTemplate::color), - NumberProviders.CODEC.fieldOf("amplifier").forGetter(InkPoweredPotionTemplate::amplifier), - CodecHelper.singleOrList(InkColor.CODEC).fieldOf("ink_color").forGetter(InkPoweredPotionTemplate::inkColors), - NumberProviders.CODEC.fieldOf("ink_cost").forGetter(InkPoweredPotionTemplate::inkCost), - Codec.BOOL.optionalFieldOf("unidentifiable", false).forGetter(InkPoweredPotionTemplate::unidentifiable) - ).apply(i, InkPoweredPotionTemplate::new)); - - public InkPoweredStatusEffectInstance get(LootContext context) { - Holder statusEffect = this.statusEffects.get(context.getRandom().nextInt(this.statusEffects.size())); - MobEffectInstance statusEffectInstance = new MobEffectInstance(statusEffect, this.duration.getInt(context), this.amplifier.getInt(context), ambient, showParticles, true); - InkColor inkColor = this.inkColors.get(context.getRandom().nextInt(this.inkColors.size())); - int cost = this.inkCost.getInt(context); - return new InkPoweredStatusEffectInstance(statusEffectInstance, new InkAmount(inkColor, cost), this.color, this.unidentifiable); - } - - } - - private final InkPoweredPotionTemplate template; - - FillPotionFillableLootFunction(List conditions, InkPoweredPotionTemplate template) { - super(conditions); - this.template = template; - } - - @Override - public LootItemFunctionType getType() { - return SpectrumLootFunctionTypes.FILL_POTION_FILLABLE; - } - - @Override - public ItemStack run(ItemStack stack, LootContext context) { - if (!(stack.getItem() instanceof InkPoweredPotionFillable inkPoweredPotionFillable)) - return stack; - - if (inkPoweredPotionFillable.isFull(stack)) - return stack; - - InkPoweredStatusEffectInstance effect = template.get(context); - inkPoweredPotionFillable.addOrUpgradeEffects(stack, List.of(effect)); - - return stack; - } - - public static LootItemConditionalFunction.Builder builder(InkPoweredPotionTemplate template) { - return simpleBuilder((conditions) -> new FillPotionFillableLootFunction(conditions, template)); - } - -} diff --git a/src/main/java/de/dafuqs/spectrum/loot/functions/GrantAdvancementLootFunction.java b/src/main/java/de/dafuqs/spectrum/loot/functions/GrantAdvancementLootFunction.java index 82bfd1fe98..f13e51367c 100644 --- a/src/main/java/de/dafuqs/spectrum/loot/functions/GrantAdvancementLootFunction.java +++ b/src/main/java/de/dafuqs/spectrum/loot/functions/GrantAdvancementLootFunction.java @@ -14,7 +14,6 @@ import net.minecraft.world.level.storage.loot.functions.*; import net.minecraft.world.level.storage.loot.parameters.*; import net.minecraft.world.level.storage.loot.predicates.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/loot/functions/SetComponentsRandomlyLootFunction.java b/src/main/java/de/dafuqs/spectrum/loot/functions/SetComponentsRandomlyLootFunction.java index 2453ac4e29..a6eeaaea82 100644 --- a/src/main/java/de/dafuqs/spectrum/loot/functions/SetComponentsRandomlyLootFunction.java +++ b/src/main/java/de/dafuqs/spectrum/loot/functions/SetComponentsRandomlyLootFunction.java @@ -8,7 +8,6 @@ import net.minecraft.world.level.storage.loot.*; import net.minecraft.world.level.storage.loot.functions.*; import net.minecraft.world.level.storage.loot.predicates.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/loot/functions/package-info.java b/src/main/java/de/dafuqs/spectrum/loot/functions/package-info.java index 3b9ea541b9..d609a63dc8 100644 --- a/src/main/java/de/dafuqs/spectrum/loot/functions/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/loot/functions/package-info.java @@ -3,6 +3,5 @@ @FieldsAreNonnullByDefault package de.dafuqs.spectrum.loot.functions; -import net.minecraft.FieldsAreNonnullByDefault; -import net.minecraft.MethodsReturnNonnullByDefault; -import org.jspecify.annotations.NullMarked; +import net.minecraft.*; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/loot/modifiers/SnifferDiggingAdditionsLootModifier.java b/src/main/java/de/dafuqs/spectrum/loot/modifiers/SnifferDiggingAdditionsLootModifier.java index 94f4626278..0322fbea6f 100644 --- a/src/main/java/de/dafuqs/spectrum/loot/modifiers/SnifferDiggingAdditionsLootModifier.java +++ b/src/main/java/de/dafuqs/spectrum/loot/modifiers/SnifferDiggingAdditionsLootModifier.java @@ -11,7 +11,6 @@ import net.minecraft.world.level.storage.loot.*; import net.minecraft.world.level.storage.loot.predicates.*; import net.neoforged.neoforge.common.loot.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/loot/modifiers/TreasureHunterLootModifier.java b/src/main/java/de/dafuqs/spectrum/loot/modifiers/TreasureHunterLootModifier.java index 1c387835ec..db0794d93a 100644 --- a/src/main/java/de/dafuqs/spectrum/loot/modifiers/TreasureHunterLootModifier.java +++ b/src/main/java/de/dafuqs/spectrum/loot/modifiers/TreasureHunterLootModifier.java @@ -1,14 +1,13 @@ package de.dafuqs.spectrum.loot.modifiers; -import com.mojang.serialization.Codec; -import com.mojang.serialization.MapCodec; -import com.mojang.serialization.codecs.RecordCodecBuilder; +import com.mojang.serialization.*; +import com.mojang.serialization.codecs.*; import de.dafuqs.spectrum.*; import de.dafuqs.spectrum.config.*; import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.progression.*; import de.dafuqs.spectrum.registries.*; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import it.unimi.dsi.fastutil.objects.*; import net.minecraft.advancements.critereon.*; import net.minecraft.core.registries.*; import net.minecraft.server.level.*; @@ -17,13 +16,12 @@ import net.minecraft.world.entity.*; import net.minecraft.world.entity.monster.*; import net.minecraft.world.entity.player.*; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.item.*; +import net.minecraft.world.level.storage.loot.*; import net.minecraft.world.level.storage.loot.parameters.*; -import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; +import net.minecraft.world.level.storage.loot.predicates.*; import net.minecraft.world.phys.*; -import net.neoforged.neoforge.common.loot.IGlobalLootModifier; -import net.neoforged.neoforge.common.loot.LootModifier; +import net.neoforged.neoforge.common.loot.*; import java.util.*; @@ -85,7 +83,7 @@ protected ObjectArrayList doApply(ObjectArrayList original RandomSource random = lootContext.getRandom(); for(Entry e : this.entries) { if(e.predicate.matches(serverLevel, pos, killed)) { - if(random.nextFloat() > e.chance() * treasureHunterLevel) { + if(random.nextFloat() > SpectrumEntityAttributes.modifyLootChance(e.chance(), player) * treasureHunterLevel) { continue; } diff --git a/src/main/java/de/dafuqs/spectrum/loot/modifiers/package-info.java b/src/main/java/de/dafuqs/spectrum/loot/modifiers/package-info.java index 6387a44c21..e6752dece5 100644 --- a/src/main/java/de/dafuqs/spectrum/loot/modifiers/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/loot/modifiers/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.loot.modifiers; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/loot/package-info.java b/src/main/java/de/dafuqs/spectrum/loot/package-info.java index 07fbb1688d..29724cef7e 100644 --- a/src/main/java/de/dafuqs/spectrum/loot/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/loot/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.loot; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/magic/MoonstoneStrike.java b/src/main/java/de/dafuqs/spectrum/magic/MoonstoneStrike.java index 96312e9e83..a7bdd76e9f 100644 --- a/src/main/java/de/dafuqs/spectrum/magic/MoonstoneStrike.java +++ b/src/main/java/de/dafuqs/spectrum/magic/MoonstoneStrike.java @@ -20,7 +20,7 @@ import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.gameevent.*; import net.minecraft.world.phys.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/magic/package-info.java b/src/main/java/de/dafuqs/spectrum/magic/package-info.java index fdd18d8419..8b32dd4f1d 100644 --- a/src/main/java/de/dafuqs/spectrum/magic/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/magic/package-info.java @@ -3,6 +3,5 @@ @FieldsAreNonnullByDefault package de.dafuqs.spectrum.magic; -import net.minecraft.FieldsAreNonnullByDefault; -import net.minecraft.MethodsReturnNonnullByDefault; -import org.jspecify.annotations.NullMarked; +import net.minecraft.*; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/mixin/AbstractBlockStateMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/AbstractBlockStateMixin.java deleted file mode 100644 index e6589a3c87..0000000000 --- a/src/main/java/de/dafuqs/spectrum/mixin/AbstractBlockStateMixin.java +++ /dev/null @@ -1,54 +0,0 @@ -package de.dafuqs.spectrum.mixin; - -import com.llamalad7.mixinextras.injector.*; -import de.dafuqs.spectrum.api.interaction.*; -import de.dafuqs.spectrum.registries.*; -import net.minecraft.core.*; -import net.minecraft.server.level.*; -import net.minecraft.world.item.*; -import net.minecraft.world.item.enchantment.*; -import net.minecraft.world.level.*; -import net.minecraft.world.level.block.*; -import net.minecraft.world.level.block.state.*; -import net.minecraft.world.level.material.*; -import net.minecraft.world.phys.shapes.*; -import org.spongepowered.asm.mixin.*; -import org.spongepowered.asm.mixin.injection.*; - -@Mixin(BlockBehaviour.BlockStateBase.class) -public abstract class AbstractBlockStateMixin { - - @ModifyVariable(method = "spawnAfterBreak", at = @At("HEAD"), ordinal = 0, argsOnly = true) - public boolean spectrum$preventXPDropsWhenUsingResonance(boolean dropExperience, ServerLevel world, BlockPos pos, ItemStack stack) { - if (ResonanceProcessor.preventNextXPDrop && EnchantmentHelper.hasTag(stack, SpectrumEnchantmentTags.RESONANT_BLOCK_DROPS)) { - ResonanceProcessor.preventNextXPDrop = false; - return false; - } - return dropExperience; - } - - // https://github.com/apace100/water-walking-fix - @ModifyReturnValue(method = "getCollisionShape(Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/phys/shapes/CollisionContext;)Lnet/minecraft/world/phys/shapes/VoxelShape;", at = @At( - "RETURN")) - public VoxelShape getFluidloggedCollisionShape(VoxelShape original, BlockGetter level, BlockPos pos, CollisionContext context) { - FluidState fluidState = level.getFluidState(pos); - int fluidLevel = fluidState.getAmount(); - if (fluidLevel == 0) return original; - VoxelShape fluidShape = FLUID_LEVEL_SHAPES[fluidLevel]; - - if ( - context.isAbove(fluidShape, pos, true) && - context.canStandOnFluid(level.getFluidState(pos.above()), fluidState) - ) return Shapes.or(original, fluidShape); - return original; - } - - @Unique - private static final VoxelShape[] FLUID_LEVEL_SHAPES; - static { - FLUID_LEVEL_SHAPES = new VoxelShape[16]; - for (int i = 0; i <= 8; i++) { - FLUID_LEVEL_SHAPES[i] = Block.box(0.0, 0.0, 0.0, 16.0, i, 16.0); - } - } -} diff --git a/src/main/java/de/dafuqs/spectrum/mixin/BlockBehaviorMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/BlockBehaviorMixin.java index c0ec60cc7a..5e35116fa8 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/BlockBehaviorMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/BlockBehaviorMixin.java @@ -5,7 +5,7 @@ import net.minecraft.world.item.*; import net.minecraft.world.level.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.injection.*; import org.spongepowered.asm.mixin.injection.callback.*; diff --git a/src/main/java/de/dafuqs/spectrum/mixin/BlockMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/BlockMixin.java index 5003a66179..afb69c0756 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/BlockMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/BlockMixin.java @@ -13,21 +13,17 @@ import net.minecraft.world.entity.player.*; import net.minecraft.world.item.*; import net.minecraft.world.item.enchantment.*; -import net.minecraft.world.level.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.entity.*; import net.minecraft.world.level.block.state.*; -import javax.annotation.*; import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.injection.*; -import org.spongepowered.asm.mixin.injection.callback.*; import java.util.*; @Mixin(Block.class) public abstract class BlockMixin { - // TODO: move to event @ModifyReturnValue(method = "getDrops(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/entity/BlockEntity;Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/item/ItemStack;)Ljava/util/List;", at = @At("RETURN")) private static List spectrum$getDroppedStacks(List original, BlockState state, ServerLevel world, BlockPos pos, BlockEntity blockEntity, Entity entity, ItemStack stack) { List droppedStacks = original; @@ -41,7 +37,7 @@ public abstract class BlockMixin { // Resonance: drop self or modify drops for some items if (EnchantmentHelper.hasTag(stack, SpectrumEnchantmentTags.RESONANT_BLOCK_DROPS)) { - ResonanceProcessor.applyResonance(world.registryAccess(), state, blockEntity, droppedStacks); + droppedStacks = ResonanceProcessor.applyResonance(world.registryAccess(), state, blockEntity, droppedStacks); } if (!droppedStacks.isEmpty()) { diff --git a/src/main/java/de/dafuqs/spectrum/mixin/BrainMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/BrainMixin.java index 146633a564..e71e0cf31f 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/BrainMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/BrainMixin.java @@ -1,7 +1,7 @@ package de.dafuqs.spectrum.mixin; -import de.dafuqs.spectrum.registries.*; import de.dafuqs.spectrum.mob_effect.*; +import de.dafuqs.spectrum.registries.*; import net.minecraft.server.level.*; import net.minecraft.world.entity.*; import net.minecraft.world.entity.ai.*; diff --git a/src/main/java/de/dafuqs/spectrum/mixin/CatEntityMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/CatEntityMixin.java deleted file mode 100644 index aa214def96..0000000000 --- a/src/main/java/de/dafuqs/spectrum/mixin/CatEntityMixin.java +++ /dev/null @@ -1,50 +0,0 @@ -package de.dafuqs.spectrum.mixin; - -import de.dafuqs.spectrum.helpers.*; -import de.dafuqs.spectrum.registries.*; -import net.minecraft.resources.*; -import net.minecraft.server.level.*; -import net.minecraft.world.*; -import net.minecraft.world.effect.*; -import net.minecraft.world.entity.*; -import net.minecraft.world.entity.animal.*; -import net.minecraft.world.entity.player.*; -import net.minecraft.world.item.*; -import net.minecraft.world.level.*; -import org.spongepowered.asm.mixin.*; -import org.spongepowered.asm.mixin.injection.*; -import org.spongepowered.asm.mixin.injection.callback.*; - -import java.util.*; - -@Mixin(Cat.class) -public abstract class CatEntityMixin extends TamableAnimal { - - protected CatEntityMixin(EntityType entityType, Level world) { - super(entityType, world); - } - - @Inject(at = @At("HEAD"), method = "mobInteract") - private void spectrum$feedKitten(Player player, InteractionHand hand, CallbackInfoReturnable cir) { - ItemStack itemStack = player.getItemInHand(hand); - - if (this.level().isClientSide()) return; - if (!this.hasCustomName()) return; - - assert this.getCustomName() != null; - String customName = this.getCustomName().getString().toUpperCase(Locale.ROOT); - - boolean howMany = customName.equals("AAA") || customName.equals("AAA ❣"); - if (player instanceof ServerPlayer serverPlayerEntity) { - if (itemStack.is(SpectrumItems.STRATINE_GEM) && this.hasEffect(MobEffects.LEVITATION) && howMany) { - Support.grantAdvancementCriterion(serverPlayerEntity, ResourceLocation.fromNamespaceAndPath("spectrum", "midgame/become_enlightened"), "confirmed"); - this.removeEffect(MobEffects.LEVITATION); - this.addEffect(new MobEffectInstance( - MobEffects.SLOW_FALLING, - 600, - 1 - )); - } - } - } -} diff --git a/src/main/java/de/dafuqs/spectrum/mixin/CatMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/CatMixin.java new file mode 100644 index 0000000000..c9989036b5 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/mixin/CatMixin.java @@ -0,0 +1,87 @@ +package de.dafuqs.spectrum.mixin; + +import de.dafuqs.spectrum.registries.*; +import net.minecraft.core.*; +import net.minecraft.tags.*; +import net.minecraft.util.*; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.ai.util.*; +import net.minecraft.world.entity.animal.*; +import net.minecraft.world.entity.animal.axolotl.*; +import net.minecraft.world.entity.monster.*; +import net.minecraft.world.level.*; +import net.minecraft.world.level.block.state.*; +import net.minecraft.world.level.pathfinder.*; +import net.minecraft.world.phys.*; +import org.spongepowered.asm.mixin.*; +import org.spongepowered.asm.mixin.injection.*; +import org.spongepowered.asm.mixin.injection.callback.*; + +import javax.annotation.*; +import java.util.*; +import java.util.function.*; + +@Mixin(Cat.class) +public abstract class CatMixin extends TamableAnimal { + + protected CatMixin(EntityType entityType, Level level) { + super(entityType, level); + } + + @Inject(method = "setVariant(Lnet/minecraft/core/Holder;)V", at = @At("HEAD")) + public void setVariant(Holder variant, CallbackInfo ci) { + if(variant.equals(SpectrumCatVariants.CATUS)) { + this.setPathfindingMalus(PathType.WATER_BORDER, 0.0F); + + goalSelector.getAvailableGoals().stream() + .filter( wrappedGoal -> wrappedGoal != null && wrappedGoal.getGoal() instanceof WaterAvoidingRandomStrollGoal) + .forEach(wrappedGoal -> goalSelector.removeGoal(wrappedGoal.getGoal())); + goalSelector.addGoal(5, new CatusStrollGoal((Cat) (Object) this, 1.0F)); + } else if(variant.equals(SpectrumCatVariants.FELIS)) { + goalSelector.getAvailableGoals().stream() + .filter(wrappedGoal -> wrappedGoal != null && wrappedGoal.getGoal() instanceof TemptGoal) + .forEach(wrappedGoal -> goalSelector.removeGoal(wrappedGoal.getGoal())); + goalSelector.addGoal(4, new TemptGoal(this, 1.75, (stack) -> stack.is(ItemTags.CAT_FOOD), false)); + } + } + + private static class CatusStrollGoal extends RandomStrollGoal { + + private static final int HORIZONTAL_RADIUS = 10; + private static final int VERTICAL_DISTANCE_SOLID = 2; + + private static final int HORIZONTAL_RADIUS_WATER = 7; + private static final int VERTICAL_DISTANCE_WATER = 1; + + public CatusStrollGoal(PathfinderMob mob, double speedModifier) { + super(mob, speedModifier); + } + + @Nullable + protected Vec3 getPosition() { + List validShore = new ArrayList<>(); + + for(BlockPos pos : BlockPos.betweenClosed(Mth.floor(this.mob.getX() - HORIZONTAL_RADIUS_WATER), Mth.floor(this.mob.getY() - VERTICAL_DISTANCE_WATER), Mth.floor(this.mob.getZ() - HORIZONTAL_RADIUS_WATER), Mth.floor(this.mob.getX() + HORIZONTAL_RADIUS_WATER), this.mob.getBlockY() + VERTICAL_DISTANCE_WATER, Mth.floor(this.mob.getZ() + HORIZONTAL_RADIUS_WATER))) { + if (this.mob.level().getFluidState(pos).is(FluidTags.WATER)) { + for(Direction direction : Direction.Plane.HORIZONTAL) { + BlockPos relativePos = pos.relative(direction); + BlockState relativeState = this.mob.level().getBlockState(relativePos); + if(relativeState.isSolid()) { + validShore.add(relativePos); + } + } + } + } + + if(!validShore.isEmpty()) { + RandomSource random = this.mob.getRandom(); + return Vec3.atCenterOf(validShore.get(random.nextInt(validShore.size()))); + } + + return DefaultRandomPos.getPos(this.mob, HORIZONTAL_RADIUS, VERTICAL_DISTANCE_SOLID); + } + + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/mixin/CropAndStemBlockMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/CropAndStemBlockMixin.java index c4a69cb1c2..c0c6425a10 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/CropAndStemBlockMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/CropAndStemBlockMixin.java @@ -35,11 +35,4 @@ public abstract class CropAndStemBlockMixin { } } - @Inject(at = @At("HEAD"), method = "randomTick", cancellable = true) - public void spectrum$isFertilizable(BlockState state, ServerLevel world, BlockPos pos, RandomSource random, CallbackInfo ci) { - if (world.getBlockState(pos.below()).is(SpectrumBlocks.TILLED_SHALE_CLAY)) { - ci.cancel(); - } - } - } diff --git a/src/main/java/de/dafuqs/spectrum/mixin/CropBlockMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/CropBlockMixin.java deleted file mode 100644 index c47897b68c..0000000000 --- a/src/main/java/de/dafuqs/spectrum/mixin/CropBlockMixin.java +++ /dev/null @@ -1,40 +0,0 @@ -package de.dafuqs.spectrum.mixin; - -import com.llamalad7.mixinextras.injector.*; -import de.dafuqs.spectrum.blocks.farming.*; -import de.dafuqs.spectrum.registries.*; -import net.minecraft.core.*; -import net.minecraft.world.level.*; -import net.minecraft.world.level.block.*; -import net.minecraft.world.level.block.state.*; -import org.spongepowered.asm.mixin.*; -import org.spongepowered.asm.mixin.injection.*; -import org.spongepowered.asm.mixin.injection.callback.*; - -@Mixin(CropBlock.class) -public abstract class CropBlockMixin { - - @ModifyExpressionValue(method = "getGrowthSpeed", at = @At(value = "INVOKE", ordinal = 0, target = "net/minecraft/world/level/BlockGetter.getBlockState (Lnet/minecraft/core/BlockPos;)Lnet/minecraft/world/level/block/state/BlockState;")) - private static BlockState spectrum$getAvailableMoisture(BlockState original) { - Block originalBlock = original.getBlock(); - if (originalBlock instanceof SpectrumFarmlandBlock) { - return Blocks.FARMLAND.defaultBlockState().setValue(FarmBlock.MOISTURE, original.getValue(FarmBlock.MOISTURE)); - } - return original; - } - - @Inject(method = "growCrops", at = @At("HEAD"), cancellable = true) - private void spectrum$cancelGrowthAttempts(Level world, BlockPos pos, BlockState state, CallbackInfo ci) { - if (world.getBlockState(pos.below()).is(SpectrumBlocks.TILLED_SHALE_CLAY)) { - ci.cancel(); - } - } - - @Inject(method = "growCrops", at = @At("HEAD"), cancellable = true) - public void spectrum$hasRandomTicks(Level world, BlockPos pos, BlockState state, CallbackInfo ci) { - if (world.getBlockState(pos.below()).is(SpectrumBlocks.TILLED_SHALE_CLAY)) { - ci.cancel(); - } - } - -} diff --git a/src/main/java/de/dafuqs/spectrum/mixin/DamageSourceMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/DamageSourceMixin.java deleted file mode 100644 index d64ef062dc..0000000000 --- a/src/main/java/de/dafuqs/spectrum/mixin/DamageSourceMixin.java +++ /dev/null @@ -1,26 +0,0 @@ -package de.dafuqs.spectrum.mixin; - -import de.dafuqs.spectrum.api.damage_type.*; -import net.minecraft.world.damagesource.*; -import net.minecraft.world.item.*; -import org.jspecify.annotations.Nullable; -import org.spongepowered.asm.mixin.*; - -import java.util.*; - -@Mixin(DamageSource.class) -public class DamageSourceMixin implements StackTracking { - - @Unique - private Optional trackedStack = Optional.empty(); - - @Override - public Optional spectrum$getTrackedStack() { - return trackedStack; - } - - @Override - public void spectrum$setTrackedStack(@Nullable ItemStack stack) { - trackedStack = Optional.ofNullable(stack); - } -} diff --git a/src/main/java/de/dafuqs/spectrum/mixin/EffectCommandMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/EffectCommandMixin.java deleted file mode 100644 index a006d1ae0b..0000000000 --- a/src/main/java/de/dafuqs/spectrum/mixin/EffectCommandMixin.java +++ /dev/null @@ -1,41 +0,0 @@ -package de.dafuqs.spectrum.mixin; - -import com.llamalad7.mixinextras.sugar.*; -import de.dafuqs.spectrum.registries.*; -import net.minecraft.commands.*; -import net.minecraft.core.*; -import net.minecraft.core.registries.*; -import net.minecraft.server.commands.*; -import net.minecraft.world.effect.*; -import net.minecraft.world.entity.*; -import org.spongepowered.asm.mixin.*; -import org.spongepowered.asm.mixin.injection.*; -import org.spongepowered.asm.mixin.injection.callback.*; - -import java.util.*; - -// TODO: needed? -@Mixin(EffectCommands.class) -public class EffectCommandMixin { - - @Inject(method = "clearEffects", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;removeAllEffects()Z")) - private static void clearUncurableEffects(CommandSourceStack source, Collection targets, CallbackInfoReturnable cir, @Local Entity target) { - if (target instanceof LivingEntity living) { - for (MobEffectInstance effect : living.getActiveEffects()) { - effect.getCures().remove(SpectrumEffectCures.COMMAND_ONLY); - } - // manually remove fatal slumber to bypass turning it into eternal slumber - living.removeEffect(SpectrumMobEffects.FATAL_SLUMBER); - } - } - - @Inject(method = "clearEffect", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;removeEffect(Lnet/minecraft/core/Holder;)Z")) - private static void clearUncurableEffect(CommandSourceStack source, Collection targets, Holder statusEffect, CallbackInfoReturnable cir, @Local Entity target, @Local MobEffect ref) { - if (target instanceof LivingEntity living) { - var effect = living.getEffect(living.level().registryAccess().registryOrThrow(Registries.MOB_EFFECT).wrapAsHolder(ref)); - if (effect != null) { - effect.getCures().remove(SpectrumEffectCures.COMMAND_ONLY); - } - } - } -} diff --git a/src/main/java/de/dafuqs/spectrum/mixin/EnchantmentHelperMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/EnchantmentHelperMixin.java index f2ca3b9dab..1b9fea10b2 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/EnchantmentHelperMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/EnchantmentHelperMixin.java @@ -3,12 +3,15 @@ import com.llamalad7.mixinextras.injector.*; import com.llamalad7.mixinextras.sugar.*; import de.dafuqs.spectrum.api.item.*; +import de.dafuqs.spectrum.helpers.*; import net.minecraft.core.*; import net.minecraft.core.component.*; import net.minecraft.world.item.*; import net.minecraft.world.item.enchantment.*; import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.injection.*; + +import java.util.function.*; import java.util.stream.*; @Mixin(EnchantmentHelper.class) @@ -21,10 +24,12 @@ private static Stream> doNothing(Stream> if (!(stack.getItem() instanceof Preenchanted)) { return original; } - ItemEnchantments itemEnchantments = stack.get(DataComponents.ENCHANTMENTS); - if (itemEnchantments == null) + ItemEnchantments existingEnchantments = stack.get(DataComponents.ENCHANTMENTS); + if (existingEnchantments == null) return original; - //Do not enchant an item with enchantments already present on the itemstack - return original.filter(enchantmentHolder -> !itemEnchantments.keySet().contains(enchantmentHolder)); + // Do not enchant an item with: + // - enchantments already present + // - incompatible enchantments + return original.filter(candidate -> EnchantmentHelper.isEnchantmentCompatible(existingEnchantments.keySet(), candidate)); } } diff --git a/src/main/java/de/dafuqs/spectrum/mixin/EndermanEntityMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/EndermanEntityMixin.java index 57a38d6bf7..4ba732e78d 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/EndermanEntityMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/EndermanEntityMixin.java @@ -1,6 +1,5 @@ package de.dafuqs.spectrum.mixin; -import de.dafuqs.spectrum.*; import de.dafuqs.spectrum.config.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.server.level.*; @@ -8,7 +7,7 @@ import net.minecraft.world.entity.monster.*; import net.minecraft.world.level.*; import net.minecraft.world.level.block.state.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.injection.*; import org.spongepowered.asm.mixin.injection.callback.*; diff --git a/src/main/java/de/dafuqs/spectrum/mixin/EntityMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/EntityMixin.java index ac8db34884..74fb4edea1 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/EntityMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/EntityMixin.java @@ -13,6 +13,8 @@ import net.minecraft.world.item.*; import net.minecraft.world.item.enchantment.*; import net.minecraft.world.phys.*; +import net.neoforged.neoforge.common.*; +import net.neoforged.neoforge.fluids.*; import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.injection.*; import org.spongepowered.asm.mixin.injection.callback.*; @@ -20,6 +22,9 @@ @Mixin(Entity.class) public abstract class EntityMixin { + @Shadow + protected abstract void setFluidTypeHeight(FluidType type, double height); + @ModifyVariable(method = "makeStuckInBlock", at = @At(value = "LOAD"), argsOnly = true) private Vec3 spectrum$applyInexorableAntiBlockSlowdown(Vec3 multiplier) { var entity = (Entity) (Object) this; @@ -90,4 +95,14 @@ public abstract class EntityMixin { return original; } + + // fixes weirdness with entities like fish not being able to swim in liquid crystal + // TODO: test and remove in MC 26.1 since Neo patched that in https://github.com/neoforged/NeoForge/commit/ad038e822a142901aeb33b0eedde0a892588b662 + @Inject(method = "setFluidTypeHeight(Lnet/neoforged/neoforge/fluids/FluidType;D)V", at = @At("HEAD")) + protected final void spectrum$considerLiquidCrystalWater(FluidType type, double height, CallbackInfo ci) { + if(type == SpectrumFluids.LIQUID_CRYSTAL_TYPE.get()) { + this.setFluidTypeHeight(NeoForgeMod.WATER_TYPE.value(), height); + } + } + } diff --git a/src/main/java/de/dafuqs/spectrum/mixin/EntityTypeMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/EntityTypeMixin.java deleted file mode 100644 index 70e35ba2f4..0000000000 --- a/src/main/java/de/dafuqs/spectrum/mixin/EntityTypeMixin.java +++ /dev/null @@ -1,20 +0,0 @@ -package de.dafuqs.spectrum.mixin; - -import de.dafuqs.spectrum.entity.*; -import net.minecraft.world.entity.*; -import org.spongepowered.asm.mixin.*; -import org.spongepowered.asm.mixin.injection.*; -import org.spongepowered.asm.mixin.injection.callback.*; - -@Mixin(EntityType.class) -public abstract class EntityTypeMixin { - - @Inject(at = @At("TAIL"), method = "trackDeltas", cancellable = true) - public void alwaysUpdateVelocity(CallbackInfoReturnable cir) { - Object thisObject = this; - if (thisObject == SpectrumEntityTypes.PHANTOM_FRAME.get() || thisObject == SpectrumEntityTypes.GLOW_PHANTOM_FRAME.get() || thisObject == SpectrumEntityTypes.KINDLING_COUGH.get()) { - cir.setReturnValue(false); - } - } - -} diff --git a/src/main/java/de/dafuqs/spectrum/mixin/FallingBlockEntityMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/FallingBlockEntityMixin.java index 1e4bffc5ca..1506c60b91 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/FallingBlockEntityMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/FallingBlockEntityMixin.java @@ -2,6 +2,7 @@ import com.llamalad7.mixinextras.sugar.*; import de.dafuqs.spectrum.recipe.anvil_crushing.*; +import net.minecraft.server.level.*; import net.minecraft.world.damagesource.*; import net.minecraft.world.entity.*; import net.minecraft.world.entity.item.*; @@ -19,10 +20,10 @@ public class FallingBlockEntityMixin { */ @Inject(method = "causeFallDamage", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/state/BlockState;is(Lnet/minecraft/tags/TagKey;)Z")) private void spectrum$processAnvilCrushing(float fallDistance, float damageMultiplier, DamageSource damageSource, CallbackInfoReturnable cir, @Local(ordinal = 1) DamageSource damageSource2, @Local(ordinal = 2) float fallHurt) { - if (damageSource2.is(DamageTypes.FALLING_ANVIL)) { - FallingBlockEntity thisEntity = (FallingBlockEntity) (Object) this; - thisEntity.level().getEntities(EntityTypeTest.forClass(ItemEntity.class), thisEntity.getBoundingBox(), Entity::isAlive) - .forEach((entity) -> AnvilCrusher.crush(entity, fallHurt)); + FallingBlockEntity thisEntity = (FallingBlockEntity) (Object) this; + if (damageSource2.is(DamageTypes.FALLING_ANVIL) && thisEntity.level() instanceof ServerLevel serverLevel) { + serverLevel.getEntities(EntityTypeTest.forClass(ItemEntity.class), thisEntity.getBoundingBox(), Entity::isAlive) + .forEach((entity) -> AnvilCrusher.crush(serverLevel, entity, fallHurt)); } } diff --git a/src/main/java/de/dafuqs/spectrum/mixin/FishingHookPredicateMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/FishingHookPredicateMixin.java deleted file mode 100644 index cb9f434e76..0000000000 --- a/src/main/java/de/dafuqs/spectrum/mixin/FishingHookPredicateMixin.java +++ /dev/null @@ -1,31 +0,0 @@ -package de.dafuqs.spectrum.mixin; - -import de.dafuqs.spectrum.entity.entity.*; -import net.minecraft.advancements.critereon.*; -import net.minecraft.server.level.*; -import net.minecraft.world.entity.*; -import net.minecraft.world.phys.*; -import org.spongepowered.asm.mixin.*; -import org.spongepowered.asm.mixin.injection.*; -import org.spongepowered.asm.mixin.injection.callback.*; - -import java.util.*; - -@Mixin(FishingHookPredicate.class) -public abstract class FishingHookPredicateMixin { - - @Shadow - @Final - private Optional inOpenWater; - - @Inject(method = "matches", at = @At(value = "HEAD"), cancellable = true) - public void spectrum$test(Entity entity, ServerLevel world, Vec3 pos, CallbackInfoReturnable cir) { - if (entity instanceof SpectrumFishingHook spectrumFishingHook) { - if (this.inOpenWater.isEmpty()) { - cir.setReturnValue(true); - } - cir.setReturnValue(this.inOpenWater.get() == spectrumFishingHook.isOpenWaterFishing()); - } - } - -} diff --git a/src/main/java/de/dafuqs/spectrum/mixin/GeodesGenerateWithGemstoneOresMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/GeodesGenerateWithGemstoneOresMixin.java index d863a91364..e6c596ca58 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/GeodesGenerateWithGemstoneOresMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/GeodesGenerateWithGemstoneOresMixin.java @@ -1,19 +1,19 @@ package de.dafuqs.spectrum.mixin; +import de.dafuqs.spectrum.data_loaders.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.core.*; -import net.minecraft.tags.*; import net.minecraft.util.*; import net.minecraft.world.level.*; -import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.levelgen.feature.*; import net.minecraft.world.level.levelgen.feature.configurations.*; -import org.jspecify.annotations.Nullable; import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.injection.*; import org.spongepowered.asm.mixin.injection.callback.*; +import java.util.*; + @Mixin(GeodeFeature.class) public abstract class GeodesGenerateWithGemstoneOresMixin { @@ -32,104 +32,40 @@ public void generate(FeaturePlaceContext context, CallbackIn @Unique private void spectrum$generateGemstoneOres(FeaturePlaceContext context) { BlockState gemBlock = context.config().geodeBlockSettings.innerLayerProvider.getState(context.random(), context.origin()); - BlockState oreBlockState = spectrum$getGemstoneOreForGeodeBlock(gemBlock); - if (oreBlockState != null) { // do not handle other modded geodes - BlockState blackslagOreBlockState = spectrum$getGemstoneBlackslagOreForGeodeBlock(gemBlock); - BlockState deepslateOreBlockState = spectrum$getGemstoneDeepslateOreForGeodeBlock(gemBlock); - WorldGenLevel world = context.level(); - RandomSource random = context.random(); - // having steps for distance with a fixed amount assures - // that the ore amount gets less with distance from the center - for (int distance = 5; distance < 14; distance++) { - for (int i = 0; i < 24; i++) { - int xOffset = (random.nextInt(distance + 1) * 2 - distance); - int yOffset = (random.nextInt(distance + 1) * 2 - distance); - int zOffset = (random.nextInt(distance + 1) * 2 - distance); - - BlockPos pos = context.origin().offset(xOffset, yOffset, zOffset); - BlockState state = world.getBlockState(pos); - if (state.is(SpectrumBlockTags.BLACKSLAG_ORE_REPLACEABLES)) { - world.setBlock(pos, blackslagOreBlockState, 3); - } else if (state.is(BlockTags.DEEPSLATE_ORE_REPLACEABLES)) { - world.setBlock(pos, deepslateOreBlockState, 3); - } else if (world.getBlockState(pos).is(BlockTags.STONE_ORE_REPLACEABLES)) { - world.setBlock(pos, oreBlockState, 3); + + Optional> geodeOresRegistry = context.level().registryAccess().registry(SpectrumRegistryKeys.GEODE_ORES); + if (geodeOresRegistry.isPresent()) { + Optional geodeOreDefinition = geodeOresRegistry.get() + .stream() + .filter(definition -> definition.blocks().test(gemBlock)) + .findFirst(); + + if (geodeOreDefinition.isPresent()) { + GeodeOreDefinition definition = geodeOreDefinition.get(); + WorldGenLevel world = context.level(); + RandomSource random = context.random(); + + // having steps for distance with a fixed amount assures + // that the ore amount gets less with distance from the center + for (int distance = definition.minDistance(); distance < definition.maxDistance(); distance++) { + for (int i = 0; i < definition.tries(); i++) { + int xOffset = (random.nextInt(distance + 1) * 2 - distance); + int yOffset = (random.nextInt(distance + 1) * 2 - distance); + int zOffset = (random.nextInt(distance + 1) * 2 - distance); + + BlockPos pos = context.origin().offset(xOffset, yOffset, zOffset); + BlockState state = world.getBlockState(pos); + + for (OreConfiguration.TargetBlockState target : definition.oreConfiguration()) { + if (target.target.test(state, random)) { + world.setBlock(pos, target.state, 3); + break; + } + } } } } } } - /** - * Returns a matching ore block for a gemstone block - * Aka amethyst_block => amethyst_ore - * - * @param blockState The blockstate the geode generates with - * @return the matching ore for that block state. Does return null if no matching ore exists. For example if another mod adds additional geodes - */ - @Unique - private @Nullable BlockState spectrum$getGemstoneOreForGeodeBlock(BlockState blockState) { - Block block = blockState.getBlock(); - if (block.equals(Blocks.AMETHYST_BLOCK)) { - return SpectrumBlocks.AMETHYST_ORE.get().defaultBlockState(); - } else if (block.equals(SpectrumBlocks.CITRINE_BLOCK.get())) { - return SpectrumBlocks.CITRINE_ORE.get().defaultBlockState(); - } else if (block.equals(SpectrumBlocks.TOPAZ_BLOCK.get())) { - return SpectrumBlocks.TOPAZ_ORE.get().defaultBlockState(); - } else if (block.equals(SpectrumBlocks.ONYX_BLOCK.get())) { - return SpectrumBlocks.ONYX_ORE.get().defaultBlockState(); - } else if (block.equals(SpectrumBlocks.MOONSTONE_BLOCK.get())) { - return SpectrumBlocks.MOONSTONE_ORE.get().defaultBlockState(); - } - return null; - } - - /** - * Returns a matching ore block for a gemstone block - * Aka amethyst_block => amethyst_ore - * - * @param blockState The blockstate the geode generates with - * @return the matching ore for that block state. Does return null if no matching ore exists. For example if another mod adds additional geodes - */ - @Unique - private @Nullable BlockState spectrum$getGemstoneDeepslateOreForGeodeBlock(BlockState blockState) { - Block block = blockState.getBlock(); - if (block.equals(Blocks.AMETHYST_BLOCK)) { - return SpectrumBlocks.DEEPSLATE_AMETHYST_ORE.get().defaultBlockState(); - } else if (block.equals(SpectrumBlocks.CITRINE_BLOCK.get())) { - return SpectrumBlocks.DEEPSLATE_CITRINE_ORE.get().defaultBlockState(); - } else if (block.equals(SpectrumBlocks.TOPAZ_BLOCK.get())) { - return SpectrumBlocks.DEEPSLATE_TOPAZ_ORE.get().defaultBlockState(); - } else if (block.equals(SpectrumBlocks.ONYX_BLOCK.get())) { - return SpectrumBlocks.DEEPSLATE_ONYX_ORE.get().defaultBlockState(); - } else if (block.equals(SpectrumBlocks.MOONSTONE_BLOCK.get())) { - return SpectrumBlocks.DEEPSLATE_MOONSTONE_ORE.get().defaultBlockState(); - } - return null; - } - - /** - * Returns a matching ore block for a gemstone block - * Aka amethyst_block => amethyst_ore - * - * @param blockState The blockstate the geode generates with - * @return the matching ore for that block state. Does return null if no matching ore exists. For example if another mod adds additional geodes - */ - @Unique - private @Nullable BlockState spectrum$getGemstoneBlackslagOreForGeodeBlock(BlockState blockState) { - Block block = blockState.getBlock(); - if (block.equals(Blocks.AMETHYST_BLOCK)) { - return SpectrumBlocks.BLACKSLAG_AMETHYST_ORE.get().defaultBlockState(); - } else if (block.equals(SpectrumBlocks.CITRINE_BLOCK.get())) { - return SpectrumBlocks.BLACKSLAG_CITRINE_ORE.get().defaultBlockState(); - } else if (block.equals(SpectrumBlocks.TOPAZ_BLOCK.get())) { - return SpectrumBlocks.BLACKSLAG_TOPAZ_ORE.get().defaultBlockState(); - } else if (block.equals(SpectrumBlocks.ONYX_BLOCK.get())) { - return SpectrumBlocks.BLACKSLAG_ONYX_ORE.get().defaultBlockState(); - } else if (block.equals(SpectrumBlocks.MOONSTONE_BLOCK.get())) { - return SpectrumBlocks.BLACKSLAG_MOONSTONE_ORE.get().defaultBlockState(); - } - return null; - } - } diff --git a/src/main/java/de/dafuqs/spectrum/mixin/GlassBottleItemMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/GlassBottleItemMixin.java deleted file mode 100644 index eda2c1c327..0000000000 --- a/src/main/java/de/dafuqs/spectrum/mixin/GlassBottleItemMixin.java +++ /dev/null @@ -1,55 +0,0 @@ -package de.dafuqs.spectrum.mixin; - -import com.llamalad7.mixinextras.sugar.*; -import de.dafuqs.revelationary.api.advancements.*; -import de.dafuqs.spectrum.*; -import de.dafuqs.spectrum.blocks.decay.*; -import de.dafuqs.spectrum.config.*; -import de.dafuqs.spectrum.registries.*; -import net.minecraft.core.*; -import net.minecraft.server.level.*; -import net.minecraft.sounds.*; -import net.minecraft.world.*; -import net.minecraft.world.entity.player.*; -import net.minecraft.world.item.*; -import net.minecraft.world.level.*; -import net.minecraft.world.level.block.*; -import net.minecraft.world.level.block.state.*; -import org.spongepowered.asm.mixin.*; -import org.spongepowered.asm.mixin.injection.*; -import org.spongepowered.asm.mixin.injection.callback.*; - -@Mixin(BottleItem.class) -public abstract class GlassBottleItemMixin { - - @Shadow - protected abstract ItemStack turnBottleIntoItem(ItemStack stack, Player player, ItemStack outputStack); - - @Inject(method = "use", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/material/FluidState;is(Lnet/minecraft/tags/TagKey;)Z"), cancellable = true) - public void onUse(Level world, Player user, InteractionHand hand, CallbackInfoReturnable> cir, @Local ItemStack handStack, @Local BlockPos blockPos) { - BlockState blockState = world.getBlockState(blockPos); - - if (blockState.is(SpectrumBlocks.FADING) && SpectrumConfig.CONFIG.CanBottleUpFading.get() && AdvancementHelper.hasAdvancement(user, SpectrumAdvancements.UNLOCK_BOTTLE_OF_FADING)) { - cir.setReturnValue(spectrum$bottleUpDecay(world, user, handStack, blockPos, blockState, SpectrumItems.BOTTLE_OF_FADING.get())); - } else if (blockState.is(SpectrumBlocks.FAILING) && SpectrumConfig.CONFIG.CanBottleUpFailing.get() && AdvancementHelper.hasAdvancement(user, SpectrumAdvancements.UNLOCK_BOTTLE_OF_FAILING)) { - cir.setReturnValue(spectrum$bottleUpDecay(world, user, handStack, blockPos, blockState, SpectrumItems.BOTTLE_OF_FAILING.get())); - } else if (blockState.is(SpectrumBlocks.RUIN) && SpectrumConfig.CONFIG.CanBottleUpRuin.get() && AdvancementHelper.hasAdvancement(user, SpectrumAdvancements.UNLOCK_BOTTLE_OF_RUIN)) { - cir.setReturnValue(spectrum$bottleUpDecay(world, user, handStack, blockPos, blockState, SpectrumItems.BOTTLE_OF_RUIN.get())); - } else if (blockState.is(SpectrumBlocks.FORFEITURE) && SpectrumConfig.CONFIG.CanBottleUpForfeiture.get() && AdvancementHelper.hasAdvancement(user, SpectrumAdvancements.UNLOCK_BOTTLE_OF_FORFEITURE)) { - cir.setReturnValue(spectrum$bottleUpDecay(world, user, handStack, blockPos, blockState, SpectrumItems.BOTTLE_OF_FORFEITURE.get())); - } - } - - @Unique - private InteractionResultHolder spectrum$bottleUpDecay(Level world, Player user, @Local ItemStack handStack, @Local BlockPos blockPos, BlockState blockState, Item item) { - if(!world.isClientSide) { - blockState.getBlock().playerWillDestroy(world, blockPos, blockState, user); - world.setBlockAndUpdate(blockPos, Blocks.AIR.defaultBlockState()); - blockState.spawnAfterBreak((ServerLevel) world, blockPos, handStack, false); - } - - world.playSound(user, user.getX(), user.getY(), user.getZ(), SoundEvents.BOTTLE_FILL_DRAGONBREATH, SoundSource.NEUTRAL, 1.0F, 1.0F); - return InteractionResultHolder.sidedSuccess(this.turnBottleIntoItem(handStack, user, item.getDefaultInstance()), world.isClientSide()); - } - -} diff --git a/src/main/java/de/dafuqs/spectrum/mixin/IEntityExtensionMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/IEntityExtensionMixin.java new file mode 100644 index 0000000000..437273adee --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/mixin/IEntityExtensionMixin.java @@ -0,0 +1,27 @@ +package de.dafuqs.spectrum.mixin; + +import com.llamalad7.mixinextras.injector.*; +import de.dafuqs.spectrum.registries.*; +import net.neoforged.neoforge.common.*; +import net.neoforged.neoforge.common.extensions.*; +import net.neoforged.neoforge.fluids.*; +import org.spongepowered.asm.mixin.*; +import org.spongepowered.asm.mixin.injection.*; + +@Mixin(IEntityExtension.class) +public interface IEntityExtensionMixin { + + @Shadow + FluidType getEyeInFluidType(); + + // fixes weirdness with entities like fish not being able to swim in liquid crystal + // TODO: test and remove in MC 26.1 since Neo patched that in https://github.com/neoforged/NeoForge/commit/ad038e822a142901aeb33b0eedde0a892588b662 + @ModifyReturnValue(method = "isEyeInFluidType(Lnet/neoforged/neoforge/fluids/FluidType;)Z", at = @At("RETURN")) + default boolean getEyeInFluidType(boolean original, FluidType type) { + if(!original && type == NeoForgeMod.WATER_TYPE.value()) { + return getEyeInFluidType() == SpectrumFluids.LIQUID_CRYSTAL_TYPE.get(); + } + return original; + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/mixin/InfestedBlockMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/InfestedBlockMixin.java index 9139f847de..1ff14de7b4 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/InfestedBlockMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/InfestedBlockMixin.java @@ -23,10 +23,6 @@ public abstract class InfestedBlockMixin { */ @Inject(at = @At("HEAD"), method = "spawnAfterBreak", cancellable = true) public void onStacksDropped(BlockState state, ServerLevel world, BlockPos pos, ItemStack stack, boolean dropExperience, CallbackInfo ci) { - if (EnchantmentHelper.hasTag(stack, SpectrumEnchantmentTags.RESONANT_BLOCK_DROPS)) { - ci.cancel(); - } - if (EnchantmentHelper.hasTag(stack, SpectrumEnchantmentTags.AUTO_KILLS_SILVERFISH)) { Silverfish silverfishEntity = EntityType.SILVERFISH.create(world); if (silverfishEntity != null) { diff --git a/src/main/java/de/dafuqs/spectrum/mixin/ItemEntityMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/ItemEntityMixin.java index 3457c0d27a..f0e9bb68bd 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/ItemEntityMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/ItemEntityMixin.java @@ -1,7 +1,6 @@ package de.dafuqs.spectrum.mixin; import de.dafuqs.spectrum.api.item.*; -import de.dafuqs.spectrum.components.*; import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.recipe.primordial_fire_burning.*; import de.dafuqs.spectrum.registries.*; @@ -70,7 +69,7 @@ public void spectrumItemStackDamageActions(DamageSource source, float amount, Ca private void isDamageProof(DamageSource source, float amount, CallbackInfoReturnable cir) { ItemEntity thisItemEntity = (ItemEntity) (Object) this; if (DamageImmunityHelper.isImmuneTo(thisItemEntity.getItem(), source)) { - cir.setReturnValue(true); + cir.setReturnValue(false); } else if (source.is(SpectrumDamageTypes.PRIMORDIAL_FIRE)) { if (PrimordialFireBurningRecipe.processItemEntity(thisItemEntity.level(), thisItemEntity)) { cir.setReturnValue(true); diff --git a/src/main/java/de/dafuqs/spectrum/mixin/ItemStackMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/ItemStackMixin.java index 533d7c16fc..6ebc1fdfea 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/ItemStackMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/ItemStackMixin.java @@ -8,14 +8,11 @@ import de.dafuqs.spectrum.registries.*; import net.minecraft.core.component.*; import net.minecraft.network.chat.*; -import net.minecraft.world.effect.*; import net.minecraft.world.entity.player.*; import net.minecraft.world.inventory.*; import net.minecraft.world.item.*; -import net.minecraft.world.item.alchemy.*; -import net.minecraft.world.item.component.*; import net.minecraft.world.item.enchantment.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.injection.*; import org.spongepowered.asm.mixin.injection.callback.*; @@ -62,7 +59,6 @@ public abstract class ItemStackMixin { } } - // TODO: move to event @Inject(method = "getTooltipLines", at = @At(value = "INVOKE", target = "net/minecraft/world/item/TooltipFlag.isAdvanced ()Z", shift = At.Shift.BEFORE, ordinal = 1)) public void spectrum$AppendTooltip(Item.TooltipContext context, Player player, TooltipFlag type, CallbackInfoReturnable> cir, @Local Consumer consumer) { var stack = (ItemStack) (Object) this; @@ -79,7 +75,6 @@ public abstract class ItemStackMixin { if (canvasEnchantments != null && !canvasEnchantments.isEmpty()) { canvasEnchantments.addToTooltip(context, consumer, type); } - } } \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/mixin/LightningEntityMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/LightningEntityMixin.java index b2ee31ecee..130b5d4915 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/LightningEntityMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/LightningEntityMixin.java @@ -8,7 +8,6 @@ import net.minecraft.world.level.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.*; -import javax.annotation.*; import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.injection.*; import org.spongepowered.asm.mixin.injection.callback.*; diff --git a/src/main/java/de/dafuqs/spectrum/mixin/LilyPadBlockMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/LilyPadBlockMixin.java index 202f498c46..e650efce04 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/LilyPadBlockMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/LilyPadBlockMixin.java @@ -18,6 +18,6 @@ public class LilyPadBlockMixin { return true; FluidState localState = world.getFluidState(pos); FluidState aboveState = world.getFluidState(pos.above()); - return (localState.getType() == SpectrumFluids.SLUDGE.get() || localState.getType() == SpectrumFluids.LIQUID_CRYSTAL.get()) && aboveState.getType() == Fluids.EMPTY; + return (localState.getType() == SpectrumFluids.LIQUID_CRYSTAL.get()) && aboveState.getType() == Fluids.EMPTY; } } diff --git a/src/main/java/de/dafuqs/spectrum/mixin/LivingEntityMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/LivingEntityMixin.java index a8d96144d0..fb261f3dce 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/LivingEntityMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/LivingEntityMixin.java @@ -4,17 +4,15 @@ import com.llamalad7.mixinextras.injector.wrapoperation.*; import com.llamalad7.mixinextras.sugar.*; import com.llamalad7.mixinextras.sugar.ref.*; -import de.dafuqs.spectrum.api.damage_type.*; import de.dafuqs.spectrum.api.item.*; import de.dafuqs.spectrum.attachment_types.*; import de.dafuqs.spectrum.blocks.memory.*; import de.dafuqs.spectrum.components.*; -import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.helpers.enchantments.*; import de.dafuqs.spectrum.items.tools.*; import de.dafuqs.spectrum.items.trinkets.*; -import de.dafuqs.spectrum.registries.*; import de.dafuqs.spectrum.mob_effect.*; +import de.dafuqs.spectrum.registries.*; import net.minecraft.core.*; import net.minecraft.nbt.*; import net.minecraft.server.level.*; @@ -31,8 +29,7 @@ import net.minecraft.world.level.*; import net.minecraft.world.level.material.*; import net.minecraft.world.phys.*; -import net.neoforged.neoforge.common.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.injection.*; import org.spongepowered.asm.mixin.injection.callback.*; @@ -69,18 +66,9 @@ public abstract class LivingEntityMixin { @Shadow public abstract void travel(Vec3 movementInput); - @Shadow - protected ItemStack useItem; - @Shadow public abstract double getAttributeValue(Holder attribute); - @Shadow - protected abstract @Nullable SoundEvent getDeathSound(); - - @Shadow - protected abstract float getSoundVolume(); - @Shadow protected boolean dead; @@ -187,26 +175,6 @@ public abstract class LivingEntityMixin { return original; } - @ModifyExpressionValue(method = {"hurt"}, at = {@At(value = "CONSTANT", args = {"floatValue=0F"}, ordinal = 2)}) - private float spectrum$parryingSwordShielding(float original, @Local(argsOnly = true) DamageSource source, @Local(ordinal = 2) float shieldedDamage) { - var entity = (LivingEntity) (Object) this; - var activeStack = entity.getUseItem(); - var useTime = entity.getTicksUsingItem(); - - if (!(activeStack.getItem() instanceof ParryingSwordItem parryingSword)) - return original; - - if (entity instanceof Player player && parryingSword.canBluffParry(activeStack, entity, useTime)) { - var comp = MiscPlayerDataAttachmentType.get(player); - comp.setParryTicks(15); - - if (parryingSword.canPerfectParry(activeStack, entity, useTime)) - comp.markForPerfectCounter(); - } - - return shieldedDamage * parryingSword.getBlockingMultiplier(source, activeStack, entity, useTime); - } - @ModifyExpressionValue(method = "isDamageSourceBlocked", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/projectile/AbstractArrow;getPierceLevel()B")) private byte spectrum$parryPiercingProjectiles(byte original) { var entity = (LivingEntity) (Object) this; @@ -277,16 +245,10 @@ public abstract class LivingEntityMixin { @Unique private Optional> spectrum$getArmorPiercing(DamageSource source) { - if (!(source instanceof StackTracking stackTracking)) - return Optional.empty(); - - var stackOptional = stackTracking.spectrum$getTrackedStack(); - - if (stackOptional.isEmpty()) + ItemStack stack = source.getWeaponItem(); + if (stack == null || stack.isEmpty()) return Optional.empty(); - var stack = stackOptional.get(); - if (!(stack.getItem() instanceof ArmorPiercingItem ap)) return Optional.empty(); @@ -306,110 +268,6 @@ public abstract class LivingEntityMixin { return false; } - // TODO: move to event - @Inject(method = "addEffect(Lnet/minecraft/world/effect/MobEffectInstance;Lnet/minecraft/world/entity/Entity;)Z", at = @At("HEAD"), cancellable = true) - private void spectrum$addEffect(MobEffectInstance effect, Entity source, CallbackInfoReturnable cir) { - var entity = (LivingEntity) (Object) this; - var effectType = effect.getEffect(); - - // if it is a stacking effect, stack it - MobEffectInstance existingInstance = this.getEffect(effectType); - if (existingInstance != null && effectType.is(SpectrumMobEffectTags.STACKING)) { - SpectrumMobEffects.effectsAreGettingStacked = true; - - int newAmplifier = 1 + existingInstance.getAmplifier() + effect.getAmplifier(); - effect.spectrum$setAmplifier(newAmplifier); - SpectrumMobEffects.effectsAreGettingStacked = false; - } - - if ((!entity.hasEffect(SpectrumMobEffects.IMMUNITY)) && AetherGracedNectarGlovesItem.testEffectFor(entity, effectType)) { - int cost = (effect.getAmplifier() + 1) * AetherGracedNectarGlovesItem.HARMFUL_EFFECT_COST; - - if (AetherGracedNectarGlovesItem.tryBlockEffect(entity, cost)) { - cir.setReturnValue(false); - return; - } - } - - float resistanceModifier = Mth.clamp(SleepMobEffect.getSleepResistance(effect, entity), 0.1F, 10F); - if (effectType == SpectrumMobEffects.ETERNAL_SLUMBER) { - if (SleepMobEffect.isImmuneish(entity)) { - effect.spectrum$setDuration(Math.round(effect.getDuration() / resistanceModifier)); - } else if (!entity.getType().is(SpectrumEntityTypeTags.SLEEP_RESISTANT)) { - effect.spectrum$setDuration(MobEffectInstance.INFINITE_DURATION); - } - } else if (effectType == SpectrumMobEffects.FATAL_SLUMBER) { - if (SleepMobEffect.isImmuneish(entity) && entity.getType().is(Tags.EntityTypes.BOSSES)) { - effect.spectrum$setDuration(20 * 60); - } else { - effect.spectrum$setDuration(Math.max(Math.round(effect.getDuration() * resistanceModifier * 3), 20 * 10)); - } - } - } - // TODO: move to event - @Inject(method = "hurt", at = @At("HEAD"), cancellable = true) - private void spectrum$applyBonusDamage(DamageSource source, float amount, CallbackInfoReturnable cir) { - LivingEntity target = (LivingEntity) (Object) this; - - // SetHealth damage does exactly that - if (amount > 0 && source.is(SpectrumDamageTypeTags.USES_SET_HEALTH)) { - float h = target.getHealth(); - target.setHealth(h - amount); - target.getCombatTracker().recordDamage(source, amount); - if (target.isDeadOrDying()) { - if (!dead) { - var deathSound = getDeathSound(); - if (deathSound != null) - target.playSound(deathSound, getSoundVolume(), target.getVoicePitch()); - } - target.die(source); - } - cir.setReturnValue(true); - return; - } - - // If this entity is hit with a SplitDamageItem, damage() gets called recursively for each type of damage dealt - if (!SpectrumDamageTypes.recursiveDamageFlag && amount > 0 && source.getDirectEntity() instanceof LivingEntity livingSource) { - ItemStack mainHandStack = livingSource.getMainHandItem(); - if (mainHandStack.getItem() instanceof SplitDamageItem splitDamageItem) { - SpectrumDamageTypes.recursiveDamageFlag = true; - SplitDamageItem.DamageComposition composition = splitDamageItem.getDamageComposition(livingSource, target, mainHandStack, amount); - - boolean damaged = false; - for (Tuple entry : composition.get()) { - int invulnerableTimeStore = target.invulnerableTime; - target.invulnerableTime = 0; - damaged |= hurt(entry.getA(), entry.getB()); - target.invulnerableTime = invulnerableTimeStore; - } - - SpectrumDamageTypes.recursiveDamageFlag = false; - cir.setReturnValue(damaged); - } - } - } - - // TODO: move to event - @Inject(method = "hurt", at = @At(value = "INVOKE", target = "net/minecraft/world/entity/LivingEntity.isDeadOrDying ()Z", ordinal = 1)) - private void spectrum$TriggerArmorWithHitEffect(DamageSource source, float amount, CallbackInfoReturnable cir) { - LivingEntity thisEntity = (LivingEntity) (Object) this; - Level world = thisEntity.level(); - if (!world.isClientSide()) { - if (thisEntity instanceof Mob thisMobEntity) { - for (ItemStack armorItemStack : thisMobEntity.getArmorSlots()) { - if (armorItemStack.getItem() instanceof ArmorWithHitEffect armorWithHitEffect) { - armorWithHitEffect.onHit(armorItemStack, source, thisMobEntity, amount); - } - } - } else if (thisEntity instanceof ServerPlayer thisPlayerEntity) { - for (ItemStack armorItemStack : thisPlayerEntity.getArmorSlots()) { - if (armorItemStack.getItem() instanceof ArmorWithHitEffect armorWithHitEffect) { - armorWithHitEffect.onHit(armorItemStack, source, thisPlayerEntity, amount); - } - } - } - } - } @ModifyVariable(method = "setSprinting(Z)V", at = @At("HEAD"), argsOnly = true) private boolean spectrum$setSprinting(boolean sprinting) { @@ -428,17 +286,6 @@ public abstract class LivingEntityMixin { } } - @Inject(method = "addEffect(Lnet/minecraft/world/effect/MobEffectInstance;Lnet/minecraft/world/entity/Entity;)Z", at = @At(value = "INVOKE", target = "Ljava/util/Map;get(Ljava/lang/Object;)Ljava/lang/Object;")) - private void spectrum$addStatusEffect(MobEffectInstance effect, Entity source, CallbackInfoReturnable cir) { - if (MobEffectHelper.canBeExtended(effect.getEffect())) { - MobEffectInstance effectProlongingInstance = this.getEffect(SpectrumMobEffects.EFFECT_PROLONGING); - if (effectProlongingInstance != null) { - effect.spectrum$setDuration(MobEffectHelper.getExtendedDuration(effect.getDuration(), effectProlongingInstance.getAmplifier())); - } - } - } - - @Inject(method = "dropAllDeathLoot", at = @At("HEAD"), cancellable = true) protected void drop(ServerLevel world, DamageSource damageSource, CallbackInfo ci) { LivingEntity thisEntity = (LivingEntity) (Object) this; diff --git a/src/main/java/de/dafuqs/spectrum/mixin/LivingEntityPreventStatusClearMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/LivingEntityPreventStatusClearMixin.java deleted file mode 100644 index 5fb921594b..0000000000 --- a/src/main/java/de/dafuqs/spectrum/mixin/LivingEntityPreventStatusClearMixin.java +++ /dev/null @@ -1,50 +0,0 @@ -package de.dafuqs.spectrum.mixin; - -import com.llamalad7.mixinextras.injector.v2.*; -import com.llamalad7.mixinextras.injector.wrapoperation.*; -import com.llamalad7.mixinextras.sugar.*; -import com.llamalad7.mixinextras.sugar.ref.*; -import de.dafuqs.spectrum.helpers.*; -import de.dafuqs.spectrum.registries.*; -import net.minecraft.core.*; -import net.minecraft.network.protocol.game.*; -import net.minecraft.server.level.*; -import net.minecraft.world.effect.*; -import net.minecraft.world.entity.*; -import org.spongepowered.asm.mixin.*; -import org.spongepowered.asm.mixin.injection.*; -import org.spongepowered.asm.mixin.injection.callback.*; - -import java.util.*; - -@Mixin(value = LivingEntity.class) -public abstract class LivingEntityPreventStatusClearMixin { - - @Shadow - public abstract boolean addEffect(MobEffectInstance effect); - - @Shadow - public abstract Map getActiveEffectsMap(); - - @Inject(method = "removeAllEffects", at = @At("HEAD")) - private void spectrum$detectFatalSlumber(CallbackInfoReturnable cir, @Share("hasFatalSlumber") LocalBooleanRef hasFatalSlumber) { - hasFatalSlumber.set(getActiveEffectsMap().containsKey(SpectrumMobEffects.FATAL_SLUMBER.value())); - } - - @Inject(method = "removeAllEffects", at = @At("TAIL")) - private void spectrum$applyEternalSlumberIfFatalSlumberRemoved(CallbackInfoReturnable cir, @Share("hasFatalSlumber") LocalBooleanRef hasFatalSlumber) { - if (hasFatalSlumber.get()) { - addEffect(new MobEffectInstance(SpectrumMobEffects.ETERNAL_SLUMBER, 6000)); - } - } - - @WrapWithCondition(method = "removeAllEffects", at = @At(value = "INVOKE", target = "Ljava/util/Iterator;remove()V")) - private boolean spectrum$preventStatusClear2(Iterator instance, @Share("blockRemoval") LocalBooleanRef blockRemoval) { - if (blockRemoval.get()) { - blockRemoval.set(false); - return false; - } - return true; - } - -} \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/mixin/MapStateMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/MapStateMixin.java index 07f0ffd05d..5245fac0bc 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/MapStateMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/MapStateMixin.java @@ -7,7 +7,7 @@ import net.minecraft.resources.*; import net.minecraft.world.level.*; import net.minecraft.world.level.saveddata.maps.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.injection.*; import org.spongepowered.asm.mixin.injection.callback.*; diff --git a/src/main/java/de/dafuqs/spectrum/mixin/MobEntityMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/MobEntityMixin.java index 385c06dec9..9e418eddd3 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/MobEntityMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/MobEntityMixin.java @@ -1,9 +1,9 @@ package de.dafuqs.spectrum.mixin; -import de.dafuqs.spectrum.registries.*; import de.dafuqs.spectrum.mob_effect.*; +import de.dafuqs.spectrum.registries.*; import net.minecraft.world.entity.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.injection.*; import org.spongepowered.asm.mixin.injection.callback.*; diff --git a/src/main/java/de/dafuqs/spectrum/mixin/PlayerEntityMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/PlayerEntityMixin.java deleted file mode 100644 index f50dcd2333..0000000000 --- a/src/main/java/de/dafuqs/spectrum/mixin/PlayerEntityMixin.java +++ /dev/null @@ -1,182 +0,0 @@ -package de.dafuqs.spectrum.mixin; - -import com.google.common.collect.*; -import com.llamalad7.mixinextras.injector.*; -import com.llamalad7.mixinextras.injector.wrapoperation.*; -import de.dafuqs.spectrum.api.entity.*; -import de.dafuqs.spectrum.api.item.*; -import de.dafuqs.spectrum.attachment_types.*; -import de.dafuqs.spectrum.components.*; -import de.dafuqs.spectrum.entity.entity.*; -import de.dafuqs.spectrum.helpers.*; -import de.dafuqs.spectrum.items.tools.*; -import de.dafuqs.spectrum.items.trinkets.*; -import de.dafuqs.spectrum.registries.*; -import net.minecraft.core.*; -import net.minecraft.core.component.*; -import net.minecraft.core.particles.*; -import net.minecraft.server.level.*; -import net.minecraft.sounds.*; -import net.minecraft.world.*; -import net.minecraft.world.damagesource.*; -import net.minecraft.world.entity.*; -import net.minecraft.world.entity.ai.attributes.*; -import net.minecraft.world.entity.player.*; -import net.minecraft.world.item.*; -import net.minecraft.world.item.component.*; -import net.minecraft.world.item.enchantment.*; -import net.minecraft.world.level.*; -import net.minecraft.world.level.block.state.*; -import javax.annotation.*; -import org.spongepowered.asm.mixin.*; -import org.spongepowered.asm.mixin.injection.*; -import org.spongepowered.asm.mixin.injection.callback.*; - -import java.util.*; - -@Mixin(Player.class) -public abstract class PlayerEntityMixin extends LivingEntity implements PlayerEntityAccessor { - - protected PlayerEntityMixin(EntityType entityType, Level world) { - super(entityType, world); - } - - @Shadow - public abstract Iterable getHandSlots(); - - @Shadow - private int sleepCounter; - - @Shadow - public abstract boolean hurt(DamageSource source, float amount); - - @Shadow - protected abstract boolean canPlayerFitWithinBlocksAndEntitiesWhen(Pose pose); - - - @ModifyVariable(method = "attack", name = "entityReachSq", at = @At(value = "STORE")) - protected double spectrum$increaseSweepMaxDistance(double original) { - var stack = this.getItemInHand(InteractionHand.MAIN_HAND); - if (stack.getItem() == SpectrumItems.DRACONIC_TWINSWORD.get()) { - int channeling = SpectrumEnchantmentHelper.getLevel(level().registryAccess(), Enchantments.CHANNELING, stack); - return original * 3 * ((channeling + 1) * 1.5); - } - return original; - } - - @Inject(method = "updateSwimming()V", at = @At("HEAD"), cancellable = true) - public void spectrum$updateSwimming(CallbackInfo ci) { - if (SpectrumCurioItem.hasEquipped(this, SpectrumItems.RING_OF_DENSER_STEPS.get())) { - this.setSwimming(false); - ci.cancel(); - } - } - //TODO: move to event - @Inject(method = "attack", at = @At(value = "INVOKE", target = "net/minecraft/world/entity/player/Player.getAttributeValue (Lnet/minecraft/core/Holder;)D")) - protected void spectrum$calculateModifiers(Entity target, CallbackInfo ci) { - Player player = (Player) (Object) this; - - Multimap, AttributeModifier> map = Multimaps.newMultimap(Maps.newLinkedHashMap(), ArrayList::new); - - AttributeModifier jeopardantModifier; - if (SpectrumCurioItem.hasEquipped(player, SpectrumItems.JEOPARDANT.get())) { - jeopardantModifier = new AttributeModifier(AttackRingItem.ATTACK_RING_DAMAGE_ID, AttackRingItem.getAttackModifierForEntity(player), AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL); - } else { - jeopardantModifier = new AttributeModifier(AttackRingItem.ATTACK_RING_DAMAGE_ID, 0, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL); - } - map.put(Attributes.ATTACK_DAMAGE, jeopardantModifier); - - player.getAttributes().addTransientAttributeModifiers(map); - } - - @ModifyExpressionValue(method = "attack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/Level;getEntitiesOfClass(Ljava/lang/Class;Lnet/minecraft/world/phys/AABB;)Ljava/util/List;")) - protected List spectrum$increaseSweepRadius(List original, Entity target) { - var stack = this.getItemInHand(InteractionHand.MAIN_HAND); - if (stack.getItem() == SpectrumItems.DRACONIC_TWINSWORD.get()) { - var channeling = spectrum$getChanneling(stack) + 1; - var size = channeling * 2 + 0.5; - var entities = this.level().getEntitiesOfClass(LivingEntity.class, target.getBoundingBox().inflate(size, 0.4 * channeling, size)); - if (!level().isClientSide() && (channeling - 1) > 0) { - for (LivingEntity living : entities) { - if (living.canBeSeenAsEnemy()) { - for (int i = 0; i < 5; i++) { - ((ServerLevel) level()).sendParticles(ParticleTypes.ENCHANTED_HIT, - living.getRandomX(1.25), - living.getY() + living.getBbHeight() * random.nextFloat(), - living.getRandomZ(1.25), - random.nextInt(2), 0, random.nextFloat() / 6F, 0, 0); - } - } - } - } - - return entities; - } - return original; - } - - @WrapOperation(method = "attack", at = @At(value = "INVOKE", target = "net/minecraft/world/level/Level.playSound (Lnet/minecraft/world/entity/player/Player;DDDLnet/minecraft/sounds/SoundEvent;Lnet/minecraft/sounds/SoundSource;FF)V", ordinal = 2)) - protected void spectrum$switchCritSound(Level instance, Player except, double x, double y, double z, SoundEvent sound, SoundSource category, float volume, float pitch, Operation original) { - var player = (Player) (Object) this; - var stack = this.getItemInHand(InteractionHand.MAIN_HAND); - var component = MiscPlayerDataAttachmentType.get(player); - if (stack.getItem() instanceof LightGreatswordItem && component.isLunging()) { - original.call(instance, except, x, y, z, SpectrumSoundEvents.LUNGE_CRIT, category, 1F, 1F + random.nextFloat() * 0.2F); - return; - } - original.call(instance, except, x, y, z, sound, category, volume, pitch); - } - - @WrapOperation(method = "attack", at = @At(value = "INVOKE", target = "net/minecraft/world/level/Level.playSound (Lnet/minecraft/world/entity/player/Player;DDDLnet/minecraft/sounds/SoundEvent;Lnet/minecraft/sounds/SoundSource;FF)V", ordinal = 1)) - protected void spectrum$switchSweepSound(Level instance, Player except, double x, double y, double z, SoundEvent sound, SoundSource category, float volume, float pitch, Operation original) { - var stack = this.getItemInHand(InteractionHand.MAIN_HAND); - if (stack.getItem() == SpectrumItems.DRACONIC_TWINSWORD.get() && spectrum$getChanneling(stack) > 0) { - this.level().playSound(except, x, y, z, SpectrumSoundEvents.ELECTRIC_DISCHARGE, category, 0.75F, 0.9F + random.nextFloat() * 0.2F); - return; - } - original.call(instance, except, x, y, z, sound, category, volume, pitch); - } - - @Unique - protected int spectrum$getChanneling(ItemStack stack) { - return SpectrumEnchantmentHelper.getLevel(level().registryAccess(), Enchantments.CHANNELING, stack); - } - - @Override - public void spectrum$setSleepTimer(int ticks) { - this.sleepCounter = ticks; - } - - // If the player holds an ExperienceStorageItem in their hands - // experience is tried to get put in there first - @ModifyVariable(at = @At("HEAD"), method = "giveExperiencePoints", argsOnly = true) - public int addExperience(int experience) { - if (experience < 0) { // draining XP, like Botanias Rosa Arcana - return experience; - } - - // if the player has a ExperienceStorageItem in hand add the XP to that - Player player = (Player) (Object) this; - for (ItemStack stack : getHandSlots()) { - if (!player.isUsingItem() && stack.getItem() instanceof ExperienceStorageItem) { - experience = ExperienceStorageItem.addStoredExperience(level().registryAccess(), stack, experience); - player.takeXpDelay = 0; - if (experience == 0) { - break; - } - } - } - return experience; - } - - @WrapOperation(method = "updatePlayerPose", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Player;setPose(Lnet/minecraft/world/entity/Pose;)V")) - public void spectrum$forceSwimmingState(Player instance, Pose entityPose, Operation original) { - var component = MiscPlayerDataAttachmentType.get(instance); - if ((component.shouldLieDown() || instance.hasEffect(SpectrumMobEffects.FATAL_SLUMBER)) && canPlayerFitWithinBlocksAndEntitiesWhen(Pose.SWIMMING)) { - instance.setPose(Pose.SWIMMING); - return; - } - original.call(instance, entityPose); - } - -} diff --git a/src/main/java/de/dafuqs/spectrum/mixin/PlayerInventoryMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/PlayerInventoryMixin.java index 2899973641..56f87938af 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/PlayerInventoryMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/PlayerInventoryMixin.java @@ -5,7 +5,6 @@ import net.minecraft.world.item.*; import net.neoforged.neoforge.capabilities.*; import net.neoforged.neoforge.items.*; -import org.jspecify.annotations.Nullable; import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.injection.*; import org.spongepowered.asm.mixin.injection.callback.*; @@ -45,9 +44,13 @@ private void offer(ItemStack stack, boolean notifiesClient, CallbackInfo ci) { IItemHandler itemHandler = inventoryStack.getCapability(Capabilities.ItemHandler.ITEM); if(itemHandler != null) { - if(!itemHandler.isItemValid(0, stackToAdd)) { + // This is a very Bottomless Bundle specific check + // but that is the only item with the 'stores items' tag + ItemStack firstStack = itemHandler.getStackInSlot(0); + if(firstStack.isEmpty() || !ItemStack.isSameItemSameComponents(firstStack, stackToAdd)) { continue; } + ItemStack remainder = itemHandler.insertItem(i, stackToAdd, false); stackToAdd.setCount(remainder.getCount()); if (remainder.isEmpty()) { diff --git a/src/main/java/de/dafuqs/spectrum/mixin/PotionItemMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/PotionItemMixin.java index 695410dd34..7e96737d15 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/PotionItemMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/PotionItemMixin.java @@ -15,7 +15,7 @@ public abstract class PotionItemMixin { CustomPotionDataComponent component = stack.get(SpectrumDataComponentTypes.CUSTOM_POTION_DATA); if (component != null) { int additionalDrinkDuration = component.additionalDrinkDuration(); - drinkTime += Math.max(4, drinkTime + additionalDrinkDuration); + drinkTime = Math.max(4, drinkTime + additionalDrinkDuration); } return drinkTime; } diff --git a/src/main/java/de/dafuqs/spectrum/mixin/RandomChanceLootConditionMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/RandomChanceLootConditionMixin.java index 286f51d39a..8ad715f487 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/RandomChanceLootConditionMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/RandomChanceLootConditionMixin.java @@ -1,7 +1,7 @@ package de.dafuqs.spectrum.mixin; -import com.llamalad7.mixinextras.injector.*; -import de.dafuqs.spectrum.helpers.enchantments.*; +import de.dafuqs.spectrum.registries.*; +import net.minecraft.world.entity.*; import net.minecraft.world.level.storage.loot.*; import net.minecraft.world.level.storage.loot.parameters.*; import net.minecraft.world.level.storage.loot.predicates.*; @@ -12,18 +12,9 @@ @Mixin(LootItemRandomChanceCondition.class) public abstract class RandomChanceLootConditionMixin { - @Shadow - @Final - private NumberProvider chance; - - @ModifyReturnValue(at = @At("RETURN"), method = "test(Lnet/minecraft/world/level/storage/loot/LootContext;)Z") - public boolean spectrum$applyRareLootEnchantment(boolean original, LootContext context) { - // if the result was to not drop a drop before reroll - // gets more probable with each additional level of Clovers Favor - if (!original) { - original = context.getRandom().nextFloat() < CloversFavorHelper.rollChance(chance.getFloat(context), context.getParamOrNull(LootContextParams.ATTACKING_ENTITY)); - } - return original; + @ModifyVariable(method = "test(Lnet/minecraft/world/level/storage/loot/LootContext;)Z", at = @At("STORE")) + public float spectrum$applyRareLootEnchantment(float originalChance, LootContext context) { + return SpectrumEntityAttributes.modifyLootChance(originalChance, context.getParamOrNull(LootContextParams.ATTACKING_ENTITY)); } } diff --git a/src/main/java/de/dafuqs/spectrum/mixin/RandomChanceWithEnchantedBonusLootConditionMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/RandomChanceWithEnchantedBonusLootConditionMixin.java index ce941e7c0a..8dff92d876 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/RandomChanceWithEnchantedBonusLootConditionMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/RandomChanceWithEnchantedBonusLootConditionMixin.java @@ -1,10 +1,7 @@ package de.dafuqs.spectrum.mixin; -import com.llamalad7.mixinextras.injector.*; -import de.dafuqs.spectrum.helpers.enchantments.*; -import net.minecraft.core.*; +import de.dafuqs.spectrum.registries.*; import net.minecraft.world.entity.*; -import net.minecraft.world.item.enchantment.*; import net.minecraft.world.level.storage.loot.*; import net.minecraft.world.level.storage.loot.parameters.*; import net.minecraft.world.level.storage.loot.predicates.*; @@ -14,28 +11,12 @@ @Mixin(LootItemRandomChanceWithEnchantedBonusCondition.class) public abstract class RandomChanceWithEnchantedBonusLootConditionMixin { - @Shadow - @Final - private LevelBasedValue enchantedChance; - - @Shadow - @Final - private Holder enchantment; - - @ModifyReturnValue(at = @At("RETURN"), method = "test(Lnet/minecraft/world/level/storage/loot/LootContext;)Z") - public boolean spectrum$applyRareLootEnchantment(boolean original, LootContext context) { - // if the result was to not drop a drop before reroll - // gets more probable with each additional level of Clovers Favor - if (!original) { - if (context.getParamOrNull(LootContextParams.ATTACKING_ENTITY) instanceof LivingEntity livingEntity) { - int level = EnchantmentHelper.getEnchantmentLevel(this.enchantment, livingEntity); - if (level > 0) { - float enchantedChanceValue = this.enchantedChance.calculate(level); - original = context.getRandom().nextFloat() < CloversFavorHelper.rollChance(enchantedChanceValue, context.getParamOrNull(LootContextParams.ATTACKING_ENTITY)); - } - } + @ModifyVariable(method = "test(Lnet/minecraft/world/level/storage/loot/LootContext;)Z", at = @At("STORE")) + public float spectrum$applyRareLootEnchantment(float original, LootContext context) { + if(original <= 0) { + return original; } - return original; + return SpectrumEntityAttributes.modifyLootChance(original, context.getParamOrNull(LootContextParams.ATTACKING_ENTITY)); } } diff --git a/src/main/java/de/dafuqs/spectrum/mixin/StatusEffectInstanceMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/StatusEffectInstanceMixin.java index ce6d7d32a3..1ad0f93144 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/StatusEffectInstanceMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/StatusEffectInstanceMixin.java @@ -1,8 +1,12 @@ package de.dafuqs.spectrum.mixin; import de.dafuqs.spectrum.injectors.*; +import de.dafuqs.spectrum.registries.*; +import net.minecraft.core.*; import net.minecraft.world.effect.*; import org.spongepowered.asm.mixin.*; +import org.spongepowered.asm.mixin.injection.*; +import org.spongepowered.asm.mixin.injection.callback.*; @Mixin(MobEffectInstance.class) public abstract class StatusEffectInstanceMixin implements StatusEffectInstanceInjector { @@ -12,6 +16,10 @@ public abstract class StatusEffectInstanceMixin implements StatusEffectInstanceI @Shadow private int amplifier; + @Shadow + @Final + private Holder effect; + @Override public void spectrum$setDuration(int newDuration) { this.duration = newDuration; @@ -22,4 +30,11 @@ public abstract class StatusEffectInstanceMixin implements StatusEffectInstanceI this.amplifier = newAmplifier; } + @Inject(at = @At("HEAD"), method = "isInfiniteDuration", cancellable = true) + public void isInfiniteDuration(CallbackInfoReturnable cir) { + if(this.effect.is(SpectrumMobEffectTags.ALWAYS_INFINITE)) { + cir.setReturnValue(true); + } + } + } diff --git a/src/main/java/de/dafuqs/spectrum/mixin/StatusEffectUtilMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/StatusEffectUtilMixin.java deleted file mode 100644 index 287c99ec3b..0000000000 --- a/src/main/java/de/dafuqs/spectrum/mixin/StatusEffectUtilMixin.java +++ /dev/null @@ -1,30 +0,0 @@ -package de.dafuqs.spectrum.mixin; - -import com.llamalad7.mixinextras.injector.wrapoperation.*; -import com.llamalad7.mixinextras.sugar.*; -import de.dafuqs.spectrum.registries.*; -import net.minecraft.network.chat.*; -import net.minecraft.util.*; -import net.minecraft.world.effect.*; -import org.spongepowered.asm.mixin.*; -import org.spongepowered.asm.mixin.injection.*; - -@Mixin(MobEffectUtil.class) -public class StatusEffectUtilMixin { - - @WrapOperation(method = "formatDuration", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/chat/Component;literal(Ljava/lang/String;)Lnet/minecraft/network/chat/MutableComponent;")) - private static MutableComponent spectrum$modifyDurationText(String string, Operation original, @Local int i, @Local(argsOnly = true) MobEffectInstance effect, @Local(argsOnly = true, ordinal = 0) float multiplier, @Local(argsOnly = true, ordinal = 1) float tickRate) { - if (effect.getEffect() == SpectrumMobEffects.ETERNAL_SLUMBER) { - return Component.translatable("effect.spectrum.eternal_slumber.duration", StringUtil.formatTickDuration(i, tickRate)); - } - return original.call(string); - } - - @WrapOperation(method = "formatDuration", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/chat/Component;translatable(Ljava/lang/String;)Lnet/minecraft/network/chat/MutableComponent;")) - private static MutableComponent spectrum$modifyDurationTextInfinite(String string, Operation original, @Local(argsOnly = true) MobEffectInstance effect) { - if (effect.getEffect() == SpectrumMobEffects.ETERNAL_SLUMBER) { - return Component.translatable("effect.spectrum.eternal_slumber.duration_inf"); - } - return original.call(string); - } -} diff --git a/src/main/java/de/dafuqs/spectrum/mixin/SwimNodeEvaluatorMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/SwimNodeEvaluatorMixin.java new file mode 100644 index 0000000000..61bc53b616 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/mixin/SwimNodeEvaluatorMixin.java @@ -0,0 +1,20 @@ +package de.dafuqs.spectrum.mixin; + +import de.dafuqs.spectrum.registries.*; +import net.minecraft.tags.*; +import net.minecraft.world.level.material.*; +import net.minecraft.world.level.pathfinder.*; +import org.spongepowered.asm.mixin.*; +import org.spongepowered.asm.mixin.injection.*; + +@Mixin(SwimNodeEvaluator.class) +public class SwimNodeEvaluatorMixin { + + // fixes weirdness with entities like fish not being able to swim in liquid crystal + // TODO: test and remove in MC 26.1 since Neo patched that in https://github.com/neoforged/NeoForge/commit/ad038e822a142901aeb33b0eedde0a892588b662 + @ModifyArg(method = "getPathTypeOfMob(Lnet/minecraft/world/level/pathfinder/PathfindingContext;IIILnet/minecraft/world/entity/Mob;)Lnet/minecraft/world/level/pathfinder/PathType;", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/material/FluidState;is(Lnet/minecraft/tags/TagKey;)Z"), index = 0) + TagKey spectrum$getPathTypeOfMob(TagKey tag) { + return SpectrumFluidTags.WATER_PATH_NODES; + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/mixin/WorldMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/WorldMixin.java index 4e5edea865..3552dd1b3d 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/WorldMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/WorldMixin.java @@ -20,15 +20,6 @@ public abstract class WorldMixin { @Final private BiomeManager biomeManager; - // using a mixin additional to net.fabricmc.fabric.api.event.player.PlayerBlockBreakEvents, - // since the fabric api event does not trigger for indirect breaks, like via projectile - @Inject(method = "destroyBlock", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/Level;getFluidState(Lnet/minecraft/core/BlockPos;)Lnet/minecraft/world/level/material/FluidState;")) - public void breakBlock(BlockPos pos, boolean drop, Entity breakingEntity, int maxUpdateDepth, CallbackInfoReturnable cir, @Local BlockState state) { - if (breakingEntity instanceof ServerPlayer serverPlayerEntity) { - SpectrumAdvancementCriteria.BLOCK_BROKEN.trigger(serverPlayerEntity, state); - } - } - @Inject(method = "isRainingAt", at = @At("HEAD"), cancellable = true) public void forcePermanentRain(BlockPos pos, CallbackInfoReturnable cir) { var biome = biomeManager.getBiome(pos); diff --git a/src/main/java/de/dafuqs/spectrum/mixin/accessors/BundleContentsComponentAccessor.java b/src/main/java/de/dafuqs/spectrum/mixin/accessors/BundleContentsComponentAccessor.java deleted file mode 100644 index 1547ae42c5..0000000000 --- a/src/main/java/de/dafuqs/spectrum/mixin/accessors/BundleContentsComponentAccessor.java +++ /dev/null @@ -1,17 +0,0 @@ -package de.dafuqs.spectrum.mixin.accessors; - -import net.minecraft.world.item.*; -import net.minecraft.world.item.component.*; -import org.apache.commons.lang3.math.*; -import org.spongepowered.asm.mixin.*; -import org.spongepowered.asm.mixin.gen.*; - -@Mixin(BundleContents.class) -public interface BundleContentsComponentAccessor { - - @Invoker - static Fraction invokeGetWeight(ItemStack stack) { - throw new AssertionError(); - } - -} diff --git a/src/main/java/de/dafuqs/spectrum/mixin/accessors/FoxEntityAccessor.java b/src/main/java/de/dafuqs/spectrum/mixin/accessors/FoxEntityAccessor.java index b7f0344a17..2ed823d76f 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/accessors/FoxEntityAccessor.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/accessors/FoxEntityAccessor.java @@ -2,7 +2,7 @@ import net.minecraft.world.entity.animal.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.gen.*; diff --git a/src/main/java/de/dafuqs/spectrum/mixin/accessors/LivingEntityAccessor.java b/src/main/java/de/dafuqs/spectrum/mixin/accessors/LivingEntityAccessor.java new file mode 100644 index 0000000000..376c17bbb6 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/mixin/accessors/LivingEntityAccessor.java @@ -0,0 +1,16 @@ +package de.dafuqs.spectrum.mixin.accessors; + + +import net.minecraft.sounds.*; +import net.minecraft.world.entity.*; +import org.jspecify.annotations.*; +import org.spongepowered.asm.mixin.*; +import org.spongepowered.asm.mixin.gen.*; + +@Mixin(LivingEntity.class) +public interface LivingEntityAccessor { + + @Invoker + @Nullable SoundEvent invokeGetDeathSound(); + +} \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/mixin/accessors/SimpleCriterionAccessor.java b/src/main/java/de/dafuqs/spectrum/mixin/accessors/SimpleCriterionAccessor.java index 4d519eaf6b..af1d71bda7 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/accessors/SimpleCriterionAccessor.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/accessors/SimpleCriterionAccessor.java @@ -2,7 +2,7 @@ import net.minecraft.advancements.critereon.*; import net.minecraft.server.level.*; -import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.gen.*; import java.util.function.*; diff --git a/src/main/java/de/dafuqs/spectrum/mixin/accessors/TridentEntityAccessor.java b/src/main/java/de/dafuqs/spectrum/mixin/accessors/TridentEntityAccessor.java index 26a361a211..4427b09b8a 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/accessors/TridentEntityAccessor.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/accessors/TridentEntityAccessor.java @@ -1,6 +1,5 @@ package de.dafuqs.spectrum.mixin.accessors; -import net.minecraft.network.syncher.*; import net.minecraft.world.entity.projectile.*; import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.gen.*; diff --git a/src/main/java/de/dafuqs/spectrum/mixin/client/BipedEntityModelMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/client/BipedEntityModelMixin.java index f1129f619d..2b5ed7782b 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/client/BipedEntityModelMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/client/BipedEntityModelMixin.java @@ -26,7 +26,7 @@ public class BipedEntityModelMixin { public ModelPart leftLeg; @Inject(method = {"setupAnim(Lnet/minecraft/world/entity/LivingEntity;FFFFF)V"}, at = @At("TAIL"), cancellable = true) - public void poseArms(LivingEntity livingEntity, float f, float g, float h, float i, float j, CallbackInfo ci) { + public void spectrum$tpose(LivingEntity livingEntity, float f, float g, float h, float i, float j, CallbackInfo ci) { if (SpectrumCurioItem.hasEquipped(livingEntity, SpectrumItems.NEAT_RING.get())) { this.rightLeg.xRot = 0; this.rightLeg.yRot = 0; diff --git a/src/main/java/de/dafuqs/spectrum/mixin/client/BlockOverlayRendererMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/client/BlockOverlayRendererMixin.java deleted file mode 100644 index 1c9e655f91..0000000000 --- a/src/main/java/de/dafuqs/spectrum/mixin/client/BlockOverlayRendererMixin.java +++ /dev/null @@ -1,49 +0,0 @@ -package de.dafuqs.spectrum.mixin.client; - -import net.minecraft.client.renderer.*; -import org.spongepowered.asm.mixin.*; - - -@Mixin(ScreenEffectRenderer.class) -public abstract class BlockOverlayRendererMixin { - - // TODO: still needed? - /* - @Inject(method = "renderScreenEffect", at = @At("TAIL")) - private static void spectrum$renderFluidOverlay(Minecraft minecraft, PoseStack poseStack, CallbackInfo ci) { - if (!minecraft.player.isSpectator()) { - if (minecraft.player.isEyeInFluid(SpectrumFluidTags.LIQUID_CRYSTAL)) { - spectrum$renderOverlay(minecraft, poseStack, SpectrumFluids.LIQUID_CRYSTAL_OVERLAY_TEXTURE, SpectrumFluids.LIQUID_CRYSTAL_OVERLAY_ALPHA); - } else if (minecraft.player.isEyeInFluid(SpectrumFluidTags.SLUDGE)) { - spectrum$renderOverlay(minecraft, poseStack, SpectrumFluids.SLUDGE_OVERLAY_TEXTURE, SpectrumFluids.SLUDGE_OVERLAY_ALPHA); - } else if (minecraft.player.isEyeInFluid(SpectrumFluidTags.MIDNIGHT_SOLUTION)) { - spectrum$renderOverlay(minecraft, poseStack, SpectrumFluids.MIDNIGHT_SOLUTION_OVERLAY_TEXTURE, SpectrumFluids.MIDNIGHT_SOLUTION_OVERLAY_ALPHA); - } else if (minecraft.player.isEyeInFluid(SpectrumFluidTags.DRAGONROT)) { - spectrum$renderOverlay(minecraft, poseStack, SpectrumFluids.DRAGONROT_OVERLAY_TEXTURE, SpectrumFluids.DRAGONROT_OVERLAY_ALPHA); - } - } - } - - @Unique - private static void spectrum$renderOverlay(Minecraft client, PoseStack poseStack, ResourceLocation textureIdentifier, float alpha) { - RenderSystem.setShader(GameRenderer::getPositionTexShader); - RenderSystem.setShaderTexture(0, textureIdentifier); - BlockPos blockPos = BlockPos.containing(client.player.getX(), client.player.getEyeY(), client.player.getZ()); - float f = LightTexture.getBrightness(client.player.level().dimensionType(), client.player.level().getMaxLocalRawBrightness(blockPos)); - RenderSystem.enableBlend(); - RenderSystem.setShaderColor(f, f, f, alpha); - - float m = -client.player.getYRot() / 64.0F; - float n = client.player.getXRot() / 64.0F; - Matrix4f matrix4f = poseStack.last().pose(); - BufferBuilder bufferBuilder = Tesselator.getInstance().begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); - bufferBuilder.addVertex(matrix4f, -1.0F, -1.0F, -0.5F).setUv(4.0F + m, 4.0F + n); - bufferBuilder.addVertex(matrix4f, 1.0F, -1.0F, -0.5F).setUv(0.0F + m, 4.0F + n); - bufferBuilder.addVertex(matrix4f, 1.0F, 1.0F, -0.5F).setUv(0.0F + m, 0.0F + n); - bufferBuilder.addVertex(matrix4f, -1.0F, 1.0F, -0.5F).setUv(4.0F + m, 0.0F + n); - BufferUploader.drawWithShader(bufferBuilder.buildOrThrow()); - RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); - RenderSystem.disableBlend(); - }*/ - -} \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/mixin/client/ClientLanguageMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/client/ClientLanguageMixin.java index 4b43d7be66..e6b9a2d5a1 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/client/ClientLanguageMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/client/ClientLanguageMixin.java @@ -18,7 +18,7 @@ public class ClientLanguageMixin { private Map storage; @Inject(method = "(Ljava/util/Map;ZLjava/util/Map;)V", at = @At("TAIL")) - private void addTranslations(Map translations, boolean rightToLeft, Map componentStorage, CallbackInfo ci) { + private void spectrum$addTranslations(Map translations, boolean rightToLeft, Map componentStorage, CallbackInfo ci) { Calendar calendar = Calendar.getInstance(); if (calendar.get(Calendar.MONTH) != Calendar.APRIL || calendar.get(Calendar.DAY_OF_MONTH) != 1) return; diff --git a/src/main/java/de/dafuqs/spectrum/mixin/client/DrawContextMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/client/DrawContextMixin.java index aa8fb9ef7f..c80838d0c8 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/client/DrawContextMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/client/DrawContextMixin.java @@ -24,7 +24,7 @@ public abstract class DrawContextMixin { @Shadow public abstract void renderOutline(int x, int y, int width, int height, int color); - @Inject(method = "renderItemDecorations(Lnet/minecraft/client/gui/Font;Lnet/minecraft/world/item/ItemStack;IILjava/lang/String;)V", at = @At(value = "INVOKE", target = "net/minecraft/world/item/ItemStack.getCount ()I", ordinal = 0)) + @Inject(method = "renderItemDecorations(Lnet/minecraft/client/gui/Font;Lnet/minecraft/world/item/ItemStack;IILjava/lang/String;)V", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/PoseStack;pushPose()V")) protected void spectrum$drawSlotBackground(Font textRenderer, ItemStack stack, int x, int y, String countOverride, CallbackInfo ci) { SlotBackgroundEffectProvider backgroundEffectProvider = null; diff --git a/src/main/java/de/dafuqs/spectrum/mixin/client/GameRendererMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/client/GameRendererMixin.java index 71a100c7ce..4278b951e2 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/client/GameRendererMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/client/GameRendererMixin.java @@ -2,7 +2,7 @@ import com.llamalad7.mixinextras.injector.*; import com.mojang.blaze3d.systems.*; -import de.dafuqs.spectrum.render.SpectrumShaders; +import de.dafuqs.spectrum.render.*; import de.dafuqs.spectrum.render.biome_rendering.*; import net.minecraft.client.*; import net.minecraft.client.renderer.*; diff --git a/src/main/java/de/dafuqs/spectrum/mixin/client/HeldItemRendererMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/client/HeldItemRendererMixin.java deleted file mode 100644 index 4860e01e14..0000000000 --- a/src/main/java/de/dafuqs/spectrum/mixin/client/HeldItemRendererMixin.java +++ /dev/null @@ -1,44 +0,0 @@ -package de.dafuqs.spectrum.mixin.client; - -import com.mojang.blaze3d.vertex.*; -import de.dafuqs.spectrum.registries.*; -import net.minecraft.client.player.*; -import net.minecraft.client.renderer.*; -import net.minecraft.world.*; -import net.minecraft.world.entity.*; -import net.minecraft.world.item.*; -import org.spongepowered.asm.mixin.*; -import org.spongepowered.asm.mixin.injection.*; -import org.spongepowered.asm.mixin.injection.callback.*; - -@Mixin(ItemInHandRenderer.class) -public class HeldItemRendererMixin { - - @Shadow - private ItemStack offHandItem; - - @Shadow - private void renderOneHandedMap(PoseStack matrices, MultiBufferSource vertexConsumers, int light, float equipProgress, HumanoidArm arm, float swingProgress, ItemStack stack) { - } - - @Shadow - private void renderTwoHandedMap(PoseStack matrices, MultiBufferSource vertexConsumers, int light, float pitch, float equipProgress, float swingProgress) { - } - - // TODO: do we need that mixin? ARTISANS_ATLAS extends MapItem - @Inject(method = "renderArmWithItem", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/ItemStack;getItem()Lnet/minecraft/world/item/Item;", ordinal = 1), cancellable = true) - private void spectrum$renderFirstPersonItem(AbstractClientPlayer player, float tickDelta, float pitch, InteractionHand hand, float swingProgress, ItemStack item, float equipProgress, PoseStack matrices, MultiBufferSource vertexConsumers, int light, CallbackInfo ci) { - if (item.is(SpectrumItems.ARTISANS_ATLAS)) { - boolean isInMainHand = hand == InteractionHand.MAIN_HAND; - if (isInMainHand && this.offHandItem.isEmpty()) { - this.renderTwoHandedMap(matrices, vertexConsumers, light, pitch, equipProgress, swingProgress); - } else { - HumanoidArm arm = isInMainHand ? player.getMainArm() : player.getMainArm().getOpposite(); - this.renderOneHandedMap(matrices, vertexConsumers, light, equipProgress, arm, swingProgress, item); - } - matrices.popPose(); - ci.cancel(); - } - } - -} diff --git a/src/main/java/de/dafuqs/spectrum/mixin/client/InGameHudMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/client/InGameHudMixin.java index f5d4456350..0da4e19b08 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/client/InGameHudMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/client/InGameHudMixin.java @@ -3,8 +3,8 @@ import com.llamalad7.mixinextras.injector.*; import com.llamalad7.mixinextras.sugar.*; import de.dafuqs.spectrum.helpers.*; -import de.dafuqs.spectrum.registries.*; import de.dafuqs.spectrum.mob_effect.*; +import de.dafuqs.spectrum.registries.*; import net.minecraft.client.*; import net.minecraft.client.gui.*; import net.minecraft.resources.*; diff --git a/src/main/java/de/dafuqs/spectrum/mixin/client/InGameOverlayRendererMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/client/InGameOverlayRendererMixin.java index a5cefea2a4..bda86acef3 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/client/InGameOverlayRendererMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/client/InGameOverlayRendererMixin.java @@ -27,13 +27,6 @@ public class InGameOverlayRendererMixin { } } - @Inject(method = "renderFire", at = @At(value = "HEAD"), cancellable = true) - private static void spectrum$cancelFireOverlayWithPrimordialFire(Minecraft client, PoseStack matrices, CallbackInfo ci) { - if (PrimordialFireAttachmentType.isOnPrimordialFire(client.player)) { - ci.cancel(); - } - } - // [VanillaCopy] uses different texture for fire overlay @Unique private static void spectrum$renderPrimordialFireOverlay(Minecraft client, PoseStack matrices) { diff --git a/src/main/java/de/dafuqs/spectrum/mixin/client/ItemRendererMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/client/ItemRendererMixin.java index ed5d5e2836..e7ad3bb00b 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/client/ItemRendererMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/client/ItemRendererMixin.java @@ -1,9 +1,9 @@ package de.dafuqs.spectrum.mixin.client; +import com.llamalad7.mixinextras.injector.*; import com.llamalad7.mixinextras.injector.wrapoperation.*; import com.llamalad7.mixinextras.sugar.*; import com.mojang.blaze3d.vertex.*; -import de.dafuqs.spectrum.api.render.*; import de.dafuqs.spectrum.registries.*; import de.dafuqs.spectrum.registries.client.*; import net.minecraft.client.multiplayer.*; @@ -13,10 +13,9 @@ import net.minecraft.world.entity.*; import net.minecraft.world.item.*; import net.minecraft.world.level.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.injection.*; -import org.spongepowered.asm.mixin.injection.callback.*; @Mixin(ItemRenderer.class) @@ -30,28 +29,13 @@ public abstract class ItemRendererMixin { original.call(instance, model, stack, light, overlay, matrices, vertices); } - @Inject(at = @At("HEAD"), method = "renderStatic(Lnet/minecraft/world/entity/LivingEntity;Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/item/ItemDisplayContext;ZLcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;Lnet/minecraft/world/level/Level;III)V") - private void spectrum$handleOversizedItemModels(LivingEntity entity, ItemStack itemStack, ItemDisplayContext displayContext, boolean leftHand, PoseStack poseStack, MultiBufferSource bufferSource, Level level, int combinedLight, int combinedOverlay, int seed, CallbackInfo ci) { - SpectrumModelPredicateProviders.DISPLAY_CONTEXT = displayContext; - } - - @Inject(at = @At("HEAD"), method = "render(Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/item/ItemDisplayContext;ZLcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;IILnet/minecraft/client/resources/model/BakedModel;)V") - private void spectrum$handleOversizedItemModels2(ItemStack itemStack, ItemDisplayContext displayContext, boolean leftHand, PoseStack poseStack, MultiBufferSource bufferSource, int combinedLight, int combinedOverlay, BakedModel p_model, CallbackInfo ci) { - SpectrumModelPredicateProviders.DISPLAY_CONTEXT = displayContext; - } - - @Inject(at = @At("HEAD"), method = "render", cancellable = true) - private void spectrum$dynRender(ItemStack stack, ItemDisplayContext renderMode, boolean leftHanded, PoseStack matrices, MultiBufferSource vertexConsumers, int light, int overlay, BakedModel model, CallbackInfo ci) { - // if model is a dynamic one, check the renderers - if (model instanceof DynamicRenderModel dm) { - DynamicItemRenderer renderer = DynamicItemRenderer.RENDERERS.get(stack.getItem()); - // shouldn't happen normally but check anyway - if (renderer != null) { - // unwrap the model here so that the custom renderer doesn't have to do it - renderer.render((ItemRenderer) (Object) this, stack, renderMode, leftHanded, matrices, vertexConsumers, light, overlay, dm.getWrappedModel()); - ci.cancel(); - } + @ModifyExpressionValue(method = "renderStatic(Lnet/minecraft/world/entity/LivingEntity;Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/item/ItemDisplayContext;ZLcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;Lnet/minecraft/world/level/Level;III)V", + at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/entity/ItemRenderer;getModel(Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/level/Level;Lnet/minecraft/world/entity/LivingEntity;I)Lnet/minecraft/client/resources/model/BakedModel;")) + private BakedModel spectrum$handleOversizedItemModels(BakedModel original, @Local(argsOnly = true) ItemStack stack, @Local(argsOnly = true) @Nullable Level world, @Local(argsOnly = true) @Nullable LivingEntity entity) { + if (world instanceof ClientLevel clientWorld) { + return original.getOverrides().resolve(original, stack, clientWorld, entity, SpectrumModelPredicateProviders.MAGIC_OVERSIZED_SEED); } + return original; } } diff --git a/src/main/java/de/dafuqs/spectrum/mixin/client/MixinParticleManager.java b/src/main/java/de/dafuqs/spectrum/mixin/client/MixinParticleManager.java index 3b609c9453..f4e44d643e 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/client/MixinParticleManager.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/client/MixinParticleManager.java @@ -27,8 +27,8 @@ private void removeDeadHook(final CallbackInfo ci) { } @Override - public void render(final PoseStack matrices, final MultiBufferSource vertexConsumers, final Camera camera, final float tickDelta) { - spectrum$earlyRenderingParticleContainer.render(matrices, vertexConsumers, camera, tickDelta); + public void renderAfterEntities(final PoseStack matrices, final MultiBufferSource vertexConsumers, final Camera camera, final float tickDelta) { + spectrum$earlyRenderingParticleContainer.renderAfterEntities(matrices, vertexConsumers, camera, tickDelta); } } \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/mixin/client/MouseMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/client/MouseMixin.java index 17e8316c2f..5af84052b3 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/client/MouseMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/client/MouseMixin.java @@ -28,16 +28,13 @@ public class MouseMixin { return (T) (Object) Mth.clampedLerp(sensitivity, sensitivity / 2, potency / 2.5); } - // AHAHAHAH, I FINALLY FIGURED OUT HOW TO DO IT! @ModifyExpressionValue(method = "turnPlayer", at = @At(value = "FIELD", opcode = Opcodes.GETFIELD, target = "Lnet/minecraft/client/Options;smoothCamera:Z")) public boolean spectrum$forceSmoothCamera(boolean original) { var player = Minecraft.getInstance().player; - if (player == null) return original; var potency = SleepMobEffect.getSleepScaling(player); - if (potency < 1.9) return original; diff --git a/src/main/java/de/dafuqs/spectrum/mixin/client/PlayerEntityRendererMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/client/PlayerEntityRendererMixin.java index cc626d9b15..6193958dee 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/client/PlayerEntityRendererMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/client/PlayerEntityRendererMixin.java @@ -3,35 +3,15 @@ import com.llamalad7.mixinextras.injector.*; import com.llamalad7.mixinextras.sugar.*; import de.dafuqs.spectrum.attachment_types.*; -import de.dafuqs.spectrum.items.tools.*; -import de.dafuqs.spectrum.registries.*; import net.minecraft.client.model.*; import net.minecraft.client.player.*; import net.minecraft.client.renderer.entity.player.*; -import net.minecraft.world.item.*; import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.injection.*; @Mixin(PlayerRenderer.class) public class PlayerEntityRendererMixin { - @ModifyExpressionValue(method = "getArmPose", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/ItemStack;getUseAnimation()Lnet/minecraft/world/item/UseAnim;")) - private static UseAnim spectrum$modifyUseAction(UseAnim original, @Local ItemStack itemStack, @Local(argsOnly = true) AbstractClientPlayer player) { - if (itemStack.getItem() == SpectrumItems.NIGHT_SALTS.get()) { - return UseAnim.TOOT_HORN; - } - return original; - } - - @ModifyReturnValue(method = "getArmPose", at = @At(value = "RETURN", ordinal = 1)) - private static HumanoidModel.ArmPose spectrum$modifyArmPose(HumanoidModel.ArmPose original, @Local ItemStack itemStack, @Local(argsOnly = true) AbstractClientPlayer player) { - if (itemStack.getItem() instanceof LightGreatswordItem) { - return HumanoidModel.ArmPose.CROSSBOW_HOLD; - } - - return original; - } - @ModifyReturnValue(method = "getArmPose", at = @At(value = "TAIL")) private static HumanoidModel.ArmPose spectrum$lungeAction(HumanoidModel.ArmPose original, @Local(argsOnly = true) AbstractClientPlayer player) { if (MiscPlayerDataAttachmentType.get(player).isLunging()) { diff --git a/src/main/java/de/dafuqs/spectrum/mixin/client/SkinManagerMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/client/SkinManagerMixin.java index 4313792759..e9501cdc9d 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/client/SkinManagerMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/client/SkinManagerMixin.java @@ -1,10 +1,6 @@ package de.dafuqs.spectrum.mixin.client; -import com.llamalad7.mixinextras.injector.*; -import com.mojang.authlib.*; -import com.mojang.authlib.minecraft.*; import de.dafuqs.spectrum.render.*; -import net.minecraft.*; import net.minecraft.client.resources.*; import net.minecraft.resources.*; import org.spongepowered.asm.mixin.*; diff --git a/src/main/java/de/dafuqs/spectrum/mixin/client/SoundSystemMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/client/SoundSystemMixin.java index 6500a1ba0d..75251799b6 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/client/SoundSystemMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/client/SoundSystemMixin.java @@ -1,16 +1,14 @@ package de.dafuqs.spectrum.mixin.client; -import com.llamalad7.mixinextras.sugar.Local; +import com.llamalad7.mixinextras.sugar.*; import de.dafuqs.spectrum.mixin.client.accessors.*; import de.dafuqs.spectrum.sound.*; -import net.minecraft.client.resources.sounds.SoundInstance; -import net.minecraft.client.sounds.ChannelAccess; -import net.minecraft.client.sounds.SoundEngine; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.At.Shift; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import net.minecraft.client.resources.sounds.*; +import net.minecraft.client.sounds.*; +import org.spongepowered.asm.mixin.*; +import org.spongepowered.asm.mixin.injection.*; +import org.spongepowered.asm.mixin.injection.At.*; +import org.spongepowered.asm.mixin.injection.callback.*; @Mixin(SoundEngine.class) public abstract class SoundSystemMixin { diff --git a/src/main/java/de/dafuqs/spectrum/mixin/compat/Plugin.java b/src/main/java/de/dafuqs/spectrum/mixin/compat/Plugin.java index 77f3ca5d1b..766d376347 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/compat/Plugin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/compat/Plugin.java @@ -1,7 +1,7 @@ package de.dafuqs.spectrum.mixin.compat; import net.neoforged.fml.loading.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import org.objectweb.asm.tree.*; import org.spongepowered.asm.mixin.extensibility.*; diff --git a/src/main/java/de/dafuqs/spectrum/mob_effect/AscensionMobEffect.java b/src/main/java/de/dafuqs/spectrum/mob_effect/AscensionMobEffect.java index ed48c5ce61..dcb70e1b60 100644 --- a/src/main/java/de/dafuqs/spectrum/mob_effect/AscensionMobEffect.java +++ b/src/main/java/de/dafuqs/spectrum/mob_effect/AscensionMobEffect.java @@ -9,7 +9,6 @@ import net.minecraft.world.effect.*; import net.minecraft.world.entity.*; import net.neoforged.neoforge.common.*; -import javax.annotation.*; import java.util.*; @@ -51,7 +50,7 @@ public void onEffectStarted(LivingEntity entity, int amplifier) { @Override public void fillEffectCures(Set cures, MobEffectInstance effectInstance) { - cures.add(SpectrumEffectCures.COMMAND_ONLY); + } } \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/mob_effect/DeadlyPoisonMobEffect.java b/src/main/java/de/dafuqs/spectrum/mob_effect/DeadlyPoisonMobEffect.java index 432a5ae77c..566e965d70 100644 --- a/src/main/java/de/dafuqs/spectrum/mob_effect/DeadlyPoisonMobEffect.java +++ b/src/main/java/de/dafuqs/spectrum/mob_effect/DeadlyPoisonMobEffect.java @@ -4,7 +4,6 @@ import net.minecraft.world.effect.*; import net.minecraft.world.entity.*; import net.neoforged.neoforge.common.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/mob_effect/DivinityMobEffect.java b/src/main/java/de/dafuqs/spectrum/mob_effect/DivinityMobEffect.java index 74620fcd08..13fe77fa07 100644 --- a/src/main/java/de/dafuqs/spectrum/mob_effect/DivinityMobEffect.java +++ b/src/main/java/de/dafuqs/spectrum/mob_effect/DivinityMobEffect.java @@ -9,11 +9,9 @@ import net.minecraft.server.level.*; import net.minecraft.world.effect.*; import net.minecraft.world.entity.*; -import net.minecraft.world.entity.ai.attributes.*; import net.minecraft.world.entity.player.*; import net.minecraft.world.level.*; import net.neoforged.neoforge.common.*; -import javax.annotation.*; import java.util.*; @@ -76,7 +74,7 @@ public void onEffectStarted(LivingEntity entity, int amplifier) { @Override public void fillEffectCures(Set cures, MobEffectInstance effectInstance) { - cures.add(SpectrumEffectCures.COMMAND_ONLY); + } } \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/mob_effect/FrenzyMobEffect.java b/src/main/java/de/dafuqs/spectrum/mob_effect/FrenzyMobEffect.java index f5477d73c6..9aaef041a1 100644 --- a/src/main/java/de/dafuqs/spectrum/mob_effect/FrenzyMobEffect.java +++ b/src/main/java/de/dafuqs/spectrum/mob_effect/FrenzyMobEffect.java @@ -6,7 +6,6 @@ import net.minecraft.world.entity.*; import net.minecraft.world.entity.ai.attributes.*; import net.neoforged.neoforge.common.*; -import javax.annotation.*; import java.util.*; @@ -54,6 +53,10 @@ public boolean applyEffectTick(LivingEntity entity, int amplifier) { entity.hurt(SpectrumDamageTypes.sleep(entity.level(), null), potency); } + if(entity.removeEffectsCuredBy(SpectrumEffectCures.FRENZY)) { + entity.removeEffect(SpectrumMobEffects.FRENZY); + } + return true; } diff --git a/src/main/java/de/dafuqs/spectrum/mob_effect/ImmunityMobEffect.java b/src/main/java/de/dafuqs/spectrum/mob_effect/ImmunityMobEffect.java index 49e4ef1fe7..1215438e71 100644 --- a/src/main/java/de/dafuqs/spectrum/mob_effect/ImmunityMobEffect.java +++ b/src/main/java/de/dafuqs/spectrum/mob_effect/ImmunityMobEffect.java @@ -5,7 +5,6 @@ import net.minecraft.world.effect.*; import net.minecraft.world.entity.*; import net.neoforged.neoforge.common.*; -import javax.annotation.*; import java.util.*; @@ -48,7 +47,7 @@ public static void removeOtherMobEffects(LivingEntity entity) { @Override public void fillEffectCures(Set cures, MobEffectInstance effectInstance) { - cures.add(SpectrumEffectCures.COMMAND_ONLY); + cures.add(EffectCures.PROTECTED_BY_TOTEM); } } \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/mob_effect/LifeDrainMobEffect.java b/src/main/java/de/dafuqs/spectrum/mob_effect/LifeDrainMobEffect.java index 296b955bdd..13ed9bfef6 100644 --- a/src/main/java/de/dafuqs/spectrum/mob_effect/LifeDrainMobEffect.java +++ b/src/main/java/de/dafuqs/spectrum/mob_effect/LifeDrainMobEffect.java @@ -7,7 +7,6 @@ import net.minecraft.world.entity.*; import net.minecraft.world.entity.ai.attributes.*; import net.minecraft.world.entity.player.*; -import javax.annotation.*; public class LifeDrainMobEffect extends MobEffect { diff --git a/src/main/java/de/dafuqs/spectrum/mob_effect/NourishingMobEffect.java b/src/main/java/de/dafuqs/spectrum/mob_effect/NourishingMobEffect.java index c238ddabaa..945ca9a659 100644 --- a/src/main/java/de/dafuqs/spectrum/mob_effect/NourishingMobEffect.java +++ b/src/main/java/de/dafuqs/spectrum/mob_effect/NourishingMobEffect.java @@ -5,7 +5,6 @@ import net.minecraft.world.entity.player.*; import net.minecraft.world.food.*; import net.minecraft.world.level.*; -import javax.annotation.*; public class NourishingMobEffect extends MobEffect { diff --git a/src/main/java/de/dafuqs/spectrum/mob_effect/ScarredMobEffect.java b/src/main/java/de/dafuqs/spectrum/mob_effect/ScarredMobEffect.java index 1cbbf03c88..258a554796 100644 --- a/src/main/java/de/dafuqs/spectrum/mob_effect/ScarredMobEffect.java +++ b/src/main/java/de/dafuqs/spectrum/mob_effect/ScarredMobEffect.java @@ -2,7 +2,6 @@ import net.minecraft.world.effect.*; import net.minecraft.world.entity.*; -import javax.annotation.*; public class ScarredMobEffect extends MobEffect { diff --git a/src/main/java/de/dafuqs/spectrum/mob_effect/SleepMobEffect.java b/src/main/java/de/dafuqs/spectrum/mob_effect/SleepMobEffect.java index 6f6a324f79..86395e67b1 100644 --- a/src/main/java/de/dafuqs/spectrum/mob_effect/SleepMobEffect.java +++ b/src/main/java/de/dafuqs/spectrum/mob_effect/SleepMobEffect.java @@ -8,7 +8,7 @@ import net.minecraft.world.entity.ai.attributes.*; import net.minecraft.world.entity.player.*; import net.neoforged.neoforge.common.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; import java.util.*; @@ -22,20 +22,13 @@ public SleepMobEffect(MobEffectCategory category, int color, boolean scales) { } // oh my god - // TODO: can the tag check be implemented into the entities base attribute modifier somehow? public static float getSleepResistance(@Nullable MobEffectInstance sleepEffect, LivingEntity entity) { var type = entity.getType(); if (sleepEffect == null || type.is(SpectrumEntityTypeTags.SOULLESS)) return Float.MAX_VALUE; - float scaling; - if (entity instanceof Player player && player.level().isClientSide()) { - scaling = (float) MiscPlayerDataAttachmentType.get(player).getLastSyncedSleepPotency(); - } else { - scaling = (float) entity.getAttributeValue(SpectrumEntityAttributes.MENTAL_PRESENCE); - } - + float scaling = 1.0F; if (type.is(SpectrumEntityTypeTags.SLEEP_WEAK)) { scaling /= 3F; } else if (type.is(SpectrumEntityTypeTags.SLEEP_RESISTANT)) { @@ -47,7 +40,6 @@ public static float getSleepResistance(@Nullable MobEffectInstance sleepEffect, return scaling; } - // TODO: can the tag check be implemented into the entities base attribute modifier somehow? public static boolean isImmuneish(LivingEntity entity) { if (entity.hasEffect(SpectrumMobEffects.FRENZY)) return true; @@ -103,8 +95,11 @@ private static boolean isConstruct(EntityType type) { public void fillEffectCures(Set cures, MobEffectInstance effectInstance) { Holder holder = effectInstance.getEffect(); - if (holder.equals(SpectrumMobEffects.SOMNOLENCE) || holder.equals(SpectrumMobEffects.CALMING)) { + if (holder.is(SpectrumMobEffects.SOMNOLENCE) || holder.is(SpectrumMobEffects.CALMING)) { + cures.add(EffectCures.PROTECTED_BY_TOTEM); cures.add(SpectrumEffectCures.SEDATIVES); + } else { + cures.add(SpectrumEffectCures.FRENZY); } } diff --git a/src/main/java/de/dafuqs/spectrum/mob_effect/package-info.java b/src/main/java/de/dafuqs/spectrum/mob_effect/package-info.java index ff0981e1a4..20fafba475 100644 --- a/src/main/java/de/dafuqs/spectrum/mob_effect/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/mob_effect/package-info.java @@ -3,6 +3,5 @@ @FieldsAreNonnullByDefault package de.dafuqs.spectrum.mob_effect; -import net.minecraft.FieldsAreNonnullByDefault; -import net.minecraft.MethodsReturnNonnullByDefault; -import org.jspecify.annotations.NullMarked; +import net.minecraft.*; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/networking/SpectrumS2CPackets.java b/src/main/java/de/dafuqs/spectrum/networking/SpectrumS2CPackets.java index ead2092b22..a8b61fc4b8 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/SpectrumS2CPackets.java +++ b/src/main/java/de/dafuqs/spectrum/networking/SpectrumS2CPackets.java @@ -41,13 +41,13 @@ public static void register(PayloadRegistrar registrar) { registrar.playToClient(PlayDivinityAppliedEffectsPayload.ID, PlayDivinityAppliedEffectsPayload.CODEC, PlayDivinityAppliedEffectsPayload::execute); registrar.playToClient(MoonstoneStrikePayload.ID, MoonstoneStrikePayload.CODEC, MoonstoneStrikePayload::execute); registrar.playToClient(SyncArtisansAtlasPayload.ID, SyncArtisansAtlasPayload.CODEC, SyncArtisansAtlasPayload::execute); - registrar.playToClient(SyncMentalPresencePayload.ID, SyncMentalPresencePayload.CODEC, SyncMentalPresencePayload::execute); registrar.playToClient(CompactingChestStatusUpdatePayload.ID, CompactingChestStatusUpdatePayload.CODEC, CompactingChestStatusUpdatePayload::execute); registrar.playToClient(FabricationChestStatusUpdatePayload.ID, FabricationChestStatusUpdatePayload.CODEC, FabricationChestStatusUpdatePayload::execute); registrar.playToClient(BlackHoleChestStatusUpdatePayload.ID, BlackHoleChestStatusUpdatePayload.CODEC, BlackHoleChestStatusUpdatePayload::execute); registrar.playToClient(PastelNodeStatusUpdatePayload.ID, PastelNodeStatusUpdatePayload.CODEC, PastelNodeStatusUpdatePayload::execute); registrar.playToClient(PastelNetworkEdgeSyncPayload.ID, PastelNetworkEdgeSyncPayload.CODEC, PastelNetworkEdgeSyncPayload::execute); registrar.playToClient(PastelNetworkRemovedPayload.ID, PastelNetworkRemovedPayload.CODEC, PastelNetworkRemovedPayload::execute); + registrar.playToClient(PlayNaturesStaffParticlesPayload.ID, PlayNaturesStaffParticlesPayload.CODEC, PlayNaturesStaffParticlesPayload::execute); } } diff --git a/src/main/java/de/dafuqs/spectrum/networking/c2s_payloads/AddLoreBedrockAnvilPayload.java b/src/main/java/de/dafuqs/spectrum/networking/c2s_payloads/AddLoreBedrockAnvilPayload.java index ac4c4622a5..d6e9d09330 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/c2s_payloads/AddLoreBedrockAnvilPayload.java +++ b/src/main/java/de/dafuqs/spectrum/networking/c2s_payloads/AddLoreBedrockAnvilPayload.java @@ -7,7 +7,6 @@ import net.minecraft.network.codec.*; import net.minecraft.network.protocol.common.custom.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; public record AddLoreBedrockAnvilPayload(String lore) implements CustomPacketPayload { diff --git a/src/main/java/de/dafuqs/spectrum/networking/c2s_payloads/BindEnderSpliceToPlayerPayload.java b/src/main/java/de/dafuqs/spectrum/networking/c2s_payloads/BindEnderSpliceToPlayerPayload.java index 36965c3879..d4cb208923 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/c2s_payloads/BindEnderSpliceToPlayerPayload.java +++ b/src/main/java/de/dafuqs/spectrum/networking/c2s_payloads/BindEnderSpliceToPlayerPayload.java @@ -9,7 +9,6 @@ import net.minecraft.server.level.*; import net.minecraft.world.entity.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; public record BindEnderSpliceToPlayerPayload(int entityId) implements CustomPacketPayload { diff --git a/src/main/java/de/dafuqs/spectrum/networking/c2s_payloads/ChangeCompactingChestSettingsPayload.java b/src/main/java/de/dafuqs/spectrum/networking/c2s_payloads/ChangeCompactingChestSettingsPayload.java index 3385a273e9..08d5a000a5 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/c2s_payloads/ChangeCompactingChestSettingsPayload.java +++ b/src/main/java/de/dafuqs/spectrum/networking/c2s_payloads/ChangeCompactingChestSettingsPayload.java @@ -9,7 +9,6 @@ import net.minecraft.network.protocol.common.custom.*; import net.minecraft.world.level.block.entity.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; public record ChangeCompactingChestSettingsPayload(AutoCraftingMode mode) implements CustomPacketPayload { diff --git a/src/main/java/de/dafuqs/spectrum/networking/c2s_payloads/GuidebookConfirmationButtonPressedPayload.java b/src/main/java/de/dafuqs/spectrum/networking/c2s_payloads/GuidebookConfirmationButtonPressedPayload.java index 1bc180a1a9..3eefe29ced 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/c2s_payloads/GuidebookConfirmationButtonPressedPayload.java +++ b/src/main/java/de/dafuqs/spectrum/networking/c2s_payloads/GuidebookConfirmationButtonPressedPayload.java @@ -8,7 +8,6 @@ import net.minecraft.server.level.*; import net.minecraft.sounds.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; public record GuidebookConfirmationButtonPressedPayload(String confirmationString) implements CustomPacketPayload { diff --git a/src/main/java/de/dafuqs/spectrum/networking/c2s_payloads/InkColorSelectedC2SPayload.java b/src/main/java/de/dafuqs/spectrum/networking/c2s_payloads/InkColorSelectedC2SPayload.java index 4751897f4d..3b3bf328a4 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/c2s_payloads/InkColorSelectedC2SPayload.java +++ b/src/main/java/de/dafuqs/spectrum/networking/c2s_payloads/InkColorSelectedC2SPayload.java @@ -1,7 +1,7 @@ package de.dafuqs.spectrum.networking.c2s_payloads; import de.dafuqs.spectrum.api.block.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.networking.*; import de.dafuqs.spectrum.networking.s2c_payloads.*; import de.dafuqs.spectrum.registries.*; @@ -12,7 +12,6 @@ import net.minecraft.server.level.*; import net.minecraft.world.inventory.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/networking/c2s_payloads/ParticleSpawnerConfigurationC2SPayload.java b/src/main/java/de/dafuqs/spectrum/networking/c2s_payloads/ParticleSpawnerConfigurationC2SPayload.java index 1253e2ceb7..66b08e3370 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/c2s_payloads/ParticleSpawnerConfigurationC2SPayload.java +++ b/src/main/java/de/dafuqs/spectrum/networking/c2s_payloads/ParticleSpawnerConfigurationC2SPayload.java @@ -11,7 +11,6 @@ import net.minecraft.world.level.*; import net.neoforged.neoforge.network.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; public record ParticleSpawnerConfigurationC2SPayload(ParticleSpawnerConfiguration configuration) implements CustomPacketPayload { diff --git a/src/main/java/de/dafuqs/spectrum/networking/c2s_payloads/RenameItemInBedrockAnvilPayload.java b/src/main/java/de/dafuqs/spectrum/networking/c2s_payloads/RenameItemInBedrockAnvilPayload.java index 88ff1e11dd..e910bb6bd7 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/c2s_payloads/RenameItemInBedrockAnvilPayload.java +++ b/src/main/java/de/dafuqs/spectrum/networking/c2s_payloads/RenameItemInBedrockAnvilPayload.java @@ -7,7 +7,6 @@ import net.minecraft.network.protocol.common.custom.*; import net.minecraft.util.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; public record RenameItemInBedrockAnvilPayload(String name) implements CustomPacketPayload { diff --git a/src/main/java/de/dafuqs/spectrum/networking/c2s_payloads/SetShadowSlotPayload.java b/src/main/java/de/dafuqs/spectrum/networking/c2s_payloads/SetShadowSlotPayload.java index 114a1030b5..65757606ee 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/c2s_payloads/SetShadowSlotPayload.java +++ b/src/main/java/de/dafuqs/spectrum/networking/c2s_payloads/SetShadowSlotPayload.java @@ -10,7 +10,6 @@ import net.minecraft.world.inventory.*; import net.minecraft.world.item.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; public record SetShadowSlotPayload(int screenHandlerSyncId, int slotId, ItemStack shadowStack) implements CustomPacketPayload { diff --git a/src/main/java/de/dafuqs/spectrum/networking/c2s_payloads/WorkstaffToggleSelectedPayload.java b/src/main/java/de/dafuqs/spectrum/networking/c2s_payloads/WorkstaffToggleSelectedPayload.java index fa99ce1469..e8becae664 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/c2s_payloads/WorkstaffToggleSelectedPayload.java +++ b/src/main/java/de/dafuqs/spectrum/networking/c2s_payloads/WorkstaffToggleSelectedPayload.java @@ -9,7 +9,6 @@ import net.minecraft.server.level.*; import net.minecraft.world.inventory.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; public record WorkstaffToggleSelectedPayload(int index) implements CustomPacketPayload { diff --git a/src/main/java/de/dafuqs/spectrum/networking/c2s_payloads/package-info.java b/src/main/java/de/dafuqs/spectrum/networking/c2s_payloads/package-info.java index 44e98c88b6..74f4e20c92 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/c2s_payloads/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/networking/c2s_payloads/package-info.java @@ -3,6 +3,5 @@ @FieldsAreNonnullByDefault package de.dafuqs.spectrum.networking.c2s_payloads; -import net.minecraft.FieldsAreNonnullByDefault; -import net.minecraft.MethodsReturnNonnullByDefault; -import org.jspecify.annotations.NullMarked; +import net.minecraft.*; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/networking/package-info.java b/src/main/java/de/dafuqs/spectrum/networking/package-info.java index 9e0b1c909c..a149f225f3 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/networking/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.networking; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/BlackHoleChestStatusUpdatePayload.java b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/BlackHoleChestStatusUpdatePayload.java index 7713b12573..2575257e20 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/BlackHoleChestStatusUpdatePayload.java +++ b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/BlackHoleChestStatusUpdatePayload.java @@ -12,7 +12,6 @@ import net.minecraft.world.level.*; import net.neoforged.neoforge.network.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/ColorTransmissionPayload.java b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/ColorTransmissionPayload.java index c68c1c371a..e4c4f34443 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/ColorTransmissionPayload.java +++ b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/ColorTransmissionPayload.java @@ -10,7 +10,6 @@ import net.minecraft.world.level.*; import net.neoforged.neoforge.network.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; public record ColorTransmissionPayload(BlockPos pos, ColoredTransmission transmission) implements CustomPacketPayload { diff --git a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/CompactingChestStatusUpdatePayload.java b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/CompactingChestStatusUpdatePayload.java index ded6f64ba6..cedc5a7c32 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/CompactingChestStatusUpdatePayload.java +++ b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/CompactingChestStatusUpdatePayload.java @@ -11,7 +11,6 @@ import net.minecraft.world.level.*; import net.neoforged.neoforge.network.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/FabricationChestStatusUpdatePayload.java b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/FabricationChestStatusUpdatePayload.java index 38b617a4c3..dc40bcd7f5 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/FabricationChestStatusUpdatePayload.java +++ b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/FabricationChestStatusUpdatePayload.java @@ -12,7 +12,6 @@ import net.minecraft.world.level.*; import net.neoforged.neoforge.network.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/InkColorSelectedS2CPayload.java b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/InkColorSelectedS2CPayload.java index 11de85b127..d46bf99275 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/InkColorSelectedS2CPayload.java +++ b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/InkColorSelectedS2CPayload.java @@ -1,7 +1,7 @@ package de.dafuqs.spectrum.networking.s2c_payloads; import de.dafuqs.spectrum.api.block.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.networking.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.core.*; @@ -12,7 +12,6 @@ import net.minecraft.world.inventory.*; import net.neoforged.neoforge.network.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/InkTransmissionPayload.java b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/InkTransmissionPayload.java new file mode 100644 index 0000000000..b3df503712 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/InkTransmissionPayload.java @@ -0,0 +1,53 @@ +package de.dafuqs.spectrum.networking.s2c_payloads; + +import de.dafuqs.spectrum.blocks.pastel_network.network.*; +import de.dafuqs.spectrum.networking.*; +import de.dafuqs.spectrum.particle.effect.*; +import net.minecraft.core.*; +import net.minecraft.network.*; +import net.minecraft.network.codec.*; +import net.minecraft.network.protocol.*; +import net.minecraft.network.protocol.common.*; +import net.minecraft.network.protocol.common.custom.*; +import net.minecraft.server.level.*; +import net.minecraft.world.level.*; +import net.neoforged.neoforge.network.handling.*; + +import java.util.*; + +public record InkTransmissionPayload(int networkColor, int travelTime, PastelTransmission transmission) implements CustomPacketPayload { + + public static final Type ID = SpectrumC2SPackets.makeId("pastel_transmission"); + public static final StreamCodec CODEC = StreamCodec.composite( + ByteBufCodecs.INT, InkTransmissionPayload::networkColor, + ByteBufCodecs.INT, InkTransmissionPayload::travelTime, + PastelTransmission.STREAM_CODEC, InkTransmissionPayload::transmission, + InkTransmissionPayload::new + ); + + public static void sendPastelTransmissionParticle(ServerPastelNetwork network, int travelTime, PastelTransmission transmission) { + Packet packet = new ClientboundCustomPayloadPacket(new InkTransmissionPayload(network.getColor(), travelTime, transmission)); + Set targetPlayers = new HashSet(); + targetPlayers.addAll(network.getLevel().getChunkSource().chunkMap.getPlayers(new ChunkPos(transmission.getNodePositions().getFirst()), false)); + targetPlayers.addAll(network.getLevel().getChunkSource().chunkMap.getPlayers(new ChunkPos(transmission.getNodePositions().getLast()), false)); + + for (ServerPlayer player : targetPlayers) { + player.connection.send(packet); + } + } + + @SuppressWarnings("resource") + public static void execute(InkTransmissionPayload payload, IPayloadContext context) { + int color = payload.networkColor(); + int travelTime = payload.travelTime(); + PastelTransmission transmission = payload.transmission; + BlockPos spawnPos = transmission.getStartPos(); + context.player().level().addParticle(new PastelTransmissionParticleEffect(transmission.getNodePositions(), transmission.getPayload(), travelTime, color), spawnPos.getX() + 0.5, spawnPos.getY() + 0.5, spawnPos.getZ() + 0.5, 0, 0, 0); + } + + @Override + public Type type() { + return ID; + } + +} \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/MoonstoneStrikePayload.java b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/MoonstoneStrikePayload.java index c408cf1b15..0e34b4d4ea 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/MoonstoneStrikePayload.java +++ b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/MoonstoneStrikePayload.java @@ -1,8 +1,8 @@ package de.dafuqs.spectrum.networking.s2c_payloads; import de.dafuqs.spectrum.helpers.*; -import de.dafuqs.spectrum.networking.*; import de.dafuqs.spectrum.magic.*; +import de.dafuqs.spectrum.networking.*; import net.minecraft.core.*; import net.minecraft.network.*; import net.minecraft.network.codec.*; @@ -13,7 +13,6 @@ import net.minecraft.world.phys.*; import net.neoforged.neoforge.network.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; public record MoonstoneStrikePayload(double x, double y, double z, float power, float knockbackMod, Vec3 playerVelocity) implements CustomPacketPayload { diff --git a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/ParticleSpawnerConfigurationS2CPayload.java b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/ParticleSpawnerConfigurationS2CPayload.java index 798989f0a8..eb9f67b2d4 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/ParticleSpawnerConfigurationS2CPayload.java +++ b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/ParticleSpawnerConfigurationS2CPayload.java @@ -7,7 +7,6 @@ import net.minecraft.network.codec.*; import net.minecraft.network.protocol.common.custom.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; public record ParticleSpawnerConfigurationS2CPayload(BlockPos pos, ParticleSpawnerConfiguration configuration) implements CustomPacketPayload { diff --git a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PastelNetworkEdgeSyncPayload.java b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PastelNetworkEdgeSyncPayload.java index f0534f51f3..169c2684f4 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PastelNetworkEdgeSyncPayload.java +++ b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PastelNetworkEdgeSyncPayload.java @@ -11,7 +11,6 @@ import net.minecraft.world.level.*; import net.neoforged.neoforge.network.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; import org.jgrapht.*; import org.jgrapht.graph.*; diff --git a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PastelNetworkRemovedPayload.java b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PastelNetworkRemovedPayload.java index 96f9c58fe5..c4b59ec401 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PastelNetworkRemovedPayload.java +++ b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PastelNetworkRemovedPayload.java @@ -9,7 +9,6 @@ import net.minecraft.network.protocol.common.custom.*; import net.neoforged.neoforge.network.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PastelNodeStatusUpdatePayload.java b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PastelNodeStatusUpdatePayload.java index 52eb5c3548..d968d3ad75 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PastelNodeStatusUpdatePayload.java +++ b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PastelNodeStatusUpdatePayload.java @@ -12,7 +12,6 @@ import net.minecraft.world.level.block.entity.*; import net.neoforged.neoforge.network.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PastelTransmissionPayload.java b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PastelTransmissionPayload.java index 07e570bdb5..866d4a40ec 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PastelTransmissionPayload.java +++ b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PastelTransmissionPayload.java @@ -12,7 +12,6 @@ import net.minecraft.server.level.*; import net.minecraft.world.level.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayAscensionAppliedEffectsPayload.java b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayAscensionAppliedEffectsPayload.java index 1616fa64af..e7495fb460 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayAscensionAppliedEffectsPayload.java +++ b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayAscensionAppliedEffectsPayload.java @@ -10,13 +10,10 @@ import net.minecraft.server.level.*; import net.minecraft.sounds.*; import net.minecraft.world.entity.player.*; -import net.minecraft.world.level.Level; +import net.minecraft.world.level.*; import net.neoforged.api.distmarker.*; import net.neoforged.neoforge.network.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; - -import java.util.logging.*; public record PlayAscensionAppliedEffectsPayload() implements CustomPacketPayload { diff --git a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayBlockBoundSoundInstancePayload.java b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayBlockBoundSoundInstancePayload.java index cc1051b559..0b2df022bf 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayBlockBoundSoundInstancePayload.java +++ b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayBlockBoundSoundInstancePayload.java @@ -13,7 +13,6 @@ import net.minecraft.world.level.block.*; import net.neoforged.neoforge.network.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; // MaxDurationTicks of <1 means "stop playing" public record PlayBlockBoundSoundInstancePayload(SoundEvent soundEvent, BlockPos pos, Holder block, int maxDurationTicks) implements CustomPacketPayload { diff --git a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayDivinityAppliedEffectsPayload.java b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayDivinityAppliedEffectsPayload.java index 2f0de8b7c3..131d5c0bd7 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayDivinityAppliedEffectsPayload.java +++ b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayDivinityAppliedEffectsPayload.java @@ -13,10 +13,8 @@ import net.minecraft.sounds.*; import net.minecraft.world.entity.player.*; import net.minecraft.world.level.*; -import net.neoforged.api.distmarker.*; import net.neoforged.neoforge.network.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; public record PlayDivinityAppliedEffectsPayload() implements CustomPacketPayload { diff --git a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayFusionCraftingFinishedParticlePayload.java b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayFusionCraftingFinishedParticlePayload.java index e7f3259742..cc335d6c71 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayFusionCraftingFinishedParticlePayload.java +++ b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayFusionCraftingFinishedParticlePayload.java @@ -1,7 +1,7 @@ package de.dafuqs.spectrum.networking.s2c_payloads; import de.dafuqs.spectrum.api.color.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.networking.*; import de.dafuqs.spectrum.particle.*; import de.dafuqs.spectrum.particle.effect.*; @@ -15,7 +15,6 @@ import net.minecraft.world.phys.*; import net.neoforged.neoforge.network.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; import org.joml.*; public record PlayFusionCraftingFinishedParticlePayload(BlockPos pos, InkColor color) implements CustomPacketPayload { @@ -43,7 +42,7 @@ public static void execute(PlayFusionCraftingFinishedParticlePayload payload, IP float velocityModifier = 0.25F; for (Vec3 velocity : VectorPattern.SIXTEEN.getVectors()) { context.player().level().addParticle( - new DynamicParticleEffect(ColoredCraftingParticleEffect.of(payload.color.getColorInt()).getType(), 0.0F, color, 1.5F, 40, false, true), + new DynamicParticleEffect(ColoredCraftingParticleEffect.of(payload.color.getColorARGB()).getType(), 0.0F, color, 1.5F, 40, false, true), sourcePos.x, sourcePos.y, sourcePos.z, velocity.x * velocityModifier, 0.0F, velocity.z * velocityModifier ); diff --git a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayFusionCraftingInProgressParticlePayload.java b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayFusionCraftingInProgressParticlePayload.java index f97906b44a..b261feb7f7 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayFusionCraftingInProgressParticlePayload.java +++ b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayFusionCraftingInProgressParticlePayload.java @@ -11,7 +11,6 @@ import net.minecraft.world.level.block.entity.*; import net.neoforged.neoforge.network.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; public record PlayFusionCraftingInProgressParticlePayload(BlockPos pos) implements CustomPacketPayload { diff --git a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayMemoryManifestingParticlesPayload.java b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayMemoryManifestingParticlesPayload.java index 2079df05de..13f95c02e7 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayMemoryManifestingParticlesPayload.java +++ b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayMemoryManifestingParticlesPayload.java @@ -15,7 +15,6 @@ import net.minecraft.world.level.*; import net.neoforged.neoforge.network.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; import org.joml.*; public record PlayMemoryManifestingParticlesPayload(BlockPos pos, int eggColor1, int eggColor2, int amount) implements CustomPacketPayload { diff --git a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayNaturesStaffParticlesPayload.java b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayNaturesStaffParticlesPayload.java new file mode 100644 index 0000000000..09f0579548 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayNaturesStaffParticlesPayload.java @@ -0,0 +1,41 @@ +package de.dafuqs.spectrum.networking.s2c_payloads; + +import de.dafuqs.spectrum.api.color.*; +import de.dafuqs.spectrum.api.ink.color.*; +import de.dafuqs.spectrum.items.magic_items.*; +import de.dafuqs.spectrum.networking.*; +import de.dafuqs.spectrum.particle.*; +import de.dafuqs.spectrum.particle.effect.*; +import net.minecraft.core.*; +import net.minecraft.network.*; +import net.minecraft.network.codec.*; +import net.minecraft.network.protocol.common.custom.*; +import net.minecraft.server.level.*; +import net.minecraft.world.item.*; +import net.minecraft.world.level.*; +import net.minecraft.world.phys.*; +import net.neoforged.neoforge.network.*; +import net.neoforged.neoforge.network.handling.*; +import org.joml.*; + +public record PlayNaturesStaffParticlesPayload(BlockPos pos) implements CustomPacketPayload { + + public static final Type ID = SpectrumC2SPackets.makeId("natures_staff_particles"); + public static final StreamCodec CODEC = StreamCodec.composite( + BlockPos.STREAM_CODEC, PlayNaturesStaffParticlesPayload::pos, + PlayNaturesStaffParticlesPayload::new + ); + + public static void sendPlayParticles(Level world, BlockPos pos) { + PacketDistributor.sendToPlayersTrackingChunk((ServerLevel) world, new ChunkPos(pos), new PlayNaturesStaffParticlesPayload(pos)); + } + + public static void execute(PlayNaturesStaffParticlesPayload payload, IPayloadContext context) { + NaturesStaffItem.spawnParticlesAndEffect(context.player().level(), payload.pos); + } + + @Override + public Type type() { + return ID; + } +} \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayParticleAroundBlockSidesPayload.java b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayParticleAroundBlockSidesPayload.java index a4bc4ac3d6..0188c85063 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayParticleAroundBlockSidesPayload.java +++ b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayParticleAroundBlockSidesPayload.java @@ -13,7 +13,6 @@ import net.minecraft.world.level.*; import net.minecraft.world.phys.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; import java.util.function.*; @@ -33,7 +32,7 @@ public static void playParticleAroundBlockSides(ServerLevel level, int quantity, Packet packet = new ClientboundCustomPayloadPacket(new PlayParticleAroundBlockSidesPayload(pos, quantity, velocity, particleEffect, sides)); for (ServerPlayer player : level.getChunkSource().chunkMap.getPlayers(new ChunkPos(pos), false)) { - if (sendCheck.test(player)) + if (!sendCheck.test(player)) continue; player.connection.send(packet); diff --git a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayParticleWithExactVelocityPayload.java b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayParticleWithExactVelocityPayload.java index d1a543b782..1a4df601f0 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayParticleWithExactVelocityPayload.java +++ b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayParticleWithExactVelocityPayload.java @@ -12,7 +12,6 @@ import net.minecraft.world.phys.*; import net.neoforged.neoforge.network.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; public record PlayParticleWithExactVelocityPayload(Vec3 pos, ParticleOptions particle, int amount, Vec3 velocity) implements CustomPacketPayload { diff --git a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayParticleWithPatternAndVelocityPayload.java b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayParticleWithPatternAndVelocityPayload.java index 1d0397cea4..2375c1a57b 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayParticleWithPatternAndVelocityPayload.java +++ b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayParticleWithPatternAndVelocityPayload.java @@ -15,7 +15,7 @@ import net.minecraft.world.level.*; import net.minecraft.world.phys.*; import net.neoforged.neoforge.network.handling.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public record PlayParticleWithPatternAndVelocityPayload(Vec3 pos, ParticleOptions effect, VectorPattern pattern, double velocity) implements CustomPacketPayload { diff --git a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayParticleWithRandomOffsetAndVelocityPayload.java b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayParticleWithRandomOffsetAndVelocityPayload.java index 481dd61a9f..c449acf1e3 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayParticleWithRandomOffsetAndVelocityPayload.java +++ b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayParticleWithRandomOffsetAndVelocityPayload.java @@ -13,7 +13,6 @@ import net.minecraft.world.phys.*; import net.neoforged.neoforge.network.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; public record PlayParticleWithRandomOffsetAndVelocityPayload(Vec3 pos, ParticleOptions effect, int amount, Vec3 randomOffset, Vec3 randomVelocity) implements CustomPacketPayload { diff --git a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayPedestalCraftingFinishedParticlePayload.java b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayPedestalCraftingFinishedParticlePayload.java index 29b5a94e11..329cc9f942 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayPedestalCraftingFinishedParticlePayload.java +++ b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayPedestalCraftingFinishedParticlePayload.java @@ -12,7 +12,6 @@ import net.minecraft.world.level.*; import net.neoforged.neoforge.network.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; public record PlayPedestalCraftingFinishedParticlePayload(BlockPos pedestalPos, ItemStack craftedStack) implements CustomPacketPayload { diff --git a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayPedestalStartCraftingParticlePayload.java b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayPedestalStartCraftingParticlePayload.java index 577c9b1982..5e0c7d1df2 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayPedestalStartCraftingParticlePayload.java +++ b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayPedestalStartCraftingParticlePayload.java @@ -10,7 +10,6 @@ import net.minecraft.world.level.*; import net.neoforged.neoforge.network.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; public record PlayPedestalStartCraftingParticlePayload(BlockPos pedestalPos) implements CustomPacketPayload { diff --git a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayPedestalUpgradedParticlePayload.java b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayPedestalUpgradedParticlePayload.java index 020a29b7f7..5e3ffd060a 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayPedestalUpgradedParticlePayload.java +++ b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayPedestalUpgradedParticlePayload.java @@ -15,7 +15,6 @@ import net.minecraft.world.level.*; import net.neoforged.neoforge.network.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; public record PlayPedestalUpgradedParticlePayload(BlockPos pedestalPos, PedestalRecipeTier newTier) implements CustomPacketPayload { diff --git a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayPresentOpeningParticlesPayload.java b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayPresentOpeningParticlesPayload.java index 1e90236995..10de606576 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayPresentOpeningParticlesPayload.java +++ b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayPresentOpeningParticlesPayload.java @@ -1,6 +1,6 @@ package de.dafuqs.spectrum.networking.s2c_payloads; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.blocks.present.*; import de.dafuqs.spectrum.networking.*; import it.unimi.dsi.fastutil.objects.*; @@ -12,7 +12,6 @@ import net.minecraft.world.level.*; import net.neoforged.neoforge.network.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayShootingStarParticlesPayload.java b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayShootingStarParticlesPayload.java index b6abeb86f0..54c9000f59 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayShootingStarParticlesPayload.java +++ b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayShootingStarParticlesPayload.java @@ -12,7 +12,6 @@ import net.minecraft.world.phys.*; import net.neoforged.neoforge.network.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; public record PlayShootingStarParticlesPayload(Vec3 shootingStarPos, ShootingStar.Variant variant) implements CustomPacketPayload { diff --git a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayTakeOffBeltSoundInstancePayload.java b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayTakeOffBeltSoundInstancePayload.java index ff22b9de51..8d2482ffcc 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayTakeOffBeltSoundInstancePayload.java +++ b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/PlayTakeOffBeltSoundInstancePayload.java @@ -8,7 +8,6 @@ import net.minecraft.server.level.*; import net.neoforged.neoforge.network.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; public record PlayTakeOffBeltSoundInstancePayload() implements CustomPacketPayload { diff --git a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/StartSkyLerpingPayload.java b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/StartSkyLerpingPayload.java index b68d0e2ece..2b0e4a9d13 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/StartSkyLerpingPayload.java +++ b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/StartSkyLerpingPayload.java @@ -13,7 +13,6 @@ import net.minecraft.world.level.dimension.*; import net.neoforged.neoforge.network.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; public record StartSkyLerpingPayload(long startTime, long endTime) implements CustomPacketPayload { diff --git a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/SyncArtisansAtlasPayload.java b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/SyncArtisansAtlasPayload.java index 004f2b046e..ea462ad692 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/SyncArtisansAtlasPayload.java +++ b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/SyncArtisansAtlasPayload.java @@ -14,7 +14,6 @@ import net.minecraft.world.level.saveddata.maps.*; import net.neoforged.api.distmarker.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/SyncMentalPresencePayload.java b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/SyncMentalPresencePayload.java deleted file mode 100644 index acac904687..0000000000 --- a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/SyncMentalPresencePayload.java +++ /dev/null @@ -1,36 +0,0 @@ -package de.dafuqs.spectrum.networking.s2c_payloads; - -import de.dafuqs.spectrum.attachment_types.*; -import de.dafuqs.spectrum.networking.*; -import net.minecraft.network.*; -import net.minecraft.network.codec.*; -import net.minecraft.network.protocol.common.custom.*; -import net.minecraft.server.level.*; -import net.minecraft.world.entity.player.*; -import net.neoforged.neoforge.network.*; -import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; - -// TODO: Why tf is that a packet and not handled in the synced component instead? -public record SyncMentalPresencePayload(double value) implements CustomPacketPayload { - - public static final Type ID = SpectrumC2SPackets.makeId("sync_mental_presence"); - public static final StreamCodec CODEC = StreamCodec.composite( - ByteBufCodecs.DOUBLE, SyncMentalPresencePayload::value, - SyncMentalPresencePayload::new - ); - - public static void sendMentalPresenceSync(ServerPlayer player, double value) { - PacketDistributor.sendToPlayer(player, new SyncMentalPresencePayload(value)); - } - - public static void execute(SyncMentalPresencePayload payload, IPayloadContext context) { - Player player = context.player(); - MiscPlayerDataAttachmentType.get(player).setLastSyncedSleepPotency(payload.value); - } - - @Override - public Type type() { - return ID; - } -} \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/TypedTransmissionPayload.java b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/TypedTransmissionPayload.java index 5244da9c11..67e411f10f 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/TypedTransmissionPayload.java +++ b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/TypedTransmissionPayload.java @@ -11,7 +11,6 @@ import net.minecraft.world.level.*; import net.neoforged.neoforge.network.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; public record TypedTransmissionPayload(TypedTransmission transmission) implements CustomPacketPayload { diff --git a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/UpdateBlockEntityInkPayload.java b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/UpdateBlockEntityInkPayload.java index 3480dbac3c..b9492bd6ce 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/UpdateBlockEntityInkPayload.java +++ b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/UpdateBlockEntityInkPayload.java @@ -1,7 +1,7 @@ package de.dafuqs.spectrum.networking.s2c_payloads; -import de.dafuqs.spectrum.api.energy.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; +import de.dafuqs.spectrum.api.ink.storage.*; import de.dafuqs.spectrum.networking.*; import net.minecraft.core.*; import net.minecraft.network.*; @@ -12,7 +12,6 @@ import net.minecraft.world.level.block.entity.*; import net.neoforged.neoforge.network.*; import net.neoforged.neoforge.network.handling.*; -import javax.annotation.*; import java.util.*; @@ -37,7 +36,8 @@ public static void execute(UpdateBlockEntityInkPayload payload, IPayloadContext Level level = context.player().level(); BlockEntity blockEntity = level.getBlockEntity(payload.pos); if (blockEntity instanceof InkStorageBlockEntity inkStorageBlockEntity) { - inkStorageBlockEntity.getEnergyStorage().setEnergy(payload.storage, payload.currentTotal); + inkStorageBlockEntity.getInkStorage().setEnergy(payload.storage, payload.currentTotal); + inkStorageBlockEntity.setInkDirty(); } } diff --git a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/package-info.java b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/package-info.java index 02757e32d1..5ee3b74af4 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.networking.s2c_payloads; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/package-info.java b/src/main/java/de/dafuqs/spectrum/package-info.java index a1c95367ee..3daf4fecd4 100644 --- a/src/main/java/de/dafuqs/spectrum/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/particle/SpectrumParticleFactories.java b/src/main/java/de/dafuqs/spectrum/particle/SpectrumParticleFactories.java index c4c03d0efb..13ff53710b 100644 --- a/src/main/java/de/dafuqs/spectrum/particle/SpectrumParticleFactories.java +++ b/src/main/java/de/dafuqs/spectrum/particle/SpectrumParticleFactories.java @@ -8,7 +8,6 @@ import net.minecraft.core.particles.*; import net.minecraft.util.*; import net.minecraft.world.level.material.*; -import net.neoforged.api.distmarker.*; import net.neoforged.neoforge.client.event.*; // See ParticleManager for vanilla @@ -82,7 +81,6 @@ public static void register(RegisterParticleProvidersEvent event) { event.registerSpriteSet(SpectrumParticleTypes.LIQUID_CRYSTAL_SPARKLE, LitParticle.Factory::new); event.registerSpriteSet(SpectrumParticleTypes.DRAGONROT, BubblePopParticle.Provider::new); event.registerSpriteSet(SpectrumParticleTypes.VOID_FOG, VoidFogParticle.Factory::new); - event.registerSpriteSet(SpectrumParticleTypes.SLUDGE_POP, BubblePopParticle.Provider::new); event.registerSpriteSet(SpectrumParticleTypes.BLUE_BUBBLE_POP, BubblePopParticle.Provider::new); event.registerSpriteSet(SpectrumParticleTypes.GREEN_BUBBLE_POP, BubblePopParticle.Provider::new); event.registerSpriteSet(SpectrumParticleTypes.SPIRIT_SALLOW, WindParticle.Factory::new); @@ -104,32 +102,27 @@ public static void register(RegisterParticleProvidersEvent event) { event.registerSpriteSet(SpectrumParticleTypes.AZURE_MOTE_SMALL, AzureMoteParticle.Factory::new); // Fluid Splash - event.registerSpriteSet(SpectrumParticleTypes.SLUDGE_SPLASH, SplashParticle.Provider::new); event.registerSpriteSet(SpectrumParticleTypes.LIQUID_CRYSTAL_SPLASH, SplashParticle.Provider::new); event.registerSpriteSet(SpectrumParticleTypes.MIDNIGHT_SOLUTION_SPLASH, SplashParticle.Provider::new); event.registerSpriteSet(SpectrumParticleTypes.DRAGONROT_SPLASH, SplashParticle.Provider::new); // Fluid Dripping - event.registerSpriteSet(SpectrumParticleTypes.DRIPPING_SLUDGE, SpectrumBlockLeakParticles.DrippingSludgeFactory::new); event.registerSpriteSet(SpectrumParticleTypes.DRIPPING_LIQUID_CRYSTAL, SpectrumBlockLeakParticles.DrippingLiquidCrystalFactory::new); event.registerSpriteSet(SpectrumParticleTypes.DRIPPING_MIDNIGHT_SOLUTION, SpectrumBlockLeakParticles.DrippingMidnightSolutionFactory::new); event.registerSpriteSet(SpectrumParticleTypes.DRIPPING_DRAGONROT, SpectrumBlockLeakParticles.DrippingDragonrotFactory::new); // Fluid Falling - event.registerSpriteSet(SpectrumParticleTypes.FALLING_SLUDGE, SpectrumBlockLeakParticles.FallingSludgeFactory::new); event.registerSpriteSet(SpectrumParticleTypes.FALLING_LIQUID_CRYSTAL, SpectrumBlockLeakParticles.FallingLiquidCrystalFactory::new); event.registerSpriteSet(SpectrumParticleTypes.FALLING_MIDNIGHT_SOLUTION, SpectrumBlockLeakParticles.FallingMidnightSolutionFactory::new); event.registerSpriteSet(SpectrumParticleTypes.FALLING_DRAGONROT, SpectrumBlockLeakParticles.FallingDragonrotFactory::new); // Fluid Landing - event.registerSpriteSet(SpectrumParticleTypes.LANDING_SLUDGE, SpectrumBlockLeakParticles.LandingSludgeFactory::new); event.registerSpriteSet(SpectrumParticleTypes.LANDING_LIQUID_CRYSTAL, SpectrumBlockLeakParticles.LandingLiquidCrystalFactory::new); event.registerSpriteSet(SpectrumParticleTypes.LANDING_MIDNIGHT_SOLUTION, SpectrumBlockLeakParticles.LandingMidnightSolutionFactory::new); event.registerSpriteSet(SpectrumParticleTypes.LANDING_DRAGONROT, SpectrumBlockLeakParticles.LandingDragonrotFactory::new); // Fluid Fishing event.registerSpriteSet(SpectrumParticleTypes.LAVA_FISHING, WakeParticle.Provider::new); - event.registerSpriteSet(SpectrumParticleTypes.SLUDGE_FISHING, WakeParticle.Provider::new); event.registerSpriteSet(SpectrumParticleTypes.LIQUID_CRYSTAL_FISHING, WakeParticle.Provider::new); event.registerSpriteSet(SpectrumParticleTypes.MIDNIGHT_SOLUTION_FISHING, WakeParticle.Provider::new); event.registerSpriteSet(SpectrumParticleTypes.DRAGONROT_FISHING, WakeParticle.Provider::new); @@ -148,6 +141,7 @@ public static void register(RegisterParticleProvidersEvent event) { event.registerSpriteSet(SpectrumParticleTypes.DYNAMIC_ALWAYS_SHOW, DynamicParticle.Factory::new); } + // TODO: unused public static TextureSheetParticle createFallingSporeBlossom(SimpleParticleType type, ClientLevel world, double x, double y, double z, double velocityX, double velocityY, double velocityZ) { int i = (int) (64.0F / Mth.randomBetween(world.getRandom(), 0.1F, 0.9F)); DripParticle blockLeakParticle = new DripParticle.FallingParticle(world, x, y, z, Fluids.EMPTY, i); diff --git a/src/main/java/de/dafuqs/spectrum/particle/SpectrumParticleTypes.java b/src/main/java/de/dafuqs/spectrum/particle/SpectrumParticleTypes.java index b06bb845ec..adb3a6e8f6 100644 --- a/src/main/java/de/dafuqs/spectrum/particle/SpectrumParticleTypes.java +++ b/src/main/java/de/dafuqs/spectrum/particle/SpectrumParticleTypes.java @@ -60,13 +60,6 @@ public class SpectrumParticleTypes { public static final SimpleParticleType PRIMORDIAL_FLAME = register("primordial_flame", true); public static final SimpleParticleType PRIMORDIAL_FLAME_SMALL = register("primordial_flame_small", true); - public static final SimpleParticleType SLUDGE_SPLASH = register("sludge_splash", false); - public static final SimpleParticleType DRIPPING_SLUDGE = register("dripping_sludge", false); - public static final SimpleParticleType FALLING_SLUDGE = register("falling_sludge", false); - public static final SimpleParticleType LANDING_SLUDGE = register("landing_sludge", false); - public static final SimpleParticleType SLUDGE_FISHING = register("sludge_fishing", false); - public static final SimpleParticleType SLUDGE_POP = register("sludge_pop", false); - public static final SimpleParticleType LIQUID_CRYSTAL_SPLASH = register("liquid_crystal_splash", false); public static final SimpleParticleType DRIPPING_LIQUID_CRYSTAL = register("dripping_liquid_crystal", false); public static final SimpleParticleType FALLING_LIQUID_CRYSTAL = register("falling_liquid_crystal", false); diff --git a/src/main/java/de/dafuqs/spectrum/particle/client/ColoredCraftingParticle.java b/src/main/java/de/dafuqs/spectrum/particle/client/ColoredCraftingParticle.java index 1c700e645a..0ab208c90f 100644 --- a/src/main/java/de/dafuqs/spectrum/particle/client/ColoredCraftingParticle.java +++ b/src/main/java/de/dafuqs/spectrum/particle/client/ColoredCraftingParticle.java @@ -5,7 +5,7 @@ import net.minecraft.client.particle.*; import net.minecraft.util.*; import org.joml.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class ColoredCraftingParticle extends TextureSheetParticle { @@ -20,6 +20,10 @@ protected ColoredCraftingParticle(ClientLevel clientWorld, double x, double y, d this.rCol = red; this.gCol = green; this.bCol = blue; + + this.xd = velocityX; + this.yd = velocityY; + this.zd = velocityZ; } @Override @@ -53,7 +57,7 @@ public Factory(SpriteSet spriteProvider) { @Override public @Nullable Particle createParticle(ColoredCraftingParticleEffect parameters, ClientLevel world, double x, double y, double z, double velocityX, double velocityY, double velocityZ) { - Vector3f color = parameters.getColor(); + Vector3f color = parameters.color(); ColoredCraftingParticle coloredCraftingParticle = new ColoredCraftingParticle(world, x, y, z, velocityX, velocityY, velocityZ, color.x, color.y, color.z); coloredCraftingParticle.setLifetime((int) (8.0D / (world.getRandom().nextDouble() * 0.8D + 0.2D))); coloredCraftingParticle.pickSprite(this.spriteProvider); diff --git a/src/main/java/de/dafuqs/spectrum/particle/client/ColoredExplosionParticle.java b/src/main/java/de/dafuqs/spectrum/particle/client/ColoredExplosionParticle.java index a079540ed1..6a89e64d36 100644 --- a/src/main/java/de/dafuqs/spectrum/particle/client/ColoredExplosionParticle.java +++ b/src/main/java/de/dafuqs/spectrum/particle/client/ColoredExplosionParticle.java @@ -4,7 +4,7 @@ import net.minecraft.client.multiplayer.*; import net.minecraft.client.particle.*; import org.joml.*; -import org.jspecify.annotations.Nullable; +import org.jspecify.annotations.*; public class ColoredExplosionParticle extends HugeExplosionParticle { diff --git a/src/main/java/de/dafuqs/spectrum/particle/client/DynamicParticle.java b/src/main/java/de/dafuqs/spectrum/particle/client/DynamicParticle.java index 4c8db794ed..232e7d53e1 100644 --- a/src/main/java/de/dafuqs/spectrum/particle/client/DynamicParticle.java +++ b/src/main/java/de/dafuqs/spectrum/particle/client/DynamicParticle.java @@ -8,7 +8,6 @@ import net.minecraft.client.particle.*; import net.minecraft.client.renderer.*; import net.minecraft.core.registries.*; -import javax.annotation.*; public class DynamicParticle extends TextureSheetParticle { diff --git a/src/main/java/de/dafuqs/spectrum/particle/client/MoonstoneStrikeParticle.java b/src/main/java/de/dafuqs/spectrum/particle/client/MoonstoneStrikeParticle.java index 2e800e9883..d241f339a6 100644 --- a/src/main/java/de/dafuqs/spectrum/particle/client/MoonstoneStrikeParticle.java +++ b/src/main/java/de/dafuqs/spectrum/particle/client/MoonstoneStrikeParticle.java @@ -7,7 +7,6 @@ import net.minecraft.client.particle.*; import net.minecraft.core.particles.*; import net.minecraft.world.phys.*; -import net.neoforged.api.distmarker.*; public class MoonstoneStrikeParticle extends NoRenderParticle { diff --git a/src/main/java/de/dafuqs/spectrum/particle/client/PastelTransmissionParticle.java b/src/main/java/de/dafuqs/spectrum/particle/client/PastelTransmissionParticle.java index 08e3912546..ff5a7eda06 100644 --- a/src/main/java/de/dafuqs/spectrum/particle/client/PastelTransmissionParticle.java +++ b/src/main/java/de/dafuqs/spectrum/particle/client/PastelTransmissionParticle.java @@ -1,7 +1,7 @@ package de.dafuqs.spectrum.particle.client; import com.mojang.blaze3d.vertex.*; -import de.dafuqs.spectrum.blocks.pastel_network.payloads.PastelPayload; +import de.dafuqs.spectrum.blocks.pastel_network.payloads.*; import de.dafuqs.spectrum.config.*; import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.particle.render.*; @@ -73,28 +73,24 @@ public void tick() { this.y = Mth.lerp(nodeProgress, source.y, destination.y); this.z = Mth.lerp(nodeProgress, source.z, destination.z); + payload.tick(level, this); + if (SpectrumConfig.CONFIG.PastelNetworkParticles.get() && this.age % 2 == 0) { level.addParticle(particleEffect, x + random.nextDouble() * 0.4 - 0.2, y + random.nextDouble() * 0.4 - 0.2, z + random.nextDouble() * 0.4 - 0.2, random.nextDouble() * 0.4 - 0.2, random.nextDouble() * 0.4 - 0.2, random.nextDouble() * 0.4 - 0.2); } } @Override - public void renderAsEntity(final PoseStack poseStack, final MultiBufferSource vertexConsumers, final Camera camera, final float tickDelta) { - final Vec3 cameraPos = camera.getPosition(); - final float x = (float) (Mth.lerp(tickDelta, xo, this.x)); - final float y = (float) (Mth.lerp(tickDelta, yo, this.y)); - final float z = (float) (Mth.lerp(tickDelta, zo, this.z)); - - poseStack.pushPose(); - - poseStack.translate(x - cameraPos.x, y - cameraPos.y, z - cameraPos.z); - final int light = getLightColor(tickDelta); - poseStack.mulPose(camera.rotation()); - poseStack.scale(0.65F, 0.65F, 0.65F); - poseStack.translate(0, -0.15, 0); - payload.render(this, level, poseStack, vertexConsumers, light); - - poseStack.popPose(); + public void renderAfterEntities(final PoseStack poseStack, final MultiBufferSource vertexConsumers, final Camera camera, final float tickDelta) { + payload.renderAfterEntities(this, level, poseStack, vertexConsumers, camera, tickDelta); + } + + public int getLightColor(float partialTick) { + return super.getLightColor(partialTick); + } + + public Vec3 getPos(float partialTick) { + return new Vec3(Mth.lerp(partialTick, xo, this.x), Mth.lerp(partialTick, yo, this.y), Mth.lerp(partialTick, zo, this.z)); } } diff --git a/src/main/java/de/dafuqs/spectrum/particle/client/SpectrumBlockLeakParticles.java b/src/main/java/de/dafuqs/spectrum/particle/client/SpectrumBlockLeakParticles.java index 9d8bfd3dcb..8d490bb19e 100644 --- a/src/main/java/de/dafuqs/spectrum/particle/client/SpectrumBlockLeakParticles.java +++ b/src/main/java/de/dafuqs/spectrum/particle/client/SpectrumBlockLeakParticles.java @@ -9,54 +9,6 @@ public class SpectrumBlockLeakParticles { - public static class LandingSludgeFactory implements ParticleProvider { - protected final SpriteSet spriteProvider; - - public LandingSludgeFactory(SpriteSet spriteProvider) { - this.spriteProvider = spriteProvider; - } - - @Override - public Particle createParticle(SimpleParticleType defaultParticleType, ClientLevel clientWorld, double d, double e, double f, double g, double h, double i) { - DripParticle blockLeakParticle = new DripParticle.DripLandParticle(clientWorld, d, e, f, SpectrumFluids.SLUDGE.get()); - blockLeakParticle.setColor(SpectrumFluids.SLUDGE_COLOR_VEC.x(), SpectrumFluids.SLUDGE_COLOR_VEC.y(), SpectrumFluids.SLUDGE_COLOR_VEC.z()); - blockLeakParticle.pickSprite(this.spriteProvider); - return blockLeakParticle; - } - } - - public static class FallingSludgeFactory implements ParticleProvider { - protected final SpriteSet spriteProvider; - - public FallingSludgeFactory(SpriteSet spriteProvider) { - this.spriteProvider = spriteProvider; - } - - @Override - public Particle createParticle(SimpleParticleType defaultParticleType, ClientLevel clientWorld, double d, double e, double f, double g, double h, double i) { - DripParticle blockLeakParticle = new DripParticle.FallAndLandParticle(clientWorld, d, e, f, SpectrumFluids.SLUDGE.get(), SpectrumParticleTypes.LANDING_SLUDGE); - blockLeakParticle.setColor(SpectrumFluids.SLUDGE_COLOR_VEC.x(), SpectrumFluids.SLUDGE_COLOR_VEC.y(), SpectrumFluids.SLUDGE_COLOR_VEC.z()); - blockLeakParticle.pickSprite(this.spriteProvider); - return blockLeakParticle; - } - } - - public static class DrippingSludgeFactory implements ParticleProvider { - protected final SpriteSet spriteProvider; - - public DrippingSludgeFactory(SpriteSet spriteProvider) { - this.spriteProvider = spriteProvider; - } - - @Override - public Particle createParticle(SimpleParticleType defaultParticleType, ClientLevel clientWorld, double d, double e, double f, double g, double h, double i) { - DripParticle blockLeakParticle = new DripParticle.DripHangParticle(clientWorld, d, e, f, SpectrumFluids.SLUDGE.get(), SpectrumParticleTypes.FALLING_SLUDGE); - blockLeakParticle.setColor(SpectrumFluids.SLUDGE_COLOR_VEC.x(), SpectrumFluids.SLUDGE_COLOR_VEC.y(), SpectrumFluids.SLUDGE_COLOR_VEC.z()); - blockLeakParticle.pickSprite(this.spriteProvider); - return blockLeakParticle; - } - } - public static class LandingLiquidCrystalFactory implements ParticleProvider { protected final SpriteSet spriteProvider; diff --git a/src/main/java/de/dafuqs/spectrum/particle/client/package-info.java b/src/main/java/de/dafuqs/spectrum/particle/client/package-info.java index f5264df3e8..4d3e97fd0c 100644 --- a/src/main/java/de/dafuqs/spectrum/particle/client/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/particle/client/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.particle.client; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/particle/effect/ColoredCraftingParticleEffect.java b/src/main/java/de/dafuqs/spectrum/particle/effect/ColoredCraftingParticleEffect.java index 2b00cece95..9f30382fa3 100644 --- a/src/main/java/de/dafuqs/spectrum/particle/effect/ColoredCraftingParticleEffect.java +++ b/src/main/java/de/dafuqs/spectrum/particle/effect/ColoredCraftingParticleEffect.java @@ -2,7 +2,7 @@ import com.mojang.serialization.*; import com.mojang.serialization.codecs.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.particle.*; import net.minecraft.core.particles.*; @@ -11,7 +11,7 @@ import net.minecraft.util.*; import org.joml.*; -public class ColoredCraftingParticleEffect implements ParticleOptions { +public record ColoredCraftingParticleEffect(Vector3f color) implements ParticleOptions { public static final ColoredCraftingParticleEffect BLACK = new ColoredCraftingParticleEffect(InkColors.BLACK_COLOR); public static final ColoredCraftingParticleEffect BLUE = new ColoredCraftingParticleEffect(InkColors.BLUE_COLOR); @@ -33,29 +33,20 @@ public class ColoredCraftingParticleEffect implements ParticleOptions { public static final MapCodec CODEC = RecordCodecBuilder.mapCodec((instance) -> instance.group( ExtraCodecs.VECTOR3F.fieldOf("color").forGetter((effect) -> effect.color) ).apply(instance, ColoredCraftingParticleEffect::new)); + public static final StreamCodec PACKET_CODEC = StreamCodec.composite( ByteBufCodecs.VECTOR3F, (effect) -> effect.color, ColoredCraftingParticleEffect::new ); - private final Vector3f color; - public ColoredCraftingParticleEffect(int color) { - this.color = SpectrumColorHelper.colorIntToVec(color); - } - - public ColoredCraftingParticleEffect(Vector3f color) { - this.color = color; + this(SpectrumColorHelper.colorIntToVec(color)); } public ParticleType getType() { return SpectrumParticleTypes.COLORED_CRAFTING; } - public Vector3f getColor() { - return this.color; - } - public static ParticleOptions of(int color) { return new ColoredCraftingParticleEffect(color); } diff --git a/src/main/java/de/dafuqs/spectrum/particle/effect/ColoredExplosionParticleEffect.java b/src/main/java/de/dafuqs/spectrum/particle/effect/ColoredExplosionParticleEffect.java index 2586319469..fa0e26b0d0 100644 --- a/src/main/java/de/dafuqs/spectrum/particle/effect/ColoredExplosionParticleEffect.java +++ b/src/main/java/de/dafuqs/spectrum/particle/effect/ColoredExplosionParticleEffect.java @@ -2,7 +2,7 @@ import com.mojang.serialization.*; import com.mojang.serialization.codecs.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.particle.*; import net.minecraft.core.particles.*; diff --git a/src/main/java/de/dafuqs/spectrum/particle/effect/ColoredFallingSporeBlossomParticleEffect.java b/src/main/java/de/dafuqs/spectrum/particle/effect/ColoredFallingSporeBlossomParticleEffect.java index 6fe3ad3538..8a0b13d933 100644 --- a/src/main/java/de/dafuqs/spectrum/particle/effect/ColoredFallingSporeBlossomParticleEffect.java +++ b/src/main/java/de/dafuqs/spectrum/particle/effect/ColoredFallingSporeBlossomParticleEffect.java @@ -2,7 +2,7 @@ import com.mojang.serialization.*; import com.mojang.serialization.codecs.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.particle.*; import net.minecraft.core.particles.*; diff --git a/src/main/java/de/dafuqs/spectrum/particle/effect/ColoredFluidRisingParticleEffect.java b/src/main/java/de/dafuqs/spectrum/particle/effect/ColoredFluidRisingParticleEffect.java index a255209c5d..556d42a04d 100644 --- a/src/main/java/de/dafuqs/spectrum/particle/effect/ColoredFluidRisingParticleEffect.java +++ b/src/main/java/de/dafuqs/spectrum/particle/effect/ColoredFluidRisingParticleEffect.java @@ -2,14 +2,13 @@ import com.mojang.serialization.*; import com.mojang.serialization.codecs.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.particle.*; import net.minecraft.core.particles.*; import net.minecraft.network.*; import net.minecraft.network.codec.*; import net.minecraft.util.*; -import javax.annotation.*; import org.joml.*; public class ColoredFluidRisingParticleEffect implements ParticleOptions { diff --git a/src/main/java/de/dafuqs/spectrum/particle/effect/ColoredSparkleRisingParticleEffect.java b/src/main/java/de/dafuqs/spectrum/particle/effect/ColoredSparkleRisingParticleEffect.java index 3e2d204719..f0a53653fb 100644 --- a/src/main/java/de/dafuqs/spectrum/particle/effect/ColoredSparkleRisingParticleEffect.java +++ b/src/main/java/de/dafuqs/spectrum/particle/effect/ColoredSparkleRisingParticleEffect.java @@ -2,7 +2,7 @@ import com.mojang.serialization.*; import com.mojang.serialization.codecs.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.particle.*; import net.minecraft.core.particles.*; diff --git a/src/main/java/de/dafuqs/spectrum/particle/effect/ColoredSporeBlossomAirParticleEffect.java b/src/main/java/de/dafuqs/spectrum/particle/effect/ColoredSporeBlossomAirParticleEffect.java index 45bbf48b7a..756ae588ae 100644 --- a/src/main/java/de/dafuqs/spectrum/particle/effect/ColoredSporeBlossomAirParticleEffect.java +++ b/src/main/java/de/dafuqs/spectrum/particle/effect/ColoredSporeBlossomAirParticleEffect.java @@ -2,7 +2,7 @@ import com.mojang.serialization.*; import com.mojang.serialization.codecs.*; -import de.dafuqs.spectrum.api.energy.color.*; +import de.dafuqs.spectrum.api.ink.color.*; import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.particle.*; import net.minecraft.core.particles.*; diff --git a/src/main/java/de/dafuqs/spectrum/particle/effect/PastelTransmissionParticleEffect.java b/src/main/java/de/dafuqs/spectrum/particle/effect/PastelTransmissionParticleEffect.java index 287183d957..5f53787071 100644 --- a/src/main/java/de/dafuqs/spectrum/particle/effect/PastelTransmissionParticleEffect.java +++ b/src/main/java/de/dafuqs/spectrum/particle/effect/PastelTransmissionParticleEffect.java @@ -2,14 +2,13 @@ import com.mojang.serialization.*; import com.mojang.serialization.codecs.*; -import de.dafuqs.spectrum.blocks.pastel_network.payloads.PastelPayload; +import de.dafuqs.spectrum.blocks.pastel_network.payloads.*; import de.dafuqs.spectrum.particle.*; import net.minecraft.core.*; import net.minecraft.core.particles.*; import net.minecraft.core.registries.*; import net.minecraft.network.*; import net.minecraft.network.codec.*; -import javax.annotation.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/particle/effect/package-info.java b/src/main/java/de/dafuqs/spectrum/particle/effect/package-info.java index 27099a2db3..083281d39a 100644 --- a/src/main/java/de/dafuqs/spectrum/particle/effect/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/particle/effect/package-info.java @@ -4,4 +4,4 @@ package de.dafuqs.spectrum.particle.effect; import net.minecraft.*; -import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/particle/package-info.java b/src/main/java/de/dafuqs/spectrum/particle/package-info.java index 7b558027af..5f7a91ff1a 100644 --- a/src/main/java/de/dafuqs/spectrum/particle/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/particle/package-info.java @@ -3,6 +3,5 @@ @FieldsAreNonnullByDefault package de.dafuqs.spectrum.particle; -import net.minecraft.FieldsAreNonnullByDefault; -import net.minecraft.MethodsReturnNonnullByDefault; -import org.jspecify.annotations.NullMarked; +import net.minecraft.*; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/particle/render/EarlyRenderingParticle.java b/src/main/java/de/dafuqs/spectrum/particle/render/EarlyRenderingParticle.java index 5e950c9ed7..1de5991c8b 100644 --- a/src/main/java/de/dafuqs/spectrum/particle/render/EarlyRenderingParticle.java +++ b/src/main/java/de/dafuqs/spectrum/particle/render/EarlyRenderingParticle.java @@ -6,5 +6,5 @@ public interface EarlyRenderingParticle { - void renderAsEntity(final PoseStack matrices, final MultiBufferSource vertexConsumers, final Camera camera, final float tickDelta); + void renderAfterEntities(final PoseStack matrices, final MultiBufferSource vertexConsumers, final Camera camera, final float tickDelta); } \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/particle/render/EarlyRenderingParticleContainer.java b/src/main/java/de/dafuqs/spectrum/particle/render/EarlyRenderingParticleContainer.java index d1989f7491..81ccbeebf9 100644 --- a/src/main/java/de/dafuqs/spectrum/particle/render/EarlyRenderingParticleContainer.java +++ b/src/main/java/de/dafuqs/spectrum/particle/render/EarlyRenderingParticleContainer.java @@ -31,10 +31,10 @@ public static void clear() { particles.clear(); } - public void render(final PoseStack matrices, final MultiBufferSource vertexConsumers, final Camera camera, final float tickDelta) { + public void renderAfterEntities(final PoseStack matrices, final MultiBufferSource vertexConsumers, final Camera camera, final float tickDelta) { for (final Queue particles : particles.values()) { for (final EarlyRenderingParticle particle : particles) { - particle.renderAsEntity(matrices, vertexConsumers, camera, tickDelta); + particle.renderAfterEntities(matrices, vertexConsumers, camera, tickDelta); } } } diff --git a/src/main/java/de/dafuqs/spectrum/particle/render/ExtendedParticleManager.java b/src/main/java/de/dafuqs/spectrum/particle/render/ExtendedParticleManager.java index f456db9b4d..784272549b 100644 --- a/src/main/java/de/dafuqs/spectrum/particle/render/ExtendedParticleManager.java +++ b/src/main/java/de/dafuqs/spectrum/particle/render/ExtendedParticleManager.java @@ -6,5 +6,5 @@ public interface ExtendedParticleManager { - void render(PoseStack matrices, MultiBufferSource vertexConsumers, Camera camera, float tickDelta); + void renderAfterEntities(PoseStack matrices, MultiBufferSource vertexConsumers, Camera camera, float tickDelta); } \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/particle/render/package-info.java b/src/main/java/de/dafuqs/spectrum/particle/render/package-info.java index 63f87b84d0..d376276fb0 100644 --- a/src/main/java/de/dafuqs/spectrum/particle/render/package-info.java +++ b/src/main/java/de/dafuqs/spectrum/particle/render/package-info.java @@ -3,6 +3,5 @@ @FieldsAreNonnullByDefault package de.dafuqs.spectrum.particle.render; -import net.minecraft.FieldsAreNonnullByDefault; -import net.minecraft.MethodsReturnNonnullByDefault; -import org.jspecify.annotations.NullMarked; +import net.minecraft.*; +import org.jspecify.annotations.*; diff --git a/src/main/java/de/dafuqs/spectrum/progression/AdvancementSyncer.java b/src/main/java/de/dafuqs/spectrum/progression/AdvancementSyncer.java new file mode 100644 index 0000000000..268e347337 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/progression/AdvancementSyncer.java @@ -0,0 +1,191 @@ +package de.dafuqs.spectrum.progression; + +import de.dafuqs.revelationary.api.advancements.*; +import de.dafuqs.spectrum.*; +import net.minecraft.advancements.*; +import net.minecraft.core.*; +import net.minecraft.nbt.*; +import net.minecraft.server.*; +import net.minecraft.server.level.*; +import net.minecraft.server.players.*; +import net.minecraft.util.*; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.animal.*; +import net.minecraft.world.level.saveddata.*; + +import java.util.*; + +public class AdvancementSyncer extends SavedData { + + public enum Option implements StringRepresentable { + ALL_PERSISTENT("all_persistent", true, false), + SPECTRUM_PERSISTENT("spectrum_persistent", true, true), + ALL_ONCE("all_once", false, false), + SPECTRUM_ONCE("spectrum_once", false, true); + + public static final StringRepresentable.EnumCodec