From ccf20fa6dcba1c3aa5beb1745696ef3b6e94ba95 Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Tue, 31 Dec 2024 17:16:19 -0500 Subject: [PATCH 01/58] Fix blood orchid petal unshrouding --- .../registries/SpectrumAdvancements.java | 3 ++- .../spectrum/registries/SpectrumItems.java | 2 +- .../reveal_blood_orchid_petals.json | 22 +++++++++++++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/data/spectrum/advancements/milestones/reveal_blood_orchid_petals.json diff --git a/src/main/java/de/dafuqs/spectrum/registries/SpectrumAdvancements.java b/src/main/java/de/dafuqs/spectrum/registries/SpectrumAdvancements.java index 0ad697d7aa..0944917165 100644 --- a/src/main/java/de/dafuqs/spectrum/registries/SpectrumAdvancements.java +++ b/src/main/java/de/dafuqs/spectrum/registries/SpectrumAdvancements.java @@ -9,7 +9,8 @@ public class SpectrumAdvancements { // Revelations public static final Identifier REVEAL_AMARANTH = SpectrumCommon.locate("milestones/reveal_amaranth"); - public static final Identifier REVEAL_AZURITE = locate("milestones/reveal_azurite"); + public static final Identifier REVEAL_AZURITE = SpectrumCommon.locate("milestones/reveal_azurite"); + public static final Identifier REVEAL_BLOOD_ORCHID_PETALS = SpectrumCommon.locate("milestones/reveal_blood_orchid_petals"); public static final Identifier REVEAL_COLORED_SAPLINGS_CMY = SpectrumCommon.locate("milestones/reveal_colored_saplings_cmy"); public static final Identifier REVEAL_COLORED_TREES_BLACK = SpectrumCommon.locate("milestones/reveal_colored_trees_k"); public static final Identifier REVEAL_COLORED_TREES_CMY = SpectrumCommon.locate("milestones/reveal_colored_trees_cmy"); diff --git a/src/main/java/de/dafuqs/spectrum/registries/SpectrumItems.java b/src/main/java/de/dafuqs/spectrum/registries/SpectrumItems.java index 993149442c..880802ff28 100644 --- a/src/main/java/de/dafuqs/spectrum/registries/SpectrumItems.java +++ b/src/main/java/de/dafuqs/spectrum/registries/SpectrumItems.java @@ -278,7 +278,7 @@ public Map getDefaultEnchantments() { public static final Item JADEITE_PETALS = new Item(IS.of(Rarity.UNCOMMON)); - public static final Item BLOOD_ORCHID_PETAL = new CloakedItem(IS.of(), SpectrumAdvancements.SOLVE_WIRELESS_REDSTONE_PRESERVATION_RUIN, Items.RED_DYE); + public static final Item BLOOD_ORCHID_PETAL = new CloakedItem(IS.of(), SpectrumAdvancements.REVEAL_BLOOD_ORCHID_PETALS, Items.RED_DYE); public static final Item ROCK_CANDY = new RockCandyItem(IS.of().food(SpectrumFoodComponents.ROCK_CANDY), RockCandy.RockCandyVariant.SUGAR); public static final Item TOPAZ_ROCK_CANDY = new RockCandyItem(IS.of().food(SpectrumFoodComponents.TOPAZ_ROCK_CANDY), RockCandy.RockCandyVariant.TOPAZ); diff --git a/src/main/resources/data/spectrum/advancements/milestones/reveal_blood_orchid_petals.json b/src/main/resources/data/spectrum/advancements/milestones/reveal_blood_orchid_petals.json new file mode 100644 index 0000000000..447dc55de5 --- /dev/null +++ b/src/main/resources/data/spectrum/advancements/milestones/reveal_blood_orchid_petals.json @@ -0,0 +1,22 @@ +{ + "criteria": { + "solved_wireless_redstone_ruin": { + "trigger": "revelationary:advancement_gotten", + "conditions": { + "advancement_identifier": "spectrum:solve_wireless_redstone_preservation_ruin" + } + }, + "entered_undergrowth_manor": { + "trigger": "revelationary:advancement_gotten", + "conditions": { + "advancement_identifier": "spectrum:lategame/find_undergrowth_manor" + } + } + }, + "requirements": [ + [ + "solved_wireless_redstone_ruin", + "entered_undergrowth_manor" + ] + ] + } \ No newline at end of file From b0c499e035763931d7ee54a0d18edab01d24bf4f Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Tue, 31 Dec 2024 18:24:52 -0500 Subject: [PATCH 02/58] Tag and proper enforcement for effects that don't work with incurable --- .../de/dafuqs/spectrum/api/status_effect/Incurable.java | 4 ++-- .../blocks/potion_workshop/PotionWorkshopBlockEntity.java | 4 +++- .../spectrum/registries/SpectrumStatusEffectTags.java | 6 ++++++ .../data/spectrum/tags/mob_effect/cannot_be_incurable.json | 6 ++++++ 4 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 src/main/resources/data/spectrum/tags/mob_effect/cannot_be_incurable.json diff --git a/src/main/java/de/dafuqs/spectrum/api/status_effect/Incurable.java b/src/main/java/de/dafuqs/spectrum/api/status_effect/Incurable.java index 6deabac2e8..1b7cb197de 100644 --- a/src/main/java/de/dafuqs/spectrum/api/status_effect/Incurable.java +++ b/src/main/java/de/dafuqs/spectrum/api/status_effect/Incurable.java @@ -2,7 +2,7 @@ import de.dafuqs.spectrum.mixin.accessors.*; -import de.dafuqs.spectrum.registries.SpectrumStatusEffects; +import de.dafuqs.spectrum.registries.SpectrumStatusEffectTags; import net.minecraft.entity.*; import net.minecraft.entity.effect.StatusEffectInstance; import net.minecraft.network.packet.s2c.play.*; @@ -16,7 +16,7 @@ public interface Incurable { static boolean isIncurable(StatusEffectInstance instance) { var type = instance.getEffectType(); - if (type == SpectrumStatusEffects.ETERNAL_SLUMBER || type == SpectrumStatusEffects.FATAL_SLUMBER) + if (SpectrumStatusEffectTags.cannotBeIncurable(type)) return false; return ((Incurable) instance).spectrum$isIncurable(); 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 70e2f80e19..3afa0bdd80 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 @@ -209,7 +209,9 @@ private static boolean hasUniqueReagents(PotionWorkshopBlockEntity potionWorksho } private static boolean isBrewingRecipeApplicable(PotionWorkshopBrewingRecipe recipe, ItemStack baseIngredient, PotionWorkshopBlockEntity potionWorkshopBlockEntity) { - return hasUniqueReagents(potionWorkshopBlockEntity) && recipe.recipeData.isApplicableTo(baseIngredient, getPotionModFromReagents(potionWorkshopBlockEntity)); + PotionMod potionMod = getPotionModFromReagents(potionWorkshopBlockEntity); + return hasUniqueReagents(potionWorkshopBlockEntity) && recipe.recipeData.isApplicableTo(baseIngredient, potionMod) + && !(potionMod.incurable && SpectrumStatusEffectTags.cannotBeIncurable(recipe.recipeData.statusEffect())); } private static void craftRecipe(PotionWorkshopBlockEntity potionWorkshopBlockEntity, PotionWorkshopCraftingRecipe recipe) { diff --git a/src/main/java/de/dafuqs/spectrum/registries/SpectrumStatusEffectTags.java b/src/main/java/de/dafuqs/spectrum/registries/SpectrumStatusEffectTags.java index a6e10998ea..5328feb0d8 100644 --- a/src/main/java/de/dafuqs/spectrum/registries/SpectrumStatusEffectTags.java +++ b/src/main/java/de/dafuqs/spectrum/registries/SpectrumStatusEffectTags.java @@ -11,6 +11,7 @@ public class SpectrumStatusEffectTags { public static TagKey BYPASSES_WHISPY_CIRCLET; public static TagKey BYPASSES_NECTAR_GLOVES; public static TagKey BYPASSES_IMMUNITY; + public static TagKey CANNOT_BE_INCURABLE; public static TagKey NO_DURATION_EXTENSION; public static TagKey SOPORIFIC; public static TagKey NIGHT_ALCHEMY; @@ -19,6 +20,7 @@ public static void register() { BYPASSES_WHISPY_CIRCLET = of("bypasses_whispy_circlet"); BYPASSES_NECTAR_GLOVES = of("bypasses_nectar_gloves"); BYPASSES_IMMUNITY = of("bypasses_immunity"); + CANNOT_BE_INCURABLE = of("cannot_be_incurable"); NO_DURATION_EXTENSION = of("no_duration_extension"); SOPORIFIC = of("soporific"); NIGHT_ALCHEMY = of("night_alchemy"); @@ -43,6 +45,10 @@ public static boolean bypassesNectarGloves(StatusEffect statusEffect) { public static boolean bypassesWhispyCirclet(StatusEffect statusEffect) { return isIn(SpectrumStatusEffectTags.BYPASSES_WHISPY_CIRCLET, statusEffect); } + + public static boolean cannotBeIncurable(StatusEffect statusEffect) { + return isIn(SpectrumStatusEffectTags.CANNOT_BE_INCURABLE, statusEffect); + } public static boolean hasEffectWithTag(LivingEntity livingEntity, TagKey tag) { for (StatusEffect statusEffect : livingEntity.getActiveStatusEffects().keySet()) { diff --git a/src/main/resources/data/spectrum/tags/mob_effect/cannot_be_incurable.json b/src/main/resources/data/spectrum/tags/mob_effect/cannot_be_incurable.json new file mode 100644 index 0000000000..297bb01e8b --- /dev/null +++ b/src/main/resources/data/spectrum/tags/mob_effect/cannot_be_incurable.json @@ -0,0 +1,6 @@ +{ + "values": [ + "spectrum:eternal_slumber", + "spectrum:fatal_slumber" + ] + } \ No newline at end of file From a8b6c830a451ff3c21773112c3f3adc28639beae Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Tue, 31 Dec 2024 18:45:55 -0500 Subject: [PATCH 03/58] Better fusion shrine hint for soothing bouquet --- src/main/resources/assets/spectrum/lang/en_us.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/spectrum/lang/en_us.json b/src/main/resources/assets/spectrum/lang/en_us.json index e9a4c8ccb6..38fc3570c7 100644 --- a/src/main/resources/assets/spectrum/lang/en_us.json +++ b/src/main/resources/assets/spectrum/lang/en_us.json @@ -5154,7 +5154,7 @@ "spectrum.recipe.fusion_shrine.explanation.no_rgb": "Saw you peeking", "spectrum.recipe.fusion_shrine.explanation.ominous_sapling": "Requires daytime", "spectrum.recipe.fusion_shrine.explanation.onyx_shard": "Midnight on a new moon only", - "spectrum.recipe.fusion_shrine.explanation.soothing_bouquet": "Perform at the height of slumber", + "spectrum.recipe.fusion_shrine.explanation.soothing_bouquet": "Perform at the darkest hour", "spectrum.recipe.fusion_shrine.explanation.paltaeria_gem": "Requires a thunderstorm", "spectrum.recipe.fusion_shrine.explanation.shooting_star_hardening": "Protects star from breaking", "spectrum.recipe.fusion_shrine.explanation.spectral_shard": "The perfect Compound", From b9c6a1e4145377637a92e2391ca46ae37b381b59 Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Tue, 31 Dec 2024 19:02:16 -0500 Subject: [PATCH 04/58] Make various DD shearables also silkable --- .../loot_tables/blocks/bristle_sprouts.json | 26 ++++++++++++++++--- .../loot_tables/blocks/giant_moss_ball.json | 26 ++++++++++++++++--- .../loot_tables/blocks/moss_ball.json | 26 ++++++++++++++++--- .../loot_tables/blocks/varia_sprout.json | 26 ++++++++++++++++--- 4 files changed, 88 insertions(+), 16 deletions(-) diff --git a/src/main/resources/data/spectrum/loot_tables/blocks/bristle_sprouts.json b/src/main/resources/data/spectrum/loot_tables/blocks/bristle_sprouts.json index 88766e80b2..33d0f42dd3 100644 --- a/src/main/resources/data/spectrum/loot_tables/blocks/bristle_sprouts.json +++ b/src/main/resources/data/spectrum/loot_tables/blocks/bristle_sprouts.json @@ -10,10 +10,28 @@ "name": "spectrum:bristle_sprouts", "conditions": [ { - "condition": "minecraft:match_tool", - "predicate": { - "tag": "c:shears" - } + "condition": "minecraft:any_of", + "terms": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "tag": "c:shears" + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ] } ] } diff --git a/src/main/resources/data/spectrum/loot_tables/blocks/giant_moss_ball.json b/src/main/resources/data/spectrum/loot_tables/blocks/giant_moss_ball.json index 08b8364fa7..5463df1302 100644 --- a/src/main/resources/data/spectrum/loot_tables/blocks/giant_moss_ball.json +++ b/src/main/resources/data/spectrum/loot_tables/blocks/giant_moss_ball.json @@ -10,10 +10,28 @@ "name": "spectrum:giant_moss_ball", "conditions": [ { - "condition": "minecraft:match_tool", - "predicate": { - "tag": "c:shears" - } + "condition": "minecraft:any_of", + "terms": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "tag": "c:shears" + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ] } ] } diff --git a/src/main/resources/data/spectrum/loot_tables/blocks/moss_ball.json b/src/main/resources/data/spectrum/loot_tables/blocks/moss_ball.json index d46fff9657..81864bf839 100644 --- a/src/main/resources/data/spectrum/loot_tables/blocks/moss_ball.json +++ b/src/main/resources/data/spectrum/loot_tables/blocks/moss_ball.json @@ -10,10 +10,28 @@ "name": "spectrum:moss_ball", "conditions": [ { - "condition": "minecraft:match_tool", - "predicate": { - "tag": "c:shears" - } + "condition": "minecraft:any_of", + "terms": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "tag": "c:shears" + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ] } ] } diff --git a/src/main/resources/data/spectrum/loot_tables/blocks/varia_sprout.json b/src/main/resources/data/spectrum/loot_tables/blocks/varia_sprout.json index 168afbaab3..a367f2fa8a 100644 --- a/src/main/resources/data/spectrum/loot_tables/blocks/varia_sprout.json +++ b/src/main/resources/data/spectrum/loot_tables/blocks/varia_sprout.json @@ -10,10 +10,28 @@ "name": "spectrum:varia_sprout", "conditions": [ { - "condition": "minecraft:match_tool", - "predicate": { - "tag": "c:shears" - } + "condition": "minecraft:any_of", + "terms": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "tag": "c:shears" + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ] } ] } From 44aec6a466577138f961db195a85fb1a597eb594 Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Tue, 31 Dec 2024 20:55:45 -0500 Subject: [PATCH 05/58] Gala wood works in furnaces (and burns twice as long as normal wood) --- .../spectrum/registries/SpectrumItemTags.java | 1 + .../dafuqs/spectrum/registries/SpectrumItems.java | 12 ++++++++++++ .../resources/assets/spectrum/lang/en_us.json | 2 +- .../minecraft/tags/items/non_flammable_wood.json | 15 --------------- 4 files changed, 14 insertions(+), 16 deletions(-) delete mode 100644 src/main/resources/data/minecraft/tags/items/non_flammable_wood.json diff --git a/src/main/java/de/dafuqs/spectrum/registries/SpectrumItemTags.java b/src/main/java/de/dafuqs/spectrum/registries/SpectrumItemTags.java index 8339889f0a..d0a5f51ac0 100644 --- a/src/main/java/de/dafuqs/spectrum/registries/SpectrumItemTags.java +++ b/src/main/java/de/dafuqs/spectrum/registries/SpectrumItemTags.java @@ -30,6 +30,7 @@ public class SpectrumItemTags { public static final TagKey EMISSIVE = of("emissive"); public static final TagKey PASTEL_NODE_UPGRADES = of("pastel_node_upgrades"); public static final TagKey TAG_FILTERING_ITEMS = of("tag_filtering_items"); + public static final TagKey WEEPING_GALA_LOGS = of("weeping_gala_logs"); private static TagKey of(String id) { return TagKey.of(RegistryKeys.ITEM, SpectrumCommon.locate(id)); diff --git a/src/main/java/de/dafuqs/spectrum/registries/SpectrumItems.java b/src/main/java/de/dafuqs/spectrum/registries/SpectrumItems.java index 880802ff28..e7c85e8512 100644 --- a/src/main/java/de/dafuqs/spectrum/registries/SpectrumItems.java +++ b/src/main/java/de/dafuqs/spectrum/registries/SpectrumItems.java @@ -1005,6 +1005,18 @@ public static void registerFuelRegistry() { FuelRegistry.INSTANCE.add(SpectrumItemTags.COLORED_FENCES, 300); FuelRegistry.INSTANCE.add(SpectrumItemTags.COLORED_FENCE_GATES, 300); + + // gala wood burns twice as long as normal + FuelRegistry.INSTANCE.add(SpectrumItemTags.WEEPING_GALA_LOGS, 600); + FuelRegistry.INSTANCE.add(SpectrumBlocks.WEEPING_GALA_PLANKS, 600); + FuelRegistry.INSTANCE.add(SpectrumBlocks.WEEPING_GALA_STAIRS, 600); + FuelRegistry.INSTANCE.add(SpectrumBlocks.WEEPING_GALA_DOOR, 400); + FuelRegistry.INSTANCE.add(SpectrumBlocks.WEEPING_GALA_FENCE, 600); + FuelRegistry.INSTANCE.add(SpectrumBlocks.WEEPING_GALA_PRESSURE_PLATE, 600); + FuelRegistry.INSTANCE.add(SpectrumBlocks.WEEPING_GALA_TRAPDOOR, 600); + FuelRegistry.INSTANCE.add(SpectrumBlocks.WEEPING_GALA_FENCE_GATE, 600); + FuelRegistry.INSTANCE.add(SpectrumBlocks.WEEPING_GALA_BUTTON, 200); + FuelRegistry.INSTANCE.add(SpectrumBlocks.WEEPING_GALA_SLAB, 300); } } diff --git a/src/main/resources/assets/spectrum/lang/en_us.json b/src/main/resources/assets/spectrum/lang/en_us.json index 38fc3570c7..31f3e07121 100644 --- a/src/main/resources/assets/spectrum/lang/en_us.json +++ b/src/main/resources/assets/spectrum/lang/en_us.json @@ -3983,7 +3983,7 @@ "book.spectrum.guidebook.weeping_gala.lantern.text": "I made two variants. I can switch between then by sneaking while placing it.", "book.spectrum.guidebook.weeping_gala.light.text": "Bright as can be", "book.spectrum.guidebook.weeping_gala.name": "Weeping Galas", - "book.spectrum.guidebook.weeping_gala.page0.text": "Imposing willows adorned with pale leaves. Its sprigs weep with a sticky, sweet resin that can be used as a [Milk](item://minecraft:milk_bucket) substitute.\\\n\\\nI wonder how they grow so large when their leaves don't even have chlorophyll.", + "book.spectrum.guidebook.weeping_gala.page0.text": "Imposing willows adorned with pale leaves. The sprigs weep with a sticky, sweet resin that can be used as a [Milk](item://minecraft:milk_bucket) substitute. The wood is incredibly dense, making it much slower to burn than most other woods.\\\n\\\nI wonder how they grow so large when their leaves don't even have chlorophyll?", "book.spectrum.guidebook.weeping_gala.page1.text": "*Gala... milk tree... wait - GALACTOSE!*", "book.spectrum.guidebook.weeping_gala.pillar.text": "*dainty*", "book.spectrum.guidebook.what_happened.name": "What happened down there?", diff --git a/src/main/resources/data/minecraft/tags/items/non_flammable_wood.json b/src/main/resources/data/minecraft/tags/items/non_flammable_wood.json deleted file mode 100644 index 224b598a47..0000000000 --- a/src/main/resources/data/minecraft/tags/items/non_flammable_wood.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "replace": false, - "values": [ - "#spectrum:weeping_gala_logs", - "spectrum:weeping_gala_planks", - "spectrum:weeping_gala_stairs", - "spectrum:weeping_gala_door", - "spectrum:weeping_gala_pressure_plate", - "spectrum:weeping_gala_fence", - "spectrum:weeping_gala_trapdoor", - "spectrum:weeping_gala_fence_gate", - "spectrum:weeping_gala_button", - "spectrum:weeping_gala_slab" - ] -} \ No newline at end of file From 329e83d9daa19883ee61df42dd2cd6b06b8d7475 Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Tue, 31 Dec 2024 21:25:02 -0500 Subject: [PATCH 06/58] Ink conversion for botania petal blocks --- .../ink_converting/from_black_petal_block.json | 17 +++++++++++++++++ .../ink_converting/from_blue_petal_block.json | 17 +++++++++++++++++ .../ink_converting/from_brown_petal_block.json | 17 +++++++++++++++++ .../ink_converting/from_cyan_petal_block.json | 17 +++++++++++++++++ .../ink_converting/from_gray_petal_block.json | 17 +++++++++++++++++ .../ink_converting/from_green_petal_block.json | 17 +++++++++++++++++ .../from_light_blue_petal_block.json | 17 +++++++++++++++++ .../from_light_gray_petal_block.json | 17 +++++++++++++++++ .../ink_converting/from_lime_petal_block.json | 17 +++++++++++++++++ .../from_magenta_petal_block.json | 17 +++++++++++++++++ .../ink_converting/from_orange_petal_block.json | 17 +++++++++++++++++ .../ink_converting/from_pink_petal_block.json | 17 +++++++++++++++++ .../ink_converting/from_purple_petal_block.json | 17 +++++++++++++++++ .../ink_converting/from_red_petal_block.json | 17 +++++++++++++++++ .../ink_converting/from_white_petal_block.json | 17 +++++++++++++++++ .../ink_converting/from_yellow_petal_block.json | 17 +++++++++++++++++ 16 files changed, 272 insertions(+) create mode 100644 src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_black_petal_block.json create mode 100644 src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_blue_petal_block.json create mode 100644 src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_brown_petal_block.json create mode 100644 src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_cyan_petal_block.json create mode 100644 src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_gray_petal_block.json create mode 100644 src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_green_petal_block.json create mode 100644 src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_light_blue_petal_block.json create mode 100644 src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_light_gray_petal_block.json create mode 100644 src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_lime_petal_block.json create mode 100644 src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_magenta_petal_block.json create mode 100644 src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_orange_petal_block.json create mode 100644 src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_pink_petal_block.json create mode 100644 src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_purple_petal_block.json create mode 100644 src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_red_petal_block.json create mode 100644 src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_white_petal_block.json create mode 100644 src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_yellow_petal_block.json diff --git a/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_black_petal_block.json b/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_black_petal_block.json new file mode 100644 index 0000000000..037219b379 --- /dev/null +++ b/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_black_petal_block.json @@ -0,0 +1,17 @@ +{ + "type": "spectrum:ink_converting", + "ingredient": { + "item": "botania:black_petal_block" + }, + "ink_color": "spectrum:black", + "amount": 225, + "required_advancement": "spectrum:hidden/collect_pigment/black", + "fabric:load_conditions": [ + { + "condition": "fabric:all_mods_loaded", + "values": [ + "botania" + ] + } + ] + } \ No newline at end of file diff --git a/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_blue_petal_block.json b/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_blue_petal_block.json new file mode 100644 index 0000000000..e6b71b0c7d --- /dev/null +++ b/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_blue_petal_block.json @@ -0,0 +1,17 @@ +{ + "type": "spectrum:ink_converting", + "ingredient": { + "item": "botania:blue_petal_block" + }, + "ink_color": "spectrum:blue", + "amount": 225, + "required_advancement": "spectrum:hidden/collect_pigment/blue", + "fabric:load_conditions": [ + { + "condition": "fabric:all_mods_loaded", + "values": [ + "botania" + ] + } + ] + } \ No newline at end of file diff --git a/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_brown_petal_block.json b/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_brown_petal_block.json new file mode 100644 index 0000000000..15cd819865 --- /dev/null +++ b/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_brown_petal_block.json @@ -0,0 +1,17 @@ +{ + "type": "spectrum:ink_converting", + "ingredient": { + "item": "botania:brown_petal_block" + }, + "ink_color": "spectrum:brown", + "amount": 225, + "required_advancement": "spectrum:hidden/collect_pigment/brown", + "fabric:load_conditions": [ + { + "condition": "fabric:all_mods_loaded", + "values": [ + "botania" + ] + } + ] + } \ No newline at end of file diff --git a/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_cyan_petal_block.json b/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_cyan_petal_block.json new file mode 100644 index 0000000000..b2ad6e5a75 --- /dev/null +++ b/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_cyan_petal_block.json @@ -0,0 +1,17 @@ +{ + "type": "spectrum:ink_converting", + "ingredient": { + "item": "botania:cyan_petal_block" + }, + "ink_color": "spectrum:cyan", + "amount": 225, + "required_advancement": "spectrum:hidden/collect_pigment/cyan", + "fabric:load_conditions": [ + { + "condition": "fabric:all_mods_loaded", + "values": [ + "botania" + ] + } + ] + } \ No newline at end of file diff --git a/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_gray_petal_block.json b/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_gray_petal_block.json new file mode 100644 index 0000000000..751f895c22 --- /dev/null +++ b/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_gray_petal_block.json @@ -0,0 +1,17 @@ +{ + "type": "spectrum:ink_converting", + "ingredient": { + "item": "botania:gray_petal_block" + }, + "ink_color": "spectrum:gray", + "amount": 225, + "required_advancement": "spectrum:hidden/collect_pigment/gray", + "fabric:load_conditions": [ + { + "condition": "fabric:all_mods_loaded", + "values": [ + "botania" + ] + } + ] + } \ No newline at end of file diff --git a/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_green_petal_block.json b/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_green_petal_block.json new file mode 100644 index 0000000000..3d0f9aaaea --- /dev/null +++ b/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_green_petal_block.json @@ -0,0 +1,17 @@ +{ + "type": "spectrum:ink_converting", + "ingredient": { + "item": "botania:green_petal_block" + }, + "ink_color": "spectrum:green", + "amount": 225, + "required_advancement": "spectrum:hidden/collect_pigment/green", + "fabric:load_conditions": [ + { + "condition": "fabric:all_mods_loaded", + "values": [ + "botania" + ] + } + ] + } \ No newline at end of file diff --git a/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_light_blue_petal_block.json b/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_light_blue_petal_block.json new file mode 100644 index 0000000000..443b94f7d5 --- /dev/null +++ b/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_light_blue_petal_block.json @@ -0,0 +1,17 @@ +{ + "type": "spectrum:ink_converting", + "ingredient": { + "item": "botania:light_blue_petal_block" + }, + "ink_color": "spectrum:light_blue", + "amount": 225, + "required_advancement": "spectrum:hidden/collect_pigment/light_blue", + "fabric:load_conditions": [ + { + "condition": "fabric:all_mods_loaded", + "values": [ + "botania" + ] + } + ] + } \ No newline at end of file diff --git a/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_light_gray_petal_block.json b/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_light_gray_petal_block.json new file mode 100644 index 0000000000..c24cf49b2d --- /dev/null +++ b/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_light_gray_petal_block.json @@ -0,0 +1,17 @@ +{ + "type": "spectrum:ink_converting", + "ingredient": { + "item": "botania:light_gray_petal_block" + }, + "ink_color": "spectrum:light_gray", + "amount": 225, + "required_advancement": "spectrum:hidden/collect_pigment/light_gray", + "fabric:load_conditions": [ + { + "condition": "fabric:all_mods_loaded", + "values": [ + "botania" + ] + } + ] + } \ No newline at end of file diff --git a/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_lime_petal_block.json b/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_lime_petal_block.json new file mode 100644 index 0000000000..7181bf5282 --- /dev/null +++ b/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_lime_petal_block.json @@ -0,0 +1,17 @@ +{ + "type": "spectrum:ink_converting", + "ingredient": { + "item": "botania:lime_petal_block" + }, + "ink_color": "spectrum:lime", + "amount": 225, + "required_advancement": "spectrum:hidden/collect_pigment/lime", + "fabric:load_conditions": [ + { + "condition": "fabric:all_mods_loaded", + "values": [ + "botania" + ] + } + ] + } \ No newline at end of file diff --git a/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_magenta_petal_block.json b/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_magenta_petal_block.json new file mode 100644 index 0000000000..80b7fa00d6 --- /dev/null +++ b/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_magenta_petal_block.json @@ -0,0 +1,17 @@ +{ + "type": "spectrum:ink_converting", + "ingredient": { + "item": "botania:magenta_petal_block" + }, + "ink_color": "spectrum:magenta", + "amount": 225, + "required_advancement": "spectrum:hidden/collect_pigment/magenta", + "fabric:load_conditions": [ + { + "condition": "fabric:all_mods_loaded", + "values": [ + "botania" + ] + } + ] + } \ No newline at end of file diff --git a/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_orange_petal_block.json b/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_orange_petal_block.json new file mode 100644 index 0000000000..9db9bab750 --- /dev/null +++ b/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_orange_petal_block.json @@ -0,0 +1,17 @@ +{ + "type": "spectrum:ink_converting", + "ingredient": { + "item": "botania:orange_petal_block" + }, + "ink_color": "spectrum:orange", + "amount": 225, + "required_advancement": "spectrum:hidden/collect_pigment/orange", + "fabric:load_conditions": [ + { + "condition": "fabric:all_mods_loaded", + "values": [ + "botania" + ] + } + ] + } \ No newline at end of file diff --git a/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_pink_petal_block.json b/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_pink_petal_block.json new file mode 100644 index 0000000000..d8b1f026fa --- /dev/null +++ b/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_pink_petal_block.json @@ -0,0 +1,17 @@ +{ + "type": "spectrum:ink_converting", + "ingredient": { + "item": "botania:pink_petal_block" + }, + "ink_color": "spectrum:pink", + "amount": 225, + "required_advancement": "spectrum:hidden/collect_pigment/pink", + "fabric:load_conditions": [ + { + "condition": "fabric:all_mods_loaded", + "values": [ + "botania" + ] + } + ] + } \ No newline at end of file diff --git a/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_purple_petal_block.json b/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_purple_petal_block.json new file mode 100644 index 0000000000..0dff6403db --- /dev/null +++ b/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_purple_petal_block.json @@ -0,0 +1,17 @@ +{ + "type": "spectrum:ink_converting", + "ingredient": { + "item": "botania:purple_petal_block" + }, + "ink_color": "spectrum:purple", + "amount": 225, + "required_advancement": "spectrum:hidden/collect_pigment/purple", + "fabric:load_conditions": [ + { + "condition": "fabric:all_mods_loaded", + "values": [ + "botania" + ] + } + ] + } \ No newline at end of file diff --git a/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_red_petal_block.json b/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_red_petal_block.json new file mode 100644 index 0000000000..51f621bec3 --- /dev/null +++ b/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_red_petal_block.json @@ -0,0 +1,17 @@ +{ + "type": "spectrum:ink_converting", + "ingredient": { + "item": "botania:red_petal_block" + }, + "ink_color": "spectrum:red", + "amount": 225, + "required_advancement": "spectrum:hidden/collect_pigment/red", + "fabric:load_conditions": [ + { + "condition": "fabric:all_mods_loaded", + "values": [ + "botania" + ] + } + ] + } \ No newline at end of file diff --git a/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_white_petal_block.json b/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_white_petal_block.json new file mode 100644 index 0000000000..a33f014bec --- /dev/null +++ b/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_white_petal_block.json @@ -0,0 +1,17 @@ +{ + "type": "spectrum:ink_converting", + "ingredient": { + "item": "botania:white_petal_block" + }, + "ink_color": "spectrum:white", + "amount": 225, + "required_advancement": "spectrum:hidden/collect_pigment/white", + "fabric:load_conditions": [ + { + "condition": "fabric:all_mods_loaded", + "values": [ + "botania" + ] + } + ] + } \ No newline at end of file diff --git a/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_yellow_petal_block.json b/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_yellow_petal_block.json new file mode 100644 index 0000000000..c35480d55e --- /dev/null +++ b/src/main/resources/data/spectrum/recipes/mod_integration/botania/ink_converting/from_yellow_petal_block.json @@ -0,0 +1,17 @@ +{ + "type": "spectrum:ink_converting", + "ingredient": { + "item": "botania:yellow_petal_block" + }, + "ink_color": "spectrum:yellow", + "amount": 225, + "required_advancement": "spectrum:hidden/collect_pigment/yellow", + "fabric:load_conditions": [ + { + "condition": "fabric:all_mods_loaded", + "values": [ + "botania" + ] + } + ] + } \ No newline at end of file From 64e56522fe6cb709a65757acac8c4a60131be4c6 Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Tue, 31 Dec 2024 21:48:31 -0500 Subject: [PATCH 07/58] Fix manor dreamgate skip --- .../structures/undergrowth_manor/bottom3.nbt | Bin 77771 -> 76719 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/data/spectrum/structures/undergrowth_manor/bottom3.nbt b/src/main/resources/data/spectrum/structures/undergrowth_manor/bottom3.nbt index ff2f04a5f74104094f2fabb295fdd7c7761cfa5b..2c82075fc06e48f3ffe9118c6fa25409cc822892 100644 GIT binary patch literal 76719 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

=0LdxPhrlIPejdlS6oMof6Ty`i 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 From 06613af8d702d3f32a991ae90430a28505dcff7b Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Wed, 1 Jan 2025 16:54:18 -0500 Subject: [PATCH 08/58] Tweak enchanter cost calculation to properly implement high-max-level discount --- .../dafuqs/spectrum/blocks/enchanter/EnchanterBlockEntity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 2ef63b0519..cc089eba8d 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/enchanter/EnchanterBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/enchanter/EnchanterBlockEntity.java @@ -421,7 +421,7 @@ public static int getRequiredExperienceForEnchantment(int enchantability, Enchan default -> rarityCost = 80; } - float levelCost = level + ((float) level / enchantment.getMaxLevel()); // the higher the level, the pricier. But not as bad for enchantments with high max levels + float levelCost = level * ((float) level / enchantment.getMaxLevel()); // the higher the level, the pricier. But not as bad for enchantments with high max levels float specialMulti = enchantment.isTreasure() ? 2.0F : enchantment.isCursed() ? 1.5F : 1.0F; float selectionAvailabilityMod = 1.0F; if (!(enchantment instanceof SpectrumEnchantment)) { From b792171b343273f8d1e51a072269cd636cde56e5 Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Wed, 1 Jan 2025 17:25:40 -0500 Subject: [PATCH 09/58] Tweak enchanter calc again so overlevelled books don't have crazy application costs --- .../dafuqs/spectrum/blocks/enchanter/EnchanterBlockEntity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 cc089eba8d..bfcee1297c 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/enchanter/EnchanterBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/enchanter/EnchanterBlockEntity.java @@ -421,7 +421,7 @@ public static int getRequiredExperienceForEnchantment(int enchantability, Enchan default -> rarityCost = 80; } - float levelCost = level * ((float) level / enchantment.getMaxLevel()); // the higher the level, the pricier. But not as bad for enchantments with high max levels + float levelCost = level * Math.min(1, (float) level / enchantment.getMaxLevel()); // the higher the level, the pricier. But not as bad for enchantments with high max levels float specialMulti = enchantment.isTreasure() ? 2.0F : enchantment.isCursed() ? 1.5F : 1.0F; float selectionAvailabilityMod = 1.0F; if (!(enchantment instanceof SpectrumEnchantment)) { From b52cf3ff6d87aa6c6e8ca16c05d27db33430416a Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Thu, 2 Jan 2025 18:41:59 +0100 Subject: [PATCH 10/58] Fix spawner entity blacklisting able to be bypassed using a spawner without any nbt --- .../dynamic/spawner_manipulation/SpawnerChangeRecipe.java | 3 --- .../spawner_manipulation/SpawnerCreatureChangeRecipe.java | 5 ++++- .../SpawnerMaxNearbyEntitiesChangeRecipe.java | 3 +++ .../SpawnerRequiredPlayerRangeChangeRecipe.java | 3 +++ .../spawner_manipulation/SpawnerSpawnCountChangeRecipe.java | 3 +++ .../spawner_manipulation/SpawnerSpawnDelayChangeRecipe.java | 3 +++ 6 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/dafuqs/spectrum/recipe/spirit_instiller/dynamic/spawner_manipulation/SpawnerChangeRecipe.java b/src/main/java/de/dafuqs/spectrum/recipe/spirit_instiller/dynamic/spawner_manipulation/SpawnerChangeRecipe.java index 1da0257f1a..e7864e8776 100644 --- a/src/main/java/de/dafuqs/spectrum/recipe/spirit_instiller/dynamic/spawner_manipulation/SpawnerChangeRecipe.java +++ b/src/main/java/de/dafuqs/spectrum/recipe/spirit_instiller/dynamic/spawner_manipulation/SpawnerChangeRecipe.java @@ -69,9 +69,6 @@ public ItemStack craft(Inventory inv, DynamicRegistryManager drm) { @Override public boolean canCraftWithStacks(Inventory inventory) { NbtCompound blockEntityTag = inventory.getStack(0).getSubNbt("BlockEntityTag"); - if (blockEntityTag == null) { - return true; - } return canCraftWithBlockEntityTag(blockEntityTag, inventory.getStack(1), inventory.getStack(2)); } diff --git a/src/main/java/de/dafuqs/spectrum/recipe/spirit_instiller/dynamic/spawner_manipulation/SpawnerCreatureChangeRecipe.java b/src/main/java/de/dafuqs/spectrum/recipe/spirit_instiller/dynamic/spawner_manipulation/SpawnerCreatureChangeRecipe.java index e5ccf6bb34..3954bba3e8 100644 --- a/src/main/java/de/dafuqs/spectrum/recipe/spirit_instiller/dynamic/spawner_manipulation/SpawnerCreatureChangeRecipe.java +++ b/src/main/java/de/dafuqs/spectrum/recipe/spirit_instiller/dynamic/spawner_manipulation/SpawnerCreatureChangeRecipe.java @@ -26,13 +26,16 @@ public SpawnerCreatureChangeRecipe(Identifier identifier) { public boolean canCraftWithBlockEntityTag(NbtCompound spawnerBlockEntityNbt, ItemStack firstBowlStack, ItemStack secondBowlStack) { Optional> entityType = SpectrumSkullBlock.getEntityTypeOfSkullStack(firstBowlStack); entityType = entityType.isEmpty() ? SpectrumSkullBlock.getEntityTypeOfSkullStack(secondBowlStack) : entityType; - + if (entityType.isEmpty()) { return false; } if (entityType.get().isIn(SpectrumEntityTypeTags.SPAWNER_MANIPULATION_BLACKLISTED)) { return false; } + if (spawnerBlockEntityNbt == null) { + return true; + } if (spawnerBlockEntityNbt.contains("SpawnData")) { NbtCompound spawnData = spawnerBlockEntityNbt.getCompound("SpawnData"); diff --git a/src/main/java/de/dafuqs/spectrum/recipe/spirit_instiller/dynamic/spawner_manipulation/SpawnerMaxNearbyEntitiesChangeRecipe.java b/src/main/java/de/dafuqs/spectrum/recipe/spirit_instiller/dynamic/spawner_manipulation/SpawnerMaxNearbyEntitiesChangeRecipe.java index bb3f0b9700..f722198b62 100644 --- a/src/main/java/de/dafuqs/spectrum/recipe/spirit_instiller/dynamic/spawner_manipulation/SpawnerMaxNearbyEntitiesChangeRecipe.java +++ b/src/main/java/de/dafuqs/spectrum/recipe/spirit_instiller/dynamic/spawner_manipulation/SpawnerMaxNearbyEntitiesChangeRecipe.java @@ -20,6 +20,9 @@ public SpawnerMaxNearbyEntitiesChangeRecipe(Identifier identifier) { @Override public boolean canCraftWithBlockEntityTag(NbtCompound spawnerBlockEntityNbt, ItemStack leftBowlStack, ItemStack rightBowlStack) { + if (spawnerBlockEntityNbt == null) { + return true; + } if (spawnerBlockEntityNbt.contains("MaxNearbyEntities")) { return spawnerBlockEntityNbt.getShort("MaxNearbyEntities") < MAX_MAX_ENTITIES; } diff --git a/src/main/java/de/dafuqs/spectrum/recipe/spirit_instiller/dynamic/spawner_manipulation/SpawnerRequiredPlayerRangeChangeRecipe.java b/src/main/java/de/dafuqs/spectrum/recipe/spirit_instiller/dynamic/spawner_manipulation/SpawnerRequiredPlayerRangeChangeRecipe.java index de4c0a24e9..04484ae2f2 100644 --- a/src/main/java/de/dafuqs/spectrum/recipe/spirit_instiller/dynamic/spawner_manipulation/SpawnerRequiredPlayerRangeChangeRecipe.java +++ b/src/main/java/de/dafuqs/spectrum/recipe/spirit_instiller/dynamic/spawner_manipulation/SpawnerRequiredPlayerRangeChangeRecipe.java @@ -20,6 +20,9 @@ public SpawnerRequiredPlayerRangeChangeRecipe(Identifier identifier) { @Override public boolean canCraftWithBlockEntityTag(NbtCompound spawnerBlockEntityNbt, ItemStack leftBowlStack, ItemStack rightBowlStack) { + if (spawnerBlockEntityNbt == null) { + return true; + } if (spawnerBlockEntityNbt.contains("RequiredPlayerRange")) { return spawnerBlockEntityNbt.getShort("RequiredPlayerRange") < MAX_DETECTION_RANGE; } diff --git a/src/main/java/de/dafuqs/spectrum/recipe/spirit_instiller/dynamic/spawner_manipulation/SpawnerSpawnCountChangeRecipe.java b/src/main/java/de/dafuqs/spectrum/recipe/spirit_instiller/dynamic/spawner_manipulation/SpawnerSpawnCountChangeRecipe.java index 9a821a182c..3521abb43f 100644 --- a/src/main/java/de/dafuqs/spectrum/recipe/spirit_instiller/dynamic/spawner_manipulation/SpawnerSpawnCountChangeRecipe.java +++ b/src/main/java/de/dafuqs/spectrum/recipe/spirit_instiller/dynamic/spawner_manipulation/SpawnerSpawnCountChangeRecipe.java @@ -20,6 +20,9 @@ public SpawnerSpawnCountChangeRecipe(Identifier identifier) { @Override public boolean canCraftWithBlockEntityTag(NbtCompound spawnerBlockEntityNbt, ItemStack leftBowlStack, ItemStack rightBowlStack) { + if (spawnerBlockEntityNbt == null) { + return true; + } if (spawnerBlockEntityNbt.contains("SpawnCount")) { return spawnerBlockEntityNbt.getShort("SpawnCount") < MAX_SPAWN_COUNT; } diff --git a/src/main/java/de/dafuqs/spectrum/recipe/spirit_instiller/dynamic/spawner_manipulation/SpawnerSpawnDelayChangeRecipe.java b/src/main/java/de/dafuqs/spectrum/recipe/spirit_instiller/dynamic/spawner_manipulation/SpawnerSpawnDelayChangeRecipe.java index 0c633652cc..f36a52c2ab 100644 --- a/src/main/java/de/dafuqs/spectrum/recipe/spirit_instiller/dynamic/spawner_manipulation/SpawnerSpawnDelayChangeRecipe.java +++ b/src/main/java/de/dafuqs/spectrum/recipe/spirit_instiller/dynamic/spawner_manipulation/SpawnerSpawnDelayChangeRecipe.java @@ -21,6 +21,9 @@ public SpawnerSpawnDelayChangeRecipe(Identifier identifier) { @Override public boolean canCraftWithBlockEntityTag(NbtCompound spawnerBlockEntityNbt, ItemStack leftBowlStack, ItemStack rightBowlStack) { + if (spawnerBlockEntityNbt == null) { + return true; + } if (spawnerBlockEntityNbt.contains("MinSpawnDelay") && spawnerBlockEntityNbt.contains("MaxSpawnDelay")) { return spawnerBlockEntityNbt.getShort("MinSpawnDelay") > MIN_DELAY && spawnerBlockEntityNbt.getShort("MaxSpawnDelay") > MIN_DELAY; From 4f494d3f94b2eb43193099c81116f83ff99dbd18 Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Thu, 2 Jan 2025 18:45:00 +0100 Subject: [PATCH 11/58] guidebook wording --- src/main/resources/assets/spectrum/lang/en_us.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/spectrum/lang/en_us.json b/src/main/resources/assets/spectrum/lang/en_us.json index 31f3e07121..ab086b80ef 100644 --- a/src/main/resources/assets/spectrum/lang/en_us.json +++ b/src/main/resources/assets/spectrum/lang/en_us.json @@ -2504,7 +2504,7 @@ "book.spectrum.guidebook.draconic_twinsword.page4.text": "As a footnote, the weapon has some unique enchantment interactions.\n- [Inertia](entry://enchanting/enchantments/inertia) boosts the Twinsword's strength each time it rebounds, while the talon's yoink on entities becomes stronger\n- [Improved Critical](entry://enchanting/enchantments/improved_critical) improves hits against airborne targets\n- Channeling improves sweeping and trades single-target ranged damage for AoE.\n- Piercing does exactly what I would expect", "book.spectrum.guidebook.nectar_gloves.page0.text": "A strange find in an even stranger place. These aubergine gloves are crafted of fine leather and are adorned with a peculiar white crystal.\\\n\\\nPutting them on seems to ward me with dike, and more than that, they cleanse me of negative status effects.", "book.spectrum.guidebook.nectar_gloves.page1.text": "*These leave me wondering so many things.\\\nTo bear dike while being devoid of [#](2432ff)Azurite[#]()... how?*", - "book.spectrum.guidebook.azuresque_dike_core.page0.text": "My magnum opus of [#](2c2e8e)Azure Dike[#]()! The machinations of preservation structures have vexed me for so long, but I think I have finally made an advanced in replicating them!\\\n\\\n Through the use of that... thing... I have managed to create a circuit that greatly empowers dike, speeding up its recovery and doubling any source of it.\\\nIt is, however, unable to produce a shield on its own.", + "book.spectrum.guidebook.azuresque_dike_core.page0.text": "My magnum opus of [#](2c2e8e)Azure Dike[#]()! The machinations of the preservation structures have puzzled me for so long, but I have finally made progress in replicating them!\\\n\\\n Through the use of that... thing... I have managed to create a circuit that greatly empowers dike, speeding up its recovery and doubling any source of it.\\\nIt is, however, unable to produce a shield on its own.", "book.spectrum.guidebook.azuresque_dike_core.page1.text": "*A giant step for me!...\\\n\\\n...But a tiny one towards replicating the structures. The vestiges are far too faint, and the amount of azurite and downstone required would be unattainable.*", "book.spectrum.guidebook.dragonbone.page0.text": "Is it really dragons these giant remnants come from?\\\nI don't know, honestly. But judging by their size, they could very well be!\\\n\\\nEven now, these blocks are surrounded by a magical aura, protecting them from blatant mining attempts. I had a *blast* just running my fingers over their rough surface.", "book.spectrum.guidebook.dragonbone.page1.text": "Damaging Dragonbone using [#](449900)Explosions[#]() seems to blow away the magical aura protecting them, finally making the blocks mineable.\\\nThe dropped pieces still retain some of that ancient magic.", From b9572a7785c56fe64cd7f4ebb1b16c4351a4f0f7 Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Thu, 2 Jan 2025 18:47:41 +0100 Subject: [PATCH 12/58] advancement capitalization (ewwww, capital) --- src/main/resources/assets/spectrum/lang/en_us.json | 2 +- src/main/resources/assets/spectrum/lang/pt_br.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/spectrum/lang/en_us.json b/src/main/resources/assets/spectrum/lang/en_us.json index ab086b80ef..f71eedbefa 100644 --- a/src/main/resources/assets/spectrum/lang/en_us.json +++ b/src/main/resources/assets/spectrum/lang/en_us.json @@ -121,7 +121,7 @@ "advancements.spectrum.collect_moonstone_shard.title": "The Brightest of Whites", "advancements.spectrum.collect_myceylon.description": "Use an Axe to scrap the bark off of a Noxwood Mushroom", "advancements.spectrum.collect_myceylon.title": "Mushroom Aromatics", - "advancements.spectrum.collect_mysterious_locket.description": "A third color mixing puzzle awaits you", + "advancements.spectrum.collect_mysterious_locket.description": "A third Color Mixing puzzle awaits you", "advancements.spectrum.collect_mysterious_locket.title": "A third Gate", "advancements.spectrum.collect_nectardew.description": "Discover a rare and mesmerizing flower", "advancements.spectrum.collect_nectardew.title": "Nectar", diff --git a/src/main/resources/assets/spectrum/lang/pt_br.json b/src/main/resources/assets/spectrum/lang/pt_br.json index eb1c9651ce..be742c4bb7 100644 --- a/src/main/resources/assets/spectrum/lang/pt_br.json +++ b/src/main/resources/assets/spectrum/lang/pt_br.json @@ -1808,7 +1808,7 @@ "advancements.spectrum.collect_moonstone_core.title": "Bright Powerhouse", "advancements.spectrum.collect_myceylon.description": "Use an Axe to scrap the bark off of a Noxwood Mushroom", "advancements.spectrum.collect_myceylon.title": "Mushroom Aromatics", - "advancements.spectrum.collect_mysterious_locket.description": "A third color mixing puzzle awaits you", + "advancements.spectrum.collect_mysterious_locket.description": "A third Color Mixing puzzle awaits you", "advancements.spectrum.collect_mysterious_locket.title": "A third Gate", "advancements.spectrum.collect_nectardew.description": "Discover a rare and mesmerizing flower", "advancements.spectrum.collect_nectardew.title": "Nectar", From 4bbf500a1479a52f2ad55b61f6368194f7063aef Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Thu, 2 Jan 2025 18:59:31 +0100 Subject: [PATCH 13/58] food item colors --- .../java/de/dafuqs/spectrum/api/color/ItemColors.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/java/de/dafuqs/spectrum/api/color/ItemColors.java b/src/main/java/de/dafuqs/spectrum/api/color/ItemColors.java index 40eba6f2f1..0a0c1820b8 100644 --- a/src/main/java/de/dafuqs/spectrum/api/color/ItemColors.java +++ b/src/main/java/de/dafuqs/spectrum/api/color/ItemColors.java @@ -33,6 +33,17 @@ public class ItemColors extends ColorRegistry { put(Items.GOLDEN_HORSE_ARMOR, DyeColor.YELLOW); put(Items.LEATHER_HORSE_ARMOR, DyeColor.BROWN); + put(Items.BEEF, DyeColor.PINK); + put(Items.CHICKEN, DyeColor.PINK); + put(Items.MUTTON, DyeColor.PINK); + put(Items.PORKCHOP, DyeColor.PINK); + put(Items.RABBIT, DyeColor.PINK); + put(Items.COOKED_BEEF, DyeColor.PINK); + put(Items.COOKED_CHICKEN, DyeColor.PINK); + put(Items.COOKED_MUTTON, DyeColor.PINK); + put(Items.COOKED_PORKCHOP, DyeColor.PINK); + put(Items.COOKED_RABBIT, DyeColor.PINK); + put(Items.ANVIL, DyeColor.BROWN); put(Items.BLACKSTONE, DyeColor.BLACK); put(Items.GILDED_BLACKSTONE, DyeColor.BLACK); From 1e296a042a91c3eca7587656083084e5a2136710 Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Thu, 2 Jan 2025 19:28:08 +0100 Subject: [PATCH 14/58] remove duplicate item group entry --- .../de/dafuqs/spectrum/registries/SpectrumItemGroups.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/de/dafuqs/spectrum/registries/SpectrumItemGroups.java b/src/main/java/de/dafuqs/spectrum/registries/SpectrumItemGroups.java index ae2b70450b..b66b4c1c24 100644 --- a/src/main/java/de/dafuqs/spectrum/registries/SpectrumItemGroups.java +++ b/src/main/java/de/dafuqs/spectrum/registries/SpectrumItemGroups.java @@ -28,10 +28,9 @@ public class SpectrumItemGroups { public static final ItemGroup MAIN = FabricItemGroup.builder() .icon(() -> new ItemStack(SpectrumBlocks.PEDESTAL_ALL_BASIC)) .entries((displayContext, entries) -> { - entries.add(SpectrumBlocks.PEDESTAL_ALL_BASIC, ItemGroup.StackVisibility.PARENT_TAB_ONLY); ItemGroupParent parent = (ItemGroupParent) SpectrumItemGroups.MAIN; for (ItemSubGroup subGroup : parent.fractal$getChildren()) { - entries.addAll(subGroup.getSearchTabStacks(), ItemGroup.StackVisibility.SEARCH_TAB_ONLY); + entries.addAll(subGroup.getSearchTabStacks(), ItemGroup.StackVisibility.PARENT_AND_SEARCH_TABS); } }) .noRenderedName() @@ -1055,7 +1054,6 @@ public static void register() { entries.add(SpectrumBlocks.SMALL_PURPLE_DRAGONJAG); entries.add(SpectrumBlocks.SMALL_BLACK_DRAGONJAG); entries.add(SpectrumBlocks.BRISTLE_SPROUTS); - entries.add(SpectrumBlocks.DOOMBLOOM); entries.add(SpectrumBlocks.SNAPPING_IVY); entries.add(SpectrumBlocks.SWEET_PEA); entries.add(SpectrumBlocks.APRICOTTI); From 92bcdaca647d644c88d23597b519b80d950c450d Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Thu, 2 Jan 2025 19:28:20 +0100 Subject: [PATCH 15/58] expanded lang sanity --- .../spectrum/commands/SanityCommand.java | 52 ++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/dafuqs/spectrum/commands/SanityCommand.java b/src/main/java/de/dafuqs/spectrum/commands/SanityCommand.java index 1e5d30c006..b83a7e8112 100644 --- a/src/main/java/de/dafuqs/spectrum/commands/SanityCommand.java +++ b/src/main/java/de/dafuqs/spectrum/commands/SanityCommand.java @@ -32,6 +32,9 @@ import net.minecraft.advancement.criterion.*; import net.minecraft.block.*; import net.minecraft.enchantment.*; +import net.minecraft.entity.*; +import net.minecraft.entity.attribute.*; +import net.minecraft.entity.effect.*; import net.minecraft.inventory.*; import net.minecraft.item.*; import net.minecraft.loot.*; @@ -172,7 +175,7 @@ private static int execute(ServerCommandSource source, String modId) { } } - // Items / Blocks without a translation + // Checking for missing translation strings for (Map.Entry, Item> item : Registries.ITEM.getEntrySet()) { if (!item.getKey().getValue().getNamespace().equals(modId)) { continue; @@ -190,6 +193,53 @@ private static int execute(ServerCommandSource source, String modId) { SpectrumCommon.logWarning("[SANITY: Block Lang] Missing translation string " + block.getValue().getTranslationKey()); } } + for (Map.Entry>, EntityType> entityType : Registries.ENTITY_TYPE.getEntrySet()) { + if (!entityType.getKey().getValue().getNamespace().equals(modId)) { + continue; + } + if (!Language.getInstance().hasTranslation(entityType.getValue().getTranslationKey())) { + SpectrumCommon.logWarning("[SANITY: EntityType Lang] Missing translation string " + entityType.getValue().getTranslationKey()); + } + } + for (Map.Entry, Enchantment> entityType : Registries.ENCHANTMENT.getEntrySet()) { + if (!entityType.getKey().getValue().getNamespace().equals(modId)) { + continue; + } + if (!Language.getInstance().hasTranslation(entityType.getValue().getTranslationKey())) { + SpectrumCommon.logWarning("[SANITY: Enchantment Lang] Missing translation string " + entityType.getValue().getTranslationKey()); + } + if (!Language.getInstance().hasTranslation(entityType.getValue().getTranslationKey() + ".desc")) { + SpectrumCommon.logWarning("[SANITY: Enchantment Lang] Missing description string " + entityType.getValue().getTranslationKey() + ".desc"); + } + } + for (Map.Entry, StatusEffect> entityType : Registries.STATUS_EFFECT.getEntrySet()) { + if (!entityType.getKey().getValue().getNamespace().equals(modId)) { + continue; + } + if (!Language.getInstance().hasTranslation(entityType.getValue().getTranslationKey())) { + SpectrumCommon.logWarning("[SANITY: Status Effect Lang] Missing translation string " + entityType.getValue().getTranslationKey()); + } + } + for (Map.Entry, EntityAttribute> entityType : Registries.ATTRIBUTE.getEntrySet()) { + if (!entityType.getKey().getValue().getNamespace().equals(modId)) { + continue; + } + if (!Language.getInstance().hasTranslation(entityType.getValue().getTranslationKey())) { + SpectrumCommon.logWarning("[SANITY: Attribute Lang] Missing translation string " + entityType.getValue().getTranslationKey()); + } + } + for (Map.Entry, EntityAttribute> entityType : Registries.ATTRIBUTE.getEntrySet()) { + if (!entityType.getKey().getValue().getNamespace().equals(modId)) { + continue; + } + if (!Language.getInstance().hasTranslation(entityType.getValue().getTranslationKey())) { + SpectrumCommon.logWarning("[SANITY: Attribute Lang] Missing translation string " + entityType.getValue().getTranslationKey()); + } + if (!Language.getInstance().hasTranslation(entityType.getValue().getTranslationKey() + ".desc")) { + SpectrumCommon.logWarning("[SANITY: Attribute Lang] Missing description string " + entityType.getValue().getTranslationKey() + ".desc"); + } + } + // recipe groups without localization Set recipeGroups = new HashSet<>(); From ce3f0ddf268a5bd87aecc61e87d33989e3f710c4 Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Thu, 2 Jan 2025 19:28:32 +0100 Subject: [PATCH 16/58] add missing entity type translations --- src/main/resources/assets/spectrum/lang/en_us.json | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/resources/assets/spectrum/lang/en_us.json b/src/main/resources/assets/spectrum/lang/en_us.json index f71eedbefa..a0591e9744 100644 --- a/src/main/resources/assets/spectrum/lang/en_us.json +++ b/src/main/resources/assets/spectrum/lang/en_us.json @@ -4240,6 +4240,13 @@ "entity.spectrum.phantom_frame": "Phantom Frame", "entity.spectrum.preservation_turret": "Preservation Turret", "entity.spectrum.shooting_star": "Shooting Star", + "entity.spectrum.item_projectile": "Item Projectile", + "entity.spectrum.fireproof_item": "Item", + "entity.spectrum.glass_arrow": "Glass Arrow", + "entity.spectrum.light_mine": "Light Mine", + "entity.spectrum.parametric_mining_device": "Parametric Mining Device", + "entity.spectrum.light_spear": "Light Spear", + "entity.spectrum.seat": "Seat", "explosion_archetype.spectrum.all": "Block and Entity Damaging Explosion", "explosion_archetype.spectrum.cosmetic": "Cosmetic Explosion", From 306483bb990c8d6f34bd2e2d9ae7d6c52aa5ed5c Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Thu, 2 Jan 2025 19:33:44 +0100 Subject: [PATCH 17/58] Pitcher Plants can be planted on spectrum farmland --- src/main/java/de/dafuqs/spectrum/mixin/CropBlockMixin.java | 2 +- .../de/dafuqs/spectrum/mixin/PlantOnCustomFarmlandMixin.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/dafuqs/spectrum/mixin/CropBlockMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/CropBlockMixin.java index a67ade3de0..77179cd1f9 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/CropBlockMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/CropBlockMixin.java @@ -16,7 +16,7 @@ public abstract class CropBlockMixin { @ModifyExpressionValue(method = "getAvailableMoisture", at = @At(value = "INVOKE", ordinal = 0, target = "Lnet/minecraft/world/BlockView;getBlockState(Lnet/minecraft/util/math/BlockPos;)Lnet/minecraft/block/BlockState;")) private static BlockState spectrum$getAvailableMoisture(BlockState original) { Block originalBlock = original.getBlock(); - if (originalBlock instanceof SpectrumFarmlandBlock spectrumFarmlandBlock) { + if (originalBlock instanceof SpectrumFarmlandBlock) { return Blocks.FARMLAND.getDefaultState().with(FarmlandBlock.MOISTURE, original.get(FarmlandBlock.MOISTURE)); } return original; diff --git a/src/main/java/de/dafuqs/spectrum/mixin/PlantOnCustomFarmlandMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/PlantOnCustomFarmlandMixin.java index bffb666e10..e968d70c4e 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/PlantOnCustomFarmlandMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/PlantOnCustomFarmlandMixin.java @@ -9,7 +9,7 @@ import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.injection.*; -@Mixin({CropBlock.class, StemBlock.class, AttachedStemBlock.class}) +@Mixin({CropBlock.class, StemBlock.class, AttachedStemBlock.class, PitcherCropBlock.class}) public abstract class PlantOnCustomFarmlandMixin { @ModifyReturnValue(method = "canPlantOnTop(Lnet/minecraft/block/BlockState;Lnet/minecraft/world/BlockView;Lnet/minecraft/util/math/BlockPos;)Z", at = @At("RETURN")) From c10edd7d90d5f2e52c80073c5d3da203b0962c80 Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Thu, 2 Jan 2025 19:35:46 +0100 Subject: [PATCH 18/58] buckets of eraser no longer stack --- .../java/de/dafuqs/spectrum/registries/SpectrumItems.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/de/dafuqs/spectrum/registries/SpectrumItems.java b/src/main/java/de/dafuqs/spectrum/registries/SpectrumItems.java index e7c85e8512..147819b4c4 100644 --- a/src/main/java/de/dafuqs/spectrum/registries/SpectrumItems.java +++ b/src/main/java/de/dafuqs/spectrum/registries/SpectrumItems.java @@ -409,9 +409,9 @@ public Map getDefaultEnchantments() { public static final Item VELVET_ASTROLOGER_BANNER_PATTERN = new BannerPatternItem(SpectrumBannerPatterns.VELVET_ASTROLOGER_TAG, IS.of(1, Rarity.UNCOMMON)); public static final Item POISONBLOOM_BANNER_PATTERN = new BannerPatternItem(SpectrumBannerPatterns.POISONBLOOM_TAG, IS.of(1, Rarity.RARE)); public static final Item DEEP_LIGHT_BANNER_PATTERN = new BannerPatternItem(SpectrumBannerPatterns.DEEP_LIGHT_TAG, IS.of(1, Rarity.RARE)); - - - public static final Item BUCKET_OF_ERASER = new EmptyFluidEntityBucketItem(SpectrumEntityTypes.ERASER, Fluids.EMPTY, SoundEvents.ITEM_BUCKET_EMPTY, IS.of()); + + + public static final Item BUCKET_OF_ERASER = new EmptyFluidEntityBucketItem(SpectrumEntityTypes.ERASER, Fluids.EMPTY, SoundEvents.ITEM_BUCKET_EMPTY, IS.of(1)); public static final Item EGG_LAYING_WOOLY_PIG_SPAWN_EGG = new SpawnEggItem(SpectrumEntityTypes.EGG_LAYING_WOOLY_PIG, 0x3a2c38, 0xfff2e0, IS.of()); public static final Item PRESERVATION_TURRET_SPAWN_EGG = new SpawnEggItem(SpectrumEntityTypes.PRESERVATION_TURRET, 0xf3f6f8, 0xc8c5be, IS.of()); From 68101a233c3eb155a1b56ff321d6ef20d3e78403 Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Thu, 2 Jan 2025 19:44:53 +0100 Subject: [PATCH 19/58] fixed life_drain unlock --- .../registries/SpectrumItemGroups.java | 2 +- .../unlocks/potions/life_drain.json | 26 +++++++++---------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/main/java/de/dafuqs/spectrum/registries/SpectrumItemGroups.java b/src/main/java/de/dafuqs/spectrum/registries/SpectrumItemGroups.java index b66b4c1c24..8bceca2cba 100644 --- a/src/main/java/de/dafuqs/spectrum/registries/SpectrumItemGroups.java +++ b/src/main/java/de/dafuqs/spectrum/registries/SpectrumItemGroups.java @@ -30,7 +30,7 @@ public class SpectrumItemGroups { .entries((displayContext, entries) -> { ItemGroupParent parent = (ItemGroupParent) SpectrumItemGroups.MAIN; for (ItemSubGroup subGroup : parent.fractal$getChildren()) { - entries.addAll(subGroup.getSearchTabStacks(), ItemGroup.StackVisibility.PARENT_AND_SEARCH_TABS); + entries.addAll(subGroup.getSearchTabStacks(), ItemGroup.StackVisibility.SEARCH_TAB_ONLY); } }) .noRenderedName() diff --git a/src/main/resources/data/spectrum/advancements/unlocks/potions/life_drain.json b/src/main/resources/data/spectrum/advancements/unlocks/potions/life_drain.json index ad5bfb038f..38a12ad483 100644 --- a/src/main/resources/data/spectrum/advancements/unlocks/potions/life_drain.json +++ b/src/main/resources/data/spectrum/advancements/unlocks/potions/life_drain.json @@ -1,16 +1,16 @@ { - "criteria": { - "crafted_potion_in_potion_brewery": { - "trigger": "revelationary:advancement_gotten", - "conditions": { - "advancement_identifier": "spectrum:midgame/brew_potion_in_potion_workshop" - } - }, + "criteria": { + "crafted_potion_in_potion_brewery": { + "trigger": "revelationary:advancement_gotten", + "conditions": { + "advancement_identifier": "spectrum:midgame/brew_potion_in_potion_workshop" + } + }, "collected_downstone_fragments": { - "trigger": "revelationary:advancement_gotten", - "conditions": { - "advancement_identifier": "spectrum:collect_downstone_fragments" - } - } - } + "trigger": "revelationary:advancement_gotten", + "conditions": { + "advancement_identifier": "spectrum:lategame/collect_downstone_fragments" + } + } + } } \ No newline at end of file From 87b5a7e5d51d139211f17dcfdd23082e7a4a5ef4 Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Thu, 2 Jan 2025 19:47:05 +0100 Subject: [PATCH 20/58] updated leaves item tag --- src/main/resources/data/minecraft/tags/items/leaves.json | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/resources/data/minecraft/tags/items/leaves.json b/src/main/resources/data/minecraft/tags/items/leaves.json index bc88c002f8..994ce3c573 100644 --- a/src/main/resources/data/minecraft/tags/items/leaves.json +++ b/src/main/resources/data/minecraft/tags/items/leaves.json @@ -2,7 +2,10 @@ "replace": false, "values": [ "#spectrum:colored_leaves", - "spectrum:nephrite_blossom_leaves", - "spectrum:spirit_sallow_leaves" + + "spectrum:jade_vine_petal_block", + "spectrum:spirit_sallow_leaves", + "spectrum:nephrite_blossom_leaves", + "spectrum:weeping_gala_leaves" ] } \ No newline at end of file From d01a50aaac2d8d55a009fc3b8c2da7363323b40c Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Thu, 2 Jan 2025 20:05:48 +0100 Subject: [PATCH 21/58] fixed wrong pixels in gem block textures --- .../block/amethyst_storage_block_top.png | Bin 295 -> 4396 bytes .../block/citrine_storage_block_top.png | Bin 284 -> 4384 bytes .../block/moonstone_storage_block_top.png | Bin 5188 -> 4596 bytes .../textures/block/onyx_storage_block_top.png | Bin 277 -> 4379 bytes .../block/topaz_storage_block_top.png | Bin 280 -> 4377 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/spectrum/textures/block/amethyst_storage_block_top.png b/src/main/resources/assets/spectrum/textures/block/amethyst_storage_block_top.png index 397abc5abb8748bfc03e0ae54fc2ada87c7aed6d..a70b74927997b04a949c109c9f5f3a3201c8f56f 100755 GIT binary patch literal 4396 zcmeHKeNYtV8DBt9`7k1=iPo}NjnU}d?tQYia(tBIWdVD$dWs&%OG5-?vim7ndIAhnx@T9fu%6m3(Td#gv*l7zzwv z=h|%xGFvUN8~gSyOnd2#(uu{NT6TSXE#lP0x6&FdpNAi!>$<)PHBWmxc523nqgSu8 zhrhgf?O?F6yprA@kaosaEdOZXEO8R%1BEU0#|pc?x!&Ff*RQ*m)N5GrF=eT^0=BJDF^eq0(p%VGjU{VGzC0n0O6&{V+#P>n*PAn`OGU#h|q!_fo}XQQ)? z=>rgOWxxt0$xRc4*Xvby)e6C5CzN`XIY(Lw*5ZnJp^-X#vO0Qn$%jGIs@NW$qP0xd)-trUU`IP`-SVlM1Z zA{&T8iH8MgrNAZ4420m=A$xa;$Kel$V+r5@PN*uvQ(=x`0ASK*XRZ^hM=9so+Gx2jZZ0F=okN{ovIG86uH#!dWU_ zuVyvCrYCKFD2}Dm1&@<~>ExY^9T0Ap-M=9dPN!H*227EKs#xr3bh?v~7kB#W50NWF!DVNtKo+l{Bf!RgpBQrIq@5@-jeQ;CNfv z|I(J*2TkZtdL}Qz^UM6A{+`MK#r>=PrGxi36N>uVf@awM5JaXFaDG1_R{s`T$hhnP z&X0kD9hCDwPzzatkN6qL!;g3ZgdRO)MEs7@HA>fr7#NZAXmyR!H6jK^q&!+(|2MkApT0~1 z7yJk0g|A9`Z~VFkzGj747iAccKKZ-*lYO;NGTxn;FCs`pjC=(lJ9a(`g<~a?Ic@B} zf`Vg0V`^U6&q7g`$(WK$ojFvioUopZOpB|Ue7Gc;IUBZ!Xs=o1PE?%8R(dOIwpGn2 zM(Fn3@#8<7^k7n3+rz#mhu1%Nu(Ek#^zqB#7vHSkAM?jzDm3=}JqK?Rv&qSe5A{}S z*UnjylJnwqZ13_2ub6Y2v+G^Yv>f?Ir zmv8#V(j)Poa(_GNiJo3|?C8DC=8y}y8&+<^yog!&~N z>k_djspa&HS?VU{W>U>ZKacF*-TU5LEqS7&WL?N-$)3q)Zl&kII1y7?mhrbgTlL0& E0YDExX#fBK delta 268 zcmV+n0rUQ>BBuh7B!2;OQb$4nuFf3k0002tNkl#jr1x?p+z0mh0>yKvPm{1SqUE|d;}YeLKUtu!)EtQSV^)WyO03& zL<y5Nmy=t9a&q~W_4{4{UwOk9HOh>NOdRT|vA@zfMH++b_&fG9_ z{f}g_yYKTp&+mPn-}`&s$!@deWIiH`mLUl8h&ju&7T)JcztB1G8Z$IX!`laydHLd6 z+J}0)yq$9bRIKm-6!V?mcea-2F{dt?P?-8+Bnt z8FByW8ES9`H|tBkY~A=)Q4u(8U)g>x-qGLL(4Mfn@<*~en{7yXC3^U?%DU4D+S~zK z+;H*r5~KdkKv$@tySez=*d64K(31@vEh8sd4m*1k*B7s=f1Ruci*G-5*;$o&)E9a* zH=c;M#Z;e3*tU0D(i7*pjC(qx?eFf~Ttzkf{lfWzS;9x(b|FYm4QDi3%|_!yB{2Ve zn;KSRbyy?nM&HOzU%It?Ug=-0`>%gJ_v7>1(~nrclD$PW_x%uJiQW|vmHFZE{(k1@ zwf?W)YEyHQg6KI+PoupOJU2!Bmca?^t$&W_ZvLkNmw&o(WR6ZZ zJ3hPVTq2;c%D zjrv_qw?O#~SOAxT&yrbzp#c}M#DL{ntf-Oq0+f`Kasp5HbLA>5S%xNgSv$4Xlratg zM+U4|6g`we;q&?AKDC_pIuuI1Uaufj3Y7|n9=K597HL237GfocF$@zB7%%4$Io^#* zn6!;A6Ac&!=h2D$Tpo*M65cJ0vjF)}_-T(qDJK*zmtty!Af}f?knx0mHbTgQ4XRiR z1isA6fb??U7GtMEu*_tC;6DVhDA~1Xs_W|#T+5^te%VMESJX0p6XEqryX?=?28IGj_kAMbtl2F=k z8*L+Tk^y#{R;vC}mOja`*!V|7y?R(m<9O4>O!D+!8)P$Z)#i9|Jt6Iv4Bq#7zjuck>{Z6h># z0-`1|wg42%P#L_}MZ@jnT(koyJZ?u|LL!_>vziT1FjSe>+JhXJq$I5*4tg!@x@ zoD1ZNw8W=UtJdg9QcLJH+C+_dtndKhI^Y$c79~_AAy<=uaA{*GSPrC?mXrzs0(Mvp zW%L4CmQb~^w( zKgI<+Vds8E3~Jg=Yc#N{36g+fP|q% z;0k?ue5(>3%*Iy?qEe+2GLyPeR4y zQ8><*bm;topYeV81y_L3GmA`%-x<1Q=$aM-({i3s*9=|LVqjX%GwS-k(Ivb8G6mf5 zACM2eDlI*5G7P?E&9SY@G$EtXx8>xaMre81lT{!f$lL|eF9_MY?{R2+NHkm0AG#Ve zYeC4v9)tA>XgX&$rRC|m4(7In*ANjKnxCfHtLu%eyN;zUj7VE}EcMCI4JIPozo>D+ zhUPo(>Az^Nx!${}tEx8H_fiy!RJ)M9;kLmgJ+Z5b-HSr r-wstaT>{&~vc*@U<91(t^m(N4IsR(TnQNC|afmrR$MlDlMO*&^bu%>( delta 256 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 diff --git a/src/main/resources/assets/spectrum/textures/block/onyx_storage_block_top.png b/src/main/resources/assets/spectrum/textures/block/onyx_storage_block_top.png index f6037a1fcf482c85b18797bf530bab1d537c6421..c1c369f4605018d8615f13ad061231bd01ef3b65 100755 GIT binary patch literal 4379 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 delta 252 zcmVST5IiE6tbjxZ9Si`A z(59kdj+Cj`fIc(80MJ2)#0vCJ5!rg1hoEo`*zfy0pWYr35pF;MK)tLe10Pk>VIHQR zq|fVVI39OUFY6`MGVsm6M?_RL9pXI2*!BQ`d6*C;kwxNr`gQEP$i7#YhY4|>nj-&l zxFRSrJX{rhK*HGeyNncHgh^zS-A0ll0Ja0k@)7Y;gDX&H#j`xb20S3wI!~Y1tSj&k zCB%8Un-8UlTuB;dcTaO}kFxccj?{O`MJ7L{f3N}n5^yv@FR(`d0000 Date: Thu, 2 Jan 2025 20:11:15 +0100 Subject: [PATCH 22/58] purple star candy is now rarer, but the chance scales with the owner's luck --- .../recipe/pedestal/dynamic/StarCandyRecipe.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/dafuqs/spectrum/recipe/pedestal/dynamic/StarCandyRecipe.java b/src/main/java/de/dafuqs/spectrum/recipe/pedestal/dynamic/StarCandyRecipe.java index 82277e61ea..6d5658ba79 100644 --- a/src/main/java/de/dafuqs/spectrum/recipe/pedestal/dynamic/StarCandyRecipe.java +++ b/src/main/java/de/dafuqs/spectrum/recipe/pedestal/dynamic/StarCandyRecipe.java @@ -6,11 +6,14 @@ import de.dafuqs.spectrum.recipe.*; import de.dafuqs.spectrum.recipe.pedestal.*; import de.dafuqs.spectrum.registries.*; +import net.minecraft.entity.attribute.*; +import net.minecraft.entity.player.*; import net.minecraft.inventory.*; import net.minecraft.item.*; import net.minecraft.recipe.*; import net.minecraft.registry.*; import net.minecraft.util.*; +import org.jetbrains.annotations.*; import java.util.*; @@ -19,7 +22,7 @@ public class StarCandyRecipe extends ShapedPedestalRecipe { public static final RecipeSerializer SERIALIZER = new EmptyRecipeSerializer<>(StarCandyRecipe::new); public static final Identifier UNLOCK_IDENTIFIER = SpectrumCommon.locate("unlocks/food/star_candy"); - public static final float PURPLE_STAR_CANDY_CHANCE = 0.02F; + public static final float PURPLE_STAR_CANDY_CHANCE = 0.01F; public StarCandyRecipe(Identifier id) { super(id, "", false, UNLOCK_IDENTIFIER, PedestalRecipeTier.BASIC, 3, 3, generateInputs(), Map.of(BuiltinGemstoneColor.YELLOW, 1), SpectrumItems.STAR_CANDY.getDefaultStack(), 1.0F, 20, false, false); @@ -28,7 +31,9 @@ public StarCandyRecipe(Identifier id) { @Override public ItemStack craft(Inventory inv, DynamicRegistryManager drm) { if (inv instanceof PedestalBlockEntity pedestal) { - if (pedestal.getWorld().random.nextFloat() < PURPLE_STAR_CANDY_CHANCE) { + @Nullable PlayerEntity owner = pedestal.getOwnerIfOnline(); + double luckBonus = owner == null ? 0.0 : owner.getAttributeValue(EntityAttributes.GENERIC_LUCK); + if (pedestal.getWorld().random.nextFloat() < PURPLE_STAR_CANDY_CHANCE + luckBonus) { return SpectrumItems.PURPLE_STAR_CANDY.getDefaultStack(); } } From e9719587084cdedad1b9ff88106bde3ea6470b4b Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Thu, 2 Jan 2025 21:03:15 +0100 Subject: [PATCH 23/58] pastel node matching --- .../nodes/PastelNodeBlockEntity.java | 14 +++++++------- .../spectrum/registries/SpectrumItemGroups.java | 1 + 2 files changed, 8 insertions(+), 7 deletions(-) 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 cabb337a9e..d5eb878664 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 @@ -560,7 +560,7 @@ private boolean filter(ItemVariant variant) { public boolean testNBTPredicates(String description, ItemStack stack, ItemVariant variant) { var tested = variant.getNbt(); - var cleanString = StringUtils.trim(description); + var cleanString = StringUtils.trim(description).toLowerCase(); var pieces = StringUtils.splitByWholeSeparator(cleanString, null); var target = pieces[0]; var predicateString = StringUtils.remove(cleanString, target); // We don't want ambiguity when checking for keywords @@ -569,10 +569,10 @@ public boolean testNBTPredicates(String description, ItemStack stack, ItemVarian // A few corrections for ease of use if (StringUtils.equalsAnyIgnoreCase(target, "durability", "uses")) - target = "Damage"; + target = ItemStack.DAMAGE_KEY; if (StringUtils.equalsAnyIgnoreCase(target, "enchs", "enchants", "enchantment")) { - target = "Enchantments"; + target = ItemStack.ENCHANTMENTS_KEY; } // Exit early if it just is not there @@ -600,7 +600,7 @@ public boolean testNBTPredicates(String description, ItemStack stack, ItemVarian boolean moreThan = StringUtils.containsIgnoreCase(predicateString, GREATER_THAN_KEYWORD); // Enchantments are so fucking cursed - if (target.equals("Enchantments") || target.equals("StoredEnchantments")) { + if (target.equals(ItemStack.ENCHANTMENTS_KEY) || target.equals(EnchantedBookItem.STORED_ENCHANTMENTS_KEY)) { if (testedData.getType() != NbtElement.LIST_TYPE) return false; @@ -649,7 +649,7 @@ public boolean testNBTPredicates(String description, ItemStack stack, ItemVarian var testedNum = ((AbstractNbtNumber) testedData).doubleValue(); // Special damage keywords - durability is weird and counts up as it decreases - if (target.equals("Damage")) { + if (target.equals(ItemStack.DAMAGE_KEY)) { if (StringUtils.containsIgnoreCase(predicateString, DAMAGED_KEYWORD)) { return testedNum > 0; } @@ -697,8 +697,8 @@ public boolean testNBTPredicates(String description, ItemStack stack, ItemVarian default: { if (nullSourceFilter) return true; - - // Last resort that will work 50% of the time maybe not realy + + // Last resort that will work 50% of the time maybe not really return sourceData.asString().equals(testedData.asString()); } } diff --git a/src/main/java/de/dafuqs/spectrum/registries/SpectrumItemGroups.java b/src/main/java/de/dafuqs/spectrum/registries/SpectrumItemGroups.java index 8bceca2cba..4cd2a09f3f 100644 --- a/src/main/java/de/dafuqs/spectrum/registries/SpectrumItemGroups.java +++ b/src/main/java/de/dafuqs/spectrum/registries/SpectrumItemGroups.java @@ -28,6 +28,7 @@ public class SpectrumItemGroups { public static final ItemGroup MAIN = FabricItemGroup.builder() .icon(() -> new ItemStack(SpectrumBlocks.PEDESTAL_ALL_BASIC)) .entries((displayContext, entries) -> { + entries.add(SpectrumBlocks.PEDESTAL_ALL_BASIC, ItemGroup.StackVisibility.PARENT_TAB_ONLY); ItemGroupParent parent = (ItemGroupParent) SpectrumItemGroups.MAIN; for (ItemSubGroup subGroup : parent.fractal$getChildren()) { entries.addAll(subGroup.getSearchTabStacks(), ItemGroup.StackVisibility.SEARCH_TAB_ONLY); From 2f058ae8ed6eab10775a3d677fbc9e6c58ce27d4 Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Thu, 2 Jan 2025 21:04:19 +0100 Subject: [PATCH 24/58] pastel node matching described in guidebook with example --- .../pastel_network/pastel_network.json | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/main/resources/data/spectrum/modonomicon/books/guidebook/entries/pastel_network/pastel_network.json b/src/main/resources/data/spectrum/modonomicon/books/guidebook/entries/pastel_network/pastel_network.json index 41b5637c9f..cc3ca5df62 100644 --- a/src/main/resources/data/spectrum/modonomicon/books/guidebook/entries/pastel_network/pastel_network.json +++ b/src/main/resources/data/spectrum/modonomicon/books/guidebook/entries/pastel_network/pastel_network.json @@ -41,6 +41,26 @@ }, "title": "book.spectrum.guidebook.pastel_network.page2.title", "text": "book.spectrum.guidebook.pastel_network.page2.text" - } + }, + { + "type": "spectrum:nbt_spotlight", + "condition": { + "type": "modonomicon:advancement", + "advancement_id": "spectrum:unlocks/equipment/bedrock_tools" + }, + "item": { + "item": "spectrum:bedrock_anvil", + "nbt": { + "display": { + "Name": "{\"text\":\"c:pickaxes\"}", + "Lore": [ + "{\"text\":\"enchantment with fortune above 2\"}" + ] + } + } + }, + "title": "book.spectrum.guidebook.pastel_network.page3.title", + "text": "book.spectrum.guidebook.pastel_network.page3.text" + } ] } From 033f5a7505cdee71ba83fb53a0a1dfa1ac48c913 Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Thu, 2 Jan 2025 21:17:40 +0100 Subject: [PATCH 25/58] enchanter_finish sound event --- .../spectrum/blocks/enchanter/EnchanterBlockEntity.java | 2 +- .../spectrum/blocks/item_bowl/ItemBowlBlockEntity.java | 2 +- .../de/dafuqs/spectrum/blocks/upgrade/UpgradeBlock.java | 2 +- .../dafuqs/spectrum/entity/entity/PhantomFrameEntity.java | 4 ++-- .../dafuqs/spectrum/registries/SpectrumSoundEvents.java | 3 ++- src/main/resources/assets/spectrum/lang/en_us.json | 1 + src/main/resources/assets/spectrum/sounds.json | 8 +++++++- 7 files changed, 15 insertions(+), 7 deletions(-) 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 bfcee1297c..8530c89401 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/enchanter/EnchanterBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/enchanter/EnchanterBlockEntity.java @@ -263,7 +263,7 @@ public static boolean isValidCenterEnchantingSetup(@NotNull EnchanterBlockEntity } public static void playCraftingFinishedEffects(@NotNull EnchanterBlockEntity enchanterBlockEntity) { - enchanterBlockEntity.getWorld().playSound(null, enchanterBlockEntity.pos, SoundEvents.ENTITY_PLAYER_LEVELUP, SoundCategory.BLOCKS, 1.0F, 1.0F); + enchanterBlockEntity.getWorld().playSound(null, enchanterBlockEntity.pos, SpectrumSoundEvents.ENCHANTER_FINISH, SoundCategory.BLOCKS, 1.0F, 1.0F); SpectrumS2CPacketSender.playParticleWithRandomOffsetAndVelocity((ServerWorld) enchanterBlockEntity.getWorld(), new Vec3d(enchanterBlockEntity.pos.getX() + 0.5D, enchanterBlockEntity.pos.getY() + 0.5, enchanterBlockEntity.pos.getZ() + 0.5D), 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 a48d9b8425..5551839f14 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 @@ -147,7 +147,7 @@ public void spawnOrbParticles(Vec3d orbTargetPos) { clientWorld.addParticle(sphereParticleEffect, this.pos.getX() + 0.5D, this.pos.getY() + 1.0D, this.pos.getZ() + 0.5D, (orbTargetPos.getX() - this.pos.getX()) * 0.045, 0, (orbTargetPos.getZ() - this.pos.getZ()) * 0.045); } - world.playSound(null, this.pos, SpectrumSoundEvents.ENCHANTER_DING, SoundCategory.BLOCKS, SpectrumCommon.CONFIG.BlockSoundVolume, 0.7F + world.random.nextFloat() * 0.6F); + world.playSound(null, this.pos, SpectrumSoundEvents.CRAFTING_DING, SoundCategory.BLOCKS, SpectrumCommon.CONFIG.BlockSoundVolume, 0.7F + world.random.nextFloat() * 0.6F); } } } 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 51605d727d..7e28caa9d2 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/upgrade/UpgradeBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/upgrade/UpgradeBlock.java @@ -122,7 +122,7 @@ private void updateConnectedUpgradeBlock(@NotNull ServerWorld world, @NotNull Bl private void playConnectedParticles(@NotNull ServerWorld world, @NotNull BlockPos pos, BlockPos currentPos) { DyeColor particleColor = getEffectColor(); - world.playSound(null, pos.getX() + 0.5D, pos.getY() + 1.0D, pos.getZ() + 0.5D, SpectrumSoundEvents.ENCHANTER_DING, SoundCategory.BLOCKS, 1.0F, 1.0F); + world.playSound(null, pos.getX() + 0.5D, pos.getY() + 1.0D, pos.getZ() + 0.5D, SpectrumSoundEvents.CRAFTING_DING, SoundCategory.BLOCKS, 1.0F, 1.0F); SpectrumS2CPacketSender.playParticleWithRandomOffsetAndVelocity( world, Vec3d.ofCenter(pos), SpectrumParticleTypes.getSparkleRisingParticle(particleColor), 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 fa3a7983b9..a56caeed40 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/entity/PhantomFrameEntity.java +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/PhantomFrameEntity.java @@ -41,7 +41,7 @@ public void setHeldItemStack(ItemStack value, boolean update) { super.setHeldItemStack(value, update); if (update && this.isAlive() && !this.getWorld().isClient()) { SpectrumS2CPacketSender.playParticleWithRandomOffsetAndVelocity((ServerWorld) this.getWorld(), getPos(), ParticleTypes.END_ROD, 10, new Vec3d(0, 0, 0), new Vec3d(0.1, 0.1, 0.1)); - this.getWorld().playSoundFromEntity(null, this, SpectrumSoundEvents.ENCHANTER_DING, SoundCategory.BLOCKS, 0.5F, 1.0F); + this.getWorld().playSoundFromEntity(null, this, SpectrumSoundEvents.CRAFTING_DING, SoundCategory.BLOCKS, 0.5F, 1.0F); } } @@ -50,7 +50,7 @@ public boolean damage(DamageSource source, float amount) { boolean success = super.damage(source, amount); if (success && this.isAlive() && !this.getWorld().isClient()) { SpectrumS2CPacketSender.playParticleWithRandomOffsetAndVelocity((ServerWorld) this.getWorld(), getPos(), ParticleTypes.END_ROD, 10, new Vec3d(0, 0, 0), new Vec3d(0.1, 0.1, 0.1)); - this.getWorld().playSoundFromEntity(null, this, SpectrumSoundEvents.ENCHANTER_DING, SoundCategory.BLOCKS, 0.5F, 1.0F); + this.getWorld().playSoundFromEntity(null, this, SpectrumSoundEvents.CRAFTING_DING, SoundCategory.BLOCKS, 0.5F, 1.0F); } return success; } diff --git a/src/main/java/de/dafuqs/spectrum/registries/SpectrumSoundEvents.java b/src/main/java/de/dafuqs/spectrum/registries/SpectrumSoundEvents.java index 63ef0380e0..3ad9d9e58e 100644 --- a/src/main/java/de/dafuqs/spectrum/registries/SpectrumSoundEvents.java +++ b/src/main/java/de/dafuqs/spectrum/registries/SpectrumSoundEvents.java @@ -46,7 +46,8 @@ public class SpectrumSoundEvents { public static final SoundEvent GUIDEBOOK_PAGES = register("item.guidebook.pages"); public static final SoundEvent ENCHANTER_WORKING = register("enchanter_working"); - public static final SoundEvent ENCHANTER_DING = register("enchanter_ding"); + public static final SoundEvent ENCHANTER_FINISH = register("enchanter_finish"); + public static final SoundEvent CRAFTING_DING = register("crafting_ding"); public static final SoundEvent SPIRIT_INSTILLER_CRAFTING = register("spirit_instiller_crafting"); public static final SoundEvent SPIRIT_INSTILLER_CRAFTING_FINISHED = register("spirit_instiller_crafting_finished"); diff --git a/src/main/resources/assets/spectrum/lang/en_us.json b/src/main/resources/assets/spectrum/lang/en_us.json index a0591e9744..023c6ccf2c 100644 --- a/src/main/resources/assets/spectrum/lang/en_us.json +++ b/src/main/resources/assets/spectrum/lang/en_us.json @@ -5262,6 +5262,7 @@ "spectrum.subtitles.dreamflayer_activates": "Dreamflayer activates", "spectrum.subtitles.dreamflayer_deactivates": "Dreamflayer deactivates", "spectrum.subtitles.enchanter_working": "Enchanter dings", + "spectrum.subtitles.enchanter_finish": "Enchanter finishes", "spectrum.subtitles.ender_splice_binds": "Ender Splice binds", "spectrum.subtitles.ender_splice_charges": "Ender Splice charges", "spectrum.subtitles.entity.block_flooder.throw": "Block Flooder flies", diff --git a/src/main/resources/assets/spectrum/sounds.json b/src/main/resources/assets/spectrum/sounds.json index 2d3d0a1a86..81ac63b4bd 100644 --- a/src/main/resources/assets/spectrum/sounds.json +++ b/src/main/resources/assets/spectrum/sounds.json @@ -291,7 +291,13 @@ "spectrum:deeper_down_portal_open" ] }, - "enchanter_ding": { + "enchanter_finish": { + "subtitle": "spectrum.subtitles.enchanter_finish", + "sounds": [ + "minecraft:random/levelup" + ] + }, + "crafting_ding": { "sounds": [ "spectrum:enchanter_ding" ] From dcaa6f3d34076c5004b56040e1c661eda0a0cb35 Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Thu, 2 Jan 2025 21:24:54 +0100 Subject: [PATCH 26/58] fixed stuck storm stone outline --- .../blocks/conditional/StuckStormStoneBlock.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) 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 3ff9cea8bc..050c7fabf5 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/conditional/StuckStormStoneBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/conditional/StuckStormStoneBlock.java @@ -39,12 +39,6 @@ public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { return world.getBlockState(pos.down()).isSolidBlock(world, pos); } - @Override - @SuppressWarnings("deprecation") - public VoxelShape getCameraCollisionShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { - return VoxelShapes.empty(); - } - @Override @SuppressWarnings("deprecation") public float getAmbientOcclusionLightLevel(BlockState state, BlockView world, BlockPos pos) { @@ -94,7 +88,7 @@ public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos po if (this.isVisibleTo(context)) { return SHAPE; } - return VoxelShapes.fullCube(); + return VoxelShapes.empty(); } @Override @@ -106,7 +100,7 @@ public VoxelShape getCollisionShape(BlockState state, BlockView world, BlockPos return this.isVisibleTo(player) ? SHAPE : VoxelShapes.empty(); } } - return VoxelShapes.fullCube(); + return VoxelShapes.empty(); } @Override From 59c8b295a5569f555f6aba3a2c7acd825d38b7ab Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Thu, 2 Jan 2025 21:26:32 +0100 Subject: [PATCH 27/58] fixed fishing loot --- .../loot_tables/gameplay/fishing/dragonrot/treasure.json | 4 ++-- .../spectrum/loot_tables/gameplay/fishing/lava/treasure.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/resources/data/spectrum/loot_tables/gameplay/fishing/dragonrot/treasure.json b/src/main/resources/data/spectrum/loot_tables/gameplay/fishing/dragonrot/treasure.json index f1fd474f1c..d4dbf10ff5 100644 --- a/src/main/resources/data/spectrum/loot_tables/gameplay/fishing/dragonrot/treasure.json +++ b/src/main/resources/data/spectrum/loot_tables/gameplay/fishing/dragonrot/treasure.json @@ -105,11 +105,11 @@ }, { "type": "minecraft:item", - "name": "spectrum:gilded_book", + "name": "minecraft:book", "functions": [ { "function": "minecraft:enchant_with_levels", - "levels": 60, + "levels": 45, "treasure": true } ] diff --git a/src/main/resources/data/spectrum/loot_tables/gameplay/fishing/lava/treasure.json b/src/main/resources/data/spectrum/loot_tables/gameplay/fishing/lava/treasure.json index 887f48eb0e..edc0c7ba52 100644 --- a/src/main/resources/data/spectrum/loot_tables/gameplay/fishing/lava/treasure.json +++ b/src/main/resources/data/spectrum/loot_tables/gameplay/fishing/lava/treasure.json @@ -121,7 +121,7 @@ "functions": [ { "function": "minecraft:enchant_with_levels", - "levels": 45, + "levels": 40, "treasure": true } ] @@ -139,7 +139,7 @@ }, { "function": "minecraft:enchant_with_levels", - "levels": 45, + "levels": 40, "treasure": true } ] From 5f65c9d2245cbaa8542226df820ddebd3d348d8f Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Thu, 2 Jan 2025 21:47:29 +0100 Subject: [PATCH 28/58] WHAT --- .../resources/assets/spectrum/textures/item/portal_breaker.png | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/main/resources/assets/spectrum/textures/item/portal_breaker.png diff --git a/src/main/resources/assets/spectrum/textures/item/portal_breaker.png b/src/main/resources/assets/spectrum/textures/item/portal_breaker.png deleted file mode 100644 index e69de29bb2..0000000000 From 87268cf56eb4c789911dfeb586c339feb501c03b Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Thu, 2 Jan 2025 21:49:38 +0100 Subject: [PATCH 29/58] quitoxic reeds do not replace other blocks when growing anymore --- .../blocks/conditional/QuitoxicReedsBlock.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) 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 c3d16b0e82..92f48bc3ca 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/conditional/QuitoxicReedsBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/conditional/QuitoxicReedsBlock.java @@ -137,7 +137,7 @@ public void onEntityCollision(BlockState state, World world, BlockPos pos, Entit @Override public void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { - if (world.getBlockState(pos.up()).isOf(this) || !isValidBlock(world, pos.up())) { + if (world.getBlockState(pos.up()).isOf(this) || !canGrow(world, pos.up())) { return; } @@ -242,7 +242,6 @@ private boolean isValidBlock(WorldView world, BlockPos pos) { if (!downState.isIn(SpectrumBlockTags.QUITOXIC_REEDS_PLANTABLE)) { return false; } - BlockState upState = world.getBlockState(pos.up()); BlockState upState2 = world.getBlockState(pos.up(2)); if (!upState.isOf(this)) { @@ -260,6 +259,15 @@ private boolean isValidBlock(WorldView world, BlockPos pos) { return fluidState.getLevel() == 8 && (fluidState.isIn(FluidTags.WATER) || state.isOf(SpectrumBlocks.LIQUID_CRYSTAL)); } + private boolean canGrow(WorldView world, BlockPos pos) { + BlockState state = world.getBlockState(pos); + if (state.isAir()) { + return true; + } + FluidState fluidState = world.getFluidState(pos); + return fluidState.getLevel() == 8 && (fluidState.isIn(FluidTags.WATER) || state.isOf(SpectrumBlocks.LIQUID_CRYSTAL)); + } + @Override public float getMaxHorizontalModelOffset() { return 0.15F; From 044bf5bd3777d6dd68f20c75fbffd147f99c05bc Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Thu, 2 Jan 2025 21:50:55 +0100 Subject: [PATCH 30/58] memories have a stack size of 1 --- .../java/de/dafuqs/spectrum/registries/SpectrumBlocks.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/dafuqs/spectrum/registries/SpectrumBlocks.java b/src/main/java/de/dafuqs/spectrum/registries/SpectrumBlocks.java index fb04ce122e..3596b0a0ec 100644 --- a/src/main/java/de/dafuqs/spectrum/registries/SpectrumBlocks.java +++ b/src/main/java/de/dafuqs/spectrum/registries/SpectrumBlocks.java @@ -1627,8 +1627,8 @@ public static void register() { registerBlockWithItem("bedrock_anvil", BEDROCK_ANVIL, IS.of(), DyeColor.BLACK); registerBlockWithItem("cracked_end_portal_frame", CRACKED_END_PORTAL_FRAME, IS.of().fireproof(), DyeColor.PURPLE); - - registerBlockWithItem("memory", MEMORY, new MemoryItem(MEMORY, IS.of(Rarity.UNCOMMON)), DyeColor.LIGHT_GRAY); + + registerBlockWithItem("memory", MEMORY, new MemoryItem(MEMORY, IS.of(1, Rarity.UNCOMMON)), DyeColor.LIGHT_GRAY); // Technical Blocks without items registerBlock("mermaids_brush", MERMAIDS_BRUSH); From ae064b022ff9fe41aaed3f481d809c4230562d85 Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Thu, 2 Jan 2025 22:38:23 +0100 Subject: [PATCH 31/58] use EntityStatus constants --- .../de/dafuqs/spectrum/blocks/idols/FeedingIdolBlock.java | 2 +- .../spectrum/blocks/idols/RandomTeleportingIdolBlock.java | 2 +- .../dafuqs/spectrum/entity/entity/BlockFlooderProjectile.java | 2 +- .../dafuqs/spectrum/entity/entity/ItemProjectileEntity.java | 4 ++-- .../spectrum/entity/entity/ParametricMiningDeviceEntity.java | 4 ++-- .../spectrum/entity/entity/SpectrumFishingBobberEntity.java | 2 +- .../de/dafuqs/spectrum/registries/SpectrumEventListeners.java | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) 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 320ac99057..23b34f2f81 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/idols/FeedingIdolBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/idols/FeedingIdolBlock.java @@ -50,7 +50,7 @@ public boolean trigger(ServerWorld world, BlockPos blockPos, BlockState state, @ InWorldInteractionHelper.decrementAndSpawnRemainder(itemEntity, 1); animalEntity.setLoveTicks(LOVE_TICKS); - world.sendEntityStatus(animalEntity, (byte) 18); + world.sendEntityStatus(animalEntity, EntityStatuses.ADD_BREEDING_PARTICLES); } } } 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 d50c19ff5a..4fd7bdb793 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/idols/RandomTeleportingIdolBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/idols/RandomTeleportingIdolBlock.java @@ -47,7 +47,7 @@ public static boolean teleportTo(ServerWorld world, Entity entity, BlockPos bloc double boundingBoxY = entity.getBoundingBox().getYLength(); // bouncy if (entity instanceof ServerPlayerEntity serverPlayerEntity) { serverPlayerEntity.teleport((ServerWorld) serverPlayerEntity.getWorld(), mutable.getX() + 0.5, mutable.getY() + boundingBoxY, mutable.getZ() + 0.5, serverPlayerEntity.getYaw(), serverPlayerEntity.getPitch()); - world.sendEntityStatus(serverPlayerEntity, (byte) 46); // particles + world.sendEntityStatus(serverPlayerEntity, EntityStatuses.ADD_BREEDING_PARTICLES); return true; } else if (entity instanceof LivingEntity livingEntity) { boolean success = livingEntity.teleport(mutable.getX() + 0.5, mutable.getY() + boundingBoxY, mutable.getZ() + 0.5, true); 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 166ed6839b..8254b6492b 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/entity/BlockFlooderProjectile.java +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/BlockFlooderProjectile.java @@ -53,7 +53,7 @@ protected void onCollision(HitResult hitResult) { super.onCollision(hitResult); World world = this.getWorld(); if (!world.isClient()) { - world.sendEntityStatus(this, (byte) 3); + world.sendEntityStatus(this, EntityStatuses.PLAY_DEATH_SOUND_OR_ADD_PROJECTILE_HIT_PARTICLES); if (hitResult.getType() == HitResult.Type.BLOCK) { BlockPos landingPos = getCorrectedBlockPos(hitResult.getPos()); 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 c8ccb341e2..1fb50b367b 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/entity/ItemProjectileEntity.java +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/ItemProjectileEntity.java @@ -42,7 +42,7 @@ protected void onCollision(HitResult hitResult) { } } - this.getWorld().sendEntityStatus(this, (byte) 3); + this.getWorld().sendEntityStatus(this, EntityStatuses.PLAY_DEATH_SOUND_OR_ADD_PROJECTILE_HIT_PARTICLES); if (!stack.isEmpty()) { Entity owner = this.getOwner(); @@ -57,7 +57,7 @@ protected void onCollision(HitResult hitResult) { @Override public void handleStatus(byte status) { - if (status == 3) { + if (status == EntityStatuses.PLAY_DEATH_SOUND_OR_ADD_PROJECTILE_HIT_PARTICLES) { ItemStack itemStack = this.getItem(); ParticleEffect particleEffect = (itemStack.isEmpty() ? ParticleTypes.ITEM_SNOWBALL : new ItemStackParticleEffect(ParticleTypes.ITEM, itemStack)); 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 5419ad7cfb..0d71ee44ee 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/entity/ParametricMiningDeviceEntity.java +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/ParametricMiningDeviceEntity.java @@ -35,7 +35,7 @@ protected void onEntityHit(EntityHitResult entityHitResult) { PlayerEntity playerOwner = owner instanceof PlayerEntity player ? player : null; ModularExplosionDefinition.explode((ServerWorld) world, entityHitResult.getEntity().getBlockPos(), playerOwner, getStack()); } - world.sendEntityStatus(this, (byte) 1); + world.sendEntityStatus(this, EntityStatuses.PLAY_DEATH_SOUND_OR_ADD_PROJECTILE_HIT_PARTICLES); remove(Entity.RemovalReason.DISCARDED); } @@ -48,7 +48,7 @@ protected void onBlockHit(BlockHitResult blockHitResult) { PlayerEntity playerOwner = owner instanceof PlayerEntity player ? player : null; ModularExplosionDefinition.explode((ServerWorld) world, blockHitResult.getBlockPos(), blockHitResult.getSide().getOpposite(), playerOwner, getStack()); } - world.sendEntityStatus(this, (byte) 2); + world.sendEntityStatus(this, EntityStatuses.PLAY_DEATH_SOUND_OR_ADD_PROJECTILE_HIT_PARTICLES); remove(Entity.RemovalReason.DISCARDED); } diff --git a/src/main/java/de/dafuqs/spectrum/entity/entity/SpectrumFishingBobberEntity.java b/src/main/java/de/dafuqs/spectrum/entity/entity/SpectrumFishingBobberEntity.java index 8d736ce8f8..135169b39e 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/entity/SpectrumFishingBobberEntity.java +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/SpectrumFishingBobberEntity.java @@ -486,7 +486,7 @@ public int use(ItemStack usedItem) { if (this.hookedEntity != null) { this.pullHookedEntity(this.hookedEntity); SpectrumAdvancementCriteria.FISHING_ROD_HOOKED.trigger((ServerPlayerEntity) playerEntity, usedItem, this, null, Collections.emptyList()); - this.getWorld().sendEntityStatus(this, (byte) 31); + this.getWorld().sendEntityStatus(this, EntityStatuses.PULL_HOOKED_ENTITY); i = this.hookedEntity instanceof ItemEntity ? 3 : 5; } else if (this.hookCountdown > 0) { if (!tryCatchEntity(usedItem, playerEntity, (ServerWorld) this.getWorld(), this.getBlockPos())) { diff --git a/src/main/java/de/dafuqs/spectrum/registries/SpectrumEventListeners.java b/src/main/java/de/dafuqs/spectrum/registries/SpectrumEventListeners.java index 1c528280e1..a7daeca978 100644 --- a/src/main/java/de/dafuqs/spectrum/registries/SpectrumEventListeners.java +++ b/src/main/java/de/dafuqs/spectrum/registries/SpectrumEventListeners.java @@ -336,7 +336,7 @@ public static void register() { entity.addStatusEffect(new StatusEffectInstance(StatusEffects.REGENERATION, 900, 1)); entity.addStatusEffect(new StatusEffectInstance(StatusEffects.ABSORPTION, 100, 1)); entity.addStatusEffect(new StatusEffectInstance(StatusEffects.FIRE_RESISTANCE, 800, 0)); - entity.getWorld().sendEntityStatus(entity, (byte) 35); + entity.getWorld().sendEntityStatus(entity, EntityStatuses.USE_TOTEM_OF_UNDYING); return false; } From f0ee3085bfc75ccd3eb6cd0920ea84192901f0c1 Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Fri, 3 Jan 2025 15:04:51 +0100 Subject: [PATCH 32/58] reworded mob head guidebook text --- src/main/resources/assets/spectrum/lang/en_us.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/spectrum/lang/en_us.json b/src/main/resources/assets/spectrum/lang/en_us.json index 023c6ccf2c..e34e02f28f 100644 --- a/src/main/resources/assets/spectrum/lang/en_us.json +++ b/src/main/resources/assets/spectrum/lang/en_us.json @@ -3099,7 +3099,7 @@ "book.spectrum.guidebook.milky_resin.page0.text": "This caramel-colored sap has a sweet aroma and a surprisingly luxurious taste! I can use it in the same way as milk, it just needs a little bit of fermenting first.\\\n\\\n*The resin itself is tasty as well, but too sticky to drink on its own.*", "book.spectrum.guidebook.milky_resin.page1.text": "*~ A pinch of sugar and a little love, and tada - [Clotted Cream](entry://cuisine/titration_barrel#4)! ~*", "book.spectrum.guidebook.milky_resin.page1.title": "Plant-based Milk", - "book.spectrum.guidebook.mob_heads.page0.text": "I was able to get a Mob Head, and not one of the few I knew before, but another one I had never seen before.\\\n\\\nWhile they make for a nice display on my wall, they also still inherit a small spark of the creature's existence.", + "book.spectrum.guidebook.mob_heads.page0.text": "I was able to get a Mob Head, but not one of the ones I knew about, but one I had never seen before.\\\n\\\nWhile they make for a nice display on my wall, they also still inherit a small spark of the creature's existence.", "book.spectrum.guidebook.mod_integration.ae2.name": "Applied Energistics", "book.spectrum.guidebook.mod_integration.ae2.page0.text": "\"Any technology advanced enough is indistinguishable from magic\", I once heard.\\\n\\\nI'm still not entirely sure how this system manages to store so many blocks in such a small space, but since I regularly walk around with hundreds of square metres of dirt, I've never bothered to question it.", "book.spectrum.guidebook.mod_integration.ae2.page1.text": "Looks like the [#](bb00bb)Crystal Growth Accelerator[#]() can speed up the growth of all kinds of Gemstone Buds!", From d1f11763625a026469a5feef3ab0efd176155698 Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Fri, 3 Jan 2025 15:56:28 +0100 Subject: [PATCH 33/58] made potions in omni acc easier to aim with. Increased speed of all projectiles --- .../OmniAcceleratorProjectile.java | 2 +- .../SpectrumOmniAcceleratorProjectiles.java | 22 +++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) 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 c027199ff4..41e72d4ffc 100644 --- a/src/main/java/de/dafuqs/spectrum/api/interaction/OmniAcceleratorProjectile.java +++ b/src/main/java/de/dafuqs/spectrum/api/interaction/OmniAcceleratorProjectile.java @@ -21,7 +21,7 @@ public interface OmniAcceleratorProjectile { OmniAcceleratorProjectile DEFAULT = (stack, shooter, world) -> { ItemProjectileEntity itemProjectileEntity = new ItemProjectileEntity(world, shooter); itemProjectileEntity.setItem(stack); - itemProjectileEntity.setVelocity(shooter, shooter.getPitch(), shooter.getYaw(), 0.0F, 2.0F, 0.5F); + itemProjectileEntity.setVelocity(shooter, shooter.getPitch(), shooter.getYaw(), 0.0F, 2.5F, 0.5F); world.spawnEntity(itemProjectileEntity); return itemProjectileEntity; }; diff --git a/src/main/java/de/dafuqs/spectrum/registries/SpectrumOmniAcceleratorProjectiles.java b/src/main/java/de/dafuqs/spectrum/registries/SpectrumOmniAcceleratorProjectiles.java index 4a865dc95c..0730ee4138 100644 --- a/src/main/java/de/dafuqs/spectrum/registries/SpectrumOmniAcceleratorProjectiles.java +++ b/src/main/java/de/dafuqs/spectrum/registries/SpectrumOmniAcceleratorProjectiles.java @@ -21,7 +21,7 @@ public static void register() { public Entity createProjectile(ItemStack stack, LivingEntity shooter, World world) { PotionEntity potionEntity = new PotionEntity(world, shooter); potionEntity.setItem(stack); - potionEntity.setVelocity(shooter, shooter.getPitch(), shooter.getYaw(), -20.0F, 2.0F, 1.0F); + potionEntity.setVelocity(shooter, shooter.getPitch(), shooter.getYaw(), 0.0F, 2.5F, 1.0F); world.spawnEntity(potionEntity); return potionEntity; } @@ -37,7 +37,7 @@ public SoundEvent getSoundEffect() { public Entity createProjectile(ItemStack stack, LivingEntity shooter, World world) { PotionEntity potionEntity = new PotionEntity(world, shooter); potionEntity.setItem(stack); - potionEntity.setVelocity(shooter, shooter.getPitch(), shooter.getYaw(), -20.0F, 2.0F, 1.0F); + potionEntity.setVelocity(shooter, shooter.getPitch(), shooter.getYaw(), 0.0F, 2.5F, 1.0F); world.spawnEntity(potionEntity); return potionEntity; } @@ -53,7 +53,7 @@ public SoundEvent getSoundEffect() { public Entity createProjectile(ItemStack stack, LivingEntity shooter, World world) { EnderPearlEntity enderPearlEntity = new EnderPearlEntity(world, shooter); enderPearlEntity.setItem(stack); - enderPearlEntity.setVelocity(shooter, shooter.getPitch(), shooter.getYaw(), 0.0F, 2.0F, 1.0F); + enderPearlEntity.setVelocity(shooter, shooter.getPitch(), shooter.getYaw(), 0.0F, 2.5F, 1.0F); world.spawnEntity(enderPearlEntity); return enderPearlEntity; } @@ -69,7 +69,7 @@ public SoundEvent getSoundEffect() { public Entity createProjectile(ItemStack stack, LivingEntity shooter, World world) { if (stack.getItem() instanceof ArrowItem arrowItem) { PersistentProjectileEntity arrowEntity = arrowItem.createArrow(world, stack, shooter); - arrowEntity.setVelocity(shooter, shooter.getPitch(), shooter.getYaw(), 0.0F, 2.0F, 1.0F); + arrowEntity.setVelocity(shooter, shooter.getPitch(), shooter.getYaw(), 0.0F, 2.5F, 1.0F); world.spawnEntity(arrowEntity); return arrowEntity; } @@ -87,7 +87,7 @@ public SoundEvent getSoundEffect() { public Entity createProjectile(ItemStack stack, LivingEntity shooter, World world) { SnowballEntity snowballEntity = new SnowballEntity(world, shooter); snowballEntity.setItem(stack); - snowballEntity.setVelocity(shooter, shooter.getPitch(), shooter.getYaw(), 0.0F, 2.0F, 1.0F); + snowballEntity.setVelocity(shooter, shooter.getPitch(), shooter.getYaw(), 0.0F, 2.5F, 1.0F); world.spawnEntity(snowballEntity); return snowballEntity; } @@ -103,7 +103,7 @@ public SoundEvent getSoundEffect() { public Entity createProjectile(ItemStack stack, LivingEntity shooter, World world) { EggEntity eggEntity = new EggEntity(world, shooter); eggEntity.setItem(stack); - eggEntity.setVelocity(shooter, shooter.getPitch(), shooter.getYaw(), 0.0F, 2.0F, 1.0F); + eggEntity.setVelocity(shooter, shooter.getPitch(), shooter.getYaw(), 0.0F, 2.5F, 1.0F); world.spawnEntity(eggEntity); return eggEntity; } @@ -119,7 +119,7 @@ public SoundEvent getSoundEffect() { public Entity createProjectile(ItemStack stack, LivingEntity shooter, World world) { Vec3d pos = shooter.getPos(); TntEntity tntEntity = new TntEntity(world, pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, shooter); - OmniAcceleratorProjectile.setVelocity(tntEntity, shooter, shooter.getPitch(), shooter.getYaw(), 0.0F, 2.0F, 1.0F); + OmniAcceleratorProjectile.setVelocity(tntEntity, shooter, shooter.getPitch(), shooter.getYaw(), 0.0F, 2.5F, 1.0F); if (world.spawnEntity(tntEntity)) { world.emitGameEvent(shooter, GameEvent.PRIME_FUSE, pos); return tntEntity; @@ -138,7 +138,7 @@ public SoundEvent getSoundEffect() { public Entity createProjectile(ItemStack stack, LivingEntity shooter, World world) { BlockFlooderProjectile blockFlooderProjectile = new BlockFlooderProjectile(world, shooter); blockFlooderProjectile.setItem(stack); - blockFlooderProjectile.setVelocity(shooter, shooter.getPitch(), shooter.getYaw(), 0.0F, 1.5F, 1.0F); + blockFlooderProjectile.setVelocity(shooter, shooter.getPitch(), shooter.getYaw(), 0.0F, 2.5F, 1.0F); world.spawnEntity(blockFlooderProjectile); return blockFlooderProjectile; } @@ -154,7 +154,7 @@ public SoundEvent getSoundEffect() { public Entity createProjectile(ItemStack stack, LivingEntity shooter, World world) { ParametricMiningDeviceEntity entity = new ParametricMiningDeviceEntity(world, shooter); entity.setItem(stack); - entity.setVelocity(shooter, shooter.getPitch(), shooter.getYaw(), 0, 1.5F, 0F); + entity.setVelocity(shooter, shooter.getPitch(), shooter.getYaw(), 0, 2.5F, 0F); world.spawnEntity(entity); return entity; } @@ -169,7 +169,7 @@ public SoundEvent getSoundEffect() { @Override public Entity createProjectile(ItemStack stack, LivingEntity shooter, World world) { FireworkRocketEntity fireworkRocketEntity = new FireworkRocketEntity(world, stack, shooter); - fireworkRocketEntity.setVelocity(shooter, shooter.getPitch(), shooter.getYaw(), 0, 1.5F, 0F); + fireworkRocketEntity.setVelocity(shooter, shooter.getPitch(), shooter.getYaw(), 0, 2.5F, 0F); world.spawnEntity(fireworkRocketEntity); return fireworkRocketEntity; } @@ -184,7 +184,7 @@ public SoundEvent getSoundEffect() { @Override public Entity createProjectile(ItemStack stack, LivingEntity shooter, World world) { ShootingStarEntity shootingStarEntity = ((ShootingStarItem) stack.getItem()).getEntityForStack(world, shooter.getEyePos(), stack); - OmniAcceleratorProjectile.setVelocity(shootingStarEntity, shooter, shooter.getPitch(), shooter.getYaw(), 0, 3.0F, 0F); + OmniAcceleratorProjectile.setVelocity(shootingStarEntity, shooter, shooter.getPitch(), shooter.getYaw(), 0, 2.5F, 0F); world.spawnEntity(shootingStarEntity); shootingStarEntity.noClip = true; From 9af0590a404d9d98298bf6c9ffc671f832976295 Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Fri, 3 Jan 2025 16:40:18 +0100 Subject: [PATCH 34/58] handle nature's staff serverside --- .../de/dafuqs/spectrum/helpers/Support.java | 16 ++++++++++++ .../items/magic_items/NaturesStaffItem.java | 26 ++++--------------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/main/java/de/dafuqs/spectrum/helpers/Support.java b/src/main/java/de/dafuqs/spectrum/helpers/Support.java index baa021eef8..f398a58aaa 100644 --- a/src/main/java/de/dafuqs/spectrum/helpers/Support.java +++ b/src/main/java/de/dafuqs/spectrum/helpers/Support.java @@ -1,13 +1,17 @@ package de.dafuqs.spectrum.helpers; +import com.jamieswhiteshirt.reachentityattributes.*; import de.dafuqs.spectrum.*; import net.minecraft.advancement.*; import net.minecraft.block.*; import net.minecraft.block.entity.*; +import net.minecraft.entity.*; +import net.minecraft.entity.player.*; import net.minecraft.registry.tag.*; import net.minecraft.server.*; import net.minecraft.server.network.*; import net.minecraft.util.*; +import net.minecraft.util.hit.*; import net.minecraft.util.math.*; import net.minecraft.util.math.random.Random; import net.minecraft.world.*; @@ -19,6 +23,18 @@ public class Support { + public static HitResult playerInteractionRaycast(World world, LivingEntity user, PlayerEntity player) { + double maxDistance = getReachDistance(player); + Vec3d eyePos = user.getEyePos(); + Vec3d rotationVec = user.getRotationVec(0F); + Vec3d vec3d3 = eyePos.add(rotationVec.x * maxDistance, rotationVec.y * maxDistance, rotationVec.z * maxDistance); + return world.raycast(new RaycastContext(eyePos, vec3d3, RaycastContext.ShapeType.OUTLINE, RaycastContext.FluidHandling.NONE, player)); + } + + public static float getReachDistance(PlayerEntity player) { + return (player.isCreative() ? 5.0F : 4.5F) + (float) player.getAttributeValue(ReachEntityAttributes.REACH); + } + public static final DecimalFormat DF = new DecimalFormat("0"); public static final DecimalFormat DF1 = new DecimalFormat("0.0"); public static final DecimalFormat DF2 = new DecimalFormat("0.00"); diff --git a/src/main/java/de/dafuqs/spectrum/items/magic_items/NaturesStaffItem.java b/src/main/java/de/dafuqs/spectrum/items/magic_items/NaturesStaffItem.java index 340e57c196..4de13602bc 100644 --- a/src/main/java/de/dafuqs/spectrum/items/magic_items/NaturesStaffItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/magic_items/NaturesStaffItem.java @@ -97,7 +97,6 @@ public void usageTick(World world, LivingEntity user, ItemStack stack, int remai if (remainingUseTicks % 10 != 0) { return; } - if (!(user instanceof PlayerEntity player)) { user.stopUsingItem(); return; @@ -106,26 +105,11 @@ public void usageTick(World world, LivingEntity user, ItemStack stack, int remai user.stopUsingItem(); } - if (world.isClient) { - usageTickClient(user); - } - } - - @Environment(EnvType.CLIENT) - @SuppressWarnings("resource") - public void usageTickClient(LivingEntity user) { - // Simple equality check to make sure this method doesn't execute on other clients. - // Always true if the current player is the one wielding the staff under normal circumstances. - MinecraftClient client = MinecraftClient.getInstance(); - if (client.player != user) { - return; - } - if (client.crosshairTarget.getType() == HitResult.Type.BLOCK) { - client.interactionManager.interactBlock( - client.player, - client.player.getActiveHand(), - (BlockHitResult) client.crosshairTarget - ); + if (!world.isClient) { + HitResult hitResult = Support.playerInteractionRaycast(world, user, player); + if (hitResult.getType() == HitResult.Type.BLOCK) { + useOnBlock(new ItemUsageContext(world, player, player.getActiveHand(), player.getStackInHand(player.getActiveHand()), (BlockHitResult) hitResult)); + } } } From 8aa6b117400b76a3b76bb19fed8bd599c7701baa Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Fri, 3 Jan 2025 16:57:53 +0100 Subject: [PATCH 35/58] redstone block sound events --- .../blocks/redstone/BlockBreakerBlock.java | 2 +- .../redstone/RedstoneCalculatorBlock.java | 3 ++- .../blocks/redstone/RedstoneTimerBlock.java | 7 ++--- .../redstone/RedstoneTransceiverBlock.java | 4 +-- .../registries/SpectrumSoundEvents.java | 2 ++ .../resources/assets/spectrum/lang/en_us.json | 2 ++ .../resources/assets/spectrum/sounds.json | 27 +++++++++++++++++++ 7 files changed, 40 insertions(+), 7 deletions(-) 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 bea5e638aa..9faca7ddc2 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/redstone/BlockBreakerBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/redstone/BlockBreakerBlock.java @@ -66,7 +66,7 @@ protected void destroy(World world, BlockPos breakerPos, Direction direction) { float hardness = blockState.getHardness(world, breakingPos); if (hardness < 0 || hardness > 50) { - world.playSound(null, breakerPos, SoundEvents.BLOCK_IRON_TRAPDOOR_OPEN, SoundCategory.BLOCKS, 0.15f, (2.0f + world.random.nextFloat())); + world.playSound(null, breakerPos, SpectrumSoundEvents.REDSTONE_MECHANISM_BREAK_BLOCK, SoundCategory.BLOCKS, 0.15f, (2.0f + world.random.nextFloat())); return; } 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 b65da6fe96..2875da17ac 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/redstone/RedstoneCalculatorBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/redstone/RedstoneCalculatorBlock.java @@ -1,5 +1,6 @@ package de.dafuqs.spectrum.blocks.redstone; +import de.dafuqs.spectrum.registries.*; import net.minecraft.block.*; import net.minecraft.block.entity.*; import net.minecraft.entity.player.*; @@ -49,7 +50,7 @@ public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEnt BlockState newModeState = state.cycle(CALCULATION_MODE); world.setBlockState(pos, newModeState, Block.NOTIFY_ALL); float pitch = 0.5F + state.get(CALCULATION_MODE).ordinal() * 0.05F; - world.playSound(player, pos, SoundEvents.BLOCK_COMPARATOR_CLICK, SoundCategory.BLOCKS, 0.3F, pitch); + world.playSound(player, pos, SpectrumSoundEvents.REDSTONE_MECHANISM_TRIGGER, SoundCategory.BLOCKS, 0.3F, pitch); if (player instanceof ServerPlayerEntity serverPlayerEntity) { // since this triggers both on server and client side: just send the // message once, client side is enough, since it is pretty irrelevant on the server 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 cef7b2ea68..770cc2d7fd 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/redstone/RedstoneTimerBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/redstone/RedstoneTimerBlock.java @@ -1,5 +1,6 @@ package de.dafuqs.spectrum.blocks.redstone; +import de.dafuqs.spectrum.registries.*; import net.minecraft.block.*; import net.minecraft.entity.player.*; import net.minecraft.particle.*; @@ -70,7 +71,7 @@ public void onBlockAdded(BlockState state, World world, BlockPos pos, BlockState public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { BlockState newState = state.with(POWERED, !state.get(POWERED)); world.setBlockState(pos, newState, 3); - world.playSound(null, pos, SoundEvents.BLOCK_COMPARATOR_CLICK, SoundCategory.BLOCKS, 0.3F, 1.0F); + world.playSound(null, pos, SpectrumSoundEvents.REDSTONE_MECHANISM_TRIGGER, SoundCategory.BLOCKS, 0.3F, 1.0F); world.scheduleBlockTick(pos, this, this.getUpdateDelayInternal(state), TickPriority.NORMAL); } @@ -101,14 +102,14 @@ public void stepTiming(ServerWorld world, BlockPos pos, ServerPlayerEntity serve TimingStep newStep = blockState.get(INACTIVE_TIME).next(); serverPlayerEntity.sendMessage(Text.translatable("block.spectrum.redstone_timer.setting.inactive").append(Text.translatable(newStep.localizationString)), true); float pitch = 0.5F + newStep.ordinal() * 0.05F; - world.playSound(null, pos, SoundEvents.BLOCK_COMPARATOR_CLICK, SoundCategory.BLOCKS, 0.3F, pitch); + world.playSound(null, pos, SpectrumSoundEvents.REDSTONE_MECHANISM_TRIGGER, SoundCategory.BLOCKS, 0.3F, pitch); world.setBlockState(pos, world.getBlockState(pos).with(INACTIVE_TIME, newStep)); } else { // toggle active time TimingStep newStep = blockState.get(ACTIVE_TIME).next(); serverPlayerEntity.sendMessage(Text.translatable("block.spectrum.redstone_timer.setting.active").append(Text.translatable(newStep.localizationString)), true); float pitch = 0.5F + newStep.ordinal() * 0.05F; - world.playSound(null, pos, SoundEvents.BLOCK_COMPARATOR_CLICK, SoundCategory.BLOCKS, 0.3F, pitch); + world.playSound(null, pos, SpectrumSoundEvents.REDSTONE_MECHANISM_TRIGGER, SoundCategory.BLOCKS, 0.3F, pitch); world.setBlockState(pos, world.getBlockState(pos).with(ACTIVE_TIME, newStep)); } 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 74643c2768..3156902e9b 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/redstone/RedstoneTransceiverBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/redstone/RedstoneTransceiverBlock.java @@ -59,9 +59,9 @@ public void toggleSendingMode(@NotNull World world, BlockPos blockPos, @NotNull world.setBlockState(blockPos, newState, Block.NOTIFY_LISTENERS); if (newState.get(SENDER)) { - world.playSound(null, blockPos, SoundEvents.BLOCK_COMPARATOR_CLICK, SoundCategory.BLOCKS, 0.3F, 0.9F); + world.playSound(null, blockPos, SpectrumSoundEvents.REDSTONE_MECHANISM_TRIGGER, SoundCategory.BLOCKS, 0.3F, 0.9F); } else { - world.playSound(null, blockPos, SoundEvents.BLOCK_COMPARATOR_CLICK, SoundCategory.BLOCKS, 0.3F, 1.1F); + world.playSound(null, blockPos, SpectrumSoundEvents.REDSTONE_MECHANISM_TRIGGER, SoundCategory.BLOCKS, 0.3F, 1.1F); } updatePowered(world, blockPos, newState); } diff --git a/src/main/java/de/dafuqs/spectrum/registries/SpectrumSoundEvents.java b/src/main/java/de/dafuqs/spectrum/registries/SpectrumSoundEvents.java index 3ad9d9e58e..007e11ea48 100644 --- a/src/main/java/de/dafuqs/spectrum/registries/SpectrumSoundEvents.java +++ b/src/main/java/de/dafuqs/spectrum/registries/SpectrumSoundEvents.java @@ -42,6 +42,8 @@ public class SpectrumSoundEvents { public static final SoundEvent MOONSTONE_STRIKE = register("moonstone_strike"); public static final SoundEvent ENTITY_BLOCK_FLOODER_THROW = register("entity.block_flooder.throw"); public static final SoundEvent OMNI_ACCELERATOR_SHOOT = register("item.omni_accelerator.shoot"); + public static final SoundEvent REDSTONE_MECHANISM_TRIGGER = register("block.redstone_mechanism.trigger"); + public static final SoundEvent REDSTONE_MECHANISM_BREAK_BLOCK = register("block.redstone_mechanism.break_block"); public static final SoundEvent GUIDEBOOK_PAGES = register("item.guidebook.pages"); diff --git a/src/main/resources/assets/spectrum/lang/en_us.json b/src/main/resources/assets/spectrum/lang/en_us.json index e34e02f28f..aec08916b9 100644 --- a/src/main/resources/assets/spectrum/lang/en_us.json +++ b/src/main/resources/assets/spectrum/lang/en_us.json @@ -5346,6 +5346,8 @@ "spectrum.subtitles.text_revealed": "Colorful World Guidebook chimes", "spectrum.subtitles.unlock": "Something unlocks", "spectrum.subtitles.use_fail": "Use fails", + "spectrum.subtitles.block.redstone_mechanism.trigger": "Mechanism triggers", + "spectrum.subtitles.block.redstone_mechanism.break_block": "Block gets broken", "spectrum.toast.anvil_crushing_recipe_unlocked.title": "New Crushing recipe:", "spectrum.toast.anvil_crushing_recipes_unlocked.title": "New Crushing recipes:", diff --git a/src/main/resources/assets/spectrum/sounds.json b/src/main/resources/assets/spectrum/sounds.json index 81ac63b4bd..7f5e88dd17 100644 --- a/src/main/resources/assets/spectrum/sounds.json +++ b/src/main/resources/assets/spectrum/sounds.json @@ -17,6 +17,33 @@ "spectrum:use_fail" ] }, + "block.redstone_mechanism.trigger": { + "subtitle": "spectrum.subtitles.block.redstone_mechanism.trigger", + "sounds": [ + "minecraft:random/click" + ] + }, + "block.redstone_mechanism.break_block": { + "subtitle": "spectrum.subtitles.block.redstone_mechanism.break_block", + "sounds": [ + { + "name": "minecraft:block/iron_trapdoor/open1", + "volume": 0.9 + }, + { + "name": "minecraft:block/iron_trapdoor/open2", + "volume": 0.9 + }, + { + "name": "minecraft:block/iron_trapdoor/open3", + "volume": 0.9 + }, + { + "name": "minecraft:block/iron_trapdoor/open4", + "volume": 0.9 + } + ] + }, "paintbrush_trigger": { "subtitle": "spectrum.subtitles.paintbrush_trigger", "sounds": [ From eaea4d0507e285be966b5df588fa67e80d40de65 Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Fri, 3 Jan 2025 17:01:55 +0100 Subject: [PATCH 36/58] reword book.spectrum.guidebook.exchanging_staff.page0.text --- src/main/resources/assets/spectrum/lang/en_us.json | 2 +- src/main/resources/assets/spectrum/lang/pt_br.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/spectrum/lang/en_us.json b/src/main/resources/assets/spectrum/lang/en_us.json index aec08916b9..f1db49c6ab 100644 --- a/src/main/resources/assets/spectrum/lang/en_us.json +++ b/src/main/resources/assets/spectrum/lang/en_us.json @@ -2583,7 +2583,7 @@ "book.spectrum.guidebook.excavation_sites.name": "Excavation Sites", "book.spectrum.guidebook.excavation_sites.page0.text": "*A work site?*", "book.spectrum.guidebook.excavation_sites.page1.text": "Deep underground - deepest underground between layers of [Downstone](entry://dimension/downstone), to be exact, I found a weird, mechanical looking structure.", - "book.spectrum.guidebook.exchanging_staff.page0.text": "For those of you who don't live in a simple [#](bb00bb)Cobblestone[#]() house, or live without walls entirely - I'm not writing about me, of course - I've come up with the Exchanging Staff, which can swap a whole bunch of connected blocks in the blink of an eye. Perfect for redecorating!", + "book.spectrum.guidebook.exchanging_staff.page0.text": "For those of you who don't live in a plain [#](bb00bb)Cobblestone[#]() house, or one without walls at all (not me, of course):\\\nThe Exchanging Staff can swap a whole bunch of connected blocks in the blink of an eye. Perfect for redecorating!", "book.spectrum.guidebook.exchanging_staff.page1.text": "*Mining also just got a lot more fun*", "book.spectrum.guidebook.exchanging_staff.page2.text": "Multiplies ore drops when exchanging similar to using Fortune on a mining tool.", "book.spectrum.guidebook.exchanging_staff.page3.text": "Gives me the block exactly as it appeared in the world, without breaking the more fragile blocks such as glass or ore.", diff --git a/src/main/resources/assets/spectrum/lang/pt_br.json b/src/main/resources/assets/spectrum/lang/pt_br.json index be742c4bb7..b69215ff52 100644 --- a/src/main/resources/assets/spectrum/lang/pt_br.json +++ b/src/main/resources/assets/spectrum/lang/pt_br.json @@ -3385,7 +3385,7 @@ "book.spectrum.guidebook.entity_detector.page1.text": "Outputs a cumulative strength of 1 for every creature within a 10 block radius.", "book.spectrum.guidebook.everpromise_ribbon.page0.text": "A ribbon given to pets as an everlasting promise to watch over and care for them.\\\nI can name it and pin it on a creature. Should it ever die it will drop a [#](bb00bb)Broken Promise[#]().", "book.spectrum.guidebook.everpromise_ribbon.page1.text": "My pet will immediately trust me, if it does not already. After naming it, I can use a [#](bb00bb)Crafting Table[#]() to add [Pigment](entry://general/pigment) to the [#](bb00bb)Ribbon[#]() to color the pets name.", - "book.spectrum.guidebook.exchanging_staff.page0.text": "For those of you who don't live in a simple [#](bb00bb)Cobblestone[#]() house, or live without walls entirely - I'm not writing about me, of course - I've come up with the Exchanging Staff, which can swap a whole bunch of connected blocks in the blink of an eye. Perfect for redecorating!", + "book.spectrum.guidebook.exchanging_staff.page0.text": "For those of you who don't live in a plain [#](bb00bb)Cobblestone[#]() house, or one without walls at all (not me, of course):\\\nThe Exchanging Staff can swap a whole bunch of connected blocks in the blink of an eye. Perfect for redecorating!", "book.spectrum.guidebook.exchanging_staff.page1.text": "*Mining also just got a lot more fun*", "book.spectrum.guidebook.exchanging_staff.page2.text": "Fortune allows multiplies ore drops when exchanging similar to using Fortune on a mining tool.", "book.spectrum.guidebook.exchanging_staff.page3.text": "Silk Touch gives you the block exactly as it appeared in the world, without breaking the more fragile blocks such as glass or ore.", From ad6b8922593dd20508bf9c9794a2579656bafc2e Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Fri, 3 Jan 2025 17:12:13 +0100 Subject: [PATCH 37/58] fixed neepmeat entry items --- src/main/resources/assets/spectrum/lang/en_us.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/spectrum/lang/en_us.json b/src/main/resources/assets/spectrum/lang/en_us.json index f1db49c6ab..062f2563cd 100644 --- a/src/main/resources/assets/spectrum/lang/en_us.json +++ b/src/main/resources/assets/spectrum/lang/en_us.json @@ -3282,8 +3282,8 @@ "book.spectrum.guidebook.mod_integration.mythicupgrades.name": "Geode+", "book.spectrum.guidebook.mod_integration.neepmeat.name": "NEEPMeat", "book.spectrum.guidebook.mod_integration.neepmeat.page0.text": "I didn't realise that you needed to be trained as a machinist to become a butcher.", - "book.spectrum.guidebook.mod_integration.neepmeat.leaf_crushing.text": "While the [](neepmeat:large_crusher) does not yield me too much Pigment, I have a good chance for Saplings!", - "book.spectrum.guidebook.mod_integration.neepmeat.amaranth_crushing.text": "Using the [](neepmeat:grinder) or [](neepmeat:large_crusher) I can get a lot more grains out of Amaranth.", + "book.spectrum.guidebook.mod_integration.neepmeat.leaf_crushing.text": "While the [](item://neepmeat:large_crusher) does not yield me too much Pigment, I have a good chance for Saplings!", + "book.spectrum.guidebook.mod_integration.neepmeat.amaranth_crushing.text": "Using the [](item://neepmeat:grinder) or [](item://neepmeat:large_crusher) I can get a lot more grains out of Amaranth.", "book.spectrum.guidebook.mod_integration.neepmeat.grinding.text": "A few items handle grinding down pretty well.\\\nDefinitely superior to smashing them with an anvil.", "book.spectrum.guidebook.mod_integration.neepmeat.enlightening.text": "Did you know that Silverfish and Endermites are related?\\\nI sure did NOT.", "book.spectrum.guidebook.mod_integration.neepmeat.kindling_vivisection.title": "Getting more feathers.", From 98ba3f72d232d2f0e79a01cdd4f0ca10a13ae750 Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Fri, 3 Jan 2025 17:32:19 +0100 Subject: [PATCH 38/58] made hint entries in dimension chapter easier to see --- .../textures/gui/guidebook/icons/idea_deep.png | Bin 0 -> 4514 bytes .../dimension/downstone_fragments_hint.json | 2 +- .../entries/dimension/malachite_hint.json | 2 +- .../entries/dimension/moonstone_cores_hint.json | 2 +- .../entries/dimension/resonance_shards_hint.json | 2 +- 5 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 src/main/resources/assets/spectrum/textures/gui/guidebook/icons/idea_deep.png diff --git a/src/main/resources/assets/spectrum/textures/gui/guidebook/icons/idea_deep.png b/src/main/resources/assets/spectrum/textures/gui/guidebook/icons/idea_deep.png new file mode 100644 index 0000000000000000000000000000000000000000..f83c29b4ee8a9893649f77cfe9d9c404faf1a509 GIT binary patch literal 4514 zcmeHKeNYtV8DB~iyg)pW2*$)NN7__nZ})EZzIHhA7=`FW$0SCr#@JBfSByxkQDdr5>r_pHl@N6pGn1*E#?)G=>AT1GG&3DK z^*`=rZ})vZe(&@Ap67Yz_9ahIL8|Hz6^3D{E~mW&-POvKJQe+Z|Lbo7x}9kBmdhoe z9uG$(K@31#ZU{ph#zXszHc--Hbh{NU7Xn)uz#H*0sEdTEaL z=O*IC-~q@ynTHZtv-a+mH5kOjmCgnf&GuN?h05$D9YrmxQ(k|f zX&}2j&#hhkOc@pF;u0U>Kb?Lr>6pKI!_FUe?r?rDxzqgn)0yhtDJxP>-&t6<<df5m2Zb#GD>3Y$G7+^` zxx0|%q@Wh?k`HQQ!7%DO49m@ng#lL$W!wk-V#unw*>OyRi@a5{+~B6%;e1#nIvXRf zw6Vy`HCA&LUX!;_l^bIbKoH6Rj|BsvC>yhC;Y(RkDJKVR!zCvgXc>Th%;J7 zOA(HkSf|%4RN=W1USLb?ONJoO%Brc7qFr_4 zwk&YDJtH0p1%5FYj(Z`p$63mvFiO_A*c44Xow0!+_YvH2*2B5Sjgghx&DtfdRte8# zw`!FASzh8qo{c}64A5ur2@JtQBTXx(;M}^F;K2hR0bgqDo_Yq zDi}cc z5j0J41Y@yKgoU#h2pR~2iD#gmHkjg2JjX7PB0+%4DF%TblHrg)u22YPZ623Zqt{ZS z5>Eig0&+kzAclCUK02!Mia}T^1BFkWi8fgDIx~Z^HtA^HsL?VQiK1RqP<51+X5t#9 zFf2+3Q45q#MF4R*%7)F4Kp;yIuOtPm8YL)P@f=aR(LnJ)26iAr1WM@*ETv;9+N(3M zG{rLd1<4-<~Z$ASgiU@VTa}7cQgZ_D5C%j9HG}4jRd2E6yY;+sFnt^iAG%_Kmm+L zk4l1E4>#Lwr2TIQnIvqhVUOmN97M7tjN;RRZt zIRUjLu%K~ac*1M}kPyraFaeGOkg<#p_kT{$Ku{>X(T*5SFPBsf#NlG*lK)ZeL4z?T zD57OhhE8U5(32x4{SaTunR*{TLv3~+cRYcI;c_yR~yy85J1e3X_TWtAO29U6 z$wa~=+2wX5eVLG`o;&~eM!Fk`B$wUhHJ{}wx2mbDtvB9%=bx{1k)dkt@gA?-efZ>> zON9rrK2bI9dFNg>_slQ$_UThTJNJ)(koB>HPr{FMr%!oY+g*75<7CHAvRL&Vy*~K} zwktvUypvPUN_%d<%ebiAncO}@P*;4h=&40%iCCM?1x^;IB4}&O Date: Fri, 3 Jan 2025 17:35:49 +0100 Subject: [PATCH 39/58] improve intro entry. Add info about optional hints --- .../resources/assets/spectrum/lang/en_us.json | 6 ++++- .../guidebook/entries/general/intro.json | 22 +++++++++++++++++-- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/main/resources/assets/spectrum/lang/en_us.json b/src/main/resources/assets/spectrum/lang/en_us.json index 062f2563cd..96fb607291 100644 --- a/src/main/resources/assets/spectrum/lang/en_us.json +++ b/src/main/resources/assets/spectrum/lang/en_us.json @@ -2942,7 +2942,11 @@ "book.spectrum.guidebook.intro.page2.text": "Spectrum features a unique progression system where you unlock new things as you progress.\\\nAs you progress, you will notice changes in the world. Differences that only *you* personally can perceive.\\\n\\\nEverything you learn will bring you closer to your ultimate goal: to find out what lies beneath the impenetrable bedrock floor.", "book.spectrum.guidebook.intro.page2.title": "Progression System", "book.spectrum.guidebook.intro.page3.link_text": "Spectrum's Discord", - "book.spectrum.guidebook.intro.page3.text": "No idea on how to progress? Take a look at this book or your advancements. These give a lot of hints on what to do next. Press the (x) or right mouse button to get started!\\\n\\\nSpectrum is still in development. If you find a bug or have a suggestion, visit Spectrum's Discord or report them on GitHub.\\\nHave fun! - DaFuqs", + "book.spectrum.guidebook.intro.page3.text": "\\\nPress the (x) or right mouse button to get started!\\\n\\\n\\\nSpectrum is still in development. If you find a bug or have a suggestion, visit Spectrum's Discord or report them on GitHub.\\\n\\\nHave fun! - DaFuqs", + "book.spectrum.guidebook.intro.stuck.title": "No idea on how to progress?", + "book.spectrum.guidebook.intro.stuck.text": "Take a look at this book or your spectrum advancements. In both you will find nudges on what to do next.\\\n\\\nThere will be multiple advancement trees, one for each chapter of your journey.", + "book.spectrum.guidebook.intro.hints.title": "Optional Hint System", + "book.spectrum.guidebook.intro.hints.text": "Yous Colorful World book comes with a hint system. If you ever are stuck feel free to consult these entries for a small hint - or the solution entirely.\\\n\\\nThey are purely optional - you will not lose out on anything if you use them. But of course you can pride yourself you finished the mod all by yourself!", "book.spectrum.guidebook.inventory_insertion.page0.text": "If I got a [#](bb00bb)Dirt Block[#]() whenever I mined an ore and it fell right into [#](bb00bb)Lava[#](), I'd have a whole lot of [#](bb00bb)Dirt[#]().\\\nNo idea what I would do with that much, to be honest. Give it to a friend who has just arrived here and needs shelter on his first night?\\\n\\\nAnyway, the dropping stuff into [#](bb00bb)Lava[#]() thing has to stop. I haven't forgotten about you, [#](bb00bb)Ghast Tears[#]().", "book.spectrum.guidebook.inventory_insertion.page1.text": "Puts broken blocks and mob drops directly into the inventory instead of dropping them onto the ground.\\\n\\\nMax Level: 1\\\nApplicable to mining tools, shears, weapons, bows, crossbows and Spectrum's fishing rods.", "book.spectrum.guidebook.item_bowl.name": "Item Bowls", diff --git a/src/main/resources/data/spectrum/modonomicon/books/guidebook/entries/general/intro.json b/src/main/resources/data/spectrum/modonomicon/books/guidebook/entries/general/intro.json index 0eb7736a27..dfe6da61ce 100644 --- a/src/main/resources/data/spectrum/modonomicon/books/guidebook/entries/general/intro.json +++ b/src/main/resources/data/spectrum/modonomicon/books/guidebook/entries/general/intro.json @@ -33,6 +33,24 @@ "text": "book.spectrum.guidebook.intro.page3.text", "link_text": "book.spectrum.guidebook.intro.page3.link_text", "url": "https://discord.com/invite/EXU9XFXT8a" - } - ] + }, + { + "type": "modonomicon:text", + "title": "book.spectrum.guidebook.intro.stuck.title", + "text": "book.spectrum.guidebook.intro.stuck.text" + }, + { + "type": "spectrum:snippet", + "resource_path": "spectrum:textures/gui/guidebook/icons/idea.png", + "resource_width": 16, + "resource_height": 16, + "texture_x": 0, + "texture_y": 0, + "texture_width": 16, + "texture_height": 16, + "border": true, + "title": "book.spectrum.guidebook.intro.hints.title", + "text": "book.spectrum.guidebook.intro.hints.text" + } + ] } From 197ac0844c0be0f41c4e8f1729e44c18ae31d6d7 Mon Sep 17 00:00:00 2001 From: azzyy Date: Fri, 10 Jan 2025 23:35:32 -0600 Subject: [PATCH 40/58] Made radius actually be a radious for DetectorBlock --- .../de/dafuqs/spectrum/blocks/redstone/DetectorBlock.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/dafuqs/spectrum/blocks/redstone/DetectorBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/redstone/DetectorBlock.java index 6792487dc3..ffd2c38ef1 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/redstone/DetectorBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/redstone/DetectorBlock.java @@ -87,8 +87,9 @@ public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Ran abstract int getUpdateFrequencyTicks(); - protected Box getBoxWithRadius(BlockPos blockPos, int radius) { - return Box.of(Vec3d.ofCenter(blockPos), radius, radius, radius); + protected Box getBoxWithRadius(BlockPos blockPos, float radius) { + var r = Math.round(radius * 2); + return Box.of(Vec3d.ofCenter(blockPos), r, r, r); } } From 586fff7d7afd14328016bb8c0c3199e7a2d65a79 Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Sat, 11 Jan 2025 12:37:21 +0100 Subject: [PATCH 41/58] :angry_tater: --- .../TotalCappedElementalMixingInkStorage.java | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) 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 index 1adc662742..b32adc76ea 100644 --- a/src/main/java/de/dafuqs/spectrum/api/energy/storage/TotalCappedElementalMixingInkStorage.java +++ b/src/main/java/de/dafuqs/spectrum/api/energy/storage/TotalCappedElementalMixingInkStorage.java @@ -4,7 +4,6 @@ import de.dafuqs.spectrum.api.energy.color.*; import net.fabricmc.api.*; import net.minecraft.nbt.*; -import net.minecraft.registry.entry.*; import net.minecraft.text.*; import org.jetbrains.annotations.*; @@ -123,13 +122,6 @@ public long getEnergy(InkColor color) { return maxAmount; } - public NbtCompound toNbt() { - NbtCompound compound = new NbtCompound(); - compound.putLong("MaxEnergyTotal", this.maxEnergyTotal); - compound.put("Energy", InkStorage.writeEnergy(this.storedEnergy)); - return compound; - } - public static TotalCappedElementalMixingInkStorage fromNbt(@NotNull NbtCompound compound) { long maxEnergyTotal = compound.getLong("MaxEnergyTotal"); Map energy = InkStorage.readEnergy(compound.contains("Energy") ? compound.getCompound("Energy") : compound); @@ -139,14 +131,19 @@ public static TotalCappedElementalMixingInkStorage fromNbt(@NotNull NbtCompound @Override public void fillCompletely() { this.storedEnergy.clear(); - //try{ 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 - //} catch (Exception e) {e.printStackTrace();} } @Override From 8847fb6e1c77ec77e9a05cc4e420c5d903276a3c Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Sat, 11 Jan 2025 12:41:28 +0100 Subject: [PATCH 42/58] use constant for DetectorBlock detection diameter --- .../de/dafuqs/spectrum/blocks/redstone/DetectorBlock.java | 7 ++++--- .../spectrum/blocks/redstone/EntityDetectorBlock.java | 2 +- .../dafuqs/spectrum/blocks/redstone/ItemDetectorBlock.java | 2 +- .../spectrum/blocks/redstone/PlayerDetectorBlock.java | 2 +- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/de/dafuqs/spectrum/blocks/redstone/DetectorBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/redstone/DetectorBlock.java index ffd2c38ef1..9314542e73 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/redstone/DetectorBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/redstone/DetectorBlock.java @@ -18,6 +18,8 @@ public abstract class DetectorBlock extends Block { public static final BooleanProperty INVERTED = Properties.INVERTED; protected static final VoxelShape SHAPE = Block.createCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 6.0D, 16.0D); + protected static final double DETECTION_DIAMETER = 20.0D; + public DetectorBlock(Settings settings) { super(settings); this.setDefaultState(((this.stateManager.getDefaultState()).with(POWER, 0)).with(INVERTED, false)); @@ -87,9 +89,8 @@ public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Ran abstract int getUpdateFrequencyTicks(); - protected Box getBoxWithRadius(BlockPos blockPos, float radius) { - var r = Math.round(radius * 2); - return Box.of(Vec3d.ofCenter(blockPos), r, r, r); + protected Box getDetectionBox(BlockPos pos) { + return Box.of(Vec3d.ofCenter(pos), DETECTION_DIAMETER, DETECTION_DIAMETER, DETECTION_DIAMETER); } } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/redstone/EntityDetectorBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/redstone/EntityDetectorBlock.java index d37a098a12..1b9e25ffa1 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/redstone/EntityDetectorBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/redstone/EntityDetectorBlock.java @@ -16,7 +16,7 @@ public EntityDetectorBlock(Settings settings) { @Override protected void updateState(BlockState state, World world, BlockPos pos) { - List entities = world.getEntitiesByType(TypeFilter.instanceOf(LivingEntity.class), getBoxWithRadius(pos, 10), LivingEntity::isAlive); + List entities = world.getEntitiesByType(TypeFilter.instanceOf(LivingEntity.class), getDetectionBox(pos), LivingEntity::isAlive); int power = Math.min(entities.size(), 15); diff --git a/src/main/java/de/dafuqs/spectrum/blocks/redstone/ItemDetectorBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/redstone/ItemDetectorBlock.java index 7910fb84b0..39d18e6fec 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/redstone/ItemDetectorBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/redstone/ItemDetectorBlock.java @@ -16,7 +16,7 @@ public ItemDetectorBlock(Settings settings) { @Override protected void updateState(BlockState state, World world, BlockPos pos) { - List items = world.getEntitiesByType(EntityType.ITEM, getBoxWithRadius(pos, 10), Entity::isAlive); + List items = world.getEntitiesByType(EntityType.ITEM, getDetectionBox(pos), Entity::isAlive); int power; if (items.size() > 0) { 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 1950c393dd..3ebd7dc62e 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/redstone/PlayerDetectorBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/redstone/PlayerDetectorBlock.java @@ -50,7 +50,7 @@ public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEnt @Override protected void updateState(BlockState state, World world, BlockPos pos) { - List players = world.getEntitiesByType(EntityType.PLAYER, getBoxWithRadius(pos, 10), player -> player.isAlive() && !player.isSpectator()); + List players = world.getEntitiesByType(EntityType.PLAYER, getDetectionBox(pos), player -> player.isAlive() && !player.isSpectator()); int power = 0; From be85994c8206f5df9e3b874b1f24505f5228ab60 Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Sat, 11 Jan 2025 12:42:43 +0100 Subject: [PATCH 43/58] clarify ender splice guidebook entry being able to bind to players --- src/main/resources/assets/spectrum/lang/en_us.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/spectrum/lang/en_us.json b/src/main/resources/assets/spectrum/lang/en_us.json index 96fb607291..fdd1b167ac 100644 --- a/src/main/resources/assets/spectrum/lang/en_us.json +++ b/src/main/resources/assets/spectrum/lang/en_us.json @@ -2565,7 +2565,7 @@ "book.spectrum.guidebook.ender_glass.page2.text": "To make it even stranger, the material seems to respond to the last signal applied, not the strongest.\\\n\\\nTruly a curiosity from the End.", "book.spectrum.guidebook.ender_hopper.page0.text": "Designed to resemble an ordinary hopper in form and function, the Ender Hopper has the special ability to put items directly into my [#](bb00bb)Ender Inventory[#]().\\\nThe counterpart to the [Ender Dropper](entry://magical_blocks/ender_dropper).", "book.spectrum.guidebook.ender_splice.page0.text": "I was quite successful replicating the Endermen's teleport ability! However, in order to determine the destination, I first have to take a snapshot of the position. Endermen don't have to do that, it seems - why? Or *do* they?\\\nFirst use binds to my current position, second use teleports me back.", - "book.spectrum.guidebook.ender_splice.page1.text": "- Can be used on other players\n- Cannot teleport across dimensions", + "book.spectrum.guidebook.ender_splice.page1.text": "- Can also be bound to players\n- Cannot teleport across dimensions", "book.spectrum.guidebook.ender_splice.page2.text": "Reduces the chance of it breaking on use.", "book.spectrum.guidebook.ender_splice.page3.text": "Allows for inter-dimensional teleportation.", "book.spectrum.guidebook.enemy_tears": "The classic. The only thing that would make this one even more delicious would be the tears of my enemies.", From c6782e7b62b900fd82107b6cd9205b9935b68aa7 Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Sat, 11 Jan 2025 12:50:05 +0100 Subject: [PATCH 44/58] reset the ender splice sound instance if the active item is not an Ender Splice for good measure --- .../spectrum/sound/EnderSpliceChargingSoundInstance.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/dafuqs/spectrum/sound/EnderSpliceChargingSoundInstance.java b/src/main/java/de/dafuqs/spectrum/sound/EnderSpliceChargingSoundInstance.java index 2c0ef826ed..9016b970fc 100644 --- a/src/main/java/de/dafuqs/spectrum/sound/EnderSpliceChargingSoundInstance.java +++ b/src/main/java/de/dafuqs/spectrum/sound/EnderSpliceChargingSoundInstance.java @@ -8,7 +8,7 @@ import net.minecraft.sound.*; import net.minecraft.util.math.*; import net.minecraft.util.math.random.*; -import net.minecraft.world.World; +import net.minecraft.world.*; @Environment(EnvType.CLIENT) public class EnderSpliceChargingSoundInstance extends AbstractSoundInstance implements TickableSoundInstance { @@ -39,7 +39,7 @@ public boolean shouldAlwaysPlay() { @Override public void tick() { - if (player == null || player.getItemUseTimeLeft() <= 0 || player.getItemUseTime() > 47) { + if (player == null || player.getItemUseTimeLeft() <= 0 || player.getItemUseTime() > 47 || !player.getActiveItem().isOf(SpectrumItems.ENDER_SPLICE)) { this.setDone(); } else { this.x = this.player.getX(); From 759489936a1e87649a2fb6b781b7b7a62c76696f Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Sat, 11 Jan 2025 12:59:14 +0100 Subject: [PATCH 45/58] fix invuln ticks bypass --- .../de/dafuqs/spectrum/entity/entity/GlassArrowEntity.java | 6 +++--- .../java/de/dafuqs/spectrum/mixin/LivingEntityMixin.java | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) 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 6ff5196c0c..82ab837da1 100644 --- a/src/main/java/de/dafuqs/spectrum/entity/entity/GlassArrowEntity.java +++ b/src/main/java/de/dafuqs/spectrum/entity/entity/GlassArrowEntity.java @@ -88,8 +88,8 @@ protected void onEntityHit(EntityHitResult entityHitResult) { if (entity instanceof LivingEntity livingEntity) { // we're resetting hurtTime here for once so onEntityHit() can deal damage // and also resetting after that again so the target is damageable again after this - invincibilityFrameStore = livingEntity.timeUntilRegen; - livingEntity.timeUntilRegen = 0; + invincibilityFrameStore = livingEntity.hurtTime; + livingEntity.hurtTime = 0; livingEntityToResetHurtTime = livingEntity; livingEntity.damageShield(20); livingEntity.damageArmor(world.getDamageSources().magic(), 20); @@ -101,7 +101,7 @@ protected void onEntityHit(EntityHitResult entityHitResult) { super.onEntityHit(entityHitResult); if (livingEntityToResetHurtTime != null) { - livingEntityToResetHurtTime.timeUntilRegen = invincibilityFrameStore; + livingEntityToResetHurtTime.hurtTime = invincibilityFrameStore; } this.playSound(SoundEvents.BLOCK_GLASS_BREAK, 0.75F, 0.9F + world.random.nextFloat() * 0.2F); diff --git a/src/main/java/de/dafuqs/spectrum/mixin/LivingEntityMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/LivingEntityMixin.java index fd16df85b0..2cbca5c966 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/LivingEntityMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/LivingEntityMixin.java @@ -611,9 +611,9 @@ private float getToughness() { boolean damaged = false; for (Pair entry : composition.get()) { - int invincibilityFrameStore = target.timeUntilRegen; + int invincibilityFrameStore = target.hurtTime; damaged |= damage(entry.getLeft(), entry.getRight()); - target.timeUntilRegen = invincibilityFrameStore; + target.hurtTime = invincibilityFrameStore; } SpectrumDamageTypes.recursiveDamageFlag = false; From 6f29fa42f48ed054a4e68aba9a4616b77b7b6ba5 Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Sat, 11 Jan 2025 13:10:26 +0100 Subject: [PATCH 46/58] cancel primordial fire sounds if player ded --- .../de/dafuqs/spectrum/sound/OnPrimordialFireSoundInstance.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/dafuqs/spectrum/sound/OnPrimordialFireSoundInstance.java b/src/main/java/de/dafuqs/spectrum/sound/OnPrimordialFireSoundInstance.java index 837d381af7..f429de5886 100644 --- a/src/main/java/de/dafuqs/spectrum/sound/OnPrimordialFireSoundInstance.java +++ b/src/main/java/de/dafuqs/spectrum/sound/OnPrimordialFireSoundInstance.java @@ -32,6 +32,6 @@ public void tick() { @Override public boolean isDone() { - return player == null || !OnPrimordialFireComponent.isOnPrimordialFire(player); + return player == null || player.isRemoved() || !OnPrimordialFireComponent.isOnPrimordialFire(player); } } From 9fd816b44d13233a11fd59738df07df1af9146ae Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Sun, 12 Jan 2025 11:35:38 +0100 Subject: [PATCH 47/58] remove nonfunctional damage tilt mixins (#477) --- .../spectrum/mixin/LivingEntityMixin.java | 8 +---- .../mixin/accessors/LivingEntityAccessor.java | 22 ------------- .../mixin/client/ClientPlayerEntityMixin.java | 32 ------------------- src/main/resources/spectrum.mixins.json | 1 - 4 files changed, 1 insertion(+), 62 deletions(-) delete mode 100644 src/main/java/de/dafuqs/spectrum/mixin/accessors/LivingEntityAccessor.java delete mode 100644 src/main/java/de/dafuqs/spectrum/mixin/client/ClientPlayerEntityMixin.java diff --git a/src/main/java/de/dafuqs/spectrum/mixin/LivingEntityMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/LivingEntityMixin.java index 2cbca5c966..312463c060 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/LivingEntityMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/LivingEntityMixin.java @@ -719,11 +719,5 @@ protected void applyInexorableEffects(CallbackInfo ci) { private boolean spectrum$isWet(LivingEntity livingEntity) { return livingEntity.isTouchingWater() ? ((TouchingWaterAware) livingEntity).spectrum$isActuallyTouchingWater() : livingEntity.isWet(); } - - - @com.llamalad7.mixinextras.injector.v2.WrapWithCondition(method = "damage", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;tiltScreen(DD)V")) - private boolean shouldTiltScreen(LivingEntity entity, double deltaX, double deltaZ, DamageSource source, - float amount) { - return !source.isIn(SpectrumDamageTypeTags.USES_SET_HEALTH); - } + } \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/mixin/accessors/LivingEntityAccessor.java b/src/main/java/de/dafuqs/spectrum/mixin/accessors/LivingEntityAccessor.java deleted file mode 100644 index 8d662569a4..0000000000 --- a/src/main/java/de/dafuqs/spectrum/mixin/accessors/LivingEntityAccessor.java +++ /dev/null @@ -1,22 +0,0 @@ -package de.dafuqs.spectrum.mixin.accessors; - -import net.minecraft.entity.effect.*; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.damage.DamageSource; - -import java.util.*; - -@Mixin(LivingEntity.class) -public interface LivingEntityAccessor { - @Accessor - DamageSource getLastDamageSource(); - - @Accessor("lastDamageSource") - public void setLastDamageSource(DamageSource damageSource); - - @Accessor() - Map getActiveStatusEffects(); -} diff --git a/src/main/java/de/dafuqs/spectrum/mixin/client/ClientPlayerEntityMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/client/ClientPlayerEntityMixin.java deleted file mode 100644 index 8fab7536d2..0000000000 --- a/src/main/java/de/dafuqs/spectrum/mixin/client/ClientPlayerEntityMixin.java +++ /dev/null @@ -1,32 +0,0 @@ -package de.dafuqs.spectrum.mixin.client; - -import de.dafuqs.spectrum.mixin.accessors.LivingEntityAccessor; -import de.dafuqs.spectrum.registries.*; -import net.fabricmc.api.*; -import net.minecraft.client.network.*; -import net.minecraft.entity.damage.DamageSource; - -import org.objectweb.asm.Opcodes; -import org.spongepowered.asm.mixin.*; -import org.spongepowered.asm.mixin.injection.*; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; - -@Environment(EnvType.CLIENT) -@Mixin(ClientPlayerEntity.class) -public class ClientPlayerEntityMixin { - @WrapWithCondition(method = "updateHealth", at = @At(value = "FIELD", target = "Lnet/minecraft/client/network/ClientPlayerEntity;hurtTime*:I", opcode = Opcodes.PUTFIELD)) - private boolean shouldTiltScreen(ClientPlayerEntity player, int newValue) { - System.out.println(((LivingEntityAccessor) player).getLastDamageSource()); - return ((LivingEntityAccessor) player).getLastDamageSource() == null - || !((LivingEntityAccessor) player).getLastDamageSource() - .isIn(SpectrumDamageTypeTags.USES_SET_HEALTH); - } - - @Inject(method = "damage", at = @At("HEAD")) - private void setDamageSource(DamageSource source, float amount, CallbackInfoReturnable info) { - ((LivingEntityAccessor) this).setLastDamageSource(source); - return; - } -} diff --git a/src/main/resources/spectrum.mixins.json b/src/main/resources/spectrum.mixins.json index 738c2585e8..1ac8f7fdef 100644 --- a/src/main/resources/spectrum.mixins.json +++ b/src/main/resources/spectrum.mixins.json @@ -121,7 +121,6 @@ "client.BlockOverlayRendererMixin", "client.BuiltinModelItemRendererMixin", "client.CapeFeatureRendererMixin", - "client.ClientPlayerEntityMixin", "client.ClientPlayNetworkHandlerMixin", "client.DeathScreenMixin", "client.DimensionTypeMixin", From e3d4d89b27a087924e04780b575804aa141b5286 Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Sun, 12 Jan 2025 12:23:42 +0100 Subject: [PATCH 48/58] mixin cleanup --- .../java/de/dafuqs/spectrum/mixin/EntityMixin.java | 11 +++++------ src/main/resources/spectrum.mixins.json | 1 - 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/main/java/de/dafuqs/spectrum/mixin/EntityMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/EntityMixin.java index 40f7dfdbb6..8f4bbf0203 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/EntityMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/EntityMixin.java @@ -1,9 +1,8 @@ package de.dafuqs.spectrum.mixin; -import com.llamalad7.mixinextras.injector.ModifyReturnValue; +import com.llamalad7.mixinextras.injector.*; import de.dafuqs.spectrum.cca.*; -import de.dafuqs.spectrum.enchantments.InexorableEnchantment; -import de.dafuqs.spectrum.mixin.accessors.*; +import de.dafuqs.spectrum.enchantments.*; import de.dafuqs.spectrum.registries.*; import de.dafuqs.spectrum.status_effects.*; import net.minecraft.enchantment.*; @@ -14,7 +13,7 @@ import net.minecraft.server.world.*; import net.minecraft.sound.*; import net.minecraft.stat.*; -import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.*; import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.injection.*; import org.spongepowered.asm.mixin.injection.callback.*; @@ -77,8 +76,8 @@ public abstract class EntityMixin { @ModifyReturnValue(method = "getPose", at = @At("RETURN")) public EntityPose spectrum$forceSleepPose(EntityPose original) { var entity = (Entity) (Object) this; - - if (!(entity instanceof LivingEntity living) || ((LivingEntityAccessor) living).getActiveStatusEffects() == null) + + if (!(entity instanceof LivingEntity living)) return original; if (!(entity instanceof PlayerEntity) && (living.hasStatusEffect(SpectrumStatusEffects.ETERNAL_SLUMBER) || living.hasStatusEffect(SpectrumStatusEffects.FATAL_SLUMBER))) diff --git a/src/main/resources/spectrum.mixins.json b/src/main/resources/spectrum.mixins.json index 1ac8f7fdef..c686807436 100644 --- a/src/main/resources/spectrum.mixins.json +++ b/src/main/resources/spectrum.mixins.json @@ -90,7 +90,6 @@ "accessors.FluidBlockAccessor", "accessors.FoxEntityAccessor", "accessors.GoatHornItemAccessor", - "accessors.LivingEntityAccessor", "accessors.MapStateAccessor", "accessors.MobEntityAccessor", "accessors.MooshroomEntityAccessor", From f1f8398348035e03889aae1fa27f4a6f2ef32fed Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Sun, 12 Jan 2025 12:23:51 +0100 Subject: [PATCH 49/58] updated piglin tags --- .../minecraft/tags/blocks/guarded_by_piglins.json | 5 +++-- .../data/minecraft/tags/items/piglin_loved.json | 12 +++++++++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/main/resources/data/minecraft/tags/blocks/guarded_by_piglins.json b/src/main/resources/data/minecraft/tags/blocks/guarded_by_piglins.json index f873725c3b..cf60ae38cc 100644 --- a/src/main/resources/data/minecraft/tags/blocks/guarded_by_piglins.json +++ b/src/main/resources/data/minecraft/tags/blocks/guarded_by_piglins.json @@ -6,6 +6,7 @@ "spectrum:large_gold_bud", "spectrum:gold_cluster", "spectrum:pure_gold_block", - "spectrum:glistering_melon" - ] + "spectrum:glistering_melon", + "spectrum:glistering_shooting_star" + ] } \ No newline at end of file diff --git a/src/main/resources/data/minecraft/tags/items/piglin_loved.json b/src/main/resources/data/minecraft/tags/items/piglin_loved.json index 6c1c8c2a8c..ea84371889 100644 --- a/src/main/resources/data/minecraft/tags/items/piglin_loved.json +++ b/src/main/resources/data/minecraft/tags/items/piglin_loved.json @@ -2,6 +2,16 @@ "replace": false, "values": [ "spectrum:axolotl_gold_head", - "spectrum:gilded_book" + "spectrum:gilded_book", + "spectrum:small_gold_bud", + "spectrum:large_gold_bud", + "spectrum:gold_cluster", + "spectrum:pure_gold", + "spectrum:pure_gold_block", + "spectrum:enchanted_golden_carrot", + "spectrum:glistering_melon", + "spectrum:glistering_melon_seeds", + "spectrum:glistering_shooting_star", + "spectrum:golden_bristle_tea" ] } \ No newline at end of file From 6f3d8eafde2768eed631ba293cdffd96868d7e6e Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Sun, 12 Jan 2025 12:30:33 +0100 Subject: [PATCH 50/58] update walls tags --- .../data/minecraft/tags/blocks/walls.json | 20 +++---- .../data/minecraft/tags/items/walls.json | 56 +++++++++---------- 2 files changed, 36 insertions(+), 40 deletions(-) diff --git a/src/main/resources/data/minecraft/tags/blocks/walls.json b/src/main/resources/data/minecraft/tags/blocks/walls.json index 61bc0df7e7..5ecbadf86b 100644 --- a/src/main/resources/data/minecraft/tags/blocks/walls.json +++ b/src/main/resources/data/minecraft/tags/blocks/walls.json @@ -2,9 +2,10 @@ "replace": false, "values": [ "spectrum:smooth_basalt_wall", - "spectrum:polished_basalt_wall", - "spectrum:basalt_brick_wall", - "spectrum:basalt_tile_wall", + "spectrum:planed_basalt_wall", + "spectrum:polished_basalt_wall", + "spectrum:basalt_brick_wall", + "spectrum:basalt_tile_wall", "spectrum:calcite_wall", "spectrum:planed_calcite_wall", @@ -12,22 +13,17 @@ "spectrum:calcite_brick_wall", "spectrum:calcite_tile_wall", - "spectrum:cobbled_blackslag_wall", - "spectrum:polished_blackslag_wall", + "spectrum:blackslag_wall", + "spectrum:cobbled_blackslag_wall", + "spectrum:polished_blackslag_wall", + "spectrum:blackslag_tile_wall", "spectrum:blackslag_brick_wall", - "spectrum:blackslag_tile_wall", "spectrum:basal_marble_wall", "spectrum:polished_basal_marble_wall", "spectrum:basal_marble_brick_wall", "spectrum:basal_marble_tile_wall", - "spectrum:blackslag_wall", - "spectrum:cobbled_blackslag_wall", - "spectrum:polished_blackslag_wall", - "spectrum:blackslag_tile_wall", - "spectrum:blackslag_brick_wall", - "spectrum:polished_bone_ash_wall", "spectrum:bone_ash_brick_wall", "spectrum:bone_ash_tile_wall", diff --git a/src/main/resources/data/minecraft/tags/items/walls.json b/src/main/resources/data/minecraft/tags/items/walls.json index 41f39a3e6b..6c89ffd06c 100644 --- a/src/main/resources/data/minecraft/tags/items/walls.json +++ b/src/main/resources/data/minecraft/tags/items/walls.json @@ -1,35 +1,35 @@ { - "replace": false, - "values": [ - "spectrum:smooth_basalt_wall", - "spectrum:polished_basalt_wall", - "spectrum:basalt_brick_wall", - "spectrum:basalt_tile_wall", + "replace": false, + "values": [ + "spectrum:smooth_basalt_wall", + "spectrum:planed_basalt_wall", + "spectrum:polished_basalt_wall", + "spectrum:basalt_brick_wall", + "spectrum:basalt_tile_wall", - "spectrum:calcite_wall", - "spectrum:polished_calcite_wall", - "spectrum:calcite_brick_wall", - "spectrum:calcite_tile_wall", + "spectrum:calcite_wall", + "spectrum:planed_calcite_wall", + "spectrum:polished_calcite_wall", + "spectrum:calcite_brick_wall", + "spectrum:calcite_tile_wall", - "spectrum:cobbled_blackslag_wall", - "spectrum:polished_blackslag_wall", - "spectrum:blackslag_brick_wall", - "spectrum:blackslag_tile_wall", + "spectrum:blackslag_wall", + "spectrum:cobbled_blackslag_wall", + "spectrum:polished_blackslag_wall", + "spectrum:blackslag_tile_wall", + "spectrum:blackslag_brick_wall", - "spectrum:blackslag_wall", - "spectrum:cobbled_blackslag_wall", - "spectrum:polished_blackslag_wall", - "spectrum:blackslag_tile_wall", - "spectrum:blackslag_brick_wall", + "spectrum:basal_marble_wall", + "spectrum:polished_basal_marble_wall", + "spectrum:basal_marble_brick_wall", + "spectrum:basal_marble_tile_wall", - "spectrum:basal_marble_wall", - "spectrum:polished_basal_marble_wall", - "spectrum:basal_marble_brick_wall", - "spectrum:basal_marble_tile_wall", + "spectrum:polished_bone_ash_wall", + "spectrum:bone_ash_brick_wall", + "spectrum:bone_ash_tile_wall", + "spectrum:preservation_wall", - "spectrum:polished_bone_ash_wall", - "spectrum:bone_ash_brick_wall", - "spectrum:bone_ash_tile_wall", - "spectrum:preservation_wall" - ] + "spectrum:pyrite_wall", + "spectrum:pyrite_tiles_wall" + ] } \ No newline at end of file From 447967e423abf0d5ef4d5a0e1e3d725b79a2d9e9 Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Sun, 12 Jan 2025 12:36:04 +0100 Subject: [PATCH 51/58] planed slabs, stairs & walls can be stonecut directly from polished --- .../basalt/planed_basalt_slab_from_polished_basalt.json | 8 ++++++++ .../basalt/planed_basalt_stairs_from_polished_basalt.json | 8 ++++++++ .../basalt/planed_basalt_wall_from_polished_basalt.json | 8 ++++++++ .../planed_calcite_slab_from_polished_calcite.json | 8 ++++++++ .../planed_calcite_stairs_from_polished_calcite.json | 8 ++++++++ .../planed_calcite_wall_from_polished_calcite.json | 8 ++++++++ 6 files changed, 48 insertions(+) create mode 100644 src/main/resources/data/spectrum/recipes/stonecutting/basalt/planed_basalt_slab_from_polished_basalt.json create mode 100644 src/main/resources/data/spectrum/recipes/stonecutting/basalt/planed_basalt_stairs_from_polished_basalt.json create mode 100644 src/main/resources/data/spectrum/recipes/stonecutting/basalt/planed_basalt_wall_from_polished_basalt.json create mode 100644 src/main/resources/data/spectrum/recipes/stonecutting/calcite/planed_calcite_slab_from_polished_calcite.json create mode 100644 src/main/resources/data/spectrum/recipes/stonecutting/calcite/planed_calcite_stairs_from_polished_calcite.json create mode 100644 src/main/resources/data/spectrum/recipes/stonecutting/calcite/planed_calcite_wall_from_polished_calcite.json diff --git a/src/main/resources/data/spectrum/recipes/stonecutting/basalt/planed_basalt_slab_from_polished_basalt.json b/src/main/resources/data/spectrum/recipes/stonecutting/basalt/planed_basalt_slab_from_polished_basalt.json new file mode 100644 index 0000000000..15999dc424 --- /dev/null +++ b/src/main/resources/data/spectrum/recipes/stonecutting/basalt/planed_basalt_slab_from_polished_basalt.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "spectrum:polished_basalt" + }, + "result": "spectrum:planed_basalt_slab", + "count": 2 +} \ No newline at end of file diff --git a/src/main/resources/data/spectrum/recipes/stonecutting/basalt/planed_basalt_stairs_from_polished_basalt.json b/src/main/resources/data/spectrum/recipes/stonecutting/basalt/planed_basalt_stairs_from_polished_basalt.json new file mode 100644 index 0000000000..85a152aefd --- /dev/null +++ b/src/main/resources/data/spectrum/recipes/stonecutting/basalt/planed_basalt_stairs_from_polished_basalt.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "spectrum:polished_basalt" + }, + "result": "spectrum:planed_basalt_stairs", + "count": 1 +} \ No newline at end of file diff --git a/src/main/resources/data/spectrum/recipes/stonecutting/basalt/planed_basalt_wall_from_polished_basalt.json b/src/main/resources/data/spectrum/recipes/stonecutting/basalt/planed_basalt_wall_from_polished_basalt.json new file mode 100644 index 0000000000..fa2036b90b --- /dev/null +++ b/src/main/resources/data/spectrum/recipes/stonecutting/basalt/planed_basalt_wall_from_polished_basalt.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "spectrum:polished_basalt" + }, + "result": "spectrum:planed_basalt_wall", + "count": 1 +} \ No newline at end of file diff --git a/src/main/resources/data/spectrum/recipes/stonecutting/calcite/planed_calcite_slab_from_polished_calcite.json b/src/main/resources/data/spectrum/recipes/stonecutting/calcite/planed_calcite_slab_from_polished_calcite.json new file mode 100644 index 0000000000..0edcd69388 --- /dev/null +++ b/src/main/resources/data/spectrum/recipes/stonecutting/calcite/planed_calcite_slab_from_polished_calcite.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "spectrum:polished_calcite" + }, + "result": "spectrum:planed_calcite_slab", + "count": 2 +} \ No newline at end of file diff --git a/src/main/resources/data/spectrum/recipes/stonecutting/calcite/planed_calcite_stairs_from_polished_calcite.json b/src/main/resources/data/spectrum/recipes/stonecutting/calcite/planed_calcite_stairs_from_polished_calcite.json new file mode 100644 index 0000000000..c3ec240b81 --- /dev/null +++ b/src/main/resources/data/spectrum/recipes/stonecutting/calcite/planed_calcite_stairs_from_polished_calcite.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "spectrum:polished_calcite" + }, + "result": "spectrum:planed_calcite_stairs", + "count": 1 +} \ No newline at end of file diff --git a/src/main/resources/data/spectrum/recipes/stonecutting/calcite/planed_calcite_wall_from_polished_calcite.json b/src/main/resources/data/spectrum/recipes/stonecutting/calcite/planed_calcite_wall_from_polished_calcite.json new file mode 100644 index 0000000000..dcf75946fc --- /dev/null +++ b/src/main/resources/data/spectrum/recipes/stonecutting/calcite/planed_calcite_wall_from_polished_calcite.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "spectrum:polished_calcite" + }, + "result": "spectrum:planed_calcite_wall", + "count": 1 +} \ No newline at end of file From 672fbdcb5f4b629b9cf8d7db687028d14256db85 Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Sun, 12 Jan 2025 12:38:16 +0100 Subject: [PATCH 52/58] pedestal guidebook entry clarifies that you need to upgrade the pedestal AND build the structure --- src/main/resources/assets/spectrum/lang/en_us.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/spectrum/lang/en_us.json b/src/main/resources/assets/spectrum/lang/en_us.json index fdd1b167ac..46f991bfa8 100644 --- a/src/main/resources/assets/spectrum/lang/en_us.json +++ b/src/main/resources/assets/spectrum/lang/en_us.json @@ -3484,7 +3484,7 @@ "book.spectrum.guidebook.pedestal_upgrade_cmy.name": "Pedestal CMY Upgrade", "book.spectrum.guidebook.pedestal_upgrade_cmy.page0.text": "I now have three gems. *And an idea!* I could upgrade my [Pedestal](entry://general/pedestal) with all three types I found! This will make it both prettier and more versatile.", "book.spectrum.guidebook.pedestal_upgrade_cmy.page0.title": "CMY Variant", - "book.spectrum.guidebook.pedestal_upgrade_cmy.page1.text": "In order to use the advanced abilities of the [Pigment Pedestal](entry://general/pedestal) I will need a structure to focus energy into it.\\\n\\\nI call it the **Spectrum Focus**.", + "book.spectrum.guidebook.pedestal_upgrade_cmy.page1.text": "In order to use the advanced abilities of the enhanced [Pigment Pedestal](entry://general/pedestal) I will need a structure to focus energy into it.\\\n\\\nI call it the **Spectrum Focus**.", "book.spectrum.guidebook.pedestal_upgrade_cmy.page1.title": "Pedestal Structure", "book.spectrum.guidebook.pedestal_upgrade_cmy.page2.text": "Dimensions: 11x11x4 blocks. But best to leave a few extra blocks of space around, just in case.", "book.spectrum.guidebook.pedestal_upgrade_cmy.page3.text": "- 1 Pigment Pedestal\n- 4 Polished Gemstone Blocks\n- 4 Chiseled Polished Blocks\n- 4 Notched Polished Blocks\n- 8 Polished Pillars\n- 68 Polished Blocks", From 6056220908d124c66be5e5020a17e24f8603fbda Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Sun, 12 Jan 2025 12:55:36 +0100 Subject: [PATCH 53/58] anvil omni acc behavior --- .../SpectrumOmniAcceleratorProjectiles.java | 23 ++++++++++++++++++- src/main/resources/spectrum.accesswidener | 8 ++++--- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/dafuqs/spectrum/registries/SpectrumOmniAcceleratorProjectiles.java b/src/main/java/de/dafuqs/spectrum/registries/SpectrumOmniAcceleratorProjectiles.java index 0730ee4138..d4b857c52c 100644 --- a/src/main/java/de/dafuqs/spectrum/registries/SpectrumOmniAcceleratorProjectiles.java +++ b/src/main/java/de/dafuqs/spectrum/registries/SpectrumOmniAcceleratorProjectiles.java @@ -117,7 +117,7 @@ public SoundEvent getSoundEffect() { OmniAcceleratorProjectile.register(new OmniAcceleratorProjectile() { @Override public Entity createProjectile(ItemStack stack, LivingEntity shooter, World world) { - Vec3d pos = shooter.getPos(); + Vec3d pos = shooter.getEyePos(); TntEntity tntEntity = new TntEntity(world, pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, shooter); OmniAcceleratorProjectile.setVelocity(tntEntity, shooter, shooter.getPitch(), shooter.getYaw(), 0.0F, 2.5F, 1.0F); if (world.spawnEntity(tntEntity)) { @@ -201,6 +201,27 @@ public SoundEvent getSoundEffect() { } }, SpectrumBlocks.GLISTERING_SHOOTING_STAR, SpectrumBlocks.FIERY_SHOOTING_STAR, SpectrumBlocks.COLORFUL_SHOOTING_STAR, SpectrumBlocks.PRISTINE_SHOOTING_STAR, SpectrumBlocks.GEMSTONE_SHOOTING_STAR); + OmniAcceleratorProjectile.register(new OmniAcceleratorProjectile() { + @Override + public Entity createProjectile(ItemStack stack, LivingEntity shooter, World world) { + Vec3d pos = shooter.getEyePos(); + + if (stack.getItem() instanceof BlockItem blockItem) { + FallingBlockEntity fallingBlockEntity = new FallingBlockEntity(world, pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, blockItem.getBlock().getDefaultState()); + OmniAcceleratorProjectile.setVelocity(fallingBlockEntity, shooter, shooter.getPitch(), shooter.getYaw(), 0, 2.5F, 0F); + world.spawnEntity(fallingBlockEntity); + world.spawnEntity(fallingBlockEntity); + return fallingBlockEntity; + } + + return null; + } + + @Override + public SoundEvent getSoundEffect() { + return SoundEvents.ENTITY_SPLASH_POTION_THROW; + } + }, ItemTags.ANVIL); } } diff --git a/src/main/resources/spectrum.accesswidener b/src/main/resources/spectrum.accesswidener index 764ff4a997..452bdc74d6 100644 --- a/src/main/resources/spectrum.accesswidener +++ b/src/main/resources/spectrum.accesswidener @@ -13,14 +13,16 @@ accessible method net/minecraft/client/particle/BlockLeakParticle$Dripping (Lnet/minecraft/client/world/ClientWorld;DDDLnet/minecraft/fluid/Fluid;Lnet/minecraft/particle/ParticleEffect;)V accessible method net/minecraft/client/particle/BlockLeakParticle$Landing (Lnet/minecraft/client/world/ClientWorld;DDDLnet/minecraft/fluid/Fluid;)V accessible method net/minecraft/client/particle/VibrationParticle (Lnet/minecraft/client/world/ClientWorld;DDDLnet/minecraft/world/event/PositionSource;I)V - +accessible method net/minecraft/entity/FallingBlockEntity (Lnet/minecraft/world/World;DDDLnet/minecraft/block/BlockState;)V accessible method net/minecraft/entity/LivingEntity applyDamage (Lnet/minecraft/entity/damage/DamageSource;F)V -extendable method net/minecraft/screen/ForgingScreenHandler addPlayerInventorySlots (Lnet/minecraft/entity/player/PlayerInventory;)V -extendable method net/minecraft/entity/projectile/ProjectileEntity (Lnet/minecraft/entity/EntityType;Lnet/minecraft/world/World;)V accessible method net/minecraft/entity/projectile/FishingBobberEntity (Lnet/minecraft/entity/EntityType;Lnet/minecraft/world/World;II)V accessible method net/minecraft/registry/entry/RegistryEntryList$Direct (Ljava/util/List;)V accessible method net/minecraft/advancement/criterion/AbstractCriterion trigger (Lnet/minecraft/server/network/ServerPlayerEntity;Ljava/util/function/Predicate;)V accessible method net/minecraft/screen/ForgingScreenHandler addPlayerInventorySlots (Lnet/minecraft/entity/player/PlayerInventory;)V + +extendable method net/minecraft/screen/ForgingScreenHandler addPlayerInventorySlots (Lnet/minecraft/entity/player/PlayerInventory;)V +extendable method net/minecraft/entity/projectile/ProjectileEntity (Lnet/minecraft/entity/EntityType;Lnet/minecraft/world/World;)V extendable method net/minecraft/item/map/MapState (IIBZZZLnet/minecraft/registry/RegistryKey;)V extendable method net/minecraft/item/map/MapState addIcon (Lnet/minecraft/item/map/MapIcon$Type;Lnet/minecraft/world/WorldAccess;Ljava/lang/String;DDDLnet/minecraft/text/Text;)V + mutable field net/minecraft/item/map/MapState dimension Lnet/minecraft/registry/RegistryKey; From 23c35cc1b77c9d4a7688eec8c9f991341f71a8de Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Sun, 12 Jan 2025 12:57:51 +0100 Subject: [PATCH 54/58] update chapter advancement descriptions --- src/main/resources/assets/spectrum/lang/en_us.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/spectrum/lang/en_us.json b/src/main/resources/assets/spectrum/lang/en_us.json index 46f991bfa8..0dc86e626b 100644 --- a/src/main/resources/assets/spectrum/lang/en_us.json +++ b/src/main/resources/assets/spectrum/lang/en_us.json @@ -409,9 +409,9 @@ "advancements.spectrum.solve_wireless_redstone_preservation_ruin.title": "Remote Connected", "advancements.spectrum.spectrum.description": "A story about magic, color and chaos", "advancements.spectrum.spectrum.title": "Spectrum - Start of a Journey", - "advancements.spectrum.spectrum_endgame.description": "A story about all you have learned", + "advancements.spectrum.spectrum_endgame.description": "A story about a journeys end", "advancements.spectrum.spectrum_endgame.title": "Spectrum - A Final Encore", - "advancements.spectrum.spectrum_lategame.description": "A story about a journeys end", + "advancements.spectrum.spectrum_lategame.description": "A story about reflective poetry", "advancements.spectrum.spectrum_lategame.title": "Spectrum - Turn to Purity", "advancements.spectrum.spectrum_midgame.description": "A story about curiosity and greed", "advancements.spectrum.spectrum_midgame.title": "Spectrum - Fall from Grace", From 8d86991e8bf88c7b72ffc286ae5c67a2b49a9c17 Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Sun, 12 Jan 2025 13:06:04 +0100 Subject: [PATCH 55/58] effulgent feather dipping fix --- .../guidebook/entries/creating_life/effulgent_feathers.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/resources/data/spectrum/modonomicon/books/guidebook/entries/creating_life/effulgent_feathers.json b/src/main/resources/data/spectrum/modonomicon/books/guidebook/entries/creating_life/effulgent_feathers.json index 540d356c4b..b19e9a2904 100644 --- a/src/main/resources/data/spectrum/modonomicon/books/guidebook/entries/creating_life/effulgent_feathers.json +++ b/src/main/resources/data/spectrum/modonomicon/books/guidebook/entries/creating_life/effulgent_feathers.json @@ -28,10 +28,6 @@ }, { "type": "spectrum:liquid_crystal_converting", - "condition": { - "type": "modonomicon:advancement", - "advancement_id": "spectrum:hidden/collect_raw_bloodstone" - }, "title": "book.spectrum.guidebook.effulgent_feathers.page1.title", "recipe_id": "spectrum:liquid_crystal_converting/raw_bloodstone", "text": "book.spectrum.guidebook.effulgent_feathers.page1.text" From 1a7ea16d3e7325e91fa34a9f5096ce6744614f09 Mon Sep 17 00:00:00 2001 From: Jkibbels Date: Sun, 12 Jan 2025 22:17:38 -0500 Subject: [PATCH 56/58] [1.20.1-noxwood-fence-patch] Patch noxwood shaped crafting bug --- .../recipes/crafting_table/noxwood/slate_fence.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/resources/data/spectrum/recipes/crafting_table/noxwood/slate_fence.json b/src/main/resources/data/spectrum/recipes/crafting_table/noxwood/slate_fence.json index dfdd4070a0..818fb6a770 100644 --- a/src/main/resources/data/spectrum/recipes/crafting_table/noxwood/slate_fence.json +++ b/src/main/resources/data/spectrum/recipes/crafting_table/noxwood/slate_fence.json @@ -1,9 +1,9 @@ { "type": "minecraft:crafting_shaped", - "group": "wooden_fence_gate", + "group": "wooden_fence", "pattern": [ - "#W#", - "#W#" + "W#W", + "W#W" ], "key": { "#": { @@ -14,6 +14,6 @@ } }, "result": { - "item": "spectrum:slate_noxwood_fence_gate" + "item": "spectrum:slate_noxwood_fence" } } \ No newline at end of file From e337081eff3556e2e9bd56494577a8211c708103 Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Mon, 13 Jan 2025 10:18:50 +0100 Subject: [PATCH 57/58] fix #655 --- .../spectrum/blocks/chests/BlackHoleChestBlockEntity.java | 6 ++---- .../spectrum/blocks/chests/RestockingChestBlockEntity.java | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) 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 052326392e..e26856343c 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/chests/BlackHoleChestBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/chests/BlackHoleChestBlockEntity.java @@ -10,7 +10,7 @@ import de.dafuqs.spectrum.particle.*; import de.dafuqs.spectrum.registries.*; import net.fabricmc.fabric.api.screenhandler.v1.*; -import net.fabricmc.fabric.api.transfer.v1.item.ItemVariant; +import net.fabricmc.fabric.api.transfer.v1.item.*; import net.minecraft.block.*; import net.minecraft.entity.*; import net.minecraft.entity.player.*; @@ -18,13 +18,11 @@ import net.minecraft.item.*; import net.minecraft.nbt.*; import net.minecraft.network.*; -import net.minecraft.registry.*; import net.minecraft.screen.*; import net.minecraft.server.network.*; import net.minecraft.server.world.*; import net.minecraft.sound.*; import net.minecraft.text.*; -import net.minecraft.util.*; import net.minecraft.util.collection.*; import net.minecraft.util.math.*; import net.minecraft.world.*; @@ -44,7 +42,7 @@ public class BlackHoleChestBlockEntity extends SpectrumChestBlockEntity implemen private static final int RANGE = 12; private final ItemAndExperienceEventQueue itemAndExperienceEventQueue; private final List filterItems; - private State state; + private State state = State.CLOSED_INACTIVE; private boolean isOpen, isFull, hasXPStorage; float storageTarget, storagePos, lastStorageTarget, capTarget, capPos, lastCapTarget, orbTarget, orbPos, lastOrbTarget, yawTarget, orbYaw, lastYawTarget; long interpTicks, interpLength = 1, age, storedXP, maxStoredXP; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/chests/RestockingChestBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/chests/RestockingChestBlockEntity.java index f855a0d532..7065b2a55d 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/chests/RestockingChestBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/chests/RestockingChestBlockEntity.java @@ -30,7 +30,7 @@ public class RestockingChestBlockEntity extends SpectrumChestBlockEntity impleme private List cachedOutputs = new ArrayList<>(4); private int coolDownTicks = 0; private boolean isOpen, isFull, hasValidRecipes; - private State state; + private State state = State.CLOSED; float rimTarget, rimPos, lastRimTarget, tabletTarget, tabletPos, lastTabletTarget,assemblyTarget, assemblyPos, lastAssemblyTarget, ringTarget, ringPos, lastRingTarget, itemTarget, itemPos, lastItemTarget, alphaTarget, alphaValue, lastAlphaTarget, yawModTarget, yawMod, lastYawModTarget, yaw, lastYaw; long interpTicks, interpLength = 1, age; From 9856c5bcc31eca6e207208bb5b16a3acae280b93 Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Mon, 13 Jan 2025 10:19:23 +0100 Subject: [PATCH 58/58] cursed --- .../spectrum/blocks/chests/RestockingChestBlockEntity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/dafuqs/spectrum/blocks/chests/RestockingChestBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/chests/RestockingChestBlockEntity.java index 7065b2a55d..64cafba513 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/chests/RestockingChestBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/chests/RestockingChestBlockEntity.java @@ -40,7 +40,7 @@ public RestockingChestBlockEntity(BlockPos blockPos, BlockState blockState) { public static void tick(World world, BlockPos pos, BlockState state, RestockingChestBlockEntity chest) { chest.age++; - + // TODO: that should run in `clientTick() instead` (same for other chests) if (world.isClient) { chest.lastYaw = chest.yaw;